Fonts
woff2, woff, ttf and an SVG font, from one deterministic build.
Point it at a directory. Out come woff2, woff,
ttf and a stylesheet, with the geometry a font actually needs — strokes
outlined, transforms baked, codepoints assigned once and never moved again.
npx @iconotype/cli init --input icons/ \
--fonts-dir app/fonts --styles-dir app/css --style-kind scss-variables
npx @iconotype/cli build --input app.iconotype.json
# built 27 glyph(s) → app/fonts/app.woff2, app/fonts/app.woff, app/fonts/app.ttf, app/css/_app.scss
init writes a committed project file and a codepoints.lock;
build is what runs afterwards, on a laptop or a runner, and produces identical
bytes from identical input. Files whose contents have not changed are not rewritten, so a
no-op build leaves the working tree clean.
A font glyph has no stroke, no transform, no clip and no even-odd fill rule. Artwork drawn anywhere other than a font editor has all four, which is why so many generated icon fonts come out hollow, doubled or empty. Everything that goes in runs through a fixer first:
<style> rules resolved, <use> dereferencedAnything that cannot survive the trip is reported rather than silently mangled — 31 findings, each with a code — and the whole pipeline is pinned by a 75-fixture visual regression suite, so a change that alters what an icon looks like fails the build.
woff2, woff, ttf and an SVG font, from one deterministic build.
CSS, SCSS, LESS, variables-only partials, CSS custom properties, or a JSON name→codepoint map.
A sprite sheet, PNGs, favicons, React and Vue components, and a .d.ts union of every icon name.
The number behind .icon-home is baked into every stylesheet you have ever
shipped and every page a browser has cached. Allocation is append-only from the Private Use
Area and recorded in a lockfile: renaming an icon moves its name, never its
number, and removing one leaves its codepoint reserved.
npx @iconotype/cli diff --input app.iconotype.json --against origin/main # non-zero if a codepoint moved
npx @iconotype/cli scan --input app.iconotype.json # which icons nothing references
diff fails a
pull request that would move a codepoint.
Drop the SVGs on the web app and see what the fixer says about them.