Lumen
Styles

Typography

Three voices — an optical serif for editorial lines, Geist for the interface, Geist with tabular figures for data.

Lumen speaks in three voices — the type equivalent of the brand's core tension, the warmth of care and the precision of an instrument.

Week 28, and right on track.
Halo checks each reading against your plan and tells you when something needs a look.
118/76 mmHg

The three voices

VoiceFaceCarriesWhere
EditorialFraunces (optical serif)warmth, character, the humanthe headline, and the one sentence that says how she is doing
InterfaceGeist (grotesque sans)precision, calm, legibilitybody, UI, labels, nav
DataGeist (tabular figures)exactnessvitals, labs, doses, time; Geist Mono only for codes and IDs

Fraunces is a variable old-style serif with an optical-size axis — it adapts its contrast to the size, and that optical idea is the same one the whole brand comes from (the lens, the eye). It reads warm and editorial without tipping into clinical-cold or consumer-cute. Geist stays the workhorse — neutral and precise, it does the reading. The serif is the warmth; the sans is the instrument.

Restraint

The serif is spent on editorial lines only: a headline, and the one sentence that says how she is doing. It never sets a number, and never sets interface text. check_truth.py enforces both rules.

Type scale

Every role, rendered from its --type-* token. Sizes follow iOS points, so body text is 17. Nothing is smaller than 12. Use the type-* utilities from lumen/tailwind.css (type-display, type-body, type-metric-xl, …); each sets the face, weight, size, leading and tracking together.

display · editorial
Fraunces · 400 · 40/44
Week 28, and right on track.
title · editorial
Fraunces · 400 · 28/34
Your blood pressure is steady
lede · editorial
Fraunces · 400 · 20/28
It has stayed in range for nine mornings in a row. Keep logging before coffee.
ui-title · ui
Geist · 600 · 22/28
Blood pressure
headline · ui
Geist · 600 · 17/22
This week
body · ui
Geist · 400 · 17/24
Halo checks each reading against your plan and tells you when something needs a look.
callout · ui
Geist · 400 · 15/20
Logged at 7:42 this morning from your cuff
label · ui
Geist · 500 · 15/20
Log a reading
footnote · ui
Geist · 400 · 13/18
Source: Omron cuff. Synced 2 minutes ago.
caption · ui
Geist · 500 · 12/16
Mon Tue Wed Thu Fri
metric-xl · data
Geist · 300 · 56/60
118/76
metric-l · data
Geist · 400 · 34/40
9.1
metric-m · data
Geist · 500 · 22/28
64
unit · data
Geist · 400 · 17/22
mmHg

Tokens: --font-display (= --font-serif), --font-sans, --font-mono — or the Tailwind utilities font-display, font-sans, font-mono from lumen/tailwind.css.

Numerals

Anything quantitative — vitals, labs, doses, gestational age — sets in Geist with font-variant-numeric: tabular-nums (the data roles set it for you) so columns stay aligned and digits never reflow as they tick. A view leads with one focal number: metric-xl (56) for the hero, metric-l (34) inside a card, metric-m (22) in rows and tiles. The unit sits beside it in unit (17), muted.

On this page