How to clean bloated name table records from a font
- Step 1Drop your font onto the tool — Accepts `.ttf`, `.otf`, `.woff`, and `.woff2`. WOFF2 is decompressed with the bundled `wawoff2` WASM and WOFF is zlib-inflated table-by-table before the name table is read, so format doesn't matter. Free tier accepts files up to **5 MB** — well above any single font weight.
- Step 2The tool locates and parses the name table — It walks the sfnt table directory for the `name` tag, reads the table version, record count, and string-storage offset, then decodes every `(platformID, encodingID, languageID, nameID)` record. If the font has no `name` table at all it stops with an error rather than guessing.
- Step 3It filters to the fixed keep-list — Only records matching platformID **3**, encodingID **1**, languageID **0x409**, and a nameID in **{1, 2, 4, 5, 6, 13, 14}** survive. There is no option to widen or narrow this — the keep-list is hard-coded. If zero records match (a font with only Mac records, say), it errors instead of emitting a nameless font.
- Step 4It rebuilds the table and re-serialises the font — Surviving records are sorted by platform → encoding → language → nameID, packed into a fresh name table with recomputed offsets, and written back via a table-directory rebuild. Only the `name` table changes; glyphs, metrics, hinting, and layout tables are byte-identical.
- Step 5Download the cleaned TTF — Output is `<yourfont>.cleaned.ttf` with MIME `font/ttf`, even if you uploaded a WOFF2. The result panel shows records before/kept/dropped and a size reduction percentage when the file got smaller.
- Step 6Re-compress for the web — Because output is always TTF, pipe it through [ttf-to-woff2](/font-tools/ttf-to-woff2) (or [ttf-to-woff](/font-tools/ttf-to-woff) for an extra legacy fallback) to ship the slimmed font. Combine with [hinting-stripper](/font-tools/hinting-stripper) and [font-subsetter](/font-tools/font-subsetter) for compounding savings.
What the tool keeps vs drops
The keep-list is fixed in code — there are no toggles. A record survives only if all four coordinates match AND the nameID is in the keep set.
| Record coordinate / nameID | Kept value(s) | Everything else |
|---|---|---|
| platformID | 3 (Windows) | Dropped — 0 (Unicode), 1 (Macintosh), 2 (ISO) all removed |
| encodingID | 1 (Unicode BMP) | Dropped — Windows Symbol (0) and Unicode-full (10) records removed |
| languageID | 0x409 (English, US) | Dropped — 0x809 (English UK), 0x40C (French), 0x411 (Japanese), every other locale removed |
| nameID 1, 2, 4 | Kept — Family, Subfamily, Full name (the records browsers match) | — |
| nameID 5, 6 | Kept — Version string, PostScript name | — |
| nameID 13, 14 | Kept — Licence description, Licence URL | — |
| nameID 0, 3, 7, 8, 9, 10, 11, 12, 16, 17, 19, 256+ | Dropped | Copyright (0), Unique ID (3), Trademark (7), Manufacturer/Designer (8/9), Typographic family/subfamily (16/17), Sample text (19), and variable-font axis names (256+) are all removed |
Input format handling
Output is always an uncompressed TTF regardless of input. Re-compress afterwards if you need a web format.
| Input | How it's read | Output |
|---|---|---|
| TTF / OTF | Used directly as the sfnt buffer | .cleaned.ttf (TTF flavour preserved in the sfnt header) |
| WOFF2 | Decompressed with bundled wawoff2 WASM into a flat sfnt | .cleaned.ttf — you lose WOFF2 compression; re-run ttf-to-woff2 |
| WOFF | Each table zlib-inflated and reassembled into an sfnt | .cleaned.ttf — re-run ttf-to-woff if you still need WOFF |
| Anything else | Rejected | Error: Unsupported font format |
Cookbook
Concrete before/after record counts from real fonts, plus the size numbers you can actually expect. The tool reports the exact before/kept/dropped figures in its result panel.
Heavily-localised commercial font
ExampleA foundry font shipped with Windows + Mac copies of every string across eight locales. The cleaner collapses it to seven Windows-English records.
Before: 72 name records
(8 locales x 2 platforms x ~4-5 strings each)
Kept: 7 records
nameID 1,2,4,5,6,13,14 @ platform 3 / enc 1 / lang 0x409
Dropped: 65 records
Result: MyFont.woff2 -> MyFont.cleaned.ttf
name table shrinks ~6-12 KBLightly-localised open-source font
ExampleMany Google Fonts ship only Windows-English plus a Mac copy. Savings are smaller but the change is still clean.
Before: 18 name records (Windows-English + Mac-Roman copies, a few extra IDs) Kept: 7 records Dropped: 11 records Result: size reduction often 1-3 KB before re-compression
Verifying the output preserved identity
ExampleAfter cleaning, confirm the font still names itself correctly with the sibling read-only inspector — it should still report family, subfamily, full name, version, PostScript name, and licence.
1. Run name-table-cleaner -> MyFont.cleaned.ttf
2. Open /font-tools/font-metadata-extractor
3. Drop MyFont.cleaned.ttf
-> Family (1), Subfamily (2), Full name (4),
Version (5), PostScript (6), Licence (13/14) present
-> Copyright (0) and Trademark (7) now absentWeb pipeline: clean then re-compress
ExampleBecause output is TTF, the practical web workflow is two tools. Clean first (smaller name table), then WOFF2-compress.
Brand-Regular.woff2 -> name-table-cleaner -> Brand-Regular.cleaned.ttf -> ttf-to-woff2 -> Brand-Regular.cleaned.woff2 Net: name-table bytes removed before compression, so the final WOFF2 is marginally smaller too.
A font that can't be cleaned
ExampleSome legacy or exotic fonts carry only Mac-platform name records. The tool refuses rather than ship a font with no Windows name.
Input: LegacyMac.ttf (platformID 1 records only)
Filter: 0 records match platform 3 / enc 1 / lang 0x409
Result: Error -> "No Windows English name records to keep
- name table layout is non-standard."
Fix: add a Windows-English name record in FontForge first.Edge cases and what actually happens
Every row below was probed against the live API. Some documented requirements (alphabetical axis order, numerical tuple order) are not actually enforced in practice — useful to know if you've been blaming the wrong thing for a 400.
Output is TTF even when you upload WOFF2
By designThe tool decompresses WOFF/WOFF2 into a raw sfnt, edits the name table, and re-serialises as an uncompressed TTF (font/ttf, <stem>.cleaned.ttf). It does not re-compress. If you uploaded a 20 KB WOFF2 you will get a much larger TTF back — that is expected. Run the result through ttf-to-woff2 to restore web-ready compression.
Copyright (nameID 0) is removed
Removed by designnameID 0 (Copyright) is not in the keep-list — only 1, 2, 4, 5, 6, 13, 14 survive. The licence description (13) and licence URL (14) are kept, but the copyright notice and trademark (7) strings are dropped. If your EULA requires the copyright string to remain embedded, this tool is not appropriate for that font — review the licence before shipping the cleaned file.
Variable-font axis names (nameID 256+) are removed
Removed by designVariable fonts store axis and named-instance labels in nameIDs 256 and above, referenced by the fvar table. Those records fall outside the keep-list and are dropped. The fvar table itself is untouched, so the axes still work, but design-tool UI that reads the axis name strings may show blank or fallback labels. Do not clean a variable font you intend to expose with named instances in an editor.
Font has no name table
ErrorIf the sfnt directory has no name tag, the tool stops with Font has no 'name' table. This is rare for real fonts (the spec requires one) but can happen with hand-built or corrupt files. There is nothing to clean — the input isn't a conformant font.
No Windows-English records to keep
ErrorIf filtering leaves zero records — typically a legacy font carrying only Mac-platform (platformID 1) strings — the tool throws No Windows English name records to keep — name table layout is non-standard. rather than emit a font with an empty name table. Add a Windows-Unicode-English name record in a desktop editor first.
head.checkSumAdjustment is not recomputed
Preserved (stale)Rebuilding the name table changes the file, but the tool does not recompute the file-level checkSumAdjustment field in the head table. Browsers, FreeType, DirectWrite, and CoreText all ignore it, so the font renders and installs normally. A strict validator (e.g. Microsoft Font Validator) will flag a checksum mismatch — harmless, but if you need a strictly valid checksum, pass the output through ttx/fontTools or a validator that rewrites it.
Typographic family/subfamily (16/17) removed
Removed by designnameIDs 16 and 17 (Typographic / Preferred family and subfamily) are not kept. For most fonts these duplicate or refine nameID 1/2 and browsers fall back to 1/2 fine. For large families with more than four styles that rely on 16/17 to group weights correctly in some applications, dropping them can change how the family lists in a desktop font menu — not a browser issue, but worth knowing before cleaning a multi-weight superfamily.
Re-running an already-cleaned font
Expected (idempotent)A font already reduced to the seven keep-list records will pass through unchanged — the filter keeps the same seven records and drops nothing. The result panel will show Records before == Records kept and Records dropped == 0, and the size reduction will be ~0%. Running it twice does no harm.
Frequently asked questions
Which name records survive cleaning?
Exactly seven, all Windows-Unicode-English (platformID 3, encodingID 1, languageID 0x409): nameID 1 (Family), 2 (Subfamily), 4 (Full name), 5 (Version), 6 (PostScript name), 13 (Licence description), and 14 (Licence URL). Everything else — Mac records, other languages, and the other nameIDs — is dropped. The keep-list is fixed; there are no options to change it.
Will this break installation on macOS or Linux?
No. macOS Font Book has read Windows-platform (platformID 3) name records since 10.6 Snow Leopard (2009), and Linux fontconfig and Windows all read the same records. The Mac-platform (platformID 1) records the tool removes are legacy duplicates. Installation and font matching work identically after cleaning.
Is there an option to keep the copyright string?
No. The tool has no options at all — its schema lists zero configurable fields and the UI has no checkboxes. nameID 0 (Copyright) is not in the keep-list, so it is always removed. The licence description (13) and licence URL (14) are kept by default, but the copyright and trademark (7) strings are not. If your licence requires the copyright string to remain, don't clean that font.
Why is my output a TTF when I uploaded a WOFF2?
The tool decompresses WOFF/WOFF2 to a raw sfnt to edit the name table, then re-serialises as an uncompressed TTF (<stem>.cleaned.ttf). It doesn't re-compress. To get a web-ready file back, run the result through ttf-to-woff2. The two-step clean-then-compress flow also produces a marginally smaller WOFF2 because the name-table bytes are gone before compression.
Can I keep French / German / Japanese name records for a non-English deployment?
Not with this tool — it keeps only English-US (0x409) and there is no language-keep list to edit. Browsers read 0x409 regardless of the user's locale, so for web delivery this is correct. If you genuinely need localised name strings preserved (for a desktop app or print pipeline), edit the name table in FontForge or fontTools instead and leave the localised records in place.
Does cleaning change how the font looks?
No. Only the name table is rebuilt. Glyph outlines (glyf/CFF), metrics (hmtx/OS_2/hhea), kerning, hinting, and OpenType layout (GSUB/GPOS) are byte-identical in the output. The font renders pixel-for-pixel the same — only metadata strings change.
How much will I save?
Lightly-localised fonts: roughly 1–3 KB off the name table. Heavily-localised commercial fonts with full multilingual records: 5–15 KB. The exact figure depends entirely on how many records the source carried — the result panel reports Records before, kept, and dropped plus a size-reduction percentage so you can measure your specific font. Remember the output is uncompressed TTF, so judge savings after re-compressing to WOFF2.
What file formats can I drop on it, and how big?
TTF, OTF, WOFF, and WOFF2. WOFF2 is decompressed with bundled WASM and WOFF is zlib-inflated before reading. The free tier accepts files up to 5 MB; Pro raises that to 50 MB. A single font weight is almost always well under 1 MB, so the limit is rarely a factor for this tool.
Does it modify variable fonts correctly?
It edits the name table the same way, but variable-font axis/instance name records (nameID 256+) are not in the keep-list and get dropped. The fvar table still works, so the axes function, but editors that read axis-name strings may show blanks. Don't clean a variable font you plan to expose with named instances in a design tool.
Will a strict validator complain about the output?
It may flag the head.checkSumAdjustment field, which the tool does not recompute after editing. This is cosmetic — browsers and OS font engines ignore it. If you need a strictly conformant checksum, run the cleaned TTF through fontTools (ttx) or any validator that rewrites checksums.
Is my font uploaded to a server?
No. The entire operation — decompression, parsing, name-table rebuild, re-serialisation — runs in your browser via WASM and JavaScript. The font binary, including any embedded licensing and copyright strings, never leaves your machine. Only an anonymous processed-count metric is recorded for signed-in dashboards.
What's the right order in a multi-tool pipeline?
Clean the name table early (on the TTF/OTF, or on a WOFF2 you decompress here), then strip hints with hinting-stripper, subset with font-subsetter if you can, and compress last with ttf-to-woff2. Each step compounds, and compressing last means every byte removed upstream stays removed. To audit before/after, use font-metadata-extractor.
Privacy first
Every JAD Font tool runs entirely in your browser using opentype.js and the wawoff2 WASM Brotli encoder. Your fonts never leave your device — verified by zero outbound network requests during processing.