Never download, self-host or subset a font file from the source site. Match the tuple instead: classification, x-height/width feel, weight used, then re-tune tracking and leading with the alternative. void extract suggests alternatives per role (dna.json → typography.roles[].alternatives, map in packages/cli/src/extract/fonts.ts); this table adds tuning notes.
Licences: OFL = SIL Open Font License 1.1 (free for commercial use, embedding and self-hosting; can't sell the font alone). All OFL faces below are on next/font/google unless marked.
Sans / grotesk
| Source (foundry, licence) | Seen on | Free alternative (licence) | Tuning |
|---|---|---|---|
| Söhne (Klim, commercial) | Stripe | Inter Tight (OFL) for display, Inter or Geist (OFL) for text | Söhne 300 display → Inter Tight 300–400; keep −0.02em; Inter cv01, ss03 for a Söhne-like 1/a |
| Neue Haas Grotesk / Helvetica Now (Monotype, commercial) | hellohello | Inter Tight (OFL) display, Inter (OFL) text; Schibsted Grotesk (OFL) for a sturdier poster feel; Arimo (Apache 2.0) metric fallback | NHG Bold is wide: Inter Tight 700 needs ~−0.02em more tracking; don't copy −0.04em body tracking onto Inter |
| Suisse Int'l (Swiss Typefaces, commercial) | Clerk | Inter or Geist (OFL), Instrument Sans (OFL) | Suisse 700 H1 → Geist 600 at −0.03em |
| GT America / GT Standard (Grilli Type, commercial) | — | Inter, Geist, Schibsted Grotesk, Hanken Grotesk (OFL) | condensed cuts → Instrument Sans wdth 85 |
| GT Walsheim (Grilli Type, commercial) | Framer | DM Sans, Figtree, Outfit (OFL) | Walsheim 500 −0.04em → Figtree 600 −0.03em |
| Graphik (Commercial Type, commercial) | — | Geist, Inter, Albert Sans (OFL) | — |
| Circular (Lineto, commercial) | — | Figtree, DM Sans (OFL) | avoid Plus Jakarta Sans (overused) |
| Akkurat, Brown, Unica 77 (Lineto, commercial) | — | Inter, Schibsted Grotesk, Instrument Sans (OFL) | — |
| ABC Diatype / ABC Favorit / ABC Oracle (Dinamo, commercial) | Resend H2, TBC, Dia | Geist, Schibsted Grotesk (OFL); Space Grotesk (OFL) for Favorit's quirk at display only | Favorit −0.05em H2 → Space Grotesk −0.035em; never Space Grotesk as body |
| Aeonik (CoType, commercial) | — | Manrope, Geist, Figtree (OFL) | — |
| PP Neue Montreal / PP Mori (Pangram Pangram, commercial; free for personal use only) | — | Inter Tight, Hanken Grotesk, Instrument Sans (OFL) | "free for personal" is not a licence for client or company sites |
| Founders Grotesk (Klim, commercial) | — | Schibsted Grotesk, Hanken Grotesk (OFL) | — |
| Untitled Sans (Klim, commercial) | — | Inter, Geist (OFL) | — |
| Basis Grotesque, Apercu (Colophon, commercial) | — | Hanken Grotesk, DM Sans, Figtree (OFL) | — |
| Proxima Nova, Gotham, Sofia Pro, Avenir/Futura (commercial) | — | Figtree, Outfit (OFL); Jost (OFL) for Futura geometry | Montserrat is the literal match but reads as template; prefer Figtree |
| SF Pro / system-ui (Apple; not licensed for web embedding) | many | Inter (OFL); or keep system-ui as a fallback stack only |
— |
Serif
| Source | Seen on | Free alternative | Tuning |
|---|---|---|---|
| Tiempos Headline/Text, Domaine, Financier, Untitled Serif (Klim, commercial) | Linear accent, Resend H1, Attio | Newsreader (OFL, opsz), Source Serif 4 (OFL, opsz); Instrument Serif (OFL) for headlines ≥ 40px | Domaine 400 at 96px −0.01em → Newsreader 400 display −0.012em (editorial knob 0.35) |
| Canela, Ogg, Recoleta, Editorial Old, Saol, Lyon, Publico, Noe Display (commercial) | — | Instrument Serif, Fraunces (SOFT 50, WONK 0), Newsreader (OFL) |
high-contrast display: Instrument Serif; soft: Fraunces |
| GT Super / GT Sectra / GT Alpina (Grilli Type, commercial) | — | Instrument Serif (display), Newsreader, Fraunces (OFL) | — |
| PP Editorial New (Pangram Pangram, commercial) | — | Instrument Serif, Cormorant Garamond, Newsreader (OFL) | Cormorant only ≥ 32px |
| Ivar, Tobias, Signifier, Freight, Caslon, Sabon, Minion (commercial) | TBC (IvarText) | Newsreader, EB Garamond, Source Serif 4 (OFL) | EB Garamond needs +1–2px body size |
Mono
| Source | Seen on | Free alternative | Notes |
|---|---|---|---|
| Berkeley Mono (US Graphics; licence forbids editors/terminals/OSS apps) | Linear | Geist Mono, JetBrains Mono, Commit Mono (OFL; Commit Mono via @fontsource + next/font/local) |
local mono: adjustFontFallback: false |
| Söhne Mono, GT America Mono, Suisse Int'l Mono, ABC Diatype Mono, Aeonik Mono (commercial) | TBC labels | Geist Mono, IBM Plex Mono (OFL) | labels at +0.1–0.15em uppercase via label-mono |
| ABC Favorit Mono (Dinamo, commercial) | Arc, Dia | Space Mono, JetBrains Mono (OFL) | — |
| SF Mono, Operator Mono, MonoLisa, Input, PragmataPro (commercial or non-redistributable) | — | JetBrains Mono, Geist Mono, Commit Mono (OFL) | SF Mono only as a fallback stack |
Display and custom brand faces
| Source | Seen on | Free alternative | Notes |
|---|---|---|---|
| Custom brand faces (CursorGothic, Anthropic Sans/Serif, arcadia, quadrant, melange, "Family", Marlin Soft SQ, Exposure) | Cursor, Anthropic, Mercury, Granola, Family, Arc, Dia | match classification: Geist / Instrument Sans for grotesks, Newsreader / Instrument Serif for serifs, Fraunces for soft serifs, Figtree or Rubik (OFL) for rounded | custom faces are part of trade dress: a different free face is already a departure |
| Mercury's variable intermediates 360/420/480 | Mercury | any variable OFL face (Inter, Geist, Figtree) at 420/480 | intermediate weights are a premium signal worth borrowing |
| PP Right Grotesk / PP Neue Machina (commercial display) | — | Anton, Big Shoulders Display; Space Grotesk / Unbounded (OFL) | poster use only |
Licence traps
- Fontshare (Satoshi, General Sans, Cabinet Grotesk, Clash Display, Switzer): ITF Free Font License, not OFL; forbids subsetting/conversion. Don't use in open-source repos or with
next/fontsubsetting. - "Free for personal use" (Pangram Pangram, many foundry trials) is not a web licence for a business site.
- Google-hosted ≠ always OFL: Roboto and Roboto Mono are Apache 2.0 (also fine).
- Adobe Fonts / Typekit faces can't be self-hosted outside the subscription.
- Custom brand fonts are never available; don't look for mirrors.
After choosing
- Add the loader with the direction's CSS variable name (
craft/references/directions.md), or rename the variable in the direction file consistently. - Re-tune
--weight-displayand--tracking-displayagainst the source tuple, then compare H1 screenshots side by side. - Budget: ≤ 2 families + mono, ≤ 4 files, ≤ 120 KB (
perf/font-budget).