Arising from int-0002 — Zero-ceremony operation — one binary, no server, no daemon
Self-host TeX Gyre Pagella; the system-font stack was silently broken on Linux
dira embeds subsetted **TeX Gyre Pagella** — regular, italic and bold — and stops relying on a font stack that resolves differently per platform.
Why this is a correctness fix, not a taste preference
`dec-0012` established that the UI is server-rendered and embedded in a Go binary that must work offline, and the reasoning recorded at the time was that webfonts "bloat the binary for zero functional gain." **That trade was miscounted.** The gain is cross-platform typographic determinism, which is exactly what the system-font rule existed to buy and was not delivering. `embed.FS` puts the subset inside the binary with no network call, so the offline guarantee is untouched. Total payload: 60.6 KB for three faces.
Why Pagella specifically
It is a **Palatino metric clone**, so every measure, leading and scale value already tuned in this system stays valid — self-hosting became a pure determinism fix with zero re-tuning. It was also the **only candidate with complete glyph coverage** for the characters this design uses, and the smallest subsetted payload of the five tested.
Licence obligations, met
GUST Font Licence (LPPL 1.3c). Renaming a derived work is *requested, not required* — GUST says so explicitly — and these files keep the Pagella name with outlines unaltered. LPPL 6b requires prominent notice of the nature of any change: these are **subsets**, recorded in `NOTICE` and `assets/fonts/README.md`.
What this does not change
The fallback chain stays in place behind the embedded face, so a build that somehow ships without the font still renders. `dec-0012`'s server-rendered, no-SPA architecture is untouched — this narrows only the "no webfont" reading of the offline constraint.
The reason this was found at all
Not by the design gates. A critic briefed to argue the direction should be reopened found it while building a case it ultimately conceded, and it is the third gate this session shown blind to what it appeared to guarantee — the coverage checker could not see its own untracked source, the contrast matrix could not see a composited tint, and the render harness cannot see a font fallback it will never experience. Same shape each time: the check validates the declaration rather than the rendered result.
Alternatives on record — 5
✗Keep the system stack — Palatino, Palatino Linotype, Book Antiqua, Georgia, serifrefused It resolves on macOS, mostly on Windows, and on a stock Linux install resolves to none of them, falling through to DejaVu Serif whose metrics are nothing like Palatino's.
A git-native developer tool has a large Linux audience, and every measure, leading and ratio in this design was tuned by rendering on macOS with Palatino loaded. That is precisely the failure the system-font rule was adopted to prevent, relocated to where the render harness structurally cannot see it, because the harness runs on macOS.
✗URW P052, the other Palatino metric clonerefused Eliminated on licence, not on design.
It is AGPL-3.0 with an exception covering PostScript and PDF documents ONLY. Embedding a woff2 in a Go binary and serving it over HTTP is neither a PostScript file nor a PDF, so the exception does not reach it, leaving bare AGPL-3.0 on an Apache-2.0 project. There is also no "URW Palladio" on Google Fonts; four candidate paths were checked and all 404.
✗Source Serif 4refused The cleanest licence of the set (OFL 1.1) and, contrary to the framing this bake-off started from, it preserves the existing ratios exactly.
Lost narrowly on glyph coverage: it lacks U+2011, the non-breaking hyphen, which this project's own documents use.
revisit ifa licence audit ever rules the GUST Font Licence unacceptable
✗Literata or Newsreaderrefused Both purpose-built for long-form screen reading and the most distinctive of the candidates, but both carry different metrics, so every measure and leading value would need re-tuning.
Both also have glyph gaps, and Newsreader has no arrows at all — a standing constraint for a tool that renders arbitrary agent-written prose.
✗Re-tune every ratio against DejaVu Serif, the worst-case fallbackrefused Correct for the weakest case and merely nicer everywhere else, at no binary cost.
Rejected because it accepts that the design a reviewer approves is not the design a third of the audience sees, and fixes the symptom rather than the determinism.