Skip to content

Font-loading audit

Two files, both preloaded

The audit found nine font files (261 KB) shipped for a site whose copy is English, and no preload link on any page — the faces were discovered only after the stylesheet parsed. Both are fixed in the layout, and this page shows the before and after with the build each number came from.

Measured from the completed build on 2026-09-12 06:33 UTC (build eoCv1yhT4VQe) by npm run build && npm run measure, and committed as docs/build-report.json. The numbers are not re-derived while the page renders, because a build cannot see its own output.

Font files shipped

9 → 2

measured on batch 55 (commit 1fb5142) → this build

Font weight

261.4 → 80 KB

69% smaller

Pages preloading

0 → 497

of 498 prerendered pages in the measured build

What shipped before, and what ships now

The old setup imported both fontsource packages wholesale: 7 subsets, latin, latin-ext, cyrillic, cyrillic-ext, greek, greek-ext, vietnamese. The site's copy uses Latin-1 characters only — é, ó, á, í, ú, ñ, £, °, × and · all live in the latin range — so nothing on a page needed the other six.

Data table — data table
FaceSubsetSizePreloadedFile
Interlatin47.1 KByesinter_latin_wght_normal-s.p.0gsaq8ukbf34m.woff2
Soralatin32.9 KByessora_latin_wght_normal-s.p.2o7d_x-bmx02y.woff2

How the preload is verified

Not by trusting the config: the audit reads every prerendered HTML file and looks for the link. A build that stopped emitting it would show a drop on this page before anyone noticed a flash of unstyled text in production.

<link rel="preload"
      href="/_next/static/media/inter_latin_wght_normal-s.p.<hash>.woff2"
      as="font" crossorigin="" type="font/woff2" />

next/font also emits a metric-matched fallback face (inter Fallback with a size-adjust of 107.89%), so the swap to the real face moves text far less than a default fallback would. That number is in the compiled CSS, not in this copy.

Inter subset

230 glyphs

inter_latin_wght_normal-s.p.0gsaq8ukbf34m.woff2

Sora subset

223 glyphs

sora_latin_wght_normal-s.p.2o7d_x-bmx02y.woff2

Characters probed

15

the glyphs the copy actually uses

Which glyphs the shipped subsets actually contain

Decoded from the woff2 cmap at build time — the files themselves, not a manifest someone wrote by hand — so a missing glyph is caught by the build rather than by a screenshot.

Data table — data table
GlyphCodepointInterSora
em dashU+2014coveredcovered
arrow leftU+2190missingmissing
arrow upU+2191coveredmissing
arrow rightU+2192missingmissing
arrow downU+2193coveredmissing
· middle dotU+00B7coveredcovered
× multiplication signU+00D7coveredcovered
° degreeU+00B0coveredcovered
é e acuteU+00E9coveredcovered
ó o acuteU+00F3coveredcovered
á a acuteU+00E1coveredcovered
í i acuteU+00EDcoveredcovered
ú u acuteU+00FAcoveredcovered
ñ n tildeU+00F1coveredcovered
£ poundU+00A3coveredcovered

The arrows are the finding: → (U+2192) and ← (U+2190) are in neither subset, so the arrows in the nav and the panels fall back to the system font; Inter carries ↑ and ↓, Sora carries none. Everything else the copy uses — the em dash, ·, ×, ° and the latin accents — is covered by both.

Preload coverage

#398 — the build report reads the preload links out of every prerendered document: fonts 80 KB preloaded on 471 of 472 pages, the one exception being the on-demand route that has no document to preload in. No face loads on a route that does not use it, because there are only two faces and the shell carries both.