Skip to content

typography tutorial · intermediate · 20 min

How to Make a Thai Font: Every Route from Handwriting to Retail

What this guide answers

There are exactly three routes to a Thai font — a handwriting-capture tool, a real type-design workflow, or a commission — and the route you can afford is decided by one technical fact: Thai needs OpenType mark positioning, and only two of the three routes produce it. This is the overview page for Latin type designers extending a family into Thai, and for designers who have been handed a Thai project and discovered that the tooling they know does not transfer. It covers the structural difficulty, the three routes with their real costs and failure modes, why AI and auto-tracing tools do not solve any of it, and what a shipped Thai font actually took to produce in our own pipeline.

If you want to draw the letterforms themselves, start instead with Thai Font Design: Letterform Basics. This page is about everything that happens around the drawing.

Why Thai is structurally harder than Latin

Latin is a linear script where each glyph advances the pen; Thai is a stacking script where marks attach to a base glyph at up to four levels above and two below, and none of that attachment happens unless the font file explicitly encodes where each mark goes. Microsoft’s Thai shaping documentation defines four above-mark classes — ABOVE1 (U+0E31, U+0E34–U+0E37), ABOVE2 (U+0E47, U+0E4D), ABOVE3 (the four tone marks U+0E48–U+0E4B), ABOVE4 (U+0E4C, U+0E4E) — plus BELOW1 (U+0E38, U+0E39), BELOW2 (U+0E3A), and a distinct AM class for U+0E33. A base consonant can carry a vowel from ABOVE1 with a tone mark from ABOVE3 sitting on top of it. That second attachment is mark-to-mark positioning, and it is the reason Thai cannot be treated as Latin-with-accents.

Microsoft flags ‘mark’ (mark-to-base) and ‘mkmk’ (mark-to-mark) as the only two REQUIRED features for a Thai OpenType font. ‘ccmp’ and ‘kern’ appear in the same table but carry no required flag. A font that ships without mark and mkmk anchors has given the renderer no instruction, so every vowel and tone mark lands at its own default origin — the failure Thai designers call สระลอย, floating vowels.

The glyph budget is the second surprise. The Thai Unicode block holds 128 code points with 87 assigned. Counting what a font actually needs: 44 consonants, 2 vocalic letters, 16 vowel signs and letters, 4 tone marks, 5 further diacritics, 2 abbreviation signs — 73 for the bare letter inventory. Add 10 Thai digits, the baht sign and Thai punctuation, U+25CC DOTTED CIRCLE (Microsoft is explicit that without it invalid mark sequences render as a white box) and U+200B ZWSP (Thai has no interword space, so ZWSP is what grows during justification), and you are at roughly 90. Then add the positional alternates Theppitak Karoonboonyanan’s Thai OpenType spec names — uni0E0D.descless and uni0E10.descless for and , the five lowered forms uni0E48.low through uni0E4C.low, uni0E4D.high — and you are near 98 glyphs that exist purely so positioning works. Add the basic Latin set that Thai text mixes with constantly — 95 printable ASCII positions — and a practical Thai+Latin font is heading for 200.

Third, there is a letterform decision with no Latin equivalent. Traditional Thai consonants carry a terminal loop (หัว); the modern loopless tradition drops it. This is not a stylistic axis you can interpolate between — it changes the skeleton of about a third of the alphabet. Decide before you draw, and read The Loopless Revolution if you are choosing for the first time.

Route 1: handwriting-capture tools

Handwriting-to-font services will give you a real TTF from your own handwriting in an afternoon, and it will almost certainly show floating vowels, because none of them documents any mark-positioning output in its own feature list. Calligraphr is the best known of them and the one to understand properly. Its free tier caps at 75 characters per font; Pro raises that to 600, with 20 concurrent fonts, 15 variants per character, ligatures and per-character spacing. It exports standard TTF or OTF, and downloaded fonts keep working after a subscription lapses. Its published documentation never names Thai: the tutorial works through “Minimal English” and “Minimal Number”, the features page names no script beyond Latin, and the only script limitation the FAQ states outright is that Calligraphr “cannot handle the high number of characters that would be necessary to create a fully functional Korean or Japanese font”. Whatever the template picker offers behind the login, characters can be added one at a time through the “Arbitrary characters” option in the template builder — which is how most people assemble a Thai set there.

