self-intersecting
A contour crosses itself. Rasterisers fill the overlap unpredictably depending on fill-rule (even-odd vs non-zero).
The differentiator
Every other browser-based type editor checks a font for errors. Patens checks it against 94 type-design rules — every contour, metric, kern pair, anchor, master, palette, and brief field — and for each finding, hands you plain-English prose that names the rule, explains why it matters, and (for around 30 codes) offers a one-click fix. The audit module is the spine of the editor, not a lint step bolted on at the end.
The teaching prose comes from the type-design tradition — the rules that get internalized through years of mentorship, or from a copy of Detail in Typography, or by watching a master rep a kerning class until everything snaps into place. Patens encodes those rules into a Web Worker that runs continuously alongside the editor, with a single describeAuditCode(code) dictionary feeding five teaching surfaces (edit panel, audit page, release pre-flight, family hub, home page) so the same prose appears wherever an audit finding is shown.
The 94 codes are stable forever — once shipped, a code's ID never gets reused. If a rule turns out to be wrong, it's deprecated (marked severity: 'info' + deprecated: true) rather than recycled. That's the same contract OpenSSF Scorecard, CodeQL, and ESLint use for their check IDs — it makes the codes referenceable from commits, bug reports, tutorials, and downstream tooling without ambiguity.
Grouped by what the rule checks. The breakdown:
self-intersecting · winding-collision · sharp-kink
cap-above-ascender · win-clip-top · use-typo-off
overflows-advance · deeply-negative-lsb · class-drift
duplicate-glyph-name · pair-orphan-class · feature-kern-disabled
naming-family · vendor-id-invalid · glyph-name-not-canonical
typo-essentials · latin-1-supp · currency · math
mark-no-prefix · base-with-prefix · without-partner
master-contour-count · axis-out-of-range · no-instances
palette-length-mismatch · brief-no-intent · figures-non-tabular
Full reference with every code's prose: /learn/audit-codes.
The teaching prose on this page is the exact text users see when they hover or click into a finding in the editor. No marketing rewrite — the audit-as-teaching promise is that the in-app copy reads like prose, not like a linter dump.
A contour crosses itself. Rasterisers fill the overlap unpredictably depending on fill-rule (even-odd vs non-zero).
A lowercase letter that should reach x-height is sitting noticeably below it. Uneven tops across letters give text a wobbly rhythm; consistent x-height alignment is what makes type read smoothly.
This glyph's left sidebearing has drifted from the median of its sidebearing-class peers. Either re-apply the class or remove this glyph from it.
A kerning pair exceeds half the smaller glyph's advance — almost certainly a decimal typo (e.g. -500 typed when -50 was meant). Check the value in the spacing pair editor.
Cap-height exceeds the ascender. Capital letters will clip when rendered — ascender is the platform-recognised top of the glyph bounding box, caps must fit inside it.
The glyph name differs from the canonical Adobe Glyph List for New Fonts name for this codepoint. Renaming keeps downstream tooling (feature substitutions, color emoji lookups, PostScript naming) consistent.
The same 94-code engine ships as a CLI. Drop it into your CI as a font-design lint step, or batch-audit a directory of project files before a foundry release.
# Audit a single project
npx patens audit my.font.json
# Error-severity only, for CI gates
npx patens audit my.font.json --severity=error
# JSON output for downstream tooling
npx patens audit my.font.json --json | jq '.'
# PR annotations in GitHub Actions
npx patens audit fonts/*.font.json --github Exit code is 0 when no error-severity issues, 1 when there are, 2 on usage / parse failure. describe any code by name to get the same prose the editor shows: npx patens describe self-intersecting.
The audit module isn't a lint step. It's a mentor that catches the things every type designer learns by drawing badly, then better, then well. The teaching prose is the difference between "warning: cap-height exceeds ascender" and "Capital letters will clip when rendered — ascender is the platform-recognised top of the glyph bounding box, caps must fit inside it."
The first sentence is true. The second sentence teaches. Patens optimizes for the second.
This is the difference that justifies opening Patens instead of one of the four other browser-based type editors. Glyphr Studio, Fontra, typlr.app, and FontStruct all check fonts for errors. Patens is the only one designed to teach you why each error matters.
Answers double as FAQPage structured data so AI engines (ChatGPT, Claude, Perplexity, Gemini) can cite individual answers when asked about the audit module.
The demo project ships with several audit findings already triggered so you can see the panel live without drawing anything.