Colophon
What this site is set in, what it is built with, and which decisions were made on purpose. A colophon is the part a reader can check you on, which is the reason to write one.
The types
Nine faces, all variable, all open licensed. Eight are the specimen cast, one to a class. The ninth, Source Serif 4, is doing two jobs at once — it sets every paragraph on this site and stands as the transitional serif in the cast, which /voice discloses rather than hides. Designer and licence for each were read from the google/fonts metadata, not from memory.
Archivo
grotesque
The grotesque seat in the cast, with a genuine width axis (62–125) that the pairing bench can actually measure.
- designer
- Omnibus-Type
- released
- 2016, from 19th-century grotesques
- licence
- OFL 1.1
- axes
- wght 100–900 · wdth 62–125
- in file
- 478 glyphs · 349 characters
- shipped
- 116KB woff2
Inter
screen sans
The default typeface of the modern web, here so the reader can see what everything else is being compared against.
- designer
- Rasmus Andersson
- released
- 2017, drawn for interfaces
- licence
- OFL 1.1
- axes
- opsz 14–32 · wght 100–900
- in file
- 918 glyphs · 347 characters
- shipped
- 102KB woff2
Source Serif 4
transitional serif
Doing two jobs here: the site's reading face and the transitional-serif specimen. It has a real optical size axis and real small caps, and both lessons lean on it.
- designer
- Frank Grießhammer, Adobe
- released
- 2014–2021, from 18th-century models
- licence
- OFL 1.1
- axes
- wght 200–900 · opsz 8–60
- in file
- 734 glyphs · 342 characters
- shipped
- 215KB woff2
Bodoni Moda
didone
The didone seat, with the widest optical size axis in the cast (6–96) — the hairlines only survive because of it.
- designer
- Owen Earl, indestructible type*
- released
- 2020, from Bodoni's 1790s originals
- licence
- OFL 1.1
- axes
- wght 400–900 · opsz 6–96
- in file
- 500 glyphs · 343 characters
- shipped
- 63KB woff2
Roboto Slab
slab serif
The slab seat, and one of only three faces here with real small caps — the Apache licence is also the odd one out, which the colophon notes.
- designer
- Christian Robertson, Google
- released
- 2013, from 19th-century egyptians
- licence
- Apache 2.0
- axes
- wght 100–900
- in file
- 558 glyphs · 343 characters
- shipped
- 52KB woff2
Public Sans
humanist sans
The humanist seat, and the source of the 45-to-90 measure guidance quoted on /measure — the face and the rulebook come from the same team.
- designer
- USWDS; based on Libre Franklin
- released
- 2019, for the US Web Design System
- licence
- OFL 1.1
- axes
- wght 100–900
- in file
- 436 glyphs · 340 characters
- shipped
- 29KB woff2
JetBrains Mono
monospace
The monospace seat. Its wght axis stops at 800, not 900, which made it this build's first proof that published ranges cannot be trusted.
- designer
- Philipp Nurullin, Konstantin Bulenkov
- released
- 2020, for code editors
- licence
- OFL 1.1
- axes
- wght 100–800
- in file
- 547 glyphs · 346 characters
- shipped
- 44KB woff2
Bricolage Grotesque
display
The display seat, with three axes (opsz, wdth, wght) — and a width axis that only narrows, which /specimen demonstrates.
- designer
- Mathieu Triay
- released
- 2023, unapologetically
- licence
- OFL 1.1
- axes
- opsz 12–96 · wght 200–800 · wdth 75–100
- in file
- 417 glyphs · 320 characters
- shipped
- 165KB woff2
Recursive
interface sans
Its MONO axis turns the same family monospaced for numerals, so every readout keeps a fixed rhythm without loading a third typeface.
- designer
- Stephen Nixon, Arrow Type
- released
- 2020, drawn for screens and code
- licence
- OFL 1.1
- axes
- MONO 0–1 · wght 300–1000
- in file
- 765 glyphs · 348 characters
- shipped
- 122KB woff2
The five values
There is no accent colour on this site, and no sixth value. Active states, focus rings, live feedback and selection are all carried by inversion, rule weight or type weight. A page arguing that type carries meaning does not get to reach for a colour the moment it needs to signal something, and the constraint turned out to be productive: it forced the type sizes further apart than they would otherwise have gone.
- --vanilla#F2EDE3page
- --stock#E8E1D4inset panels, instrument wells
- --ink#16150Fall reading text; inverted field
- --gray#635F57labels, captions, metadata
- --rule#CFC7B7hairlines only, never text
One value was changed
The palette this site was briefed with set --gray at #78736A. Measured against the page it scores 4.04:1, and against the inset panels 3.62:1 — below the 4.5:1 that WCAG AA requires for text at these sizes, on both of the two surfaces it ever sits on. Since that value carries every label, caption and readout on the site, it failed everywhere it appeared. It was darkened to #635F57, which scores 5.45:1 and 4.89:1 and keeps the same warm cast.
The hairline value has a related constraint worth recording. --rule is 1.44:1 against the page, which is correct for a hairline and disqualifying for anything that bounds a control. So every slider track, thumb and focus ring on this site is drawn in ink or gray, never in rule, to clear the 3:1 non-text contrast floor.
How it is built
Next.js 16 with the App Router, React 19.2, TypeScript in strict mode, Tailwind 4. Content lives in typed files in the repository — no CMS, no database, no accounts, and nothing is stored about anyone. There is no analytics script, no cookie banner and no newsletter capture, because the site collects nothing and so has nothing to ask for.
All motion is native CSS. Scroll-driven animation uses animation-timeline: view() inside an @supportsguard, so browsers without it get the final state rather than a broken page. There is no animation library. Three motion moves exist in total: page titles open their tracking on entry, the home page’s hero sets itself once on load, and reading text lifts in. Under prefers-reduced-motion every final state renders immediately.
The fonts are the interesting part of the build. Every axis range, OpenType feature list, glyph count and character grid on this site is read out of the shipped woff2 binaries by a script, so no axis range is ever typed by hand. Four of the nine faces had real ranges that differed from their published notes. The binaries are subsetted from the upstream originals with harfbuzz, retaining all layout features — an earlier pipeline subsetted by character range and silently destroyed the small capitals that /case exists to demonstrate, which is the sort of failure that ships.
Credits and terms
Written, designed and built as a standalone editorial asset. The measure guidance on /measure follows Robert Bringhurst’s The Elements of Typographic Style for the 45-to-75 character band, and the US Web Design System for the wider 45-to-90 working range. Typeface metadata comes from the google/fonts repository.
Eight faces are licensed under the SIL Open Font Licence 1.1. Roboto Slab is the exception, licensed under Apache 2.0. Both licences permit the embedding and subsetting performed here; the subsetted files carry their original name and licence metadata intact.
Every claim on this page can be checked against the files. That is what a colophon is for.