Note the arithmetic collision. The bare 73-glyph Thai letter inventory technically fits inside the free 75-character cap. So the honest statement is not “Thai does not fit in the free tier” — it is that Thai fits in 75 characters only with zero Thai numerals, zero punctuation, zero Latin, no dotted circle and none of the positional alternates. A font anyone would actually use starts around 90.

But the cap is not the real blocker. Calligraphr’s FAQ documents contextual alternates (for character randomisation) and Pro-tier ligatures as its OpenType output and mentions no mark-to-base positioning, no mark-to-mark positioning, no anchors, and no combining-mark handling — precisely the tables Thai requires. Thai users report the predictable result first-hand: a Pantip thread on making a font with Calligraphr describes vowels that “should sit above or below the consonant” not staying there. The inference we would draw, and label as ours rather than the vendor’s, is that upgrading to Pro to fix floating vowels spends money on the wrong problem. More character slots do not create GPOS anchors.

Two tools in this bracket are worth naming. iFontMaker (Eiji Nishidai, $7.99 one-time on the App Store, version 3.52) is the one handwriting app we found whose own site explicitly lists Thai among its supported scripts — 2ttf.com states it covers “Latin-1, Greek, Cyrillic, Thai, and Japanese” — and it exports TrueType. Be careful with pricing when you research it: the $19.99/yr and $7.99/mo subscription figures that circulate under that name belong to a different App Store listing (id1591733051, currently titled “Font Creator for Keyboard”) by a different developer. FontForge is the honest zero-cost answer — free, GPL v3 and 3-clause BSD, current stable release 20251009, cross-platform, and it documents mark-to-base, mark-to-ligature and mark-to-mark positioning. You declare the lookups in the Lookups pane of Element > Font Info, which splits GSUB from GPOS, and place the anchor points with Points > Add Anchor. It is a font editor rather than a handwriting app, and it is the free route that can actually produce a correct Thai font. Birdfont is often listed as free, but its freeware build requires every font you make with it to be released under the SIL OFL and excludes colour fonts, variable fonts and OTF/CFF export; the Commercial edition starts at $4.99 and Plus at $9.99.

The workable Route 1 pattern is therefore hybrid: capture your handwriting outlines in Calligraphr or iFontMaker, then open the result in FontForge and add the anchors and ccmp rules by hand. That is a real afternoon-plus-a-week, not an afternoon.

Route 2: real type design

A genuine Thai typeface is drawn glyph by glyph in Glyphs, FontLab or FontForge, and the OpenType layer is roughly half the work — not a post-production formality. The drawing side is covered in Thai Font Design: Letterform Basics. The engineering side has a fixed shape.

Your GSUB layer is smaller than you expect. Theppitak’s spec states that ccmp is the only GSUB feature Thai rendering engines use, so every substitution you write is registered under it. Microsoft names two ccmp jobs specifically: decompose Sara Am (U+0E33) so its mark component can be positioned independently, and swap in a descender-less alternate for when a below-base vowel follows, so the vowel does not collide with the consonant’s tail. The independent shaping documentation gives the Sara Am decomposition concretely as U+0E33 becoming U+0E4D plus U+0E32.

Your GPOS layer is where the effort goes. Every mark glyph carries an anchor and a mark class; every base glyph defines an anchor for each mark class it can accept; every mark that can host another mark needs mkmk anchors too. The full pipeline the shaping engine runs is GSUB ‘locl’ then ‘ccmp’, then GPOS ‘kern’, ‘mark’, ‘mkmk’. Build against that order and test against it.

Test with hb-shape from HarfBuzz rather than by eye in a design app. Design apps hide problems in both directions — some apply shaping your target platform will not, and some fail to apply shaping your font does implement correctly. The specific strings worth keeping in a regression file: ญุ (descender-less alternate), น้ำ (Sara Am decomposition under a tone mark), and any consonant carrying an ABOVE1 vowel plus an ABOVE3 tone mark (mkmk stacking).

Route 3: commission

Commissioning is the correct route whenever the font is a brand asset rather than a craft exercise, and the brief matters more than the budget. ThaiGraph does not publish rate cards we cannot source, so treat what follows as a brief checklist rather than a price guide; the studios themselves are profiled in Thai Type Foundries.

A brief that will not produce disputes specifies: looped or loopless skeleton; the exact glyph set, stated as a codepoint list rather than “Thai”; whether Latin is in scope and whether it must match an existing Latin family’s metrics; the weight and width axes, and whether the deliverable is static instances or a variable font; the required OpenType features named individually (ccmp, kern, mark, mkmk at minimum); the licence model and embedding rights; and the source files — UFO or .glyphs — as a named deliverable, not an assumption. If bilingual setting is part of the job, the metric constraints are in our Thai + Latin bilingual guide, and licence terminology is unpacked in Thai Font Licensing.

