How to opentype name table records: complete reference
- Step 1Identify the core identity records (0–6) — 0 Copyright, 1 Family, 2 Subfamily, 3 Unique ID, 4 Full name, 5 Version, 6 PostScript name. These are the minimum a font needs to install and be referenced. The extractor labels all seven; Family (1) and Version (5) are the two you'll reach for most.
- Step 2Find the attribution + legal records (7–14) — 7 Trademark, 8 Manufacturer, 9 Designer, 10 Description, 11 Manufacturer URL, 12 Designer URL, 13 License, 14 License URL. The extractor labels all of these. 13/14 are the licence-audit pair; 8/9 are the attribution pair.
- Step 3Understand the modern naming records (16–17) — 16 Typographic Family Name, 17 Typographic Subfamily Name — the modern replacement for the four-style limit of 1/2. These are NOT in the extractor's label set, so a font's true 9-weight family name may not appear as a labelled record even when present.
- Step 4Note the specialist records (18–25) — 18 Compatible Full Name (Mac), 19 Sample Text (the extractor labels this one), 20 PostScript CID, 21/22 WWS Family/Subfamily, 23/24 Light/Dark Background palette names, 25 Variations PostScript Name Prefix. Mostly niche; the extractor labels only 19 from this range.
- Step 5Locate axis and instance names (256+) — Variable fonts store axis labels (Weight, Width, Slant) and named-instance labels in nameID 256 and above, referenced from `fvar`. The extractor doesn't label these; it will show `fvar` in `tables_present` so you know they exist. Use a variable-font-aware tool to read them.
- Step 6Decide what's safe to strip — For web delivery you can drop most records and keep Family (1), Subfamily (2), Full name (4), Version (5), PostScript name (6), and the licence pair (13/14) — which is exactly what the [Name Table Cleaner](/font-tools/name-table-cleaner) keeps. Verify the result by re-running the [Metadata Extractor](/font-tools/font-metadata-extractor).
Standard nameID reference (0–25)
Every standard OpenType name record. 'Extractor label' shows what the Metadata Extractor surfaces it as — a blank means it isn't in the extractor's label set (use a low-level dumper for those).
| nameID | Meaning | Extractor label | Notes |
|---|---|---|---|
| 0 | Copyright notice | Copyright | Attribution; safe to keep, often kept on strip |
| 1 | Font Family (legacy) | Family | The 4-style family name; what old Windows groups on |
| 2 | Font Subfamily (legacy) | Subfamily | One of Regular/Bold/Italic/Bold Italic in the legacy model |
| 3 | Unique font identifier | Unique ID | Foundry-defined; not used for matching |
| 4 | Full font name | Full name | Human-readable full name (e.g. 'Inter Bold') |
| 5 | Version string | Version | Free-form; opaque identifier — see the versioning guide |
| 6 | PostScript name | PostScript name | No spaces; used by PDF/PostScript; must be unique |
| 7 | Trademark | Trademark | Legal notice when the name is a registered mark |
| 8 | Manufacturer | Manufacturer | Foundry/vendor — primary attribution key for audits |
| 9 | Designer | Designer | Type designer credit |
| 10 | Description | Description | Free-text blurb; often empty |
| 11 | Vendor URL | Manufacturer URL | Foundry website |
| 12 | Designer URL | Designer URL | Designer website |
| 13 | License description | License | Embedded licence text (often empty for OSS) |
| 14 | License URL | License URL | Link to the licence — strongest licence signal |
| 15 | (Reserved) | — | Reserved by the spec; not used |
| 16 | Typographic Family | — | Modern multi-weight family name — NOT labelled by the extractor |
| 17 | Typographic Subfamily | — | Modern style name (e.g. 'SemiBold Italic') |
| 18 | Compatible Full (Mac) | — | Mac-platform legacy compatibility name |
| 19 | Sample text | Sample text | Suggested preview string |
| 20 | PostScript CID findfont | — | CID-keyed fonts only |
| 21 | WWS Family | — | Weight/Width/Slant family model |
| 22 | WWS Subfamily | — | WWS style name |
| 23 | Light Background Palette | — | Name for a CPAL palette (colour fonts) |
| 24 | Dark Background Palette | — | Name for a CPAL palette (colour fonts) |
| 25 | Variations PS Name Prefix | — | Prefix for generated instance PostScript names (variable fonts) |
Legacy (1/2) vs typographic (16/17) family naming
The single most confusing part of the name table. Both models usually coexist; which one an app uses determines how your weights group.
| Model | IDs | Behaviour |
|---|---|---|
| Legacy / RIBBI | 1 Family + 2 Subfamily | Groups into at most 4 styles (Regular, Bold, Italic, Bold Italic) — a constraint from old Windows. A 9-weight family must split into multiple 'families' (e.g. 'Inter', 'Inter Light', 'Inter Medium') |
| Typographic / preferred | 16 Family + 17 Subfamily | Lets all weights share one family name with distinct style names ('Thin', 'SemiBold', 'Black') — the modern model apps prefer when present |
| What the extractor shows | 1 + 2 (as Family/Subfamily) | It surfaces the legacy pair. If a font relies on 16/17 for its true family grouping, that name won't appear as a labelled record — use a low-level dumper to see it |
Strip-safety for web delivery
What's safe to remove vs keep when minimising a webfont. The Name Table Cleaner keeps the 'keep' set (Windows-English records 1,2,4,5,6,13,14) and rebuilds the table.
| Record(s) | Recommendation | Why |
|---|---|---|
| 1, 2, 4, 6 | Keep | Identity — needed for matching, PDF embedding, and PostScript references |
| 5 (Version) | Keep | Needed for version tracking / drift detection |
| 13, 14 (License) | Keep | Compliance — losing these makes a later audit much harder |
| 0, 7, 8, 9, 10, 11, 12 (attribution) | Optional to strip for web | Saves a little size; keep if a licence requires attribution |
| 3, 18, 19, 20 (specialist) | Usually strip for web | Rarely consumed by browsers |
Cookbook
Real records as the Metadata Extractor returns them, annotated with the nameID behind each. For the structural fields that accompany the name records, see the extraction how-to.
Reading the core identity records
ExampleThe records every well-formed font carries. The extractor labels each; the nameID in brackets is what they map to in the spec.
Extractor output (names): Family : Inter <- nameID 1 Subfamily : Regular <- nameID 2 Full name : Inter Regular <- nameID 4 Version : Version 4.000 <- nameID 5 PostScript name : Inter-Regular <- nameID 6 (Unique ID, nameID 3, is often present but rarely needed.)
The licence + attribution set
ExampleThe records a compliance audit cares about. 13/14 are the licence pair; 0/8/9 are attribution. An empty License (13) is common — see the licensing guide.
Copyright : (c) 2016-2024 The Inter Authors <- nameID 0 Manufacturer : The Inter Project Authors <- nameID 8 Designer : Rasmus Andersson <- nameID 9 License : ...SIL Open Font License v1.1. <- nameID 13 License URL : https://openfontlicense.org <- nameID 14
When typographic family (16/17) is invisible
ExampleA 9-weight family using the typographic model shows its true family name in nameID 16, which the extractor doesn't label. You see the legacy split via nameID 1 instead.
What the extractor shows: Family : Inter SemiBold <- nameID 1 (legacy split) Subfamily : Regular <- nameID 2 What's actually in the font (low-level dump): nameID 16 (Typographic Family) : Inter nameID 17 (Typographic Subfamily) : SemiBold The modern grouping lives in 16/17 — read it with fonttools ttx if you need it; the extractor surfaces the legacy 1/2 pair.
Variable font: axis names are not labelled
ExampleAxis labels live in nameID 256+. The extractor won't label them, but tables_present tells you fvar exists so you know to look.
Extractor output:
tables_present: [..., "STAT", "avar", "fvar", "gvar", ...]
names: { Family: "Inter", Version: "Version 4.000", ... }
fvar present => axis names (Weight, Slant, ...) are in nameID 256+.
The extractor doesn't read them; freeze an instance or inspect
axes with /font-tools/variable-font-freezer.After a name-table clean
ExampleThe Name Table Cleaner keeps only the Windows-English records 1,2,4,5,6,13,14. Re-running the extractor confirms exactly which records survived.
Before clean (names): Copyright, Family, Subfamily, Full name, Version, PostScript name, Trademark, Manufacturer, Designer, Description, Manufacturer URL, Designer URL, License, License URL After /font-tools/name-table-cleaner (names): Family, Subfamily, Full name, Version, PostScript name, License, License URL (IDs 1,2,4,5,6,13,14 kept; the rest removed.)
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.
Record exists in the font but the extractor doesn't label it
By designThe extractor labels a defined set (0–14 plus 19). Records like Typographic Family (16/17), WWS names (21/22), CPAL palette names (23/24), and axis names (256+) aren't in the label map. They may exist in the font and even be surfaced by opentype.js under a raw key, but they won't appear under a friendly label. Use fonttools ttx for an exhaustive dump.
Family name differs between nameID 1 and nameID 16
ExpectedThis is normal for multi-weight families. nameID 1 carries a legacy-split name ('Inter SemiBold') for old-Windows compatibility, while nameID 16 carries the true family ('Inter'). The extractor shows the legacy nameID 1 as Family. If a CSS font-family match seems off, the typographic name in 16 is likely what the browser is grouping on.
Records present only in a non-English language
English onlyThe extractor reads the English string via getEnglishName. A font localised only for, say, Japanese may store its records under ja with no Windows-English equivalent, returning a thin or empty names object. The records exist — they're just not English. fonttools ttx shows all platform/language variants.
PostScript name (6) contains illegal characters
ReviewnameID 6 must be unique and avoid spaces and the characters [](){}<>/%. A malformed PostScript name can break PDF embedding and PostScript workflows. The extractor reports whatever is there verbatim — if it has spaces or forbidden characters, the font was authored incorrectly.
Empty License record (13)
ExpectedMany open-source families leave nameID 13 empty and ship the licence as a separate file. An absent License key is not proof the font is unlicensed. Check the upstream distribution. The licensing-compliance guide covers how to handle this in an audit.
Light/Dark palette names (23/24) on a colour font
Not labelledColour fonts with CPAL palettes name them via nameID 23/24. The extractor doesn't label these; tables_present will show COLR/CPAL so you know the font is colour. To remove colour layers entirely use the Colour Table Remover.
Record stripped vs record never present
IndistinguishableFrom the binary alone you can't tell whether a missing record was stripped by a build step or never authored. Both produce an absent key in the output. If you expected a record (e.g. Version) and it's gone, check whether a subsetter/cleaner in your pipeline removed it before concluding the source lacked it.
Sample Text (19) used as a preview string
SupportednameID 19 holds a suggested preview string (often a pangram). It's one of the few specialist records the extractor labels. It has no rendering effect — it's a hint for font browsers. Safe to strip for web delivery if you're minimising the name table.
Two fonts share a Unique ID (3)
ReviewnameID 3 is foundry-defined and meant to be unique, but it's not enforced and not used for font matching. Don't rely on it to distinguish builds — use the Version string plus a SHA-256 fingerprint (see the versioning guide) instead.
Variations PS Name Prefix (25) on a variable font
Not labellednameID 25 supplies the prefix used to auto-generate PostScript names for variable-font instances. The extractor doesn't label it. It only matters when you instantiate named instances — the Variable Font Freezer handles instance creation; verify the resulting PostScript name with the extractor afterward.
Frequently asked questions
How many standard name records are there?
The OpenType spec defines IDs 0 through 25 (with 15 reserved), plus 256 and above for variable-font axis and instance names. Most fonts populate only 5–10 — typically the core identity set (0–6) and the licence/attribution set (8, 9, 13, 14). The extractor labels IDs 0–14 plus 19.
Which records does the Metadata Extractor surface?
It labels Copyright (0), Family (1), Subfamily (2), Unique ID (3), Full name (4), Version (5), PostScript name (6), Trademark (7), Manufacturer (8), Designer (9), Description (10), Manufacturer URL (11), Designer URL (12), License (13), License URL (14), and Sample text (19). Records outside that set (16/17, 21/22, 23/24, 256+) aren't labelled — use a low-level dumper for those.
What's the difference between nameID 1 and nameID 16?
nameID 1 (legacy Family) plus nameID 2 (Subfamily) group a font into at most four styles — Regular, Bold, Italic, Bold Italic — a constraint inherited from old Windows. nameID 16 (Typographic Family) plus 17 let a whole multi-weight family share one name with distinct style names. Both usually coexist; the extractor surfaces the legacy 1/2 pair.
Why doesn't the extractor show my font's typographic family name?
Because typographic Family (nameID 16) isn't in the extractor's label set. It surfaces the legacy Family (nameID 1), which for a multi-weight family is often a split name like 'Inter SemiBold'. To read nameID 16, use a low-level tool like fonttools ttx.
Where do variable-font axis names live?
In nameID 256 and above, referenced from the fvar table. The extractor doesn't label them, but it will list fvar in tables_present so you know the font has axes. To work with the axes themselves, use the Variable Font Freezer.
Which records are safe to strip for a webfont?
You can usually drop the attribution and specialist records and keep Family (1), Subfamily (2), Full name (4), Version (5), PostScript name (6), and the licence pair (13/14). That's exactly the set the Name Table Cleaner keeps. Keep the licence records unless you're certain you don't need them for compliance.
Why is the License record (13) empty on so many fonts?
Open-source families frequently ship the licence as a separate OFL.txt/LICENSE file and leave nameID 13/14 thin. An empty record isn't evidence the font is unlicensed — check the upstream package. The licensing guide covers how to audit around this.
Can I tell whether a missing record was stripped?
Not from the binary alone — a record that was removed by a build step and one that was never authored both show up as an absent key. If you expected a record and it's gone, check whether a subsetter or the name-table cleaner removed it before concluding the source font lacked it.
Does nameID 5 follow a version format?
No — it's free text. You'll see Version 4.000, Version 1.001;git-..., OTF 1.020;PS 001.000, and tool-stamped variants. Treat it as an opaque identifier; for reliable version tracking pair it with a SHA-256 fingerprint as described in the versioning guide.
What records do colour fonts add?
Colour fonts with CPAL palettes can name them via nameID 23 (Light Background) and 24 (Dark Background). The extractor doesn't label these, but tables_present showing COLR/CPAL (or sbix, CBDT) tells you the font is colour. To remove colour layers use the Colour Table Remover.
Can I edit name records in the browser?
Not with this read-only extractor. opentype.js can read the name table reliably but its writer produces broken output for some platform/encoding combinations. To trim records use the Name Table Cleaner (which keeps the safe records and rebuilds the table); for arbitrary edits use a desktop tool and re-verify with the extractor.
What about variable-font axis names — can I see them at all?
Not via this extractor's labelled output. The records (nameID 256+) exist and are referenced by fvar, but they're outside the label set. Use a variable-font-aware tool to read axis and instance names; the extractor's role here is to confirm fvar is present and report the core name records.
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.