Two tools for working on a typeface, running entirely in this browser. The fonts you drop here are never uploaded — they are read by a Python engine loaded into this page, and the results come straight back as a download.
Starting the font engine…
Match one font's glyph set to another
Pick a source font whose character set is correct, and a target font that has drifted. Glyphs the target has but the source doesn't are removed; glyphs the source has but the target doesn't are added as empty placeholders — real glyph slots with a name, a width and a Unicode mapping, just no outline yet. Shared glyphs are left alone.
Optical kerning from glyph shapes
Every glyph side is measured at 24 heights and classified as
square, round, narrow at the top,
narrow at the bottom or waisted. Those classes set
how much space each pair should get. The baseline is taken from your
own font — the typical gap between straight-sided pairs like
nn and HI — so correctly spaced pairs come
out at zero and only real departures get kerned. Existing kerning
within the tolerance is kept exactly as you set it.
Before and after
Both lines use the real font files, rendered by your browser with kerning on.
Localized forms from glyph names
The same character often needs a different shape depending on the
language — a Bulgarian д is not a Russian д, and Romanian
sets its Ş with a comma below. OpenType handles that with the
locl feature, which normally has to be written by hand.
Draw the alternates, name them <base>.locl<TAG>
— like decyr.loclBGR — and this writes the feature for you.
The locl part can sit anywhere in the name, so
aacute.loclHUN.sc correctly substitutes
aacute.sc. Base names are matched through Unicode rather
than as text, so an alternate called Elcyr.loclBGR still
finds its base even when the font calls it uni041B.
Tidy up glyph names
Fonts pick up whatever names the tool that built them used:
afii10096 for ю, or uni044E. This renames
every glyph from the character it actually encodes, and updates
everything that points at it — cmap, metrics, components, kerning
and the layout features — so the font behaves exactly as before.
Suffixes are kept, so afii10096.loclBGR becomes
yucyr.loclBGR. That is worth doing before the Locl
Enabler: once the base is called decyr, its alternate
decyr.loclBGR follows from the name.
Font Installer — a download
The last tool needs to write to your font folder and your trash, which a browser cannot do, so it comes as a small download instead.
Point it at the folder your font editor exports to and it installs every
new version as it appears. It identifies a font by the family and style
recorded inside the file rather than by its filename, so a
re-export called MyFont-FINAL-v2.otf replaces
MyFont.otf instead of quietly leaving you with two copies
that applications pick between at random. The version it replaces goes to
the trash, never deleted.
Needs Python 3.8 or newer and nothing else — no
pip install step. macOS and most Linux systems already have
it; on Windows install it from python.org and tick
Add python.exe to PATH. The included README has the setup for
each platform, including how to keep it running after you log in
(launchd, systemd or Task Scheduler).
unzip dimka-font-installer.zip cd dimka-font-installer python3 install-fonts watch ~/Documents/FontExports
On macOS you can skip the terminal entirely and double-click
Watch Folder (macOS).command inside the folder.