Why AI generators and auto-tracers fail on Thai

Outline tracing produces outlines. Thai correctness lives in tables that contain no outlines at all, so a tool that only generates shapes cannot produce a working Thai font regardless of how good the shapes are. An anchor is a coordinate pair plus a class assignment; a ccmp rule is a substitution instruction. Neither is visible in a bitmap, an SVG, or a vectorised scan, so neither can be inferred by an image model or a tracer. A generated Thai font can look flawless as a specimen sheet of isolated consonants and collapse the moment a vowel is typed.

This is also why the “font generator” results that dominate search for this query are the wrong tool entirely. On our reading of what currently ranks, most of them produce Unicode-styled text — characters swapped for lookalikes from other Unicode blocks — not font files. Nothing is installed, nothing is licensed, and no Thai mark ever gets positioned.

Our own survey of commercial AI font-generation tooling in August 2026 found none producing correctly shaped Thai. We record that as a ThaiGraph research finding rather than a vendor statement, and it is a moving target — re-check before relying on it.

What shipping one actually looked like

In August 2026 we shipped ThaiGraph Condensed — Light, Regular, Medium, Bold, TTF and WOFF2 — through an automated fontTools pipeline, and the instructive part is how much of the work was positioning data rather than drawing. The family is derived from Anuphan v3.002, designed by Mint Tantisuwanna at Cadson Demak and published under SIL OFL 1.1 with no Reserved Font Name, which is what makes a renamed derivative legally clean.

The build has four stages. Instance pins the variable source at a heavier weight than the target, so a horizontal condense does not leave the stems looking thin. Condense scales every horizontal coordinate by 0.85 — glyf outlines, composite offsets and transforms, hmtx advances and left side bearings, and every GPOS XCoordinate, XPlacement and XAdvance value. That last clause is the whole trick: if you condense outlines but not GPOS anchors, every mark in the font detaches by up to 15% of its base width. Mark and mkmk anchors get the same X treatment and keep their Y untouched. TrueType hints are stripped, because they are stale the moment geometry moves. Rebrand applies the OFL-compliant rename, licence name records, and condensed width-class and macStyle bits. QA shapes real Thai through HarfBuzz across 40 automated checks: no .notdef anywhere, mark and mkmk attachment identical to the source, ccmp descender-less alternates firing on plus below-vowel, Sara Am decomposing, measured advance-width ratio 0.850 in all four styles, metadata clean.

The reusable lesson for anyone deriving from an OFL Thai family: whatever transformation you apply to outlines, apply the same transformation to the positioning tables, then verify it with a shaper rather than a design app. Derivatives of an OFL font must themselves remain OFL, and if the source declares a Reserved Font Name you must rename. Anuphan declares none, which is why it was the source we chose.

Choosing a route

Pick by what happens to the font after it exists, not by budget. A personal handwriting font for your own notes: Calligraphr or iFontMaker, and accept that สระ placement may be imperfect — or spend the extra week in FontForge adding anchors. A font that ships inside a product or a client identity: Route 2 or Route 3, with no middle ground. Our editorial judgement, and we label it as ours: Thai readers do not file floating vowels in a released brand asset under rendering quirk, they file them under the brand getting Thai wrong. A Latin family extending into Thai: Route 3 with a foundry that has a Thai team, and a brief that names the metric constraints up front.

If what you actually need is an existing font rather than a new one, the handwritten Thai fonts category and the loopless category list what is already available with verified licences, and the pillar Complete Guide to Thai Typography covers the writing system itself.

Information verified as of August 2026

