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 unchangedComposition v4.0Designed at 390px firstRail items 24 → 6
Generation
Width
app.relayctx.com — Relays1180 × desktop
RelaysSearch anything…⌘K
Filter
One sheet. Everything secondary lives here, not above the list.
TypeAny
FreshnessAny
Tags115 · search
CirculationAny
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 item
Where it goes in 4.0
Why
Dashboard · Inbox · Requests
Now
All three answer one question — what needs you. Five bands, empty bands render nothing.
Getting started
Now band 0
A band that disappears when done, not a permanent rail row.
Transfers
Relays
Renamed to the object. The user-facing noun is a relay; transfer is the API word.
Stream · Series · Sessions
Streams + type lens
One table in the platform. One surface, three types, one shared list shell.
Catalog · Trash
Files
Libraries and shelves are the taxonomy; trash is a scope, not a destination.
Graph
Explore
Graph · Catalog · Journey are three lenses over one corpus, behind one door.
Network · Connect · Capture
Connect
Everything you are connected to — agents, integrations, people, orgs — in one place.
Search
⌘K
Shell law: ⌘K is the principal search. A search page is a second vocabulary.
Send
Primary button
An action, not a place. It belongs where the thumb is.
Organizations · Contract · Team · Profile · Settings
You
Account 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
1Hand-reachable — Send sits in the topbar on desktop and at the thumb on a phone; the rail leaves the viewport entirely below 860px.
2One-thumb, few-step — receive, send, approve, open, forward and file are each one tap from Now or Relays.
3Legible at a glance — what it is, is it mine, is it fresh, did it work: answered in the card without scrolling. Titles never truncate to a stub.
4Answers immediately — skeletons shaped like the content, never a spinner that could mean anything.
5Recoverable — undo over confirmation dialogs; a failed load never renders as an empty state.
6Same object, same grammar — this stylesheet also dresses the operator console. No affordance is hover-gated without a touch path.
7Harness-honest — the agent gets the same object, composed as a taste with a link back here.