Accuracy report
Show your working.
A converter that says “100% accurate” is guessing. This page shows what we test, which independent converters we compare against, and every difference we found.
Methodology
Four layers of checking.
- 01Running
Reference pairs
Words and sentences with known correct output, taken from the source projects’ own fixtures and published examples, checked in both directions.
- 02Running
Reorder tests
Visual-order fonts store the short-i sign, the reph and similar marks in a different order from Unicode. Dedicated tests cover each rearrangement and their combinations.
- 03Running
Round trips
Text converted to a legacy font and back should come out unchanged. Where it can’t, the font genuinely lacks the character and the loss report says so.
- 04Running
Differential tests
Every font that has an open-source counterpart is run against it, pinned to an exact commit, on the same test strings. Each disagreement is reviewed by rule. The majority does not automatically win, because many converters copy the same tables. Where the counterpart is the project our mapping came from, the test checks our copy of the table, not the table itself.
Provenance
Sources and test results, per font.
Generated from the converter registry and the differential-test results, so it can’t drift from what the tool actually runs. The project is open source under GPL-3.0-or-later. Mappings come from openly licensed projects (MIT, Apache, CC-BY or GPL-compatible) or are written by us from documented layouts, and each one records its source, commit and licence.
| Profile | Language | Mappings | Compared with | Exact match | Source | License |
|---|---|---|---|---|---|---|
| Kruti Dev 010fixture-tested | Hindi | 157 | HinLegacy, kru2uni 1 source lineage | 77.0%Mostly the other converter’s errors: 149 of 221 differences. of 960; reviewed: 149 their error, 72 equivalent | Independently authored from the public Kruti Dev 010 layout; behaviour cross-checked with HinLegacy (MIT) and IIIT-H kru2uni. Additional aliases checked entry-by-entry against IIT Delhi e44eaa2d0f6be95698c0178bc05017992b4b58c9 (GPL-3.0-or-later) and KrutiExtract b841c8e346623d8f3334a8d138917bc69f76a8c7 (MIT); the complete IIT tables remain quarantined. reference | Project-owned data; MIT and GPL-3.0-or-later references |
| Walkman Chanakya 905fixture-tested | Hindi | 159 | HinLegacy 1 source lineage | 32.8%Mostly the other converter’s errors: 484 of 484 differences. of 720; reviewed: 484 their error, 0 equivalent | Independently authored Walkman Chanakya 905 slot differences against the shared Kruti Dev layout; HinLegacy engines/chanakya.py, commit 7ae4d8b (MIT). Additional aliases checked entry-by-entry against IIT Delhi e44eaa2d0f6be95698c0178bc05017992b4b58c9 (GPL-3.0-or-later) and KrutiExtract b841c8e346623d8f3334a8d138917bc69f76a8c7 (MIT); the complete IIT tables remain quarantined. reference | Project-owned data; MIT and GPL-3.0-or-later references |
| DevLys 010fixture-tested | Hindi | 164 | HinLegacy 1 source lineage | 91.4% of 720; reviewed: 0 their error, 62 equivalent | Reuses the Kruti Dev 010 core chart with DevLys aliases independently checked against HinLegacy engines/devlys.py, commit 7ae4d8b (MIT). Additional aliases checked entry-by-entry against IIT Delhi e44eaa2d0f6be95698c0178bc05017992b4b58c9 (GPL-3.0-or-later) and KrutiExtract b841c8e346623d8f3334a8d138917bc69f76a8c7 (MIT); the complete IIT tables remain quarantined. reference | Project-owned data; MIT and GPL-3.0-or-later references |
| Preetifixture-tested | Nepali | 149 | nepali-fonts 1 source lineage | 100.0% of 240; reviewed: 0 their error, 0 equivalent | Independently authored layout; checked against nirajan-pant/nep-fontconv (63d177d) and nepalibhasha/nepali-fonts (c2dcb30), both MIT. reference | Project-owned data; MIT references |
| Bijoy Classic / SutonnyMJfixture-tested | Bengali | 309 | bondhon 1 source lineage | 98.3% of 240; reviewed: 4 their error, 0 equivalent | BanglaKit bondhon Bijoy Classic assignments and fixtures (2019 BanglaKit); cross-checked with banglakit/converter. reference | MIT; independently structured mapping data |
| Baminifixture-tested | Tamil | 297 | Pakeetharan, Open-Tamil 1 source lineage | 94.2% of 960; reviewed: 29 their error, 27 equivalent | Pakeetharan Balasubramaniam unicode-bamini-converter (2025), MIT. reference | MIT; independently structured mapping data |
| Nudi / Baraha shared ASCIIfixture-tested | Kannada | 523 | Looped-forward, Looped-reverse 1 source lineage | 76.0%Mostly the other converter’s errors: 162 of 172 differences. of 716; reviewed: 162 their error, 10 equivalent | Looped Labs asciikannada2unicode and unicode2asciikannada (2015 Looped Labs Pvt. Ltd.). reference | MIT; independently structured mapping data |
| Shree-Dev 0714fixture-tested | Marathi | 229 | Padma 1 source lineage | 98.3% of 240; reviewed: 2 their error, 2 equivalent | Padma Shree_Dev_0714.js and script Unicode tables (pinned mapping-table fixtures) reference | GPL-2.0-or-later |
| Shivajifixture-tested | Marathi | 187 | Padma 1 source lineage | 95.0% of 240; reviewed: 0 their error, 12 equivalent | Padma Shivaji.js and script Unicode tables (pinned mapping-table fixtures) reference | GPL-2.0-or-later |
| Kiranfixture-tested | Marathi | 186 | Padma 1 source lineage | 98.3% of 240; reviewed: 0 their error, 4 equivalent | Padma Kiran.js and script Unicode tables (pinned mapping-table fixtures) reference | GPL-2.0-or-later |
| Anu (Anu Script Manager 7)fixture-tested | Telugu | 1743 | No local open-source converter · 19/20 website spot checks | — | Unicode to Non Unicode (unicodetononunicode.com), Anu 7 mapping and Telugu test corpus, updated 2026-10-21. reference | CC BY 4.0 |
| TeraFont Trilochanfixture-tested | Gujarati | 96 | Terafont 1 source lineage | 70.3%Mostly the other converter’s errors: 185 of 214 differences. of 720; reviewed: 185 their error, 6 equivalent, 23 open | Ankit Pipalia, terafont-trilochan-converter, app/converter.py and tests/test_converter.py. reference | MIT (Copyright © 2026 Ankit Pipalia); fonts excluded |
| AnmolLipifixture-tested | Punjabi | 108 | ShabadOS JS 3.2.2 1 source lineage | 91.3% of 720; reviewed: 0 their error, 63 equivalent | Shabad OS gurmukhi Rust maps, normalization and independent tests (1.0.0) reference | MIT |
| DrChatrikfixture-tested | Punjabi | 103 | Padma 1 source lineage | 88.3% of 240; reviewed: 0 their error, 28 equivalent | Padma DrChatrik.js and script Unicode tables (pinned mapping-table fixtures) reference | GPL-2.0-or-later |
| ML-TT Karthikafixture-tested | Malayalam | 152 | Payyans 1 source lineage | 54.9%129 of 325 differences are the other converter’s errors. of 720; reviewed: 129 their error, 196 equivalent | Original SMC Payyans maps/karthika.map and tests/test.py reference | GPL-3.0 |
| ML-TT Revathifixture-tested | Malayalam | 134 | Payyans 1 source lineage | 73.3%73 of 192 differences are the other converter’s errors. of 720; reviewed: 73 their error, 119 equivalent | Original SMC Payyans maps/revathi.map and tests/test.py reference | GPL-3.0 |
| ML-TT Ambilifixture-tested | Malayalam | 182 | Payyans 1 source lineage | 53.5%129 of 335 differences are the other converter’s errors. of 720; reviewed: 129 their error, 206 equivalent | Original SMC Payyans maps/ambili.map and tests/test.py reference | GPL-3.0 |
| FML Malayalamfixture-tested | Malayalam | 138 | Kalkandam 1 source lineage | 100.0% of 720; reviewed: 0 their error, 0 equivalent | Kalkandam js/malayalam.js and tests/malayalam.test.js reference | MIT |
| Akruti Odia Saralafixture-tested | Odia | 200 | OdiaWikimedia 1 source lineage | 93.8% of 240; reviewed: 0 their error, 15 equivalent | OdiaWikimedia/Converter Akruti-Sarala - Unicode Converter.htm; Manoj Sahukar and Subhashish Panigrahi reference | GPL-3.0 |
| DV-TTGaneshExperimental — check output | Hindi | 229 | No local open-source converter | — | Padma DV_TTGanesh.js; ede617bc1645dfe796be968303d746dd6a9d0afb reference | GPL-2.0-or-later |
| DVW-TTGaneshExperimental — check output | Hindi | 232 | No local open-source converter | — | Padma DVW_TTGanesh.js; ede617bc1645dfe796be968303d746dd6a9d0afb reference | GPL-2.0-or-later |
| AnjalExperimental — check output | Tamil | 316 | Open-Tamil 1 source lineage | 98.5% of 720; reviewed: 8 their error, 3 equivalent | Open-Tamil txt2unicode, Arulalan.T / Ezhil Language Foundation (2014). reference | GPL-3.0-or-later (file-level license) |
| BoomiExperimental — check output | Tamil | 316 | Open-Tamil 1 source lineage | 83.3%Mostly the other converter’s errors: 118 of 120 differences. of 720; reviewed: 118 their error, 2 equivalent | Open-Tamil txt2unicode, Arulalan.T / Ezhil Language Foundation (2014). reference | GPL-3.0-or-later (file-level license) |
| DinamaniExperimental — check output | Tamil | 314 | Open-Tamil 1 source lineage | 98.5% of 720; reviewed: 8 their error, 3 equivalent | Open-Tamil txt2unicode, Arulalan.T / Ezhil Language Foundation (2014). reference | GPL-3.0-or-later (file-level license) |
| DinathanthyExperimental — check output | Tamil | 316 | Open-Tamil 1 source lineage | 98.5% of 720; reviewed: 8 their error, 3 equivalent | Open-Tamil txt2unicode, Arulalan.T / Ezhil Language Foundation (2014). reference | GPL-3.0-or-later (file-level license) |
| KavipriyaExperimental — check output | Tamil | 322 | Open-Tamil 1 source lineage | 78.1%Mostly the other converter’s errors: 158 of 158 differences. of 720; reviewed: 158 their error, 0 equivalent | Open-Tamil txt2unicode, Arulalan.T / Ezhil Language Foundation (2014). reference | GPL-3.0-or-later (file-level license) |
| MurasoliExperimental — check output | Tamil | 314 | Open-Tamil 1 source lineage | 81.0%Mostly the other converter’s errors: 131 of 137 differences. of 720; reviewed: 131 their error, 6 equivalent | Open-Tamil txt2unicode, Arulalan.T / Ezhil Language Foundation (2014). reference | GPL-3.0-or-later (file-level license) |
| NakkeeranExperimental — check output | Tamil | 314 | Open-Tamil 1 source lineage | 98.5% of 720; reviewed: 8 their error, 3 equivalent | Open-Tamil txt2unicode, Arulalan.T / Ezhil Language Foundation (2014). reference | GPL-3.0-or-later (file-level license) |
| TABfixture-tested | Tamil | 309 | Open-Tamil, Padma 2 source lineages | 99.1% of 1,269; reviewed: 8 their error, 3 equivalent | Open-Tamil txt2unicode, Arulalan.T / Ezhil Language Foundation (2014). reference | GPL-3.0-or-later (file-level license) |
| TAM / TAM-ElangoExperimental — check output | Tamil | 307 | Open-Tamil, Padma 2 source lineages | 87.6%Mostly the other converter’s errors: 154 of 157 differences. of 1,267; reviewed: 154 their error, 3 equivalent | Open-Tamil txt2unicode, Arulalan.T / Ezhil Language Foundation (2014). reference | GPL-3.0-or-later (file-level license) |
| TSCIIExperimental — check output | Tamil | 320 | Open-Tamil, Padma 2 source lineages | 97.6% of 1,280; reviewed: 16 their error, 15 equivalent | Open-Tamil txt2unicode, Arulalan.T / Ezhil Language Foundation (2014). reference | GPL-3.0-or-later (file-level license) |
| PallavarExperimental — check output | Tamil | 306 | Open-Tamil 1 source lineage | 77.5%Mostly the other converter’s errors: 159 of 162 differences. of 720; reviewed: 159 their error, 3 equivalent | Open-Tamil txt2unicode, Arulalan.T / Ezhil Language Foundation (2014). reference | GPL-3.0-or-later (file-level license) |
| IndowebExperimental — check output | Tamil | 313 | Open-Tamil 1 source lineage | 97.1% of 720; reviewed: 18 their error, 3 equivalent | Open-Tamil txt2unicode, Arulalan.T / Ezhil Language Foundation (2014). reference | GPL-3.0-or-later (file-level license) |
| KoelnExperimental — check output | Tamil | 405 | Open-Tamil 1 source lineage | 67.5%Mostly the other converter’s errors: 234 of 234 differences. of 720; reviewed: 234 their error, 0 equivalent | Open-Tamil txt2unicode, Arulalan.T / Ezhil Language Foundation (2014). reference | GPL-3.0-or-later (file-level license) |
| LibiExperimental — check output | Tamil | 314 | Open-Tamil 1 source lineage | 62.2%Mostly the other converter’s errors: 272 of 272 differences. of 720; reviewed: 272 their error, 0 equivalent | Open-Tamil txt2unicode, Arulalan.T / Ezhil Language Foundation (2014). reference | GPL-3.0-or-later (file-level license) |
| WebulagamExperimental — check output | Tamil | 314 | Open-Tamil 1 source lineage | 98.5% of 720; reviewed: 8 their error, 3 equivalent | Open-Tamil txt2unicode, Arulalan.T / Ezhil Language Foundation (2014). reference | GPL-3.0-or-later (file-level license) |
| SoftviewExperimental — check output | Tamil | 323 | Open-Tamil 1 source lineage | 70.8%Mostly the other converter’s errors: 210 of 210 differences. of 720; reviewed: 210 their error, 0 equivalent | Open-Tamil txt2unicode, Arulalan.T / Ezhil Language Foundation (2014). reference | GPL-3.0-or-later (file-level license) |
| VanavilExperimental — check output | Tamil | 336 | Open-Tamil 1 source lineage | 70.8%Mostly the other converter’s errors: 210 of 210 differences. of 720; reviewed: 210 their error, 0 equivalent | Open-Tamil txt2unicode, Arulalan.T / Ezhil Language Foundation (2014). reference | GPL-3.0-or-later (file-level license) |
| IndicaExperimental — check output | Tamil | 305 | Open-Tamil 1 source lineage | 99.4% of 720; reviewed: 4 their error, 0 equivalent | Open-Tamil txt2unicode, Arulalan.T / Ezhil Language Foundation (2014). reference | GPL-3.0-or-later (file-level license) |
| Anu TamilExperimental — check output | Tamil | 306 | Open-Tamil 1 source lineage | 99.4% of 720; reviewed: 4 their error, 0 equivalent | Open-Tamil txt2unicode, Arulalan.T / Ezhil Language Foundation (2014). reference | GPL-3.0-or-later (file-level license) |
- Their error
- The other converter produced invalid Unicode, left characters unconverted, or failed to round-trip. We checked each case by rule.
- Equivalent
- A different but equally valid result: the same text after Unicode normalisation, or two legacy key sequences that draw the same glyphs.
- Open
- We couldn’t settle it from the evidence. Each open case is listed with its specific question in the differential report.
Kruti Dev 010: mapping notes+
The as=ें decode alias is verified against IIT Delhi e44eaa2d0f6be95698c0178bc05017992b4b58c9 (GPL-3.0-or-later) and KrutiExtract b841c8e346623d8f3334a8d138917bc69f76a8c7 (MIT). See scripts/differential/iit/port-fixes.json.
Walkman Chanakya 905: mapping notes+
Distinct slots include =k (त्र), ½ (ऋ), iQ (फ), Q (फ़), / (ध), ¼ (द्ध). This profile does not cover other Chanakya font families.
DevLys 010: mapping notes+
Core keyboard is shared, but extended aliases and preferred forms differ: ä (क्त), ç (प्र), èk (ध), ¨ (ो), © (ौ). Plain shared-slot text cannot uniquely identify DevLys versus Kruti Dev.
Preeti: mapping notes+
Word fixtures: nepalibhasha/nepali-fonts tests/test_preeti.py (Shuvayatra vectors). Kantipur is not an interchangeable font alias. Canonical reph follows matras; accepts reph before matras too. Extended ° follows nepali-fonts (ङ्ढ); nep-fontconv instead lists ड्ढ; the two references disagree and this rare slot is unresolved.
Bijoy Classic / SutonnyMJ: mapping notes+
Reference commit 398d942e634a90e41994d68881c677d519efa7e1. Canonical classic slots. Alternate e-sign † is accepted; encoding uses † at word start and for split vowels. No legacy font files redistributed.
Bamini: mapping notes+
Reference commit ee08d4360afadebaea4ef373ca1fad42025abb53. Ambiguous * assignments for ஙு/ஙூ/ஞு/ஞூ are excluded; * canonically means ழூ. Open-Tamil txt2unicode has a GPL file-level header despite the MIT repository license: no code or tables from it used. ரூ uses the & glyph (the reference encoder emits an extraneous backslash).
Nudi / Baraha shared ASCII: mapping notes+
Reference commit 341e746263ff74a7c181ce47ffddcd39f5eb9654. Verified common 8-bit Baraha / Nudi font layout, not phonetic keyboard input. Forward tables resolve shifted ಛ/ಜ vowel errors in the upstream reverse table. No claim of support for every Nudi/Baraha font version; no separate Baraha encoding verified.
Shree-Dev 0714: mapping notes+
Mapping-table fixtures, not a native-reader document corpus. Alternate glyphs encode canonically. Explicit eyelash र् uses a preserved Unicode joiner with a loss diagnostic (no verified separate legacy slot); Padma half-RRA is ऱ्. Unknown font variants require review.
Shivaji: mapping notes+
Mapping-table fixtures, not a native-reader document corpus. Alternate glyphs encode canonically. Explicit eyelash र् uses a preserved Unicode joiner with a loss diagnostic (no verified separate legacy slot); Padma half-RRA is ऱ्. Unknown font variants require review.
Kiran: mapping notes+
Mapping-table fixtures, not a native-reader document corpus. Alternate glyphs encode canonically. Explicit eyelash र् uses a preserved Unicode joiner with a loss diagnostic (no verified separate legacy slot); Padma half-RRA is ऱ्. Unknown font variants require review.
Anu (Anu Script Manager 7): mapping notes+
Adapted into structured pairs and a Telugu syllable reorderer. Attribution requested by the source: Unicode to Non Unicode, unicodetononunicode.com. https://creativecommons.org/licenses/by/4.0/. Only Anu 7 Windows-1252 character strings; no font files. Mapping SHA-256 1a54f21904f79b9bf7426994e06597bed8452179ca042c02b833c4077d65b312. Colliding isolated vowel and vattu slots require context. No separate reph glyph is documented: ర్ uses pollu or ra-vattu according to the cluster.
TeraFont Trilochan: mapping notes+
Reference commit cc2315ca1cfaed87468d14d4fbf1a4970e11391c. Independently structured mapping with new bidirectional cluster handling. README ambiguities (Latin letters, reph, half forms, ર/૨, પ/૫) are diagnosed; reph and half forms are reconstructed. Prefer consonants for ambiguous digit slots. Terminal virama has no verified glyph and is preserved with a loss warning. No font files redistributed. LMG Arun excluded: LMG2Shruti download page states GPL.
AnmolLipi: mapping notes+
Pinned MIT rewrite; npm gurmukhi-utils 3.2.2 is GPL and was not used. src/unicode.rs explicitly identifies shared AnmolLipi/GurbaniAkhar slots. Official Unicode output folds open-top yayya variants (reported as lossy); decorative extender/stamp bytes are preserved with diagnostics. No font files redistributed.
DrChatrik: mapping notes+
Mapping-table fixtures, not a native-reader document corpus. Alternate glyphs encode canonically. Ambiguous overlapping punctuation follows the upstream table. AnmolLipi is a different layout.
ML-TT Karthika: mapping notes+
Pinned original repository; docs/LICENSE GPLv3 and payyan.py GPLv3-or-later. Table fixtures plus Karthika upstream sample words; no independent running-text corpus for Revathi/Ambili. Atomic chillus preferred; aliases canonicalized; ambiguous upstream slots retain their last defined value. Dot reph has no mapped slot and is preserved with diagnostics. Shared ASCII slots cannot identify the font without distinctive conjuncts or font metadata. No font binaries bundled.
ML-TT Revathi: mapping notes+
Pinned original repository; docs/LICENSE GPLv3 and payyan.py GPLv3-or-later. Table fixtures plus Karthika upstream sample words; no independent running-text corpus for Revathi/Ambili. Atomic chillus preferred; aliases canonicalized; ambiguous upstream slots retain their last defined value. Dot reph has no mapped slot and is preserved with diagnostics. Shared ASCII slots cannot identify the font without distinctive conjuncts or font metadata. No font binaries bundled.
ML-TT Ambili: mapping notes+
Pinned original repository; docs/LICENSE GPLv3 and payyan.py GPLv3-or-later. Table fixtures plus Karthika upstream sample words; no independent running-text corpus for Revathi/Ambili. Atomic chillus preferred; aliases canonicalized; ambiguous upstream slots retain their last defined value. Dot reph has no mapped slot and is preserved with diagnostics. Shared ASCII slots cannot identify the font without distinctive conjuncts or font metadata. No font binaries bundled.
FML Malayalam: mapping notes+
MIT licence and source inspected; notice retained in scripts/malayalam.ts. Canonical FML nda slot is ï, distinct from ML soft hyphen. Atomic chillus preferred; ൿ shares Iv with ക് (loss reported). Historical dot reph is unsupported and preserved with diagnostics. No claim of every FML font variant or of ML-TT Revathi/Ambili compatibility; no fonts bundled.
Akruti Odia Sarala: mapping notes+
Table-based upstream fixtures; repository has no separate golden corpus. HTML additionally credits CC-BY-SA 3.0 and Rebati/Srujanika. Trie avoids replacement cascades. à is ma-phala in the upstream table despite an unreachable later reph rule; canonical reph uses ð. No fonts bundled; Aprant/ORTT/Shreelipi not claimed.
DV-TTGanesh: mapping notes+
Single source; no independent verification or native review. See scripts/differential/dtp-summary.md. Exact delegated faces only; no blanket family compatibility.
DVW-TTGanesh: mapping notes+
Single source; no independent verification or native review. See scripts/differential/dtp-summary.md. Exact delegated faces only; no blanket family compatibility.
Anjal: mapping notes+
Pinned commit 5ce20bd727a6a9d1e5969b212ab8fdae571b132f; encode2utf8.py syllable tables. Repository MIT label does not replace GPL file headers. Maximal-munch conversion avoids upstream sequential replacement cascades. Legacy strings represent character slots, not raw file bytes. No font binaries or native review.
Boomi: mapping notes+
Pinned commit 5ce20bd727a6a9d1e5969b212ab8fdae571b132f; encode2utf8.py syllable tables. Repository MIT label does not replace GPL file headers. Maximal-munch conversion avoids upstream sequential replacement cascades. Legacy strings represent character slots, not raw file bytes. No font binaries or native review.
Dinamani: mapping notes+
Pinned commit 5ce20bd727a6a9d1e5969b212ab8fdae571b132f; encode2utf8.py syllable tables. Repository MIT label does not replace GPL file headers. Maximal-munch conversion avoids upstream sequential replacement cascades. Legacy strings represent character slots, not raw file bytes. No font binaries or native review.
Dinathanthy: mapping notes+
Pinned commit 5ce20bd727a6a9d1e5969b212ab8fdae571b132f; encode2utf8.py syllable tables. Repository MIT label does not replace GPL file headers. Maximal-munch conversion avoids upstream sequential replacement cascades. Legacy strings represent character slots, not raw file bytes. No font binaries or native review.
Kavipriya: mapping notes+
Pinned commit 5ce20bd727a6a9d1e5969b212ab8fdae571b132f; encode2utf8.py syllable tables. Repository MIT label does not replace GPL file headers. Maximal-munch conversion avoids upstream sequential replacement cascades. Legacy strings represent character slots, not raw file bytes. No font binaries or native review.
Murasoli: mapping notes+
Pinned commit 5ce20bd727a6a9d1e5969b212ab8fdae571b132f; encode2utf8.py syllable tables. Repository MIT label does not replace GPL file headers. Maximal-munch conversion avoids upstream sequential replacement cascades. Legacy strings represent character slots, not raw file bytes. No font binaries or native review.
Nakkeeran: mapping notes+
Pinned commit 5ce20bd727a6a9d1e5969b212ab8fdae571b132f; encode2utf8.py syllable tables. Repository MIT label does not replace GPL file headers. Maximal-munch conversion avoids upstream sequential replacement cascades. Legacy strings represent character slots, not raw file bytes. No font binaries or native review.
TAB: mapping notes+
Pinned commit 5ce20bd727a6a9d1e5969b212ab8fdae571b132f; encode2utf8.py syllable tables. Repository MIT label does not replace GPL file headers. Maximal-munch conversion avoids upstream sequential replacement cascades. Legacy strings represent character slots, not raw file bytes. Cross-checked against Padma ede617bc1645dfe796be968303d746dd6a9d0afb (GPL-2.0-or-later): 240/240 independent corpus decodes agree; Open-Tamil differences are explained sequential-replacement defects or equivalent Sri spellings. Authoritative adjudication: TN17 (2004), G.O.Ms.No.17 (13 June 1999), Annexure IV. Ã is கூ; invented digit slots were removed. Independent TN17 review agrees on all 309 chart entries and all 240 corpus strings; Padma agrees on the same 549 cases. See scripts/differential/tn17-review.json for the PDF hash and fingerprint. Reference tables used for adjudication only; no standard table copied into the application. No font binaries or native review.
TAM / TAM-Elango: mapping notes+
Pinned commit 5ce20bd727a6a9d1e5969b212ab8fdae571b132f; encode2utf8.py syllable tables. Repository MIT label does not replace GPL file headers. Maximal-munch conversion avoids upstream sequential replacement cascades. Legacy strings represent character slots, not raw file bytes. Authoritative adjudication: G.O.Ms.No.17/1999 Annexure III and TN17 shared-glyph rules; corrected NG pulli, LLA split-o and NYA split-au. Remains experimental: authoritative review is targeted adjudication, not two independent full-repertoire confirmations. Reference tables used only to adjudicate individual disagreements. No font binaries or native review.
TSCII: mapping notes+
Pinned commit 5ce20bd727a6a9d1e5969b212ab8fdae571b132f; encode2utf8.py syllable tables. Repository MIT label does not replace GPL file headers. Maximal-munch conversion avoids upstream sequential replacement cascades. Legacy strings represent character slots, not raw file bytes. Cross-checked against Padma ede617bc1645dfe796be968303d746dd6a9d0afb (GPL-2.0-or-later): 240/240 independent corpus decodes agree; Open-Tamil differences are explained sequential-replacement defects or equivalent Sri spellings. Authoritative adjudication: TN15 v1.1 (2007), archived TSCII charter and IANA registration. Use FE for canonical 1.7 I (AD accepted for 1.6 compatibility); B7 aytham; AA-tail ksha-au; modern SHA-based Sri per TN15 note 2; C1 transport aliases accepted. Remains experimental: authoritative review is targeted adjudication, not two independent full-repertoire confirmations. Reference tables used only to adjudicate individual disagreements. No font binaries or native review.
Pallavar: mapping notes+
Pinned commit 5ce20bd727a6a9d1e5969b212ab8fdae571b132f; encode2utf8.py syllable tables. Repository MIT label does not replace GPL file headers. Maximal-munch conversion avoids upstream sequential replacement cascades. Legacy strings represent character slots, not raw file bytes. No font binaries or native review.
Indoweb: mapping notes+
Pinned commit 5ce20bd727a6a9d1e5969b212ab8fdae571b132f; encode2utf8.py syllable tables. Repository MIT label does not replace GPL file headers. Maximal-munch conversion avoids upstream sequential replacement cascades. Legacy strings represent character slots, not raw file bytes. No font binaries or native review.
Koeln: mapping notes+
Pinned commit 5ce20bd727a6a9d1e5969b212ab8fdae571b132f; encode2utf8.py syllable tables. Repository MIT label does not replace GPL file headers. Maximal-munch conversion avoids upstream sequential replacement cascades. Legacy strings represent character slots, not raw file bytes. No font binaries or native review.
Libi: mapping notes+
Pinned commit 5ce20bd727a6a9d1e5969b212ab8fdae571b132f; encode2utf8.py syllable tables. Repository MIT label does not replace GPL file headers. Maximal-munch conversion avoids upstream sequential replacement cascades. Legacy strings represent character slots, not raw file bytes. No font binaries or native review.
Webulagam: mapping notes+
Pinned commit 5ce20bd727a6a9d1e5969b212ab8fdae571b132f; encode2utf8.py syllable tables. Repository MIT label does not replace GPL file headers. Maximal-munch conversion avoids upstream sequential replacement cascades. Legacy strings represent character slots, not raw file bytes. No font binaries or native review.
Softview: mapping notes+
Pinned commit 5ce20bd727a6a9d1e5969b212ab8fdae571b132f; encode2utf8.py syllable tables. Repository MIT label does not replace GPL file headers. Maximal-munch conversion avoids upstream sequential replacement cascades. Legacy strings represent character slots, not raw file bytes. No font binaries or native review.
Vanavil: mapping notes+
Pinned commit 5ce20bd727a6a9d1e5969b212ab8fdae571b132f; encode2utf8.py syllable tables. Repository MIT label does not replace GPL file headers. Maximal-munch conversion avoids upstream sequential replacement cascades. Legacy strings represent character slots, not raw file bytes. No font binaries or native review.
Indica: mapping notes+
Pinned commit 5ce20bd727a6a9d1e5969b212ab8fdae571b132f; encode2utf8.py syllable tables. Repository MIT label does not replace GPL file headers. Maximal-munch conversion avoids upstream sequential replacement cascades. Legacy strings represent character slots, not raw file bytes. No font binaries or native review.
Anu Tamil: mapping notes+
Pinned commit 5ce20bd727a6a9d1e5969b212ab8fdae571b132f; encode2utf8.py syllable tables. Repository MIT label does not replace GPL file headers. Maximal-munch conversion avoids upstream sequential replacement cascades. Legacy strings represent character slots, not raw file bytes. No font binaries or native review.
Hindi, Marathi and Nepali fonts at scale
50,757 strings, every Devanagari font.
The test set has 36,911 real Hindi, Marathi, Nepali and Sanskrit words, sentences built from them, and generated hard cases: every consonant with every vowel sign, every two-consonant conjunct, reph, rakar, nukta, the Marathi eyelash ra and ळ, Nepali spellings, numerals and punctuation. Each string is converted to the font and back, and the legacy text is also decoded by the independent converters available for that font. Disagreements are judged by rule (malformed output, a converter that cannot read its own encoding), never by majority. Deliberately broken glyph orders, which have no right answer, are left out of the percentages.
| Font | Round trip exact | Has a character the font lacks | Compared with | Same or equivalent | Other converter’s error | Open |
|---|---|---|---|---|---|---|
| Kruti Dev 010 | 99.99%50,753 of 50,757 | 111 | HinLegacy, IIT Delhi FontConverter, KrutiExtract, kru2uni3 source lineages, 3,10,434 comparisons | 84.3% | 45,277 | 3,543 |
| DevLys 010 | 99.99%50,753 of 50,757 | 111 | HinLegacy, IIT Delhi FontConverter2 source lineages, 2,05,986 comparisons | 94.4% | 10,931 | 690 |
| Walkman Chanakya 905 | 99.99%50,752 of 50,757 | 112 | HinLegacy, IIT Delhi FontConverter, KrutiExtract3 source lineages, 2,58,240 comparisons | 56.7% | 1,10,943 | 829 |
| Shivaji | 100.00%50,757 of 50,757 | 3,726 | Padma1 source lineage, 52,321 comparisons | 98.4% | 771 | 68 |
| Kiran | 99.99%50,750 of 50,757 | 1,494 | Padma1 source lineage, 52,410 comparisons | 97.7% | 705 | 505 |
| Shree-Dev 0714 | 100.00%50,756 of 50,757 | 2,427 | Padma1 source lineage, 52,309 comparisons | 97.4% | 1,101 | 276 |
| Preeti | 100.00%50,755 of 50,757 | 2,225 | nepali-fonts1 source lineage, 52,158 comparisons | 96.6% | 1,761 | 36 |
| DV-TTGanesh | 100.00%50,756 of 50,757 | 6,332 | Padma1 source lineage, 52,465 comparisons | 98.9% | 425 | 145 |
| DVW-TTGanesh | 100.00%50,756 of 50,757 | 6,332 | Padma1 source lineage, 52,465 comparisons | 98.9% | 425 | 145 |
Round trip
Text converted to the font and back must match. Where a font has no glyph for a character (Preeti has no ळ, Kruti Dev no ASCII colon), the converter keeps it as Unicode and flags it, and the rest still comes back exactly.
Font detection
On generated samples of every supported font, the top guess converted 93.1% of 12–30-word passages and 80.3% of 1–3-word snippets correctly. Short snippets are often genuinely ambiguous, which is why the detector asks you to confirm.
English and links in pasted text
Web addresses and email addresses are never converted. A word is left in English only when it cannot be legacy-font text: none of 5,19,354 legacy words in our tests were wrongly left unconverted. Ordinary English words that also spell valid Hindi in the font are still converted, so check mixed text.
Generated 1 November 2026 by the project’s accuracy script. No fluent-speaker review has been done.
At corpus scale
Bengali, Tamil, Malayalam and the other non-Devanagari fonts.
Each of these fonts was run over 4,47,249 words from frequency lists, 53,332 sentences and 62,237 generated syllables and clusters: Unicode to the font and back. Silent changes, text altered without a warning: 0. Where a font has no glyph for something, the converter says so. That is counted as flagged, not as a match. The same runs made 7,91,453 comparisons with the independent converters listed above. Generated 1 November 2026.
| Font | Words | Sentences | Syllables | Compared with |
|---|---|---|---|---|
| Bijoy Classic / SutonnyMJ | 99.89% | 99.21% | 99.97% | bondhon |
| Bamini | 99.98% | 99.80% | 100% | Pakeetharan, Open-Tamil |
| Nudi / Baraha shared ASCII | 100% | 100% | 100% | Looped-forward, Looped-reverse |
| Anu (Anu Script Manager 7) | 100% | 100% | 99.87% | No local converter |
| TeraFont Trilochan | 99.99% | 31.30% | 99.97% | Terafont |
| AnmolLipi | 100% | 100% | 100% | ShabadOS JS 3.2.2 |
| DrChatrik | 100% | 100% | 100% | Padma |
| ML-TT Karthika | 99.99% | 99.91% | 100% | Payyans |
| ML-TT Revathi | 99.99% | 99.91% | 100% | Payyans |
| ML-TT Ambili | 99.99% | 99.91% | 100% | Payyans |
| FML Malayalam | 99.99% | 99.73% | 99.94% | Kalkandam |
| Akruti Odia Sarala | 100% | 100% | 100% | OdiaWikimedia |
| Anjal | 99.98% | 99.80% | 99.85% | Open-Tamil |
| Boomi | 99.98% | 99.80% | 100% | Open-Tamil |
| Dinamani | 99.98% | 99.80% | 100% | Open-Tamil |
| Dinathanthy | 99.98% | 99.80% | 100% | Open-Tamil |
| Kavipriya | 99.98% | 99.80% | 100% | Open-Tamil |
| Murasoli | 99.98% | 99.80% | 100% | Open-Tamil |
| Nakkeeran | 99.98% | 99.80% | 100% | Open-Tamil |
| TAB | 99.98% | 99.80% | 100% | Open-Tamil, Padma |
| TAM / TAM-Elango | 99.98% | 99.80% | 100% | Open-Tamil, Padma |
| TSCII | 100% | 100% | 100% | Open-Tamil, Padma |
| Pallavar | 99.94% | 99.55% | 100% | Open-Tamil |
| Indoweb | 99.98% | 99.80% | 100% | Open-Tamil |
| Koeln | 99.86% | 99.00% | 100% | Open-Tamil |
| Libi | 99.98% | 99.85% | 100% | Open-Tamil |
| Webulagam | 99.98% | 99.80% | 100% | Open-Tamil |
| Softview | 99.98% | 99.80% | 100% | Open-Tamil |
| Vanavil | 99.98% | 99.80% | 100% | Open-Tamil |
| Indica | 99.98% | 99.80% | 100% | Open-Tamil |
| Anu Tamil | 99.98% | 99.80% | 100% | Open-Tamil |
Percentages are round trips that come back exactly or as canonically equivalent Unicode. The remainder were all flagged to the user, mostly sequences the font cannot draw, or punctuation that shares a glyph slot (Terafont has no verified full-stop slot).
Font detection, on 3,330 samples of these fonts, Unicode text and English: for one or two words, the right font comes first 68% of the time, and a font that gives the same conversion 79% of the time. For a few sentences those figures are 82% and 89%. Several Tamil and Malayalam fonts share most of their layout, so short samples often can’t tell them apart. When the scores are close, the converter asks you to confirm the font.
What “accurate” means here
- Same text in, same text out. Conversion is deterministic. There is no AI guessing at words.
- Syllables, not letters. Marks are repositioned per syllable, which is why words like हिन्दी and कार्य come out right.
- No silent damage. What a font can’t represent is flagged, never quietly dropped.
What it doesn’t promise
- Spelling correction. Misspelt input stays misspelt.
- Every font variant. Numbered releases of a font can differ. Each profile says which one it targets.
- Perfect detection. The font detector ranks guesses; it does not know.