March 30, 2026
Variable type in production
What you gain, what you pay and where it breaks when you ship a real variable font on a live site.
Variable fonts have been “production-ready” for years, yet most sites still ship six static files. The reason is rarely the font itself: it’s the subset, hosting, fallback and CSS chain that hasn’t been calibrated.
What you gain
A single file covers every weight and, if the font exposes it, optical size too. You go from five or six WOFF2 files to one asset, and crucially you stop fighting the visible jump between heading and body: the browser can interpolate.
What you pay
The single file weighs more than a single static. If your site only needs two weights without italic or opsz, variable may be a bad trade. Practical rule: three weights or more, variable; one or two, statics.
Where it breaks
- No subset. Shipping the full file with every glyph is the main cause of slow sites with variable type.
pyftsubsetwith extended Latin coverage usually does the job. - Misused
font-display: swap. On XL headlines, the fallback-to-variable jump is loud. Preferoptionalor a tunedsize-adjust. - Axis animations. Animating
font-variation-settingsis legal but CPU-heavy. If you do it, restrict it to the transition and addwill-change: font-variation-settings.
Reasonable minimum setup
- One variable subsetted to your main language.
- Named fallback with
size-adjustto minimise CLS. font-display: swapfor body,optionalfor large headlines.- Preload only the file you need in the first viewport.
Do these four things and a well-chosen variable feels better than a classic static system, and weighs less.