Skip to content

fonts: press the Anthropic suite, pin it to the NAS M.2, make it the daily driver - #418

Open
mecattaf wants to merge 4 commits into
mainfrom
work/anthropic-fonts-nas
Open

mecattaf wants to merge 4 commits into
mainfrom
work/anthropic-fonts-nas

Conversation

@mecattaf

Copy link
Copy Markdown
Owner

What

The Anthropic brand faces captured in ~/colors become the fleet's font suite, installed exactly like the Apple faces: three 0444 tarballs on nas:/mnt/fast/fonts/anthropic/ (README + SHA256SUMS, already uploaded and verified there), requireFile-pinned in pkgs/anthropic-{mono-nerd,ui,webfonts}.nix, seeded nightly. No font byte enters this repo.

pkgs/fontbuilder is the press (recipe only, no bytes): nix run .#fontbuilder -- ~/colors/waves/capture <out> reproduces the exact tarballs byte for byte (--verify-repro proved it on every artifact). Stage table, never-pass flags and the reproducibility argument are in pkgs/fontbuilder/README.md; the material, its defects, the naming arithmetic, the donor table and the ligature alignment are in docs/fonts/anthropic-suite.md; the runbook is docs/fonts/nas-and-bootstrap.md.

Two commits: the first installs the packages, the second switches kitty, the fontconfig generics and the GTK keys (approved in a review window spawned from the built packages).

Measured on the pressed faces

terminal faces 12 statics, AnthropicMono Nerd Font Mono, 13,440–13,444 codepoints each, every advance 1200, braille 256/256, calt 136 lookups
desktop Anthropic Sans / Anthropic Serif variable (wght 300–800, opsz 16–48), Anthropicons pinned
web 7 woff2 + anthropic-fonts.css under /etc/profiles/per-user/tom/share/webfonts/ and ~/.local/share/webfonts
tarballs mono 2,571,132 B, ui 726,204 B, web 830,195 B
acceptance pkgs/fontbuilder/tests/{accept,resolve,shape,a12}.py all 0 failures on this press

Bootstrap notes

  • The coordinator store is already seeded with the three tarballs; worker/client rebuilt before the 01:30 nightly need scp root@nas:/mnt/fast/fonts/anthropic/<file> . && nix-store --add-fixed sha256 <file>.
  • nix flake check is not a gate here (it fails on the untouched tree); the three host toplevel.drvPath evals pass.
  • Revert is two files together: the kitty font block and defaultFonts.

🤖 Generated with Claude Code

mecattaf and others added 4 commits September 17, 2026 07:17
The Anthropic brand faces captured in ~/colors (Sans, Serif, Mono, Anthropicons;
the anthropic.com "Web" 26.043.1 variable cuts, 14 files pinned by sha256) become
the fleet's own font suite, installed exactly the way the Apple faces are: one
0444 tarball per package on nas:/mnt/fast/fonts/anthropic/, requireFile-pinned
in pkgs/anthropic-{mono-nerd,ui,webfonts}.nix, seeded nightly by
update-center-seed. No font byte enters this repo (.gitignore now rejects them).

pkgs/fontbuilder is the press, a self-contained package that ships the recipe
and no bytes (`nix run .#fontbuilder -- <capture> <out>`, ~4 min): instance the
variable Mono to 12 statics, normalize names and style bits, completeness-merge
Greek/Cyrillic/math/braille from JetBrains Mono, DejaVu Sans Mono and Maple Mono
NF (every grafted glyph carries its donor as a name suffix), ligaturize from
Fira Code 3.001, re-seat each ligature against Anthropic's own strokes, Nerd-
patch last (--complete --mono --makegroups 4, 3.5.1), restore the ten PUA
glyphs the patcher overwrites, and canonicalize head+FFTM so two runs are
byte-identical (--verify-repro proved it on all 12+5+7 artifacts and the three
tarballs). The Sans/Serif stay variable (wght+opsz) with the doubled-"Web"
names, the missing italic bit on the variable row, the Serif wght-300 default
and the STAT " Italic" doubling repaired; the webfonts land under
share/webfonts via home.packages and a fontconfig glob reject, because
fontconfig here indexes woff2 and would contend with the TTFs.

Measured on the pressed faces: 13,440-13,444 codepoints per terminal face,
every advance 1200, braille 256/256, calt 136 lookups, nameID16
"AnthropicMono Nerd Font Mono" (28 of 31 chars), fc-scan spacing 100 on all
12 (the Light Italic source instanced to 90 before the phantom-delta repair).
Mono tarball 2,571,132 B. Acceptance suite in pkgs/fontbuilder/tests (kitty's
own resolver, shaping from the exact face, coverage, alignment, archive shape,
no live fontconfig side effects) passes on this press.

update-center-seed.nix now carries full archive paths (two vendor dirs), an
eval-time font-vs-font GC-root-name guard and a shell-time font-vs-node guard
(a tarball named tally.tar.zst used to clobber seeds/tally silently).

Docs: docs/fonts/{README,anthropic-suite,nas-and-bootstrap}.md and
pkgs/fontbuilder/README.md. Personal use only, per Tom's ruling; the faces
have no published licence and are never redistributed.

This commit installs the packages only; the consumers (kitty, fontconfig
generics, GTK) move in the next commit, after the review window.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… suite

Approved by Tom in the review window (kitty spawned on the live niri session
with the built packages through a private fontconfig; the process mapped the
four AnthropicMonoNerdFontMono faces and nothing from Liga SFMono).

kitty.conf names the family in the family="…" style="…" form, the only one
whose result depends neither on the monospace alias nor on nameID4 surviving a
patcher release (kitty looks bare strings up verbatim and falls through to
fc_match silently; measured table in the file). Bold stays SemiBold.
fonts.fontconfig.defaultFonts puts Anthropic Sans / Serif / AnthropicMono Nerd
Font Mono first with the outgoing families second, so a failed build degrades
to yesterday's rendering rather than DejaVu. GTK font-name, document-font-name
and monospace-font-name move together at the same sizes. sf-pro and
sfmono-liga stay installed; the revert is this kitty block plus defaultFonts,
together, and a switch.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
fontTools reads the glyph header xMin/xMax as -12/1212 on every terminal face
while a BoundsPen over the drawn contours gives -11/1213; both are the same
Nerd box-art outline, and the assertion (x0 <= 0, x1 >= 1200) holds either way.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…one retry

resolve/shape/geometry/a12 take the driver's uniform '<out> --src <dir>' form
and --allow-partial for smoke builds (resolve.py declines to judge the four
roles on a subset; shape.py skips absent faces). shape.py spawned ~45 kitty
processes through one shared JSON path and once believed an empty result:
each probe now writes its own file and an empty spawn is retried once.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@mecattaf mecattaf added the additive-after-rebase triage bucket 2026-09-20 label Sep 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

additive-after-rebase triage bucket 2026-09-20

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant