
LOS ANGELES, CALIFORNIA
Every token, primitive and state in the product, rendered once so the team can audit it in one pass. The values on this page are measurements from reference/TOKENS.md, not preferences. If a screen needs a visual idea that is not here, it is added here first and consumed second.
Near-black ground, paper ink, one accent. The satellite image supplies all other colour, which is why the interface holds none. Signal orange marks status and live elements only — measured discipline is one accent, used once on a page. A signal-coloured element that is not reporting a state is a bug.
Use as Tailwind utilities — bg-void / border-hairline / text-paper-dim / text-signal. Never hard-code a hex outside app/globals.css.
Six roles and no seventh. Display and body are Inter; labels and data are IBM Plex Mono, uppercase and letterspaced. Note the two findings that are easy to get wrong: display is set at weight 400, not bold, and body line-height is 1.2, not 1.6. The scale compresses from both ends on a phone — display shrinks while label, body and action grow.
A photograph of your home, taken from orbit.
The capture window opens for six days.
Give an address. A satellite is tasked. The frame is composed with its telemetry, printed in your region and shipped as a finished object.
A mission is a request to photograph a single address from orbit and to deliver that photograph as a finished print. The digital file is a by-product of producing it.
Capture window open
Start mission
Mission 32BF / capture window open
34.0522, -118.2437 · 18:42 11.02.2026
Shot from Space / print credit
Shell UI is sentence case. Uppercase belongs to the label eyebrow and the monospace telemetry layer — nowhere else, and never to a sentence. Readouts carry data-telemetry for tabular figures.
One container, three widths, one grid. Wide carries every top-level band; narrow carries prose and forms; flush is for media that must reach the viewport edge. The 12-column grid holds at every width — the column count never drops to four on a phone, spans change instead, which is what keeps the layout reading as one system rather than three breakpoint designs.
GRID12 — 12 COLUMNS, 20 PX COLUMN GAP, 18 PX ROW GAP
No screen sets its own max-width and no screen declares its own gutter. Both come from Container.
The single most important measurement in the system. Section padding on the reference page is 0, 20, 32, 48 or 56 — never one repeated value. Sections are sized by their media; the rhythm comes from padded bands alternating with full-bleed plates that butt directly against their neighbours. A uniform py-12 on every section is the fastest way to make a page read as a template.
Padded band — top and bottom at 48.
FLUSH PLATE — 0 / 0
Following band — 20 above, 32 below.
SPACER — BASE 32 / LG 48 / XXL 80—112, FOR GAPS INSIDE A BAND
Band takes top and bottom separately and they are rarely the same value. There is no uniform section spacer token and none is to be added.
The most important component on the site. A hairline frame, registration marks, and one telemetry rail beneath the picture. The rail holds at most six values: coordinates, timestamp and up to four file tags. Extra tags are dropped, never wrapped into a second band.



Props — src alt width height lat lon capturedAt tags caption aspect priority sizes credit label creditAlign className.
A dossier has no drop shadows and no rounded corners. Depth is a 1px hairline and a darker well. Corner marks are registration marks — they say the thing is a frame, not that it is clickable.
The base surface. A label bar appears only when the frame is holding a named block.
Active tone plus registration marks. Used for the block a screen is currently acting on.
Alert tone. Reserved for a block reporting a failed or blocked step.
RULE — DEFAULT
RULE — SOFT
Label left, dotted lead, value right. The lead shrinks before the value does, so a long value wraps under its own label instead of forcing a horizontal scroll at 390px.
DATAROW — THREE TONES
KEYVALUEGRID — COLUMNS=2
Chips report a stage; the orbit diagram reports a pass. The diagram is instrumentation — bearing ring, graticule, ground track, pass marker — and the rule is one per viewport. Two of them on a screen is the fastest way to make the page look like a toy.
The tilt is read from the track string, so the drawing always agrees with its label. Strokes are non-scaling: hairlines stay 1px whether the diagram is drawn at 96px or 220px. Pass animated only when a pass is genuinely live.
Props — track inclination altitudeKm size phase animated.
There is no spinner in this product. A pending thing is a plate being scanned, an unavailable thing is hatched like a struck-out field, and a failure states what failed and what happens next, in mission voice.
SKELETON — ASPECT
SKELETON — LINES
SCANSWEEP — REPEATING
This account has not filed a target yet. Start a mission and the record will appear here as soon as the address is resolved.
CAPTURE FAILED
Cloud cover exceeded the threshold on three consecutive passes. The window has been reopened at no cost. No action is required.
FORMAT F70 — UNAVAILABLE IN THIS REGION
One control, everywhere: 3px radius, a self-coloured 1px border, 44/44/52px tall on 20/32/40px of inline padding, and a monospace uppercase label at 12px on positive tracking. Primary is ink on ground and recedes one step on hover; secondary is a 45% hairline; ghost is text. Every size clears a 44px tap target — small means narrower, never shorter. <Button>, <ActionButton> and <CommsButton> are three APIs over this one anatomy.
Loading keeps the label at full strength, dims the words and runs a sweep. Disabled withdraws the whole face to 35% rather than rebuilding it, so a disabled primary can never be mistaken for an enabled secondary. Neither uses a spinner.
A mission, filed: image plate on top, telemetry block beneath. The whole card is one link, so the tap target is the card, not the code.
Numbered sections are the spine of the site. Index in the accent, title in monospace, body in sans, hairline between every step.
An address is resolved to decimal coordinates and a capture area. The customer sees the area, not a street pin.
The coordinates go to the imaging provider. A capture window opens; passes are attempted until the frame clears cloud.
The capture is graded and composed with its telemetry: coordinates, timestamp, orbit, mission code, credit.
US orders print in the US, EU orders in the EU. The print ships from the facility nearest the address on file.
The name is a print credit on a film frame — a small bordered box paired with telemetry. It is set in type in exactly one component, which caps itself at md and refuses anything larger. It is never centred as a hero, never coloured with the accent, never enlarged.
SIZE XS — FRAME CORNER
SIZE SM — DEFAULT
SIZE MD — CEILING
There is no larger size. A caller passing one gets sm. If a screen needs a big line of type, it needs a headline.
One fixed layer over the document, mounted once in the root layout. It sits below the header so it never films over navigation, it is pointer-events none, and it drops further on 2x displays. At this strength it reads as emulsion on the page, not as noise on the photograph. If you can see it on an image, it is too strong.
GrainOverlay is mounted in app/layout.tsx. Never mount a second one — two layers double the opacity.