Atelier

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.