static-to-variable

Turn a family of static weights into one variable font.

Static weights are usually drawn independently, so their glyphs don't line up — different points and contours per weight — and won't interpolate. static-to-variable rebuilds them onto a shared structure so they do, then builds and checks the font for you.

Scrub the weight axis

real fonts the pipeline built, live

The quick brown fox jumps over the lazy dog · 0123456789
!0021
"0022
#0023
$0024
%0025
&0026
'0027
(0028
)0029
*002A
+002B
,002C
-002D
.002E
/002F
00030
10031
20032
30033
40034
50035
60036
70037
80038
90039
:003A
;003B
<003C
=003D
>003E
?003F
@0040
A0041
B0042
C0043
D0044
E0045
F0046
G0047
H0048
I0049
J004A
K004B
L004C
M004D
N004E
O004F
P0050
Q0051
R0052
S0053
T0054
U0055
V0056
W0057
X0058
Y0059
Z005A
[005B
\005C
]005D
^005E
_005F
`0060
a0061
b0062
c0063
d0064
e0065
f0066
g0067
h0068
i0069
j006A
k006B
l006C
m006D
n006E
o006F
p0070
q0071
r0072
s0073
t0074
u0075
v0076
w0077
x0078
y0079
z007A
{007B
|007C
}007D
~007E
¡00A1
¢00A2
£00A3
¤00A4
¥00A5
¦00A6
§00A7
¨00A8
©00A9
ª00AA
«00AB
¬00AC
®00AE
¯00AF
°00B0
±00B1
²00B2
³00B3
´00B4
µ00B5
00B6
·00B7
¸00B8
¹00B9
º00BA
»00BB
¼00BC
½00BD
¾00BE
¿00BF
À00C0
Á00C1
Â00C2
Ã00C3
Ä00C4
Å00C5
Æ00C6
Ç00C7
È00C8
É00C9
Ê00CA
Ë00CB
Ì00CC
Í00CD
Î00CE
Ï00CF
Ð00D0
Ñ00D1
Ò00D2
Ó00D3
Ô00D4
Õ00D5
Ö00D6
×00D7
Ø00D8
Ù00D9
Ú00DA
Û00DB
Ü00DC
Ý00DD
Þ00DE
ß00DF
à00E0
á00E1
â00E2
ã00E3
ä00E4
å00E5
æ00E6
ç00E7
è00E8
é00E9
ê00EA
ë00EB
ì00EC
í00ED
î00EE
ï00EF
ð00F0
ñ00F1
ò00F2
ó00F3
ô00F4
õ00F5
ö00F6
÷00F7
ø00F8
ù00F9
ú00FA
û00FB
ü00FC
ý00FD
þ00FE
ÿ00FF
loading… wght 100900 · 188 glyphsbuilt from Thin 100 · Regular 400 · Black 900 · Roboto by Christian Robertson, OFL

Each of these was rebuilt from three or four independent static weights into a single file with a continuous wght axis. Drag the slider — every glyph interpolates natively.

The hard part it solves

A variable font interpolates point-by-point between master weights. That only works if every weight shares the same number of contours and points, in the same order. Independently-drawn statics almost never do — so a naive merge either fails to build or mangles glyphs mid-interpolation.

01 · Rebuild

Re-derive every weight onto one shared point structure so they interpolate — the part independent static fonts get wrong.

02 · Normalize

Fix donor-inherited height and metric defects so masters line up.

03 · Build & check

Compile the variable font with fontmake, then verify every named weight matches its donor and freeze anything that can't interpolate cleanly.

8 / 8

Google Fonts families rebuilt end-to-end into valid variable fonts

sans → serif → mono

from geometric sans to high-contrast display serif to monospace

auto-verified

per-weight fidelity checks and interpolation-safety gates on every build

Three commands

# scaffold a config
static-to-variable init

# point it at your static fonts, set the weights, then
static-to-variable build --config stv.config.json