Files
zeekay 25edbb3620 fix(zen): refit zen-wide to the LUX wordmark, 1.56x -> 1.40x
The preset was fitted to a licensed display face and then used beside the drawn
LUX mark. Against that mark it renders 824px where the mark is 741px,
91.1% residual. Refit to our own mark: 1.40x is 739px and 17.6%.

Flattening the U's baseline overshoot takes it to 16.8% — Zen's round
forms drop 16 units below the baseline, correct type design, and the
drawn mark is dead flat. That is an outline operation (sites/_shape.py),
not a font setting, so it applies to the cut wordmark and not the preset.

Also: retag 45 binaries to identify as Zen, add publish.yml (this package
had none — 1.8.1 and 1.8.2 were hand-published), and the fitting tools.
2026-08-23 16:35:55 -07:00

2417 lines
13 KiB
Plaintext

{
.appVersion = "3516";
.formatVersion = 3;
axes = (
{
name = "Element Shape";
tag = ELSH;
}
);
customParameters = (
{
name = "Use Typo Metrics";
value = 1;
},
{
name = "Disable Subroutines";
value = 1;
},
{
name = "Write lastChange";
value = 0;
},
{
name = "Write DisplayStrings";
value = 0;
},
{
name = fsType;
value = (
);
},
{
name = "meta Table";
value = (
{
data = Latn;
tag = dlng;
},
{
data = Latn;
tag = slng;
}
);
},
{
name = "Virtual Master";
value = (
{
Axis = "Element Shape";
Location = 100;
}
);
}
);
date = "2026-04-03 11:28:45 +0000";
familyName = "Zen Pixel";
featurePrefixes = (
{
automatic = 1;
code = "languagesystem DFLT dflt;
languagesystem latn dflt;
languagesystem latn AZE;
languagesystem latn CRT;
languagesystem latn KAZ;
languagesystem latn TAT;
languagesystem latn TRK;
languagesystem latn ROM;
languagesystem latn MOL;
languagesystem latn MAH;
languagesystem latn NLD;
";
name = Languagesystems;
}
);
features = (
{
automatic = 1;
code = "feature locl;
feature sups;
feature numr;
feature dnom;
feature frac;
feature ordn;
feature ss01;
feature ss02;
feature ss03;
feature ss04;
feature ss05;
feature ss06;
feature ss09;
";
tag = aalt;
},
{
automatic = 1;
code = "lookup ccmp_DFLT_1 {
@CombiningTopAccents = [acutecomb brevecomb caroncomb circumflexcomb commaturnedabovecomb dieresiscomb dotaccentcomb gravecomb hungarumlautcomb macroncomb ringcomb tildecomb];
lookupflag UseMarkFilteringSet @CombiningTopAccents;
sub i' @CombiningTopAccents by idotless;
sub j' @CombiningTopAccents by jdotless;
} ccmp_DFLT_1;
lookup ccmp_latn_1 {
lookupflag 0;
sub fi by f i;
sub fl by f l;
} ccmp_latn_1;
script latn;
lookup ccmp_latn_1;
";
tag = ccmp;
},
{
automatic = 1;
code = "script latn;
language AZE;
lookup locl_latn_0 {
sub i by idotaccent;
} locl_latn_0;
language CRT;
lookup locl_latn_0;
language KAZ;
lookup locl_latn_0;
language TAT;
lookup locl_latn_0;
language TRK;
lookup locl_latn_0;
script latn;
language ROM;
lookup locl_latn_1 {
sub Scedilla by Scommaaccent;
sub scedilla by scommaaccent;
sub Tcedilla by Tcommaaccent;
sub tcedilla by tcommaaccent;
} locl_latn_1;
language MOL;
lookup locl_latn_1;
script latn;
language MAH;
lookup locl_latn_2 {
sub Lcommaaccent by Lcommaaccent.loclMAH;
sub Ncommaaccent by Ncommaaccent.loclMAH;
sub lcommaaccent by lcommaaccent.loclMAH;
sub ncommaaccent by ncommaaccent.loclMAH;
sub commaaccentcomb by commaaccentcomb.loclMAH;
} locl_latn_2;
script latn;
language NLD;
lookup locl_latn_3 {
sub iacute j' by jacute;
sub Iacute J' by Jacute;
} locl_latn_3;
";
tag = locl;
},
{
automatic = 1;
code = "sub one by onesuperior;
sub two by twosuperior;
sub three by threesuperior;
";
tag = sups;
},
{
automatic = 1;
code = "sub three by three.numr;
";
tag = numr;
},
{
automatic = 1;
code = "sub four by four.dnom;
";
tag = dnom;
},
{
automatic = 1;
code = "sub one slash four by onequarter;
sub one slash two by onehalf;
sub three slash four by threequarters;
";
tag = frac;
},
{
automatic = 1;
code = "sub [zero one two three four five six seven eight nine] [A a]' by ordfeminine;
sub [zero one two three four five six seven eight nine] [O o]' by ordmasculine;
sub N o period by numero;
";
tag = ordn;
},
{
automatic = 1;
code = "lookupflag IgnoreMarks;
sub f i by f_i.dlig;
";
tag = dlig;
},
{
automatic = 1;
code = "lookupflag IgnoreMarks;
sub A I by A_I.liga;
sub U I by U_I.liga;
sub f i by fi;
sub f l by fl;
";
tag = liga;
},
{
automatic = 1;
code = "sub a by a.ss01;
sub aacute by aacute.ss01;
sub abreve by abreve.ss01;
sub acircumflex by acircumflex.ss01;
sub adieresis by adieresis.ss01;
sub agrave by agrave.ss01;
sub amacron by amacron.ss01;
sub aogonek by aogonek.ss01;
sub aring by aring.ss01;
sub atilde by atilde.ss01;
";
labels = (
{
language = dflt;
value = "No tail a";
}
);
tag = ss01;
},
{
automatic = 1;
code = "sub a by a.ss02;
sub aacute by aacute.ss02;
sub abreve by abreve.ss02;
sub acircumflex by acircumflex.ss02;
sub adieresis by adieresis.ss02;
sub agrave by agrave.ss02;
sub amacron by amacron.ss02;
sub aogonek by aogonek.ss02;
sub aring by aring.ss02;
sub atilde by atilde.ss02;
";
labels = (
{
language = dflt;
value = "Alt a";
}
);
tag = ss02;
},
{
automatic = 1;
code = "sub l by l.ss03;
sub lacute by lacute.ss03;
sub lcaron by lcaron.ss03;
sub lcommaaccent.loclMAH by lcommaaccent.loclMAH.ss03;
sub lcommaaccent by lcommaaccent.ss03;
sub lslash by lslash.ss03;
";
labels = (
{
language = dflt;
value = "Alt l";
}
);
tag = ss03;
},
{
automatic = 1;
code = "sub R by R.ss04;
sub Racute by Racute.ss04;
sub Rcaron by Rcaron.ss04;
sub Rcommaaccent by Rcommaaccent.ss04;
";
labels = (
{
language = dflt;
value = "Alt R";
}
);
tag = ss04;
},
{
automatic = 1;
code = "sub I by I.ss05;
sub Iacute by Iacute.ss05;
sub Icircumflex by Icircumflex.ss05;
sub Idieresis by Idieresis.ss05;
sub Idotaccent by Idotaccent.ss05;
sub Igrave by Igrave.ss05;
sub Imacron by Imacron.ss05;
sub Iogonek by Iogonek.ss05;
sub Itilde by Itilde.ss05;
";
labels = (
{
language = dflt;
value = "Alt I";
}
);
tag = ss05;
},
{
automatic = 1;
code = "sub G by G.ss06;
sub Gbreve by Gbreve.ss06;
sub Gcommaaccent by Gcommaaccent.ss06;
sub Gdotaccent by Gdotaccent.ss06;
sub Gmacron by Gmacron.ss06;
";
labels = (
{
language = dflt;
value = "Alt G";
}
);
tag = ss06;
},
{
automatic = 1;
code = "sub zero by zero.ss09;
";
labels = (
{
language = dflt;
value = "Alt numbers";
}
);
tag = ss09;
}
);
fontMaster = (
{
axesValues = (
0
);
customParameters = (
{
name = unitizerUnit;
value = "38";
},
{
name = hheaAscender;
value = 1005;
},
{
name = hheaDescender;
value = -295;
},
{
name = hheaLineGap;
value = 0;
},
{
name = typoAscender;
value = 1005;
},
{
name = typoDescender;
value = -295;
},
{
name = typoLineGap;
value = 0;
},
{
name = winAscent;
value = 1088;
},
{
name = winDescent;
value = 394;
},
{
name = "Master Icon Glyph Name";
value = v;
}
);
id = m01;
metricValues = (
{
pos = 722;
},
{
pos = 532;
},
{
},
{
pos = -152;
},
{
}
);
name = Regular;
visible = 1;
}
);
instances = (
{
axesValues = (
0
);
instanceInterpolations = {
m01 = 1;
};
name = Regular;
visible = 0;
},
{
axesValues = (
1
);
instanceInterpolations = {
m01 = 1;
};
name = Square;
},
{
axesValues = (
20
);
instanceInterpolations = {
m01 = 1;
};
name = Circle;
visible = 0;
},
{
axesValues = (
40
);
instanceInterpolations = {
m01 = 1;
};
name = Grid;
visible = 0;
},
{
axesValues = (
60
);
instanceInterpolations = {
m01 = 1;
};
name = Triangle;
visible = 0;
},
{
axesValues = (
80
);
instanceInterpolations = {
m01 = 1;
};
name = Line;
visible = 0;
}
);
kerningLTR = {
m01 = {
"@MMK_L_A" = {
"@MMK_R_T" = -76;
"@MMK_R_V" = -38;
};
"@MMK_L_L" = {
"@MMK_R_T" = -152;
"@MMK_R_V" = -114;
};
"@MMK_L_T" = {
"@MMK_R_A" = -76;
"@MMK_R_T" = 0;
"@MMK_R_a" = -76;
"@MMK_R_o" = -76;
};
"@MMK_L_V" = {
"@MMK_R_A" = -38;
"@MMK_R_a" = -38;
"@MMK_R_o" = -38;
};
"@MMK_L_l" = {
"@MMK_R_T" = -76;
};
"@MMK_L_o" = {
"@MMK_R_T" = -76;
};
"@MMK_L_r" = {
"@MMK_R_a" = -38;
"@MMK_R_o" = -38;
};
underscore = {
"@MMK_R_o" = -38;
"@MMK_R_v" = -76;
};
};
};
metrics = (
{
type = "cap height";
},
{
type = "x-height";
},
{
type = baseline;
},
{
type = descender;
},
{
type = "italic angle";
}
);
properties = (
{
key = copyrights;
values = (
{
language = dflt;
value = "Copyright 2026 Hanzo AI, Inc. (https://git.hanzo.ai/hanzoai/font)";
}
);
},
{
key = designers;
values = (
{
language = dflt;
value = "Hanzo AI, Inc.";
}
);
},
{
key = designerURL;
value = "https://hanzo.ai";
},
{
key = licenses;
values = (
{
language = dflt;
value = "This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: https://openfontlicense.org";
}
);
},
{
key = manufacturers;
values = (
{
language = dflt;
value = "Hanzo AI, Inc.";
}
);
},
{
key = manufacturerURL;
value = "https://hanzo.ai";
},
{
key = vendorID;
value = "HNZO";
}
);
settings = {
gridLength = 38;
gridSubDivision = 38;
keyboardIncrementBig = 38;
};
unitsPerEm = 1000;
userData = {
backdropGlyphLib = {
AE = (
(
A,
1,
0
),
(
E,
1,
0
),
(
OE,
1,
0
)
);
B = (
(
D,
1,
0
),
(
E,
1,
0
),
(
H,
0,
0
),
(
P,
1,
0
),
(
R,
0,
0
),
(
Germandbls,
0,
0
),
(
germandbls,
0,
0
),
(
three,
0,
0
),
(
eight,
0,
0
)
);
C = (
(
D,
0,
0
),
(
G,
1,
0
),
(
O,
1,
0
),
(
Q,
0,
0
)
);
D = (
(
B,
0,
0
),
(
C,
0,
0
),
(
E,
0,
0
),
(
G,
0,
0
),
(
O,
1,
0
),
(
Q,
0,
0
)
);
E = (
(
B,
1,
0
),
(
D,
0,
0
),
(
F,
1,
0
),
(
H,
0,
0
)
);
Eng = (
(
N,
1,
0
),
(
j,
1,
0
)
);
F = (
(
E,
1,
0
),
(
H,
0,
0
)
);
G = (
(
A,
0,
0
),
(
C,
0,
0
),
(
D,
0,
0
),
(
H,
0,
0
),
(
O,
1,
0
),
(
Q,
0,
0
),
(
x,
0,
0
)
);
Germandbls = (
(
B,
1,
0
),
(
S,
1,
0
),
(
T,
0,
0
),
(
germandbls,
0,
0
)
);
H = (
(
B,
0,
0
),
(
D,
0,
0
),
(
E,
0,
0
),
(
F,
0,
0
),
(
I,
0,
0
),
(
J,
0,
0
),
(
K,
0,
0
),
(
L,
0,
0
),
(
M,
0,
0
),
(
N,
1,
0
),
(
P,
0,
0
),
(
R,
0,
0
),
(
U,
1,
0
)
);
I = (
(
B,
0,
0
),
(
D,
0,
0
),
(
E,
0,
0
),
(
F,
0,
0
),
(
H,
0,
0
),
(
J,
0,
0
),
(
K,
0,
0
),
(
L,
0,
0
),
(
M,
0,
0
),
(
N,
0,
0
),
(
P,
0,
0
),
(
R,
0,
0
),
(
T,
1,
0
),
(
U,
0,
0
),
(
Y,
1,
0
),
(
i,
0,
0
),
(
l,
1,
0
),
(
one,
1,
0
)
);
IJ = (
(
I,
0,
0
),
(
J,
1,
0
),
(
U,
1,
0
)
);
J = (
(
I,
1,
0
),
(
U,
0,
0
)
);
K = (
(
B,
0,
0
),
(
H,
0,
0
),
(
I,
1,
0
),
(
R,
0,
0
),
(
X,
0,
0
),
(
Y,
0,
0
)
);
L = (
(
E,
0,
0
),
(
H,
0,
0
),
(
I,
1,
0
)
);
M = (
(
H,
1,
0
),
(
I,
0,
0
),
(
O,
0,
0
),
(
N,
0,
0
),
(
V,
0,
0
),
(
W,
0,
0
)
);
N = (
(
H,
1,
0
),
(
I,
0,
0
),
(
M,
0,
0
),
(
U,
1,
0
)
);
O = (
(
C,
1,
0
),
(
D,
0,
0
),
(
G,
1,
0
),
(
Q,
1,
0
),
(
zero,
1,
0
)
);
OE = (
(
E,
1,
0
),
(
O,
1,
0
),
(
OE,
1,
0
)
);
Oslash = (
(
O,
1,
0
),
(
Q,
0,
0
)
);
P = (
(
B,
1,
0
),
(
F,
1,
0
),
(
R,
1,
0
)
);
Q = (
(
C,
0,
0
),
(
D,
0,
0
),
(
G,
0,
0
),
(
O,
1,
0
),
(
R,
0,
0
)
);
R = (
(
B,
0,
0
),
(
F,
0,
0
),
(
P,
1,
0
),
(
Q,
0,
0
),
(
X,
0,
0
)
);
T = (
(
H,
0,
0
),
(
I,
1,
0
),
(
Y,
1,
0
)
);
Thorn = (
(
D,
0,
0
),
(
H,
0,
0
),
(
I,
0,
0
),
(
P,
1,
0
)
);
U = (
(
H,
0,
0
),
(
N,
1,
0
),
(
O,
0,
0
),
(
V,
0,
0
)
);
V = (
(
U,
1,
0
),
(
W,
0,
0
),
(
X,
0,
0
),
(
Y,
1,
0
)
);
W = (
(
M,
0,
0
),
(
V,
0,
0
)
);
X = (
(
K,
0,
0
),
(
N,
0,
0
),
(
R,
0,
0
),
(
V,
0,
0
),
(
Y,
1,
0
),
(
Z,
1,
0
)
);
Y = (
(
I,
0,
0
),
(
T,
1,
0
),
(
U,
0,
0
),
(
V,
1,
0
),
(
W,
0,
0
),
(
X,
0,
0
)
);
Z = (
(
L,
0,
0
),
(
T,
0,
0
),
(
X,
0,
0
)
);
ae = (
(
a,
1,
0
),
(
e,
1,
0
),
(
o,
0,
0
),
(
oe,
1,
0
)
);
ampersand = (
(
E,
0,
0
),
(
t,
0,
0
)
);
at = (
(
a,
1,
0
)
);
b = (
(
c,
0,
0
),
(
e,
0,
0
),
(
h,
1,
0
),
(
k,
0,
0
),
(
l,
0,
0
),
(
o,
1,
0
),
(
p,
1,
0
)
);
c = (
(
b,
0,
0
),
(
d,
0,
0
),
(
e,
1,
0
),
(
g,
0,
0
),
(
o,
1,
0
),
(
p,
0,
0
),
(
q,
0,
0
)
);
cent = (
(
c,
1,
0
)
);
d = (
(
c,
0,
0
),
(
eth,
0,
0
),
(
e,
0,
0
),
(
l,
0,
0
),
(
o,
1,
0
),
(
q,
1,
0
)
);
dollar = (
(
S,
1,
0
)
);
e = (
(
b,
0,
0
),
(
c,
1,
0
),
(
d,
0,
0
),
(
g,
0,
0
),
(
o,
1,
0
),
(
p,
0,
0
),
(
q,
0,
0
)
);
eight = (
(
B,
0,
0
),
(
zero,
1,
0
),
(
three,
1,
0
),
(
six,
0,
0
),
(
nine,
0,
0
)
);
eng = (
(
j,
1,
0
),
(
m,
0,
0
),
(
n,
1,
0
)
);
estimated = (
(
e,
0,
0
)
);
eth = (
(
d,
1,
0
),
(
o,
1,
0
)
);
euro = (
(
C,
1,
0
)
);
exclam = (
(
I,
1,
0
),
(
T,
0,
0
),
(
one,
0,
0
),
(
period,
1,
0
),
(
question,
1,
0
)
);
f = (
(
l,
0,
0
),
(
longs,
0,
0
),
(
germandbls,
0,
0
),
(
t,
1,
0
)
);
five = (
(
six,
1,
0
)
);
florin = (
(
f,
1,
0
)
);
franc = (
(
F,
1,
0
)
);
g = (
(
c,
0,
0
),
(
e,
0,
0
),
(
o,
1,
0
),
(
q,
0,
0
)
);
germandbls = (
(
B,
1,
0
),
(
b,
0,
0
),
(
f,
1,
0
),
(
s,
1,
0
),
(
longs,
1,
0
)
);
h = (
(
b,
1,
0
),
(
k,
0,
0
),
(
l,
0,
0
),
(
m,
0,
0
),
(
n,
1,
0
),
(
r,
0,
0
)
);
i = (
(
I,
0,
0
),
(
j,
1,
0
),
(
l,
1,
0
),
(
n,
0,
0
)
);
idotless = (
(
I,
0,
0
),
(
i,
0,
0
),
(
j,
0,
0
),
(
uni0237,
0,
0
),
(
l,
1,
0
),
(
n,
0,
0
)
);
j = (
(
i,
1,
0
),
(
l,
0,
0
),
(
n,
0,
0
)
);
k = (
(
b,
1,
0
),
(
h,
0,
0
),
(
l,
0,
0
),
(
x,
1,
0
)
);
l = (
(
I,
1,
0
),
(
b,
0,
0
),
(
h,
0,
0
),
(
k,
0,
0
),
(
i,
0,
0
),
(
one,
1,
0
)
);
longs = (
(
f,
1,
0
),
(
l,
0,
0
),
(
germandbls,
0,
0
)
);
m = (
(
h,
0,
0
),
(
n,
1,
0
),
(
r,
0,
0
),
(
w,
0,
0
)
);
mu = (
(
u,
1,
0
)
);
n = (
(
h,
0,
0
),
(
m,
0,
0
),
(
r,
0,
0
),
(
u,
1,
0
),
(
v,
0,
0
)
);
nine = (
(
zero,
1,
0
),
(
six,
1,
0
),
(
eight,
1,
0
)
);
o = (
(
b,
0,
0
),
(
c,
1,
0
),
(
d,
0,
0
),
(
eth,
0,
0
),
(
e,
1,
0
),
(
g,
0,
0
),
(
p,
0,
0
),
(
q,
0,
0
)
);
oe = (
(
ae,
1,
0
),
(
e,
1,
0
),
(
o,
1,
0
)
);
one = (
(
I,
1,
0
),
(
l,
1,
0
)
);
oslash = (
(
o,
1,
0
)
);
p = (
(
b,
1,
0
),
(
c,
0,
0
),
(
e,
0,
0
),
(
n,
0,
0
),
(
o,
1,
0
)
);
product = (
(
H,
1,
0
)
);
q = (
(
d,
1,
0
),
(
c,
0,
0
),
(
e,
0,
0
),
(
g,
0,
0
),
(
o,
1,
0
)
);
question = (
(
two,
1,
0
),
(
period,
1,
0
),
(
exclam,
1,
0
)
);
r = (
(
h,
0,
0
),
(
m,
0,
0
),
(
n,
1,
0
)
);
seven = (
(
T,
0,
0
)
);
six = (
(
zero,
1,
0
),
(
five,
1,
0
),
(
eight,
1,
0
),
(
nine,
0,
0
)
);
t = (
(
f,
1,
0
),
(
l,
0,
0
)
);
thorn = (
(
b,
1,
0
),
(
h,
1,
0
),
(
p,
1,
0
)
);
three = (
(
B,
0,
0
),
(
eight,
1,
0
)
);
two = (
(
question,
1,
0
)
);
u = (
(
n,
1,
0
),
(
v,
0,
0
)
);
uni0237 = (
(
i,
0,
0
),
(
idotless,
1,
0
),
(
l,
0,
0
),
(
n,
0,
0
)
);
uni20B9 = (
(
R,
1,
0
)
);
uni20BD = (
(
P,
1,
0
)
);
uni20BF = (
(
B,
1,
0
)
);
v = (
(
n,
0,
0
),
(
w,
0,
0
),
(
x,
0,
0
),
(
y,
1,
0
)
);
w = (
(
v,
0,
0
),
(
m,
0,
0
)
);
x = (
(
k,
1,
0
),
(
v,
0,
0
),
(
z,
0,
0
)
);
y = (
(
v,
1,
0
)
);
yen = (
(
Y,
1,
0
)
);
z = (
(
x,
0,
0
)
);
zero = (
(
O,
1,
0
)
);
};
};
versionMajor = 1;
versionMinor = 0;
}