font.hanzo.ai The open AI cloud

One variable file, five presets and five pixel cuts — every Hanzo surface reads its type from the same source.

HANZO ZEN
01 · Cut your own

Move it, then take it

Every setting below is live type, not a picture of it. When it reads right, take the file: the cutter runs in this tab — it walks the outlines at your weight, bakes in the letterforms you picked, and hands back a static font. Nothing is uploaded, and no server sees the setting.

Hanzo

Width and tracking travel with the file. transform:scaleX() stretches what is painted and leaves the layout box where it was; a font that is really wider carries the width in its advances too. So a cut taken here needs no CSS to keep the setting you gave it.

02 · The pack

Hanzo's presets

Five presets ship with the family. Hanzo uses .zen-air, .zen-book, .zen-medium — the others are there when a surface needs them. Each is one point in Zen's parameter space. Click a row to load it above.

PresetwghtscaleXtrackWhat it is for
.zen-air in use 220— -0.03em Thin display. Set large, tracked in.
.zen-book in use 497— — Text. The reading weight.
.zen-medium in use 606— — UI emphasis. A step up from book without becoming display.
.zen-wide 6501.4861 -0.095em Monumental caps. Widened, and weighted to hold the widening.
.zen-round 900— -0.018em Heavy and friendly at large sizes.

Voice: ss01 — single-storey a — the neo-grotesque register. The estate default is normal, so a brand opts into its letterform.

03 · Zen Mono

Cut for the terminal

Every glyph is 0.6 em wide, so a column of code is a column. The pairs a screen of code turns on are kept apart out of the box: the zero comes slashed, and 1, l and I each stand on a foot, so none of them is a bare stroke.

const cut = await zen.cut({
  weight: 497,      // anywhere on 100–900
  forms: ['ss01'],  // baked into the outlines
})
// 0O o · 1lI · rn m · ;:, · {}[]()
for (let i = 0; i <= 0xFF; i++) draw(i)
0 O ozero, O, o
1 l I |one, l, I, bar
rn mr n, m
; : , .the small marks
{ } [ ] ( )the brackets
=> !== <=the operators

The sets go the other way here, because the defaults already favour code: ss09 takes the slash back out of the zero and ss03 swaps the l's foot for a tail. Both are in the editor above, and both survive into a cut you take.

04 · Zen Pixel

Five cuts, one axis

Pixel is drawn out of an element — a square, a circle, a triangle — and the element is an axis, not five files. The named cuts are five stops on it, and everything between them is a cut too.

HANZO ZEN PIXEL

The strip above runs the axis end to end. Pick a stop to load it into the editor, or drag Element there for the space between.

05 · The scale

One file, every size

Display · 64px Hanzo
Heading · 34px Hanzo
Subhead · 22px Hanzo sets type in Zen
Body · 16px Hanzo sets type in Zen
Small · 13px Hanzo sets type in Zen

Zen is variable on wght 100–900, so one file covers every weight — no nine static cuts, and no second request when a page needs a bolder line.

06 · The set

Characters

ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789 &@#$%^*()[]{}<>/\|+−=~ ‘’“” — –
Zen Mono   const zen = 0xFF1l0O;   i++ => !== <=
07 · Using it

One line, or two imports

Then name the role, never the face: var(--font-sans), var(--font-mono), var(--font-pixel). A surface on @hanzo/design gets them with the token layer and needs no font import at all — which is what keeps every Hanzo property on one version of the type as the family evolves.

08 · The files

Take the family

The variable file is the desktop install — one file, every weight, and every current system reads it. A named static cut is what the editor above makes, so it is not hosted nine times over here. The .woff2 statics are for a stylesheet that wants a fixed weight without an axis.

FileFamilyForSize
Zen-Variable.ttf SansInstall it — every weight, one file169 KB
Zen-Variable.woff2 SansThe web — every weight, one file70 KB
Zen-Italic-Variable.ttf SansInstall it — every weight, italic, one file174 KB
Zen-Italic-Variable.woff2 SansThe web — every weight, italic, one file73 KB
Zen-Black.woff2 SansThe web, one weight47 KB
Zen-BlackItalic.woff2 SansThe web, one weight48 KB
Zen-Bold.woff2 SansThe web, one weight47 KB
Zen-BoldItalic.woff2 SansThe web, one weight48 KB
Zen-ExtraBold.woff2 SansThe web, one weight47 KB
Zen-ExtraBoldItalic.woff2 SansThe web, one weight48 KB
Zen-ExtraLight.woff2 SansThe web, one weight45 KB
Zen-ExtraLightItalic.woff2 SansThe web, one weight47 KB
Zen-Italic.woff2 SansThe web, one weight47 KB
Zen-Light.woff2 SansThe web, one weight45 KB
Zen-LightItalic.woff2 SansThe web, one weight47 KB
Zen-Medium.woff2 SansThe web, one weight46 KB
Zen-MediumItalic.woff2 SansThe web, one weight48 KB
Zen-Regular.woff2 SansThe web, one weight45 KB
Zen-SemiBold.woff2 SansThe web, one weight46 KB
Zen-SemiBoldItalic.woff2 SansThe web, one weight48 KB
Zen-Thin.woff2 SansThe web, one weight45 KB
Zen-ThinItalic.woff2 SansThe web, one weight47 KB
ZenMono-Variable.ttf MonoInstall it — every weight, one file171 KB
ZenMono-Variable.woff2 MonoThe web — every weight, one file71 KB
ZenMono-Italic-Variable.ttf MonoInstall it — every weight, italic, one file181 KB
ZenMono-Italic-Variable.woff2 MonoThe web — every weight, italic, one file79 KB
ZenMono-Black.woff2 MonoThe web, one weight52 KB
ZenMono-BlackItalic.woff2 MonoThe web, one weight56 KB
ZenMono-Bold.woff2 MonoThe web, one weight52 KB
ZenMono-BoldItalic.woff2 MonoThe web, one weight56 KB
ZenMono-ExtraBold.woff2 MonoThe web, one weight52 KB
ZenMono-ExtraBoldItalic.woff2 MonoThe web, one weight56 KB
ZenMono-ExtraLight.woff2 MonoThe web, one weight50 KB
ZenMono-ExtraLightItalic.woff2 MonoThe web, one weight54 KB
ZenMono-Italic.woff2 MonoThe web, one weight54 KB
ZenMono-Light.woff2 MonoThe web, one weight51 KB
ZenMono-LightItalic.woff2 MonoThe web, one weight54 KB
ZenMono-Medium.woff2 MonoThe web, one weight52 KB
ZenMono-MediumItalic.woff2 MonoThe web, one weight55 KB
ZenMono-Regular.woff2 MonoThe web, one weight50 KB
ZenMono-SemiBold.woff2 MonoThe web, one weight52 KB
ZenMono-SemiBoldItalic.woff2 MonoThe web, one weight55 KB
ZenMono-Thin.woff2 MonoThe web, one weight50 KB
ZenMono-ThinItalic.woff2 MonoThe web, one weight52 KB
ZenPixel-Variable.ttf PixelInstall it — every weight, one file3.6 MB
ZenPixel-Variable.woff2 PixelThe web — every weight, one file39 KB
ZenPixel-Circle.woff2 PixelThe web, one weight28 KB
ZenPixel-Grid.woff2 PixelThe web, one weight29 KB
ZenPixel-Line.woff2 PixelThe web, one weight18 KB
ZenPixel-Square.woff2 PixelThe web, one weight29 KB
ZenPixel-Triangle.woff2 PixelThe web, one weight29 KB

Licensed under the SIL Open Font License — the notice travels in LICENSE.txt and in each file's own name table.