Blog
10 posts on web fonts, compression, and performance.

Best Free Handwriting Fonts for Your Next Project
A developer-focused roundup of the best free handwriting fonts in 2026, with honest advice on when each one actually works and when to skip it.

Best Free Display Fonts for Headers
A practical roundup of the best free display fonts, with honest takes on where each one actually works and when to skip it.

Best free serif fonts for editorial sites in 2026
10 free serif fonts that hold up at body sizes, headline sizes, and on retina screens. With pre-compressed WOFF2s and the cases each one wins.

Subset Inter to under 20KB without breaking your headlines
Inter ships with 2,500+ glyphs covering Vietnamese, Cyrillic, Greek, and rare ligatures. Most sites use 200 of them. Here's how to cut to what you actually need.

Variable fonts vs static WOFF2: which is actually smaller?
A variable font with 9 weights bundles into one file. Nine static WOFF2 cuts are nine separate files. The smaller-on-paper option isn't always faster in practice.

How to preload WOFF2 fonts (without making things slower)
rel=preload tells the browser to fetch a font early. Done right, it cuts LCP by 200ms+. Done wrong, it duplicates requests and hurts performance.

Self-host Google Fonts for GDPR compliance
Loading fonts from fonts.googleapis.com sends every visitor's IP to Google. German courts have ruled that violates GDPR. Here's the fix in 5 minutes.

Fix "Ensure text remains visible during webfont load" in Lighthouse
Lighthouse flags this on roughly half of audited sites. The fix is one line of CSS, but only if you understand which font-display value to pick.

font-display: swap vs optional vs fallback, what to actually use
swap, optional, fallback, block, auto. Each one trades blocking time for layout shift. Here's when each makes sense, with real-world tradeoffs.

How to compress fonts to WOFF2 for the web
WOFF2 cuts a typical font file by 70-90% with no quality loss. Here's the practical workflow: subset to the characters you need, encode with brotli, drop hinting tables.