Which fonts can actually be rendered here
Last updated 2026-11-02
On this page
In the inspector some fonts can be drawn with their real outlines and measured character by character, while others only show a pre-rendered specimen. That is not an unfinished feature — the two groups simply hold different things.
Two sources
| Source | What it has | What you can do |
|---|---|---|
Local fonts (src=device) |
The font file on your machine, once you grant access | Real rendering, measure any character, coverage, full metrics |
Library (src=library) |
Fingerprint, metadata, a few specimen images | Names / weight / metrics / coverage; rendering needs the specimen or a temporary load |
Why library fonts have no bytes
The server stores no font files (see docs/adr/0001): only fingerprints (content hashes), metadata extracted from the font, and specimen SVGs rendered during analysis.
That is not laziness. Font files are megabytes, their licences differ, and hosting them means distributing them — which would turn this project into a font CDN, with legal and bandwidth costs it is not meant to carry.
What "temporary load" does
Loading a library font:
fetchthe bytes from the upstream mirror (GitHub / Google Fonts);- register them with
new FontFace(name, bytes)ondocument.fonts, so the page can render with it; - if measuring is needed, hand the same bytes to the parser and build a measurer (a few kept, by recency — not an unbounded cache).
All of it lives in browser memory; nothing goes through this site's storage and nothing is written to disk.
Why not just FontFace(url)
new FontFace(family, 'url(...)') loads a font too, but the bytes stay inside the browser where scripts cannot reach them — so you cannot parse them or measure arbitrary characters. Fetching ourselves gives one copy that both registers and parses, with the same network traffic.
The price: a CJK font (tens of megabytes) means one extra copy in memory, and parsing happens on the main thread (hundreds of milliseconds). That is why the measurer is optional.
Only the local side needs permission
queryLocalFonts() is a Chromium-family API:
- listing local fonts (family, style, PostScript name) is a single full scan;
- getting a font's bytes needs a user gesture plus permission.
Permission is granted per origin, though a browser may ask again after a new page load — which is why nothing scans "in passing" when a page opens: every byte read happens on your click.
Safari and Firefox do not implement the API, so the entire local side is unavailable there (the home and contribute pages word things according to support).
Three cases where something cannot be shown
- Safari / Firefox: the local entry point is unavailable;
- A library font that has not been loaded: specimen only; type preview and metrics come after loading;
- Local archive entries that were only probed: selectable and previewable, but
cmapRangesis null, so coverage says "not analysed".
What the specimen is
A specimen is an SVG drawn from the font's real outlines during analysis (one per language) and stored in object storage. It is not a screenshot and does not depend on anything installed on the visitor's machine — so everyone can see it.
Further reading
docs/adr/0001-no-font-bytes-on-server.md- MDN: Local Font Access API
- MDN:
FontFace,document.fonts