System / 05

Fonts probe.

Renders a baseline string in 30+ common fonts and measures the rendered width. Different width = font is installed.

Notes

Width-probing is an older technique. The newer Local Font Access API gives more detail but is restricted to permission-granted enterprise apps in Chrome only.

How it works

We append an invisible <span> with the probe text 'mmmmmmmmmwwwwwwwwwlli' at 72 px. For each candidate font we set its font-family to "Candidate", fallback across each of three fallbacks (monospace / serif / sans-serif).

If the rendered width differs from the bare fallback for any of the three, the candidate font must exist on the system (otherwise the browser would have used the fallback). The span is removed after probing.

Frequently asked

Why isn't there a 'list all fonts' API?

There used to be, briefly — the Local Font Access API. It was withdrawn from most browsers because it leaked too much fingerprint information (the exact set of installed fonts is nearly unique per machine). The width-probing fallback we use here is older but works in every browser.

How does width-probing work?

Render the same long string in font 'A, monospace' and in 'monospace'. If the widths differ, font A must exist — otherwise the browser would have fallen back to monospace and produced the same width. Repeat for each font of interest.

Why does my list have Apple-specific fonts even though I'm on Windows?

Some fonts are detected indirectly — e.g. Segoe UI Emoji might be aliased to Apple Color Emoji on iOS-skinned browsers. The probe can't distinguish 'the font is named X' from 'the font is locally aliased to X'.

Is this useful for fingerprinting?

Yes — the exact set of installed fonts is among the strongest passive fingerprinting signals (3-4 bits of entropy on average). Privacy-focused browsers (Tor, Brave) report a fixed canonical font list rather than the real one. If your list is short and contains only system defaults, you're likely using one of those.