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:

  1. fetch the bytes from the upstream mirror (GitHub / Google Fonts);
  2. register them with new FontFace(name, bytes) on document.fonts, so the page can render with it;
  3. 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

  1. Safari / Firefox: the local entry point is unavailable;
  2. A library font that has not been loaded: specimen only; type preview and metrics come after loading;
  3. Local archive entries that were only probed: selectable and previewable, but cmapRanges is 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