One chrome for every public view — the pages served to people who aren't (or aren't yet) signed in: HTTP error pages, the maintenance screen, link-expiry notices, claim gates. Each view fills the shell's slots and inherits everything else: the mark, the status strip, tokens, dark mode, and the triage beacon that reports the hit to /api/frontend-error under category public — so a spike of dead public links lights up the console shell like any other incident.
The page, Relay Code, or invite link doesn't exist or has expired. If someone sent you this link, ask them for a fresh one.
ref PB-M9K2H2-77D · reported automatically — quote it to support
| Slot | Contract |
|---|---|
.mark | The Open Signal mark, currentColor on --rly-accent-ui. Never the wordmark — public views stay quiet. |
.status-strip | Mono eyebrow: the machine state (HTTP 404 · reported, maintenance · back soon). Error states tint --rly-error, notices tint accent, neutral otherwise. |
.code | Oversized mono status code. Omitted (empty ⇒ hidden) on non-HTTP views like notices and claim gates. |
h3 + .body | Display-italic headline in product voice, one short body paragraph. No jargon, no blame, next step always stated. |
.actions | At most one accent button + one ghost. Default: Go home → relayctx.com; 503 adds Status, expiry adds Request a new link. |
.support | Mono support ref (PB-…) minted by the beacon. Same lookup key the console Error Log resolves — one vocabulary from app (CE-), boot (BF-), and public (PB-) surfaces. |
Every shell-based view ships this snippet — the same ingest the app's error screens and boot watchdog use, so public-surface failures join the one pipeline (journald + frontend_errors + spike alerts, category public):
<script>
try {
var ref = 'PB-' + Date.now().toString(36).toUpperCase() + '-' +
Math.random().toString(36).slice(2,5).toUpperCase();
document.getElementById('shSupport').textContent =
'ref ' + ref + ' · reported automatically — quote it to support';
navigator.sendBeacon('https://app.relayctx.com/api/frontend-error', JSON.stringify({
ref: ref, type: 'public-404', // public-500 / public-503 / public-expired
url: location.href, timestamp: new Date().toISOString(), ua: navigator.userAgent
}));
} catch (e) { /* reporting never breaks the page */ }
</script>
Spike thresholds live in relay-platform (docs/GUIDE.client-error-triage.md): a burst of public-* reports raises a public-category warning in platform_alerts → the console shell chips + Slack. A dead link shipped in a campaign email stops being invisible.
handle_errors), maintenance, join/claim landings' failure states, link-expiry notices.prefers-color-scheme via the token file's data-theme stamp; every state must read in both.