Fixing Broken Georgian Fonts
Ever found a font you liked, only to have it break in some weird, annoying way? In my case, it completely wrecked Latin characters, like, they just vanished. So I had to dig in and figure out what the hell was going on.
A Bit of Background.
I come from Georgia, a small country between Russia and Turkey. We’ve got our own language and, better yet, our own writing system. Thress scripts, to be exact. But Mkhedruli is one everyone uses today.
Digital fonts for Georgian exist, sure. But I never gave them much thought. Usually, I’d just grab one from font.ge, install it, and move on.
Until last week
The Problem
I picked a nice-looking font from font.ge and dropped it into Figma. All good, until it wasn’t:
- Georgian letters showed up when typing Latin characters (e.g. typing a gave me ა)
- Typing actual Georgian gave me a fallback system font
At first I thought Figma was the reason. Turns out, the font itself was broken: the author had mapped Georgian glyphs onto Latin Unicode points.

So if I wanted to see the styled Georgian characters, I had to type English letters while using the Georgian layout. Not ideal.
Even worse, on the actual website, Latin characters like a
or b
showed up as Georgian letters. I had to wrap all Latin text in <span>
tags with a separate font, just to make it readable. Obviously it wasn't a good thing to leave as is.
Discovering FontForge
This problem led me to FontForge, an open-source font editor. It lets you open font files, inspect glyphs, remap them, and basically do surgery on broken fonts.
Once I opened the font, the issue was obvious: The font author had taken an English font and recreated Georgian letters on the Latin Unicode points. That might’ve been a workaround years ago when Georgian support was bad, but today? It’s broken.
So I:
- Moved the Georgian glyphs to their correct Unicode points.
- Removed the incorrect Latin substitutions.

But now I had another problem: the font had no real Latin letters anymore. It fell back to the system font. Functional, but visually inconsistent.
After some digging, I figured out the original Latin font was Bauhaus, unfortunately, copyrighted. So I skipped bundling it for now, but at least I knew what I was missing.
Mtavruli and Casing Support
Georgian is an unicase script, we don’t have a native uppercase like Latin’s A-Z. However, we do have a stylistic version called Mtavruli, which is used like uppercase for emphasis or titles.
Example:
- Mkhedruli: გამარჯობა (gamarjoba - hello)
- Mtavruli: ᲒᲐᲛᲐᲠᲯᲝᲑᲐ
Georgian casing isn't well supported in fonts either. If you press Shift in Georgian layout, you still get Mkhedruli, no case transformation happens. because to write შ თ ჭ ღ ჟ ძ ჩ you need to use combinations of shift+ს ტ წ რ ჯ ზ ც. so having a Mtavruli attached to shift would break this.
Whenever i needed uppercase looking georgian letters i had to use a second font and also if i know i will have to use both i look for a font that have both styles made to look cohesive on website.
However, I noticed some modern Georgian websites using both cases in one font, which was intriguing. I inspected those fonts and found something interesting: they used Unicode ranges for both Mkhedruli and Mtavruli, and implemented casing using OpenType lookups substitutions.
This is done using case feature scripts in the font itself. These allow substitution rules based on text context, so that if uppercase is detected, the font shows the Mtavruli glyph instead.
This was my first real exposure to OpenType features like this:

Usage on Website
to display font cases selectively you would use font-feature-settings for case:
css
Copy.ffs-case {
font-feature-settings: 'case' on;
}
so note using this inside font-face
css
Copy@font-face {
font-family: 'MyGeorgianFont';
src: url('./fonts/georgian.otf') format('opentype');
font-feature-settings: 'case' on; // won’t work
}
didn't work for me, because i guess you can't change internal font options while declaring the font. In either way it's better to just apply casing whenever u need and it's not necessary to make different font faces for that specific usage.
Final Touches and Pain Points
errors about curve points and intersections. That part was painfully slow, it took forever to fix all the curve, extrema and rounding issues so the font would export cleanly.
But eventually, I had a fully working font:
- Proper Georgian Unicode mapping
- Working Latin letters
- Support for Mtavruli “uppercase”
- Clean curves and no export warnings
Fonts seem simple from the outside, but once you dig in, especially for non-Latin scripts, you realize how much can go wrong if they're not built properly.
Now, whenever I run into a font issue, I know how to fix it. And maybe one day, I’ll even create my own from scratch.