static-to-variable

Turn static fonts into one variable font.

Point it at a folder of thin, regular, and bold. Get one file with every weight in between.

npm install -g static-to-variable
cd ~/Downloads/Inter/static
static-to-variable init
static-to-variable build

init finds the .ttf and .otf files in the folder, reads each one's weight, and writes a config you can edit. build produces the variable TTF and WOFF2.

Variable fonts that didn't exist

See all 14 families
Font
Weight
400
One file, every weight in between.

How it works

Normally you can't just merge the files because they don't line up. This handles that, and skips anything it can't do cleanly instead of breaking it.

Lines the files up
Every weight is redrawn the same way, so they blend smoothly.
Checks every letter
Each weight has to match the original, and the in-betweens can't go wonky.
Skips what it can't
Anything it can't merge cleanly stays fixed at one weight, and you get a list.

What you need

It runs on your machine, so nothing is uploaded anywhere and a big family can take as long as it needs.

Node 24.11+
Runs the CLI itself. nodejs.org
Python 3.11+ and uv
The font engine. docs.astral.sh/uv
A few minutes
Three weights of a small family take under a minute; nine weights of a 3,000-glyph family take several.