Font Subsetter

This free font subsetter strips a font down to only the glyphs you actually use, then hands back a much smaller WOFF2 or a ready-to-drop web-font kit. Choose from 21 language and symbol presets, paste your copy to extract the exact characters it contains, or define custom Unicode ranges. It runs browser-based and stays completely private — your font is processed on your own device, with no uploads.

100% private — runs in your browser

Drop a font file here, or browse

TTF · OTF · WOFF · WOFF2

Unicode presets

Add whole ranges on top of the textarea. Presets and manual text merge into one subset.

Advanced options
Upload a font, then select presets or paste characters.

Subset fonts locally to shrink web-font payloads — ideal for icon fonts, logotypes, and landing pages with limited copy. Pair with the Font Converter for format changes.

How to use the font subsetter

  1. Load your font. Drag in a TTF, OTF, WOFF, or WOFF2 file. Nothing leaves your browser — the font is read directly on your device.
  2. Choose what to keep. Pick one of the 21 language and symbol presets (Latin, Cyrillic, Greek and more), paste your copy so the tool extracts only the characters it uses, or type a custom Unicode range like U+0041-005A.
  3. Combine selections if you need to. Stack a language preset with extra punctuation, numbers, or a handful of icons so the subset covers every glyph on your page.
  4. Preview the glyph count. See how many glyphs survive the cut and roughly how much weight you’ll save before you commit.
  5. Download. Export a single optimized WOFF2, or grab a web-font kit with the @font-face CSS ready to paste into your stylesheet.

What font subsetting is and why it shrinks files

A typical font file carries far more than the letters you see on screen. It can hold thousands of glyphs: accented characters for dozens of languages, currency symbols, math operators, arrows, ligatures, and alternate forms you may never use. When you subset a font, you keep only the glyphs your project needs and discard the rest. Removing those unused glyphs — along with their outline data and the kerning and hinting tables tied to them — is what makes the file dramatically smaller. If your site only renders English text, the Cyrillic, Greek, Arabic, and CJK glyphs bundled in a global font are pure dead weight. A font subsetter cuts them out cleanly so your visitors download exactly what they’ll see.

How much smaller fonts get and the page-speed payoff

The savings depend on how much you remove, but they are often substantial. A broad multi-language font trimmed to a single script can shrink by a large margin, and trimming to just the exact characters in a logo or heading can leave a file a tiny fraction of its original size. Because web fonts are render-blocking resources that browsers fetch early, every kilobyte you cut helps the page paint sooner.

That feeds straight into Core Web Vitals. A smaller font downloads faster, so text becomes visible earlier and your First Contentful Paint (FCP) improves. When you subset WOFF2 and pair it with a sensible loading strategy, the font stops being a bottleneck and starts behaving like the lightweight asset it should be.

Subsetting by language, by exact characters, or by Unicode range

There are three practical ways to decide which glyphs to keep, and this tool supports all of them:

  • By language preset. The fastest option for body copy. Pick Latin, Latin Extended, Cyrillic, Greek, or one of the other presets and the subsetter keeps the full character set for that script — safe when your content is dynamic and you don’t know every character in advance.
  • By exact characters (text extraction). Paste your actual copy and the tool keeps only the characters that appear in it. This is ideal for headings, logos, and static marketing pages where the text rarely changes, and it produces the smallest possible files.
  • By Unicode range. Specify precise codepoints such as U+0030-0039 for digits. This gives you surgical control and maps directly to how the web platform splits fonts.

That last point connects to the CSS unicode-range descriptor. Inside a @font-face rule you can declare which codepoints a font file covers, and the browser only downloads that file when the page uses a character in the range. By producing several subsets — say one for Latin and one for Cyrillic — and giving each its own @font-face block with a matching unicode-range, you let browsers fetch only the scripts a visitor encounters. This is exactly how large font services serve global typefaces without forcing everyone to download every alphabet.

A note on licensing

Subsetting modifies the font binary, so only subset fonts you are licensed to use and modify. Many commercial webfont licenses explicitly permit subsetting because it is a normal part of web delivery, and open-source families under the SIL Open Font License generally allow it too. But some licenses restrict modification or redistribution, and a few self-hosted webfont agreements forbid altering the binary at all. When in doubt, check the license or EULA that came with your font before you deploy a subset. The processing here is private and local, but that does not override the terms you agreed to with the foundry.

Common subset presets

Preset Rough glyph count Typical use
Latin (basic) ~200-250 English and core Western European text, plus common punctuation
Latin Extended ~400-700 Accented characters for most European languages (Polish, Turkish, Vietnamese, etc.)
Cyrillic ~250-400 Russian, Ukrainian, Bulgarian, Serbian and related scripts
Greek ~70-130 Modern Greek text and common Greek-letter symbols
Numbers & punctuation only ~30-60 Tabular data, price tickers, countdowns, UI badges
Icons / symbols varies (a handful to a few hundred) Custom icon fonts trimmed to only the symbols in the UI

Glyph counts are approximate and vary by typeface — a display face may cover a script with far fewer glyphs than a full-featured text family. Use the live count in the tool for the exact figure on your font.

