Skip to content

From variable to static: instancing a variable font

Exporting a variable font to a static format copies it as-is — real instancing evaluates outlines, metrics, kerning and marks at one location. Do it on device, then verify.

A variable font at rest is a set of masters and math; a static font is a finished drawing. Instancing — baking one location of the design space into an ordinary TTF — is what you need when the target doesn't do variable: design tools with no axis UI, app-embedding SDKs, stores and foundries that want a static family, files that must not carry fvar at all. Font Studio's Make static (Pro, under Font Engineering → Variable) does this on-device: this walkthrough instances the two-axis dot font built in the variable dot font guide at Weight 400 / Roundness 50 and exports it as an ordinary static TTF.

The trap this replaces

It's worth naming, because every export screen hides it: exporting a variable font to a static format without instancing copies the file as-is — masters, axes, fvar and all — into a .ttf wrapper. Nothing is evaluated; the "static" font still behaves like a variable font where support exists and renders at its default instance nowhere else. Real instancing is a computation, not a re-label. That's what Make static runs.

The flow

Open the variable font and go to Font Engineering → Variable. The design space shows the axes — this font has two, wght 100–800 and ROND 0–100, with 15 named instances — plus per-axis sliders and a live preview. Set the cursor: Weight 400, Roundness 50. The header tracks the location (wght 400 · ROND 50), and the style name field auto-suggests from the axis values — "Soft", here.

The Variable tab with wght and ROND sliders and the Make static card
Variable tab at wght 400 · ROND 50 — the auto-suggested style name is 'Soft'.

The Make static card states exactly what happens when you commit: "Outlines, advance widths, font-wide metrics, kerning and mark positions are all evaluated at this point. The result is an ordinary static TTF." That list is the difference between instancing and copying — every one of those is interpolated from the masters at the cursor's coordinates, including positions that travel along avar curves if the font maps them.

The Make static actions: Export TTF, Replace in project, and Export all named instances as ZIP
Three exits: Export TTF as a standalone file, Replace in project (one undo step), or export every named instance as a ZIP.
  • Export TTF — the static font as a file, named for the style.
  • Replace in project — swap your working font for the instance.
  • Export all 15 named instances (ZIP) — the whole named-instance set, one static file each; this is your static-family release in one tap.

"Remove overlaps" defaults to ON — contour overlap merging, the same final pass Google Fonts applies to static releases (it shrinks files and fixes rendering artifacts in a handful of rasterizers).

What came out, checked

Exported the "Soft" instance and inspected it with fontTools:

  • fvar is gone. The static TTF has no axes, no instances, no variations — maxp reports the same 54 glyphs, none of the variable machinery.
  • The name table was rewritten for the style: family "My Font Soft", subfamily "Regular" — the RIBBI split (a family-with-style name becomes family + Regular) so desktop font menus show it as its own family. See name tables explained for why that split happens.
  • Metrics are baked: glyph advances at the Soft location (1,463 units for the letter glyphs on this font) are now plain hmtx values, no HVAR deltas.
  • Size: 4,080 B static vs 26,224 B variable — the variable font carries fvar/gvar/STAT plus a second master's worth of data; the instance carries one drawing per glyph.

One honest note on comparing against desktop tools: fontTools' instancer.instantiateVariableFont at the same coordinates produces the same metrics and the same outlines geometrically, but the compiled bytes differ (different overlap-removal and point-ordering choices). Compare geometry and metrics, not file hashes.

Limits, disclosed

  • TrueType outlines only. CFF2 variable fonts are refused with a message.
  • It needs the real variable font. Subsetting strips variable tables — a subsetted "variable" font can't be instanced because there's nothing left to interpolate. Keep the original; see how to reduce font file size for what subsetting does and doesn't keep.
  • Exporting ≠ instancing — the as-is copy trap above. If a pipeline hands you a "static" file that still has axes, it went through the wrong door.
  • No hinting authoring is involved; exporting can strip legacy hinting.

What to try next

On-device processing

Solve it in Font Studio

Free to download on Android and iPad. Every workflow in this guide runs on your device — your font files are not uploaded.