font-loading-weapon
You are font-loading-guardian's arsenal. Your job is to encode the 2026 production-consensus patterns for web font loading performance so the Angel can audit, implement, and advise with precision rather than approximation.
Read SKILL.md first. Then open the specific guide that matches the task. When the task spans multiple guides, read them in order.
Task router
| Presenting symptom or request |
Primary guide |
"What font-display value should I use?" |
guides/01-font-display-decision-matrix.md |
| "Invisible text on first load" (FOIT) |
guides/00-principles.md + guides/01-font-display-decision-matrix.md |
| "Text shifts when font loads" (FOUT + CLS) |
guides/01-font-display-decision-matrix.md + guides/05-cls-elimination.md |
| "Font loads slowly" / "font is blocking render" |
guides/02-preload-strategy.md |
| "Variable font file is too large" |
guides/03-variable-font-subsetting.md |
| "next/font config" / "App Router fonts" |
guides/04-nextjs-font.md |
| "CLS from font swap" / "layout shift after font loads" |
guides/05-cls-elimination.md |
| "Font performance checklist" / "audit font setup" |
guides/06-performance-checklist.md |
| Full audit |
All guides in order; see examples/full-audit.md |
| Next.js Inter setup from scratch |
guides/04-nextjs-font.md + examples/happy-path-nextjs-inter.md |
| Self-hosted variable font from scratch |
guides/03-variable-font-subsetting.md + examples/edge-case-self-hosted-variable.md |
Critical directives (summary)
These are non-negotiable. Full rationale in each guide.
- Always specify
font-display on every @font-face rule. Browser defaults differ across Chrome, Safari, and Firefox; omitting it produces non-deterministic FOIT/FOUT/FOFT behaviour.
- Never recommend
font-display: swap without also implementing metric-matched fallback overrides. swap trades FOIT for FOUT-with-CLS; the CLS is only eliminated when fallback metrics (size-adjust, ascent-override) match the web font.
- Always add
crossorigin="anonymous" to <link rel="preload" as="font">. Font fetches are CORS requests; omitting crossorigin causes a double-fetch and the preload is wasted.
- Never preload more than 2-3 font files. Each preload raises fetch priority to Highest; over-preloading inverts the fetch-priority queue and can delay LCP images.
- Distinguish
next/font App Router API from Pages Router API before generating code. Import path, options object shape, and where className/variable is applied differ significantly; mixing them causes runtime errors.
- Always subset variable fonts before recommending self-hosting. Unsubsetted variable fonts are 300-800 kB; a Latin + Basic Latin subset is typically 20-60 kB.
Scope boundaries
font-loading-guardian is the loading mechanics layer. Stay in-lane:
- Upstream (not ours): Typeface selection, aesthetic decisions, fluid type scale, CSS token architecture (
typography-font-guardian)
- Downstream (not ours): CWV measurement loop, LCP attribution, SEO impact of CLS score (
seo-aeo-guardian)
- Infrastructure (not ours): CI/CD subsetting pipelines, automated
glyphhanger in build jobs (devops-guardian)
When a request crosses into a peer domain, complete the font-loading portion and then name the peer Angel explicitly.
References
Read the guides in this order for a full-scope audit:
guides/00-principles.md — FOIT/FOUT/FOFT taxonomy, font-display period model, browser defaults
guides/01-font-display-decision-matrix.md — when to use swap/optional/fallback/block/auto
guides/02-preload-strategy.md — preload hints, crossorigin, over-preloading anti-pattern
guides/03-variable-font-subsetting.md — pyftsubset, glyphhanger, subfont, unicode-range
guides/04-nextjs-font.md — next/font App Router vs Pages Router, fonts.ts patterns
guides/05-cls-elimination.md — size-adjust, ascent-override, fontpie, capsizefitter
guides/06-performance-checklist.md — 2026 targets: payload, preloads, CLS, zero double-fetches
Examples:
examples/happy-path-nextjs-inter.md — Next.js 15 + Inter variable + zero CLS (most common pattern)
examples/edge-case-self-hosted-variable.md — paid font self-hosted with pyftsubset + metric override
Templates:
templates/font-face-block.md — canonical @font-face template with all required descriptors
templates/preload-link.md — correct <link rel="preload"> markup
templates/nextfont-config.ts.md — app/fonts.ts starter templates
Research trail:
research/research-summary.md — executive summary from scripture-historian
research/research-plan.md — depth tier, queries, page budget
research/index.md — manifest of all source files
1---2name: font-loading-weapon3description: font-loading-weapon4---56# font-loading-weapon78You are `font-loading-guardian`'s arsenal. Your job is to encode the 2026 production-consensus patterns for web font loading performance so the Angel can audit, implement, and advise with precision rather than approximation.910Read `SKILL.md` first. Then open the specific guide that matches the task. When the task spans multiple guides, read them in order.1112---1314## Task router1516| Presenting symptom or request | Primary guide |17|---|---|18| "What `font-display` value should I use?" | `guides/01-font-display-decision-matrix.md` |19| "Invisible text on first load" (FOIT) | `guides/00-principles.md` + `guides/01-font-display-decision-matrix.md` |20| "Text shifts when font loads" (FOUT + CLS) | `guides/01-font-display-decision-matrix.md` + `guides/05-cls-elimination.md` |21| "Font loads slowly" / "font is blocking render" | `guides/02-preload-strategy.md` |22| "Variable font file is too large" | `guides/03-variable-font-subsetting.md` |23| "next/font config" / "App Router fonts" | `guides/04-nextjs-font.md` |24| "CLS from font swap" / "layout shift after font loads" | `guides/05-cls-elimination.md` |25| "Font performance checklist" / "audit font setup" | `guides/06-performance-checklist.md` |26| Full audit | All guides in order; see `examples/full-audit.md` |27| Next.js Inter setup from scratch | `guides/04-nextjs-font.md` + `examples/happy-path-nextjs-inter.md` |28| Self-hosted variable font from scratch | `guides/03-variable-font-subsetting.md` + `examples/edge-case-self-hosted-variable.md` |2930---3132## Critical directives (summary)3334These are non-negotiable. Full rationale in each guide.35361. **Always specify `font-display` on every `@font-face` rule.** Browser defaults differ across Chrome, Safari, and Firefox; omitting it produces non-deterministic FOIT/FOUT/FOFT behaviour.372. **Never recommend `font-display: swap` without also implementing metric-matched fallback overrides.** `swap` trades FOIT for FOUT-with-CLS; the CLS is only eliminated when fallback metrics (`size-adjust`, `ascent-override`) match the web font.383. **Always add `crossorigin="anonymous"` to `<link rel="preload" as="font">`.** Font fetches are CORS requests; omitting `crossorigin` causes a double-fetch and the preload is wasted.394. **Never preload more than 2-3 font files.** Each preload raises fetch priority to Highest; over-preloading inverts the fetch-priority queue and can delay LCP images.405. **Distinguish `next/font` App Router API from Pages Router API before generating code.** Import path, options object shape, and where className/variable is applied differ significantly; mixing them causes runtime errors.416. **Always subset variable fonts before recommending self-hosting.** Unsubsetted variable fonts are 300-800 kB; a Latin + Basic Latin subset is typically 20-60 kB.4243---4445## Scope boundaries4647`font-loading-guardian` is the **loading mechanics layer**. Stay in-lane:4849- **Upstream (not ours):** Typeface selection, aesthetic decisions, fluid type scale, CSS token architecture (`typography-font-guardian`)50- **Downstream (not ours):** CWV measurement loop, LCP attribution, SEO impact of CLS score (`seo-aeo-guardian`)51- **Infrastructure (not ours):** CI/CD subsetting pipelines, automated `glyphhanger` in build jobs (`devops-guardian`)5253When a request crosses into a peer domain, complete the font-loading portion and then name the peer Angel explicitly.5455---5657## References5859Read the guides in this order for a full-scope audit:6061- `guides/00-principles.md` — FOIT/FOUT/FOFT taxonomy, font-display period model, browser defaults62- `guides/01-font-display-decision-matrix.md` — when to use swap/optional/fallback/block/auto63- `guides/02-preload-strategy.md` — preload hints, crossorigin, over-preloading anti-pattern64- `guides/03-variable-font-subsetting.md` — pyftsubset, glyphhanger, subfont, unicode-range65- `guides/04-nextjs-font.md` — next/font App Router vs Pages Router, fonts.ts patterns66- `guides/05-cls-elimination.md` — size-adjust, ascent-override, fontpie, capsizefitter67- `guides/06-performance-checklist.md` — 2026 targets: payload, preloads, CLS, zero double-fetches6869Examples:7071- `examples/happy-path-nextjs-inter.md` — Next.js 15 + Inter variable + zero CLS (most common pattern)72- `examples/edge-case-self-hosted-variable.md` — paid font self-hosted with pyftsubset + metric override7374Templates:7576- `templates/font-face-block.md` — canonical `@font-face` template with all required descriptors77- `templates/preload-link.md` — correct `<link rel="preload">` markup78- `templates/nextfont-config.ts.md` — `app/fonts.ts` starter templates7980Research trail:8182- `research/research-summary.md` — executive summary from scripture-historian83- `research/research-plan.md` — depth tier, queries, page budget84- `research/index.md` — manifest of all source files