Design System

Foundations / Typography

Geist, compressed to the edge of legibility.

Three voices give every interface its rhythm. Display compresses to announce. Body relaxes to read. Mono labels — uppercase, tracked open — speak the operator's voice for asset codes, timestamps, and audit lines.

Display — 56 / 0.98 / -0.06em

Editorial minimalism for operators.
Geist 56 · weight 600 · tracking -0.06emHero only · one per surface

The decision to compress display type past comfort — into engineered-object territory — is the system's loudest move. At -0.06em the words stop reading as prose and start reading as labels, which is what operators scan for. Pair with line-height 0.98–1.02 so verticals stay tight; the negative tracking does the rhythm work.

Hierarchy comes from size and tracking — never from weight. Three weights only: 400 reading, 500 interactive, 600 announcing.

Display L — 42 / 1.02 / -0.055em

A design language for operations.
Geist 42 · weight 600 · tracking -0.055emAuth pages · page heroes

Heading 1 — 32 / 1.12 / -0.045em

Section title
Geist 32 · weight 600 · tracking -0.045emSection titles

Heading 2 — 24 / 1.2 / -0.035em

Card title or subsection
Geist 24 · weight 600 · tracking -0.035emCard titles · subsections

Body — 14 / 1.55 / -0.005em

Default UI body. Sufficient for dense screens, comfortable for reading.
Geist 14 · weight 400 · tracking -0.005emDefault UI body

Mono Label — 10 / 1.0 / +0.14em — uppercase

ASSET · A-01 · 14:32 · OPERATOR · J. DOE
Geist Mono 10 · weight 500 · tracking 0.14emField labels · timestamps · asset codes

Uppercase is a mono responsibility. Geist Sans uppercase fights the negative tracking and reads as shouting; Geist Mono with positive tracking reads as a label. This is the only rule the system breaks for: every uppercase string is mono.

Numbers are tabular. Any KPI, stat, table column, or time value uses tabular-nums. Operators compare numbers top-to-bottom; tabular prevents the jitter.