CluPilotCloud/app/Livewire
Claude 99715989aa
tests / pest (push) Successful in 8m55s Details
tests / assets (push) Successful in 20s Details
tests / release (push) Successful in 4s Details
Dress the placeholder page, and record why the obvious VPN fix cannot work
The page shown while the site is hidden was still in the old style — a coloured
square and system fonts — on the two hostnames a visitor is most likely to try.
It now uses the site's own plate, typeface and registration marks, still
entirely self-contained because it is shown precisely when the asset build may
not exist. Both it and the error pages lighten the accent in dark mode: the tone
is chosen for contrast against paper, and on the ink plate the small text is the
first thing to stop being readable.

The VPN investigation ended somewhere useful, and not where it started.

The blank page on the phone is the reverse proxy refusing the request — `respond
404` sends no body. It refuses because the phone is not on the tunnel: the
client config lists only the management subnet in AllowedIPs, so a request to
the console's public hostname goes out over the mobile network and arrives from
a carrier address. It also explains "last contact: never", since WireGuard only
performs a handshake when it has traffic to send, and nothing is ever routed
into the tunnel.

The obvious fix — add the server's public address to AllowedIPs — is written
down here as a comment and a test rather than as code, because it cannot work.
The WireGuard endpoint is that same address, so routing it into the tunnel
routes the handshake packets into the tunnel they are trying to establish. The
result is a loop and a connection that never comes up: the same blank page, now
with no way in at all.

Reaching the console over the VPN needs an address INSIDE the subnet — the proxy
answering on the hub address, and a name that resolves to it. That is a
deployment change, not something a config line can express.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-27 09:19:30 +02:00
..
Admin Dress the placeholder page, and record why the obvious VPN fix cannot work 2026-07-27 09:19:30 +02:00
Auth feat(auth): enterprise split login + signup (Fortify registration) via frontend-design 2026-07-25 18:16:27 +02:00
Concerns Give customers two-factor, and stop every button on the settings page reacting at once 2026-07-27 08:48:34 +02:00
Backups.php feat(portal): service framing + gradient line charts + billing button fix 2026-07-25 14:18:08 +02:00
Billing.php feat(billing): a proof register, and modules frozen at their booked price 2026-07-26 13:07:34 +02:00
Cloud.php feat(billing): the plan catalogue becomes three tables, and config stops selling 2026-07-26 12:05:56 +02:00
ConfirmCancelPackage.php fix(portal): no silent no-ops without a customer; maintenance visible per instance; maintenance form redesign 2026-07-25 19:10:44 +02:00
ConfirmCloseAccount.php fix(portal): no silent no-ops without a customer; maintenance visible per instance; maintenance form redesign 2026-07-25 19:10:44 +02:00
ConfirmRemoveOrder.php feat(billing): a cart you can actually read and change 2026-07-26 05:26:49 +02:00
CustomerProvisioning.php fix(engine-b): stop customer dashboard polling once provisioning failed 2026-07-25 13:06:31 +02:00
Dashboard.php feat(traffic): meter the monthly allowance, show it, throttle instead of blocking 2026-07-25 23:33:47 +02:00
Invoices.php feat(portal): service framing + gradient line charts + billing button fix 2026-07-25 14:18:08 +02:00
Settings.php Give customers two-factor, and stop every button on the settings page reacting at once 2026-07-27 08:48:34 +02:00
Support.php feat(portal): full sidebar — Cloud, Users, Backups, Invoices, Support 2026-07-25 08:08:33 +02:00
Users.php feat(billing): the plan catalogue becomes three tables, and config stops selling 2026-07-26 12:05:56 +02:00