How to font subsetting tradeoffs and known limitations
- Step 1Confirm coverage — Before subsetting, run the Character Coverage Map. The output shows which Unicode blocks the source font supports. After subsetting, run again on the result — every required block should still register near 100%.
- Step 2Verify kerning if critical — Run the Kerning Pair Auditor before and after. Most kerning pairs survive subsetting via the kern table; class-based GPOS kerning may be reduced. For headlines and display typography, this matters; for body text, rarely.
- Step 3Check OpenType features — If your design uses smcp (small caps), liga (ligatures), or stylistic alternates, run the OpenType Features Inspector on the subset. Confirm the features you depend on still appear.
Frequently asked questions
Why might ligatures break?+
Standard ligatures (fi, fl) live in GSUB. opentype.js's Subset preserves the most common GSUB lookups, but complex contextual lookups can be reduced. The visible symptom: f-i sequence shows as two glyphs instead of one fi ligature.
What about COLR/CPAL chromatic glyphs?+
Chromatic colour layers are stored in COLR/CPAL tables — these are stripped by opentype.js's Subset class. The result is a monochrome version of your colour font. Use the Colour Table Remover tool if that's the explicit goal; otherwise expect this side-effect.
Can I subset OTF (CFF) fonts safely?+
opentype.js can read CFF but its writer prefers TTF outlines. The result is functionally correct (renders the same glyphs) but technically TTF, not OTF. Browser users see no difference.
What's the limit on glyphs?+
Free tier 1,000 glyphs (covers most Latin/Cyrillic/Greek). Pro tier 65,536 (full Unicode). For massive CJK subsets, the operation is memory-heavy — give the browser 2–3 seconds and stay on the tab.
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.