The system originally declared three stacks and loaded no webfonts. That was a real posture — nothing third-party, nothing to wait for — but it meant the brand's voice was whatever the reader's OS happened to own. This card tested what that actually cost. Outcome, in two rounds: the display face was bound first (Charis SIL, 28 KB), then the interface face (IBM Plex Sans, 40 KB). Only the mono is still a system face. Everything below is the evidence that produced those decisions, kept live so it can be re-checked rather than believed.
Applied on 2026-07-29:
--serif now leads with 'Charis SIL', bound in
colors_and_type.css from fonts/;
Cambria inserted ahead of Georgia in the fallback chain;
--t-stamp raised 9px → 10px, now the system's size floor; and mono
tracking documented as a maximum with a .12em–.16em tolerance.
Round two —
the sans, same finding: reviewing the applied kit, the interface face was still resolving to
whatever the OS owned — SF Pro, Segoe UI, Roboto, or a Liberation/Arial metric clone — with
Arial sitting at the end of the declared chain. That is the identical defect
round one fixed for the display face, left in place on the argument that the sans "carries short
strings". It does not: it carries the ledes, the card prose, every panel key and every ledger label.
Bound to IBM Plex Sans (IBM Corp., OFL 1.1), one variable file, 400–600, 40 KB.
Arial removed from the fallback chain outright.
The brief was "more dynamic than Arial" — which rules out another neutral grotesque, but not in the direction of personality for its own sake. This interface's job is to disappear behind the record, so the face needs grain without asking to be looked at.
| Candidate | Payload | Case | Verdict |
|---|---|---|---|
| IBM Plex Sans variable 400–600 |
40 KB | Humanist skeleton with engineered detailing — flared terminals, a tailed l,
a distinctly drawn a and g. Comfortable at the
13.5px UI density this system runs at. And it is the body face the sibling product already
declares — the Map Room's own design system names "IBM Plex Sans"
— so the public site and the private operator surface now share an interface voice while keeping
their own display faces. |
Adopted |
| Libre Franklin variable 400–600 |
29 KB | An American newspaper gothic — arguably the more "editorial" answer, and 11 KB lighter. Rejected because it is tighter at small sizes than Plex, and because nothing outside this package points at it. Evidence beat 11 KB. | Runner-up |
| Inter / system-ui the status quo |
0 KB | Free, and precisely the problem: a neutral grotesque that changes identity per platform and ends on Arial. | Rejected |
Total font payload is now 68 KB across two faces — still well under either single variable serif the display round rejected (Source Serif 4 at 119 KB, Newsreader at 129 KB).
Measured live with document.fonts.check() — not a guess about your
machine.
| Role | First entry that resolves here | Declared stack |
|---|
The H1 at 34px, 19ch measure, in each face the stack can land on.
The highlighted row is what this machine shows. Watch the measure and the colour of the block change —
this is the same CSS on every row.
Android resolves none of the four and falls to the generic serif
— Noto Serif, a fifth texture the system has never been reviewed in.
This is the finding that matters. The system's loudest typographic rule is
every headline figure is serif and tabular. Georgia's default numerals are old-style
— 3 4 5 7 9 descend, 0 1 2 sit at x-height. The ledger's
volt $0, the number that carries the whole investigation, drops to
two-thirds of the size it was designed at.
lining-nums
no effectThe fourth row proves the cheap fix does not work: classic Georgia ships no
lnum feature, so font-variant-numeric: lining-nums
has nothing to switch to. Only changing the face fixes this.
Count the roles: the serif has about six, the sans about seven — and the mono carries
eighteen: eyebrows, source lines, stamps, buttons, margin notes, panel labels, the live
chip, legend counts, method numerals, standards numerals, footer headings, the colophon, the
→ affordance, table meta, table captions, form labels, tab labels, counts. The
apparatus face is the interface, and ui-monospace resolves to SF Mono,
Cascadia Mono or Roboto Mono depending on the reader.
The .16em eyebrow tracking and .11em
stamp tracking were tuned on SF Mono. On a wider mono the eyebrow goes loose; on a narrower one the 9px
stamp tightens. Both are now documented in DESIGN.md §3 as maximums with a
.12em–.16em tolerance, to be reduced on a wide mono and never increased.
Separately: the stamp was 9px, the only type in the system under 10px, while carrying
status — raised to 10px, which is now the declared size floor.
Three bets, each self-hosted (no third-party request, the source's posture preserved).
Every row below is the live face, downloaded into fonts/candidates/.
A specimen line proves nothing until it sits in the panel row and the ledger it has to live in.
Was — Iowan Old Style
Newsreader
Serif voice / sans interface / mono apparatus, with every figure in the serif, is the correct system for a public-record project and was not touched. Three things changed:
--serif now leads with
Charis SIL, 28 KB, bound from fonts/: it makes the
already-declared Charter the guarantee, at a quarter the weight of the variable options. For a civic
project that has to load on any connection, that mattered more than an optical-size axis.
Cambria also went in ahead of Georgia, so the figure
rule survives even if the webfont never arrives..12em–.16em
tolerance, so a wider mono on Windows or Android gets tightened rather than left loose.Only the mono stays a system face. It carries short apparatus strings where every
candidate resolves to something competent, and its real variance is tracking, which is now documented as
a tolerance rather than a fixed value. The two faces a reader actually reads at length are both bound.
The system still makes no third-party request — fonts/ is
served from the project.
The adopted face ships in fonts/ with its
licence (OFL.txt). The two rejected faces stay in
fonts/candidates/ so this comparison remains re-renderable — a decision record you
can re-check rather than take on trust, which is the standard this system applies to every other figure it
publishes. Payload figures are the Latin subset as served; subsetting to this project's actual character set
would roughly halve them.