How to audit kerning quality for brand typography
- Step 1List the brand's critical pairs first — Before touching the tool, write down the pairs that appear in the brand name, headline templates, and primary CTA copy. A wordmark usually has 5–10 unique pairs; headline templates add another 10–20. These are the non-negotiables — a gap here is a launch blocker; a gap in an obscure pair is not.
- Step 2Confirm where the font stores kerning — Run [opentype-features-inspector](/font-tools/opentype-features-inspector) on the exact file. If it lists a `kern` feature, kerning is in GPOS and this auditor will show few or zero pairs — that's a storage choice, not a defect. Only if kerning is in the legacy `kern` table will the auditor give a complete picture.
- Step 3Run the audit at a high Top-N — Set the Top-N slider to 500 for a QA pass — you want the full picture, not just the loudest 50. The slider is the only control; there's no per-pair search, so you'll scan the JSON `sample` strings to find your critical pairs.
- Step 4Check each critical pair against the output — Search the JSON for each critical pair's two-character `sample` (e.g. `"Wa"`, `"To"`). Present with a healthy negative value: good. Absent from the legacy table while the font is GPOS-kerned: fine. Absent and the font is kern-table-based: a real gap to flag.
- Step 5Normalise values before comparing fonts — When choosing between two candidate brand fonts, divide each pair's `value` by its `upm`. The font whose `AV` is -0.10em is tighter than one whose `AV` is -0.05em, regardless of raw FUnits. Record the normalised numbers in your comparison, not the raw values.
- Step 6Document the decision — For any genuine gap, pin the call in design review: switch fonts, request a foundry update, or accept the gap with a CSS letterspacing override on the affected headline. Download the `.kerning.json` and attach it to the review ticket as the evidence.
Critical pair checklist for brand QA
The pairs most likely to look wrong at headline size. Check each against your font's audit (or a visual review if the font is GPOS-kerned). Typical values are rough Latin norms, not measured from one font.
| Pair group | Examples | Typical value (at upm 1000) | Why it matters at display size |
|---|---|---|---|
| Cap + cap diagonal | AV, VA, AW, WA, AY, YA | -60 to -120 | Largest negative space in Latin; un-kerned, it reads as a visible hole |
| Cap T/V/W/Y + lowercase | To, Te, Va, Wo, Ya | -30 to -90 | Headline-frequent; the lowercase tucks under the cap's overhang |
| Cap + round | PO, FO, TO | -20 to -60 | Common in all-caps wordmarks and section labels |
| Lowercase pairs | av, aw, oy, va | -10 to -40 | Subtle at body size; visible in large lowercase logotypes |
| Punctuation | T., Y,, f', r. | -20 to -80 | Quote and period gaps after overhanging glyphs look loose if un-kerned |
Reading the audit result for QA decisions
What each output signal means for a sign-off decision. 'Kern feature in GPOS?' refers to the OpenType Features Inspector result.
| Audit result | Kern feature in GPOS? | QA interpretation |
|---|---|---|
| Hundreds of pairs, critical pairs present | No | Legacy-table font, well kerned. Pass. |
| Few pairs, critical pairs missing | No | Real gap. Flag for font swap, foundry update, or letterspacing override. |
| Zero pairs | Yes | GPOS-kerned font. Auditor can't enumerate it. Do a visual display-size review instead. Not a defect. |
| Zero pairs | No | Genuinely unkerned font. Major red flag for brand display use. |
Cookbook
QA scenarios a typography reviewer actually hits. The recurring theme: pair the Kerning Pair Auditor with opentype-features-inspector so an empty audit is interpreted correctly, never mistaken for a quality failure.
Wordmark kerning sign-off
ExampleA wordmark with the letters of the brand name. Pull each pair and confirm a sensible negative value. Here the brand name contains a Wa and a To — both present and healthy.
Brand name pairs to check: W-a, a-v, v-e, To
Audit (pairLimit 500), searching sample strings:
{ "sample": "Wa", "value": -84, "upm": 1000 } ✓
{ "sample": "To", "value": -72, "upm": 1000 } ✓
"av" not found, "ve" not found
Verdict: caps pairs kerned (the visible ones at headline size);
lowercase av/ve gap is invisible below ~40px — acceptable for
a wordmark set at 28px.An empty audit that is NOT a quality problem
ExampleA premium retail font audits as zero pairs. Before flagging it, the reviewer checks the features inspector — and finds a kern feature in GPOS. The font kerns beautifully; it just doesn't use the legacy table.
Kerning Pair Auditor: total_kerning_pairs 0 OpenType Features Inspector: 'kern' feature present (GPOS) Verdict: PASS. Kerning is in GPOS, which browsers apply. The auditor reads only the legacy kern table, so zero pairs here is expected for this font. Do a visual review at 64px to confirm Wa/To/AV look right — they will.
An empty audit that IS a quality problem
ExampleA cheap or hastily-built font audits as zero pairs AND has no kern feature in GPOS. This is a genuine red flag for brand display use.
Kerning Pair Auditor: total_kerning_pairs 0 OpenType Features Inspector: no 'kern' feature anywhere Verdict: REJECT for headline use. The font applies no kerning at all; AV and To will show visible gaps at display size. Either pick a different face or budget for manual letter- spacing on every headline template (expensive, brittle).
Comparing two candidate brand fonts fairly
ExampleBoth candidates are legacy-table fonts. Normalise by upm before declaring a winner — raw FUnits mislead when the em sizes differ.
Candidate A (TTF, upm 2048): AV value -180 → -0.088 em Candidate B (OTF, upm 1000): AV value -84 → -0.084 em Nearly identical tightness despite the 2x raw-value gap. Decide on letterforms, not the raw -180 vs -84 numbers. A's larger FUnit value is just its bigger em scale.
Letterspacing override for an accepted gap
ExampleIf a chosen font lacks kerning on one headline-critical pair and re-licensing isn't an option, approximate it with a per-element CSS override on the specific string.
/* Font lacks Wa kerning; the wordmark needs it tight. */
.wordmark { font-family: 'BrandSans'; }
/* Targeted negative tracking on the headline only */
.wordmark { letter-spacing: -0.01em; }
/* Note: this affects ALL pairs in the string, not just Wa.
Use sparingly and review the other pairs don't over-tighten. */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.
Premium font audits as zero pairs
By design — verify before flaggingHigh-quality modern fonts store kerning in GPOS and drop the legacy kern table, so they audit as zero here despite excellent kerning. Never sign off 'no kerning' from the auditor alone. Confirm with opentype-features-inspector: a kern feature present means the font kerns and the empty audit is expected.
Audit shows pairs but the browser renders differently
Expected when GPOS also presentIf the font has both a kern table and GPOS kerning, browsers use GPOS and ignore the legacy table. The auditor's list (from the legacy table) then doesn't match what users see. Treat the audit as a compatibility artefact, not the rendered truth, whenever the features inspector also shows a GPOS kern feature.
Critical pair missing from the list
InvestigateA missing critical pair could mean a genuine gap (legacy-table font with no entry for it) or GPOS storage (the pair exists, just not in the legacy table). Disambiguate via the features inspector. Only the legacy-table-with-no-GPOS case is a true defect worth a font swap.
Lowercase pairs absent
Often acceptableMany fonts kern caps and cap+lowercase thoroughly but skip lowercase-only pairs because they're invisible below ~24px. For a brand that sets headlines in caps or large mixed-case, missing lowercase kerning is usually fine. Flag it only if the brand uses large all-lowercase logotypes.
Glyph with no codepoint in the sample field
ExpectedSmall-cap, ligature-component, and alternate glyphs have no Unicode mapping, so the sample shows [glyphname] instead of a letter. The kern still counts; you just read the glyph name. For brand QA this usually means a stylistic alternate that won't appear in your headline unless a feature is enabled.
Comparing raw values across fonts without normalising
Mistake to avoidA -180 in a 2048-upm font is gentler than a -120 in a 1000-upm font. Comparing raw FUnits ranks the wrong font as 'tighter'. Always divide by upm first. The audit reports upm precisely so you can do this — don't skip it.
Auditing a re-exported font instead of the shipped file
Process errorIf the dev team subsets or re-compresses the font in their build, the shipped file may have different (or dropped) kerning. JAD's in-browser font-subsetter uses opentype.js, which drops layout tables — so a subsetted copy can lose GPOS kerning. Always audit the exact artefact that will go to production, after the build, not the foundry's original.
Variable brand font
Usually emptyVariable fonts store kerning in GPOS and audit as zero here. For a variable brand font, do a visual review at the weights/widths you'll actually ship, or freeze the shipped instance with variable-font-freezer — though freezing preserves GPOS, so the legacy-table audit stays empty regardless.
Frequently asked questions
Does an empty audit mean my brand font has no kerning?
No — not on its own. The auditor reads the legacy kern table only, and most modern premium fonts store kerning in GPOS, which audits as zero here despite being well kerned. Confirm with opentype-features-inspector: a kern feature present means the font kerns and the empty audit is expected. Only zero pairs AND no GPOS kern feature is a genuine red flag.
How many kerning pairs should a quality brand font have?
For a legacy-table font, hundreds to a couple thousand pairs is typical for thorough Latin coverage; under ~150 starts to feel thin for display use. But this metric only applies to kern-table fonts — a GPOS class-based font expresses the same coverage in a few dozen class pairs, so pair count isn't comparable across storage types. Judge by whether your critical pairs look right at display size, not by the raw count.
Which pairs matter most for headlines?
Cap+cap diagonals (AV, WA, AY) first — they have the largest negative space and look worst un-kerned. Then cap+lowercase after T/V/W/Y (To, Va, Wo). Then punctuation after overhanging glyphs (T., Y,). Lowercase-only pairs matter only at large lowercase sizes. Build your critical-pairs checklist from the actual brand name and headline templates.
Are missing pairs visible in body text?
Rarely. Below ~16px, kerning gaps blend into general type density and most readers won't notice. Above ~24px — headlines, wordmarks, hero text — missing pairs jump out. If your brand uses display-size typography, audit kerning carefully; if it's a body-text-only brand, kerning quality matters far less.
How do I compare kerning strength across two candidate fonts?
Run both at Top-N 500 and normalise: divide each pair's value by its upm to get an em fraction. The audit reports upm precisely so you can do this. Comparing raw FUnits is wrong because em sizes differ (1000 vs 2048). After normalising, compare the same pairs (AV, To) head to head.
Can I add kerning to a font that's missing it?
Not in the browser — this tool is read-only and editing GPOS safely client-side isn't feasible. To author kerning, use a desktop editor like Glyphs or FontForge. As a stopgap for one headline-critical pair, a targeted CSS letter-spacing override approximates tighter spacing, but it affects every pair in the string, so use it carefully and review the side effects.
Should I audit the foundry's font or the file we ship?
The file you ship, after your build. If the build subsets or re-compresses the font, kerning can change or drop — JAD's in-browser font-subsetter uses opentype.js, which drops GPOS layout tables, so a subsetted copy can lose its kerning entirely. Audit the production artefact, not the original, to catch build-introduced regressions.
Why do some glyphs show as [name] instead of a letter?
Those glyphs have no Unicode codepoint — small caps, ligature components, stylistic alternates. The sample field falls back to the opentype.js glyph name in square brackets. For brand QA this usually means a glyph that only appears when a specific OpenType feature is on, so it likely won't show in your default headline rendering.
Is the brand font uploaded anywhere?
No. Parsing runs entirely in your browser via opentype.js, so a licensed or unreleased typeface under NDA never leaves your machine. Only a usage counter (a tool ran) is recorded server-side for signed-in users — no font content. This matters when auditing fonts whose license restricts redistribution.
What size font can I audit?
The Kerning Pair Auditor is a Pro-tier tool: free file ceiling 5 MB, Pro 50 MB. Brand fonts are almost always well under that. Note that fonts large enough to approach 50 MB are usually CJK families that kern via GPOS class lookups — which the auditor doesn't enumerate, so a visual or fontTools-based review is the right approach there.
What's a complete kerning QA workflow?
1) List critical pairs from the brand name and headlines. 2) Run opentype-features-inspector to learn where kerning lives. 3) If legacy-table, run the Kerning Pair Auditor at Top-N 500 and check each critical pair. 4) If GPOS, do a visual review at display size. 5) Pair with glyph-inspector and font-metrics-analyzer for the rest of the spacing review. 6) Document the decision and attach the JSON.
Does the tool tell me if kerning is 'good' or just count it?
It reports facts — pair count, values, samples, upm — not a quality verdict. 'Good kerning' is a human judgement about whether the values produce even spacing at your sizes. Use the audit data plus a visual display-size review to make the call. There's no automated quality score; typography QA still needs a trained eye.
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.