How to audit a custom icon font after subsetting or a build step
- Step 1Preview the source font first — Drop the pre-subset font and note the header: 'Showing N of M encoded glyphs'. This is your baseline glyph count.
- Step 2Run your subset / build — Subset, minify, or rebuild as your pipeline does. Produce the output `.woff2`/`.ttf`.
- Step 3Preview the output font — Drop the built file. Read the new 'Showing N of M' header — M is the encoded-glyph count in the output.
- Step 4Diff the counts — If the output's encoded count dropped more than expected, glyphs were removed. If it's unchanged but icons render as boxes, outlines were stripped while cmap entries stayed.
- Step 5Scan for empty boxes — Walk the grid for cells that render as □. Each is a codepoint whose outline is gone — a silent regression. Note its `U+XXXX` caption.
- Step 6Cross-check codepoints — Hover suspect cells to confirm the codepoint, and verify the picture under each codepoint matches your manifest. Re-subset if anything shifted.
Failure modes this audit catches
Three ways a subset/build silently breaks an icon font, and how each appears in the previewer.
| Failure | Cause | How it shows here | Fix |
|---|---|---|---|
| Glyph removed | Subset dropped a still-used icon | No cell for that codepoint; lower 'Showing' count | Add the glyph back to the keep-list |
| Outline stripped | Over-aggressive subset kept cmap, dropped outline | Cell renders as an empty box (□) | Re-subset keeping the outline |
| Codepoint shifted | Rebuild reassigned codepoints | Wrong picture under a familiar U+ caption | Pin codepoints stable across builds |
| Names lost | Build stripped the post table | Hover shows only U+, not a name | Cosmetic; codepoints still work |
Reading the header line
The previewer prints one summary line. 'Showing' is capped at 1500; 'of M' is the true encoded-glyph total.
| Header reads | Meaning | QA action |
|---|---|---|
| Showing 24 of 24 encoded glyphs | All encoded glyphs shown; M=24 | Compare 24 to your manifest |
| Showing 24 of 30 encoded glyphs | 6 unexpected extra codepoints | Find what 6 leftover glyphs are |
| Showing 1500 of 4200 encoded glyphs | Display capped; 4200 total | Subset to your used set for a full view |
| Cell present but renders □ | cmap kept, outline dropped | Re-subset to restore the outline |
Cookbook
Concrete before/after audits. Counts and codepoints are illustrative — read your own header line and captions.
Baseline vs output count
ExamplePreview both files and diff the encoded-glyph totals to confirm only intended glyphs were removed.
Pre-subset preview header: Showing 412 of 412 encoded glyphs Keep-list: 24 icons Post-subset preview header: Showing 24 of 24 encoded glyphs -> correct If post says "Showing 21 of 21" -> 3 of your 24 were dropped
Detect a stripped outline
ExampleCounts match but an icon renders as a box. The cmap entry survived; the outline didn't.
Header: Showing 24 of 24 encoded glyphs (count looks fine) But the settings cell (U+E8B8) renders as [] -> outline stripped, cmap kept -> CI saw 24 glyphs and passed; users see a tofu box
Catch a codepoint shift
ExampleAfter a rebuild, the picture under a known codepoint changed — a remap bug.
Before: U+E042 -> bell icon After rebuild: U+E042 -> close icon -> codepoint assignments shifted -> existing CSS using \e042 now shows the wrong icon -> pin codepoints (see PUA point assigner)
Confirm a format conversion preserved glyphs
ExampleYou converted the icon font from TTF to WOFF2. Preview both and verify identical encoded counts.
icons.ttf preview header: Showing 24 of 24 encoded glyphs icons.woff2 preview header: Showing 24 of 24 encoded glyphs -> conversion preserved every encoded glyph
Manifest cross-check
ExamplePair the grid with your codepoint manifest to verify each entry still renders.
Manifest: { home: E88A, search: E8B6, settings: E8B8 }
Preview the build; for each entry:
- is there a cell at that U+ caption? (glyph present)
- does it render (not a box)? (outline present)
- is it the right picture? (no shift)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.
Counts match but icons render as boxes
Outline stripped — silent regressionThe 'Showing N of M' count only reflects cmap entries. A subset can keep the codepoint and drop the outline, so the count is unchanged while the glyph is effectively gone. The render reveals it as a □. Re-subset keeping that glyph with the font subsetter.
Output has more encoded glyphs than expected
Leftover glyphsIf 'of M' is higher than your keep-list, the subset retained glyphs you meant to drop (composites with codepoints, or an over-broad unicode range). Tighten the keep-list and re-run.
A removed icon shows no cell at all
Glyph droppedWhen a codepoint is gone from the cmap there's simply no cell for it and the 'Showing' count is lower. That's the clearest signal a glyph was removed. Add it back to the subset keep-list.
Display capped at 1500 on a large source
Truncated to 1500 shownAuditing a full pre-subset font that exceeds 1500 encoded glyphs shows only the first 1500. The 'of M' total is accurate, so use it for the count; subset first for a glyph-by-glyph visual audit.
Glyph names gone after the build
Cosmetic — post table strippedIf the build stripped post, hover tooltips show only the codepoint. This doesn't affect rendering or addressing — codepoints still work. Treat it as cosmetic.
Auditing a .ttc you extracted faces from
Unsupported font formatThe previewer can't open .ttc collections — only single ttf/otf/woff/woff2 faces. Audit each extracted face individually.
Composite glyph component disappeared
Not directly visibleComposite components usually have no codepoint and aren't shown. If a composite icon now renders wrong, it's the component outline that's missing — inspect outlines per glyph with the glyph inspector.
Output font over the tier size limit
Rejected — exceeds tier limitFree allows 5 MB, Pro 50 MB, Developer 1 GB per job. A pre-subset all-in-one TTF can exceed Free; preview the smaller .woff2, or audit on a higher tier.
Two builds, identical grids, different file sizes
ExpectedThe previewer audits encoded glyphs and outlines, not bytes. Two builds can show the same grid while differing in compression, hinting, or metadata. For byte-level diffs use a glyph-count analyzer or format identifier.
Frequently asked questions
How do I confirm my subset kept the right icons?
Preview the output and read 'Showing N of M encoded glyphs', then diff M against your keep-list. Also scan for cells that render as boxes — those are outlines that were dropped while the codepoint stayed.
Why does the count look right but icons are boxes?
The count reflects cmap entries, not outlines. An over-aggressive subset can keep the codepoint and remove the outline, so the count is unchanged but the glyph renders as tofu. Re-subset keeping the outline.
How do I see if a glyph was removed entirely?
A removed codepoint has no cell, and the 'Showing' total is lower than your baseline. Compare the pre-subset and post-subset header lines.
Can I detect a codepoint shift after a rebuild?
Yes — if the picture under a familiar U+ caption changed, the rebuild reassigned codepoints. Pin your codepoints across builds to avoid breaking existing CSS.
Does it diff two fonts automatically?
No — it previews one font at a time. Preview each and compare the header counts and grids by eye. For a side-by-side render of two fonts, that's a different tool.
Is the 'Showing' number the real glyph count?
It's capped at 1500. The 'of M' figure is the true encoded-glyph total. Use M for counting; subset large fonts first if you need a full visual pass.
Will it catch lost glyph names?
Indirectly — if hover shows only U+ and no name, the post table was stripped. That's cosmetic; rendering and codepoint addressing are unaffected.
Does this work as a CI step?
It's an interactive browser tool, so it's a manual visual gate, not a headless CI check. Use it as the human QA pass before deploy. For automated counts, a glyph-count analyzer is closer.
Can I audit a TTC collection?
No — collections aren't supported. Extract single faces (ttf/otf/woff/woff2) and audit each.
Is my proprietary font uploaded?
No. Everything runs client-side, so the build artifact never leaves your machine — suitable for a local pre-deploy check.
Why might the output have extra glyphs?
An over-broad unicode keep-range or retained composites can leave more encoded glyphs than your icon list. Tighten the subset and re-preview.
What if a composite icon renders wrong but no cell is missing?
Composite components often lack codepoints and aren't shown; a missing component outline can break the composite while the count looks fine. Inspect outlines per glyph with the glyph inspector.
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.