Preview card 10 · type audit · decided

Is the type system carrying its weight?

Live specimens, not descriptions
Outcome: Charis SIL + IBM Plex Sans, 68 KB

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.

Round two · why IBM Plex Sans

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.

CandidatePayloadCaseVerdict
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).

1 · What resolves, right now, in this browser

Measured live with document.fonts.check() — not a guess about your machine.

RoleFirst entry that resolves hereDeclared stack

2 · The finding — the display face was different on every platform

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.

macOS / iOSIowan Old Style
stack position 1
Four deeds that record no price, and a $15M public purchase.
macOS onlyCharter
stack position 2
Four deeds that record no price, and a $15M public purchase.
WindowsGeorgia
stack position 3 wider · larger x-height · old-style figures
Four deeds that record no price, and a $15M public purchase.
Last resortTimes New Roman
stack position 4 print face, thin on screen
Four deeds that record no price, and a $15M public purchase.

Android resolves none of the four and falls to the generic serif — Noto Serif, a fifth texture the system has never been reviewed in.

3 · The finding that decided it — the figure rule broke on Windows

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-style3 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.

Iowan Old Stylelining · tabular
as designed
$0   $15M   90.6%   197   43.23 ac
Charterlining · tabular
$0   $15M   90.6%   197   43.23 ac
Georgiaold-style · tabular rule broken
$0   $15M   90.6%   197   43.23 ac
Georgia+ lining-nums no effect
$0   $15M   90.6%   197   43.23 ac

The 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.

4 · The mono is doing the most work and is the least specified

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.

ui-monospace
(SF Mono here)
The corpus · lead investigation Prototype · 197 matches early 14-source fixture · prototype snapshot
Menlo
(wider)
The corpus · lead investigation Prototype · 197 matches early 14-source fixture · prototype snapshot
Courier New
(worst case)
The corpus · lead investigation Prototype · 197 matches early 14-source fixture · prototype snapshot

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.

5 · Candidates — the same H1 and the same ledger, in real type

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/.

WasIowan Old Style
macOS only
Four deeds that record no price, and a $15M public purchase.
$0   90.6%   43.23 ac
Candidate A — ADOPTEDCharis SIL
a Charter derivative
28 KB · 2 static weights
now the system face
Four deeds that record no price, and a $15M public purchase.
$0   90.6%   43.23 ac
Candidate BSource Serif 4
variable, opsz 8–60
119 KB
Four deeds that record no price, and a $15M public purchase.
$0   90.6%   43.23 ac
Candidate CNewsreader
variable, opsz 6–72
129 KB
Four deeds that record no price, and a $15M public purchase.
$0   90.6%   43.23 ac

In the actual components

A specimen line proves nothing until it sits in the panel row and the ledger it has to live in.

WasIowan Old Style
Planned city purchase$15M
Prototype matches197
Charis SIL
Planned city purchase$15M
Prototype matches197
Source Serif 4
Planned city purchase$15M
Prototype matches197
Newsreader
Planned city purchase$15M
Prototype matches197
The ledger, on dark

Was — Iowan Old Style

Sale price recorded on the 2021 deeds$0
Council roll-calls machine-readable90.6%

Newsreader

Sale price recorded on the 2021 deeds$0
Council roll-calls machine-readable90.6%

What each option costs

Option 0 · free · ALSO APPLIED0 KB Insert Cambria before Georgia in the stack. Cambria ships with Windows and Office, is a screen-first transitional close to Iowan in weight, and — unlike Georgia — has lining tabular figures by default. Fixes the figure break for most Windows readers. Does not fix Android, and the voice still varies.
Option A · Charis SIL · ADOPTED28 KB Self-host the Charter derivative already declared at stack position 2. The face becomes identical everywhere and the documented intent does not change — you are guaranteeing a face the system already names, not adding one.
Option C · Newsreader129 KB Self-host a newsroom face with an optical-size axis, so 44px headlines tighten and 21px panel figures stay sturdy — one file doing what two opticals would. The most voice, the most bytes.
Outcome · applied 2026-07-29

The architecture was right. One face has stopped being a guess.

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:

  1. The display face is self-hosted. --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.
  2. The stamp went 9px → 10px, and 10px is now the declared size floor. It carries status — we hold this versus this is not yet obtainable — which is the one thing a reader must not squint at.
  3. Mono tracking is documented as a maximum with a .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 requestfonts/ 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.

← All preview cards