Sources

  1. Thai stacks combining marks in discrete vertical levels. Microsoft's Thai shaping model defines four above-mark classes — ABOVE1 (U+0E31, U+0E34–U+0E37), ABOVE2 (U+0E47, U+0E4D), ABOVE3 (the four tone marks U+0E48–U+0E4B), ABOVE4 (U+0E4C, U+0E4E) — plus two below-mark classes, BELOW1 (U+0E38, U+0E39) and BELOW2 (U+0E3A), and a separate AM class for U+0E33.Microsoft Learn — 'Developing OpenType Fonts for Thai Script', section 'Invalid Combining Marks' (accessed Aug 11, 2026)
  2. 'mark' (mark-to-base) and 'mkmk' (mark-to-mark) are the only two features flagged as REQUIRED for a Thai OpenType font in Microsoft's feature table; 'ccmp' and 'kern' are listed but not marked required.Microsoft Learn — 'Developing OpenType Fonts for Thai Script', OpenType feature table (accessed Aug 11, 2026)
  3. Microsoft names two specific ccmp jobs for Thai: decompose Sara Am (U+0E33) so its mark component can be positioned, and substitute a descender-less alternate for Yo Ying (ญ) before a below-base vowel. It also states a Thai font should contain U+25CC DOTTED CIRCLE or invalid mark sequences render as a white .notdef box, and recommends including U+200B ZWSP because Thai does not separate words with spaces.Microsoft Learn — 'Developing OpenType Fonts for Thai Script' (accessed Aug 11, 2026)
  4. The independent OpenType shaping documentation gives the Thai pipeline as GSUB 'locl' then 'ccmp', followed by GPOS 'kern', 'mark', 'mkmk', and specifies the Sara Am decomposition as U+0E33 to U+0E4D (nikhahit) plus U+0E32 (sara aa).n8willis, opentype-shaping-documents — opentype-shaping-thai-lao.md ('The order in which these substitutions must be performed is fixed: locl ccmp'; GPOS 'kern mark mkmk') (accessed Aug 11, 2026)
  5. Theppitak Karoonboonyanan's Thai OpenType specification names the positional alternates a Thai font must carry beyond the Unicode repertoire: uni0E0D.descless (ญ) and uni0E10.descless (ฐ); uni0E48.low through uni0E4C.low; uni0E4D.high; and optionally uni0E47.high. The spec also states that ccmp is the only GSUB feature Thai rendering engines use.Theppitak Karoonboonyanan — 'Spec for Thai OpenType Font Creation', Linux Thai (created 2004-07-29, last updated 2012-02-22) (accessed Aug 11, 2026)
  6. The Thai Unicode block U+0E00–U+0E7F contains 128 code points, of which 87 are assigned. Thai has 44 consonant symbols, 16 vowel symbols that combine into at least 32 vowel forms, four tone marks, and ten Thai digits.Wikipedia — 'Thai (Unicode block)' and 'Thai script' (accessed Aug 11, 2026)
  7. Glyph budget arithmetic for a usable Thai font: 44 consonants + 2 vocalic letters + 16 vowel signs and letters + 4 tone marks + 5 other diacritics + 2 abbreviation signs = 73 letters; plus 10 Thai digits, currency and punctuation, U+25CC and U+200B takes it to roughly 90; plus the 8–9 positional alternates takes it to roughly 98; adding a basic Latin set (95 printable ASCII positions) takes a practical Thai+Latin font toward 200.ThaiGraph editorial — arithmetic derived from the Unicode Thai block inventory, Microsoft's Thai spec, and Theppitak's alternate list (accessed Aug 11, 2026)
  8. Calligraphr's free tier is capped at 75 characters per font and its Pro tier at 600 characters per font. Free allows 1 font and 2 variants per character; Pro allows 20 fonts and 15 variants, plus ligatures, per-character spacing, and server-side backup. Calligraphr outputs standard TTF or OTF files, and fonts keep working after a subscription lapses.Calligraphr — official pricing and features pages (accessed Aug 11, 2026)
  9. Calligraphr's public documentation never names Thai. The tutorial names 'Minimal English' and 'Minimal Number' as its worked examples, the features page names no script beyond Latin, and the only script limitation the FAQ states explicitly is 'Calligraphr cannot handle the high number of characters that would be necessary to create a fully functional Korean or Japanese font.' Characters outside a predefined set are added individually through the 'Arbitrary characters' option in the template builder. The FAQ documents only ligatures (Pro) and contextual alternates for randomization as OpenType output, with no mention of mark-to-base positioning, mark-to-mark positioning, anchors, or combining marks.Calligraphr — official features page, tutorial 1, and FAQ documentation (accessed Aug 11, 2026)
  10. Thai users report that Calligraphr-made Thai fonts render vowels detached from their consonants. The original Pantip poster wrote 'สระที่จะต้องอยู่บน-ล่างพยัญชนะมันกลับไม่อยู่' (vowels that should sit above or below the consonant do not stay there); a follow-up simply reported 'สระลอยค่ะ'.Pantip thread 39922367 — 'ทำฟ้อนต์ใช้เองด้วยเว็บ calligraphr' (accessed Aug 11, 2026)
  11. Buying Calligraphr Pro to raise the character cap does not fix floating vowels, because the failure is absent GPOS mark/mkmk anchor data and absent ccmp rules rather than an insufficient glyph count. This is an inference from Calligraphr's documented feature set against Microsoft's required-feature table, not a vendor statement.ThaiGraph editorial — inference from Calligraphr's published feature documentation and Microsoft's Thai required-feature table (accessed Aug 11, 2026)
  12. iFontMaker (App Store id377381670) is by developer Eiji Nishidai, priced $7.99 as a one-time purchase, version 3.52 released 2024-12-08, requiring iPadOS 13.0+. Its official site states it supports Unicode 'currently covering Latin-1, Greek, Cyrillic, Thai, and Japanese' and exports TrueType files.Apple App Store listing for iFontMaker, and 2ttf.com, the official iFontMaker site (accessed Aug 11, 2026)
  13. Subscription prices of $19.99/yr and $7.99/mo circulating in search results for 'iFontMaker' belong to a different App Store listing, id1591733051 (currently titled 'Font Creator for Keyboard', previously 'iFont Maker – Handwriting Fonts'), published by a different developer and sold on subscription rather than a one-time purchase.Cross-check of Apple App Store id377381670 against id1591733051 (accessed Aug 11, 2026)
  14. FontForge is free and open source under a mix of GNU GPL v3 and the 3-clause BSD licence, runs on Windows, macOS and GNU+Linux, and its latest stable release is version 20251009 (released 2025-10-09). Its 'Advanced Typography Tables' reference documents mark-to-base, mark-to-ligature and mark-to-mark positioning; lookups are declared in the Lookups pane of Element > Font Info, which separates GSUB from GPOS, and anchor points are placed with Points > Add Anchor.fontforge.org documentation, 'Advanced Typography Tables' and 'Font Info dialog'; Wikipedia — 'FontForge' (accessed Aug 11, 2026)
  15. Birdfont's freeware build requires every font edited with it to be released under the SIL Open Font License, and excludes colour fonts, variable fonts and OTF (CFF) export; the freeware EULA states 'All fonts edited with this version have to be released under the SIL Open Font License.' The Commercial edition is $4.99 USD or more and the Plus edition $9.99 USD or more.Birdfont — official download page and freeware EULA (accessed Aug 11, 2026)
  16. ThaiGraph Condensed v1.000 (Light, Regular, Medium, Bold; TTF and WOFF2) was produced by an in-house fontTools pipeline derived from Anuphan v3.002 (Cadson Demak, SIL OFL 1.1, no Reserved Font Name). The build instances the variable source at a heavier weight, applies a 0.85 horizontal condense across glyf outlines, composite transforms, hmtx advances and every GPOS X-coordinate including mark and mkmk anchors, strips TrueType hints, and renames per OFL requirements. All 40 automated HarfBuzz shaping checks (10 per style across 4 styles) pass, with measured advance-width ratio 0.850 in every style.ThaiGraph editorial — internal build record, font-factory pipeline (config.json / build.py / qa.py), run 2026-08-11 (accessed Aug 11, 2026)
  17. As of August 2026 ThaiGraph's own survey of commercial AI font-generation tools found none that produce correctly shaped Thai output. This is our research finding, not a vendor or third-party published statement.ThaiGraph editorial — internal survey of commercial AI font tooling, August 2026 (accessed Aug 11, 2026)
  18. Anuphan is published by Cadson Demak under the SIL Open Font License 1.1 with no Reserved Font Name — the licence file's copyright line reads 'Copyright 2019 The Anuphan Project Authors (https://github.com/cadsondemak/Anuphan)' with no name reserved — which is what makes renamed derivatives legally straightforward. The source file used in our build reports version 3.002 in its name table.google/fonts repository — ofl/anuphan/OFL.txt, cross-checked against the name table of the Anuphan variable file in our build sources (accessed Aug 11, 2026)
  19. Most sites ranking as 'Thai font generator' output Unicode-styled text — characters substituted for lookalikes drawn from other Unicode blocks — rather than installable font files, so no Thai mark positioning is ever involved.ThaiGraph editorial — observation of the tools ranking for this query, August 2026 (accessed Aug 11, 2026)
  20. Floating vowels in a released brand asset read to Thai readers as the brand getting Thai wrong rather than as a rendering quirk. This is ThaiGraph's editorial judgement, not a measured finding.ThaiGraph editorial — judgement of our Thai-reading editorial team (accessed Aug 11, 2026)