Build a realistic character inventory
A subset keeps mapped characters from the supplied text and the additional glyphs needed by the subset engine for layout. Include headings, numbers, punctuation, accented names, translated messages and user-visible error text, not just a short homepage screenshot.
Future content is a separate requirement. Usernames, prices and localization can introduce characters that were not present during generation. A subset does not learn new content later; keep a full fallback or regenerate it when your character inventory changes.
Characters are not shaped glyphs
A Unicode codepoint may map to a base glyph, but ligatures, contextual forms and combining marks require additional substitution and positioning data. HarfBuzz closure retains related glyphs, and Font Bridge requests every layout feature tag when subsetting.
The coverage report checks cmap entries. Joiners and variation selectors are context controls, so they are identified separately rather than scored as ordinary missing glyphs. Passing this report does not prove Arabic joining, Indic shaping, emoji sequences or every typographic feature.
Compare more than the file size
Inspect removed Unicode mappings and dropped tables. Use complete words and sentences in each supported script, including combining marks, kerning pairs and ligatures. The before/after browser preview uses local buffers; its raster difference covers only a bounded sample.
Browser fallback can make a missing character appear correct by drawing it from another font. Check the explicit missing-codepoint report and test with your target font stack. Never treat a zero pixel difference on one line as proof that the entire subset is equivalent.