RelayCTX / Concept · app · v4.0 Console concept →
Experience 4.0 · the coherence release

Six places, one grammar

v3.5 settled the material — colour, type, motion. Nothing here changes it. What 4.0 versions is the layer above: how surfaces are arranged, how an object reads, and how much a person has to hold in their head to use Relay on a phone. The whole proposal is legible in one switch below.

Material v3.5 unchanged Composition v4.0 Designed at 390px first Rail items 24 → 6
Generation
Width
app.relayctx.com — Relays 1180 × desktop
Relays Search anything… ⌘K

Nothing is hidden — everything gets a home

The rail carries places. Actions are not places: Send is a button, Search is ⌘K (shell law 4), and identity settings live under You. Three of the removals are not judgement calls — Streams, Series and Sessions are literally one table in the platform (pulse_contexts, differing only by pulse_type), so they are one surface with a type lens, not three pages.

v3.5 rail itemWhere it goes in 4.0Why
Dashboard · Inbox · RequestsNowAll three answer one question — what needs you. Five bands, empty bands render nothing.
Getting startedNow band 0A band that disappears when done, not a permanent rail row.
TransfersRelaysRenamed to the object. The user-facing noun is a relay; transfer is the API word.
Stream · Series · SessionsStreams + type lensOne table in the platform. One surface, three types, one shared list shell.
Catalog · TrashFilesLibraries and shelves are the taxonomy; trash is a scope, not a destination.
GraphExploreGraph · Catalog · Journey are three lenses over one corpus, behind one door.
Network · Connect · CaptureConnectEverything you are connected to — agents, integrations, people, orgs — in one place.
Search⌘KShell law: ⌘K is the principal search. A search page is a second vocabulary.
SendPrimary buttonAn action, not a place. It belongs where the thumb is.
Organizations · Contract · Team · Profile · SettingsYouAccount management is a hub you visit, not chrome you carry on every screen.
Demo · Receive · Admin Console ↗You (role-gated)Hide, don't disable — and don't reserve rail space for three people.
The removals are reversible and measurable. Every row above is a redirect, not a deletion — deep links keep working, and the streamlined cohort flag already shipped as a server-side lever for hiding advanced surfaces. 4.0 makes the streamlined shape the default and lets depth be something you walk toward.

Hats are walls. Lenses are windows.

Relay already has a Cloudflare-grade layer model — access, projection, features — but the product never names it, and "lens" is currently spent seven different ways across the estate. 4.0 gives a person exactly two verbs. Switching a hat re-seals: objects in another workspace are not dimmed, they are not there. Switching a lens re-weights: everything stays, emphasis moves. Positions never change — that is what proves a hat is a boundary and not a filter.

Hats and lenses — one corpus
Hat — a wall
Lens — a window
the ruling

A lens never grants

Narrowing a view must never widen access. Authorization is evaluated once, server-side, before any lens renders — so a lens is presentation over an already-filtered set. This is already law in projection.py; 4.0 makes it visible vocabulary rather than an internal invariant.

the fix it forces

Three denials, three sentences

Today one string covers all of them: "not available on your plan." It is wrong twice out of three times. 4.0 branches on the denial source — plan → upgrade · org → ask an admin · absent here → switch hats.

what it retires

Seven meanings, one word

Arrange lenses, scope lenses, library lenses, audience lenses, search lenses, list lenses and workspace lenses all currently share a name. 4.0 ships a glossary: the switcher is the hat; Force/Time/Orbit/Heat is Arrange; Active/All/Archived is scope; audience is audience.

Depth behind a bounded door

Graph transfers, chains and the corpus map stay as deep as they are. What 4.0 standardises is the door: every rich surface opens on a bounded, current working set — never a dump — and the person pulls the thread from there. This contract is already ratified for the Graph Map (render cap 250, hard ceiling 500, capsules over members); 4.0 applies the same door to Files, Journey, and any surface that can exceed a screen.

Explore — the working set
Search the corpus…
The load is sized by the viewport, not the corpus. A workspace with 15,000 objects fetches roughly what one with 150 fetches — only the honest total grows. The counter always describes what is drawn, never what exists, and a capped response is never allowed to look complete. That single rule is why depth here does not become weight.

What 4.0 does not touch

material

Every value is v3.5

This page imports /brand/generated/relay-tokens-v36.css and invents no colour. Neutral surfaces, teal on touch points only, one italic display moment per view, flat, 0.5px borders, mono for data. If a 4.0 screen needs a new token, the composition is wrong.

no deviation left

RCTX-240 is decided

These pages once overrode the fill to #0f766e ahead of the ruling, because the shipped #0d9488 is 3.74:1 with white and fails AA at button sizes. RCTX-240 was ratified on 2026-08-12, so the override is gone — the fill now reads straight from --rly-accent-fill like every other value here.

vocabulary

The locked words hold

Code, not PIN. Receive on the button. Stream, not the old wire name. Relay is the object and the verb. ⇄ stays the Code anchor in rich and plain alike. 4.0 renames surfaces, never the primitives.

The bar this is drawn against

Concept — not a build instruction. Direction doc: relay-board/docs/product/experience-4-0.md Console concept → Hats & Lenses v1 → All concepts →