Browser subsetter vs. command-line tools

The reference toolchain for font subsetting lives on the command line. pyftsubset, the subsetter that ships with the Python fonttools package, is what most build pipelines call under the hood — a typical invocation looks like pyftsubset Font.ttf --text-file=chars.txt --flavor=woff2. Tools like glyphhanger wrap fonttools and add a crawler that scans your pages to discover which characters you actually use, then emits the subset and the matching unicode-range values automatically.

Those tools are powerful, but they require installing Python, fonttools, and a Brotli library before you can produce a single WOFF2, and the flags are easy to get wrong. A browser-based subsetter gives you the same core result with nothing to install, instant feedback on the glyph count, and your font file never leaving your device. For one-off jobs, brand fonts, or a quick heading subset, that is usually all you need; reach for the command line only when you want subsetting baked into an automated build step.

What font subsetting will not do

Subsetting is narrowly about which glyphs ship, so its limits are worth stating. It will not change the design of your typeface — the kept glyphs render exactly as the foundry drew them. It will not grant you rights you do not have; removing glyphs does not turn a desktop-only or no-modification license into a webfont license. And it will not help if you keep everything — a subset that still includes every script is just a re-saved font. The savings come entirely from leaving glyphs out, so the tighter your selection, the smaller the result.

Subset scope What it keeps Typical size vs. original
Full multi-script font Every glyph (Latin, Cyrillic, Greek, CJK, symbols) 100% (baseline)
Single script (Latin) One alphabet plus core punctuation ~10-30%
Latin + numbers + punctuation Body-copy essentials for one language ~10-25%
Exact characters (logo / heading) Only the glyphs in your fixed text ~1-5%
Icons / symbols only The handful of glyphs your UI uses ~1-10%

Figures are rough and depend on the source font; a global family trimmed to Latin saves far more than a font that was Latin-only to begin with. Reductions are largest for CJK families, where a full file can run into megabytes.

Frequently asked questions

What is font subsetting?

Font subsetting is the process of creating a smaller font file that contains only a chosen subset of glyphs instead of the full character set. You remove everything the page doesn’t use — extra languages, symbols, and alternates — and keep just the glyphs you need, which makes the file load faster.

How much smaller will my font get?

It depends on how much you cut. Trimming a wide multi-language font to a single script removes a large share of the glyphs and shrinks the file accordingly; reducing it to the exact characters in a heading or logo can make it a tiny fraction of the original. The preview shows your real before-and-after weight for your specific font.

What’s the difference between WOFF2 and WOFF?

WOFF2 uses Brotli compression and produces noticeably smaller files than the older WOFF format, and it is supported by every modern browser. WOFF is worth including only if you must support very old browsers. For nearly all sites today, exporting a subset WOFF2 is the right default.

Is subsetting lossless?

For the glyphs you keep, yes — their outlines, kerning, and hinting are preserved exactly, so the characters render identically. The only thing lost is the glyphs you removed. If a visitor’s content needs a character that isn’t in your subset, the browser falls back to another font for it, so subset by language when your text is dynamic.

How does the unicode-range descriptor work?

The unicode-range descriptor in a @font-face rule tells the browser which codepoints a font file covers. The browser only downloads that file when the page renders a character inside the range. Split a typeface into per-script subsets, give each its own @font-face block and unicode-range, and visitors fetch only the scripts they actually encounter.

Can I subset any font I own?

You can subset any font you are licensed to use and modify. Many commercial webfont licenses and open-source (SIL Open Font License) families permit subsetting as part of normal web delivery, but some licenses restrict modifying the font binary. Check the license or EULA for your font before deploying a subset.

Does it work offline and stay private?

Yes. The font subsetter runs entirely in your browser — your font is read and processed on your own device and is never uploaded to a server. Once the page has loaded it will keep working without a connection, and your files stay private to you.

Is it free?

Yes, the font subsetter is completely free to use, with no sign-up, no watermarks, and no limit on how many fonts you subset.

Can I subset a variable font?

Yes. Subsetting removes glyphs while leaving the font’s variation axes — weight, width, optical size, and so on — intact, so a subset variable font still flexes across its full range. You are cutting characters, not axes. Just keep in mind that a variable font already packs several styles into one file, so its baseline is larger; subsetting it to the scripts you need is an easy win.

Does subsetting work for CJK fonts?

It is where subsetting matters most. Chinese, Japanese, and Korean fonts carry tens of thousands of glyphs and can weigh several megabytes even as WOFF2, because Brotli compression only trims that down so far. Cutting a CJK font to the specific characters a page renders — or to a common-character set — can shrink it by well over 90%, turning an unusable web font into a practical one.

Should I subset before or after converting to WOFF2?

Do both in one step. This tool subsets your source TTF or OTF and exports WOFF2 together, which is the right order: you drop the unused glyphs first, then apply Brotli compression to what remains. Converting to WOFF2 first and subsetting afterward gives the same glyphs but adds a needless round trip — let the subsetter output the final web font directly.

Related design tools & guides