public views · category anchor · v3.5 neutral-first

The public .shell

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.

HTTP 404 · reported
404

This context didn't transfer

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

Anatomy — the slots

SlotContract
.markThe Open Signal mark, currentColor on --rly-accent-ui. Never the wordmark — public views stay quiet.
.status-stripMono eyebrow: the machine state (HTTP 404 · reported, maintenance · back soon). Error states tint --rly-error, notices tint accent, neutral otherwise.
.codeOversized mono status code. Omitted (empty ⇒ hidden) on non-HTTP views like notices and claim gates.
h3 + .bodyDisplay-italic headline in product voice, one short body paragraph. No jargon, no blame, next step always stated.
.actionsAt most one accent button + one ghost. Default: Go homerelayctx.com; 503 adds Status, expiry adds Request a new link.
.supportMono 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.

The triage beacon

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.

Category rules