Skip to content

Font Subsetter

Cuts a TrueType font down to the glyphs your text actually uses and can wrap the result as WOFF — the difference between a 4 MB and a 90 KB Korean webfont.

Cuts a TrueType font down to the characters a page actually uses and rebuilds a valid file from what is left. For Korean this is the difference between a multi-megabyte download and a couple of hundred kilobytes, because a complete Hangul font carries 11,172 syllables and a page uses a few hundred. It can emit WOFF alongside the TTF, and it re-parses its own output before offering it.

🔒 Runs entirely in your browserfontsubsetperformancewebfont

Drop a TTF file

TrueType outlines only (.ttf, or an .otf with a glyf table). Everything happens in this tab.

How it cuts

  • · Keeps the glyphs for the characters you asked for and the component glyphs they reference (the closure of composite glyphs), then rewrites glyf·loca·hmtx·hhea·maxp·cmap (formats 4 and 12) and post. Table checksums and head.checkSumAdjustment are recomputed.
  • · The output is re-read with the same parser and only offered once it passes. The hinting programs (fpgm·prep·cvt) are left alone.
  • · A character you leave out renders as an empty box. Paste the real text of the page, or for Korean turn on the 2,350-syllable KS X 1001 set.

To look at the font first, the font inspector; to change only the format, the format converter.

How to use it

  1. Drop a TrueType file

    A `.ttf`, or a `.otf` that has TrueType outlines inside. The panel says which kind the file is as soon as it opens, because a CFF font cannot be subset here.

  2. Paste the text the page uses

    Copy the real copy — headings, labels, button text, error messages. Duplicates are collapsed automatically. Anything you leave out will render as a blank box in the final page, so err towards including more.

  3. Decide between your text and the standard set

    This is the real decision. Pasting only your text gives the smallest file and breaks the moment someone types a name into a field. Turning on the KS X 1001 set of 2,350 syllables gives a larger file that survives arbitrary Korean input. Static marketing copy wants the first; anything with user content wants the second.

  4. Build it and read the numbers

    Glyphs before and after, bytes before and after, and the percentage saved. If any character you asked for is missing from the font, it is listed rather than silently dropped.

  5. Take the file and the @font-face beside it

    The declaration is generated with the weight and italic flag read from the font’s own OS/2 and post tables, so it matches the file rather than being a guess.

Common questions

It refuses my OTF. Why?

Because that file has CFF (PostScript) outlines, and subsetting those means rewriting charstrings in a different outline format — a separate program from cutting TrueType `glyf` records, which is what this does. The page says so rather than producing a broken file. Use pyftsubset from fonttools on a desktop. Inspecting the font still works.

Will kerning and ligatures survive?

No. `GPOS` and `GSUB` are dropped, and the page lists them when it does. For Latin text that means no kerning pairs and no ligatures in the subset; for Korean it rarely matters, since Hangul composition is in the glyphs themselves. If kerning is load-bearing for you, subset with fonttools instead, which can rewrite those tables.

What happens to a variable font?

It comes out as the default instance — the variation tables are not carried through. That is usually fine for a subset, since a subset is a shipping artefact rather than a working file, but if you were relying on an axis, subset the static instance you actually use.

Can it make WOFF2?

No. WOFF2 needs Brotli and the browser does not give a page one. WOFF is available and is produced with `CompressionStream("deflate")` — it typically takes another 40–50% off the TTF. WOFF2 would take roughly another 20–30% beyond that, which needs a desktop tool.

Some characters came out as empty boxes.

They were not in the character list when the subset was built. That is the whole trade of subsetting: the file only contains what you asked for. Rebuild with the missing characters added, or turn on the KS X 1001 set so arbitrary Korean input has somewhere to land.

Feed it from

Next

These accept what this tool produces, so the result can go straight in.