Orange textured background

Signal

Font detection

We probe which fonts are installed by measuring text-width variance across a curated cross-platform list. Hardware-bound — stable across browsers on the same OS.

Reviewed

Tier 1 hardware

What it measures

The signal tests a curated cross-platform font list covering Windows, macOS, Linux, and Android. For each font, a hidden span is rendered using that font as the primary family and a generic fallback. If the rendered dimensions differ from a pure-fallback baseline, the font is considered installed.

Because fonts are installed at the OS level rather than the browser level, the same presence set is reported by Chrome, Safari, and Firefox on the same machine, making the signal hardware-bound.

How it's collected

The collector creates a hidden off-screen container, renders a baseline span in the fallback family, and records its rendered width and height. Each candidate font is then rendered in turn with the same content; if its dimensions diverge from the baseline, the font is marked present.

The collector yields to the main thread periodically (using scheduler.yield() on Chrome 115+ or setTimeout 0 as a fallback) to avoid blocking the UI. The hidden container is removed from the DOM in a finally block. If document is undefined, the result is absent immediately.

Confidence rules

ConfidenceTrigger
normalMeasurement returned a non-null presence array
absentdocument is undefined, or any unhandled exception

Why hardware-bound

Font measurement relies solely on offsetWidth and offsetHeight of DOM spans, which is deterministic across all browser engines for a given installed font set. Chrome, Safari, and Firefox all perform the same comparison: rendered span vs. fallback baseline. Because installed fonts are an OS and hardware property, not a browser property, the presence bitmap is stable across browsers on the same device.

The document.fonts.check() API was considered and rejected. In Chrome it returns true for any syntactically valid font-family name because it silently falls back, causing false positives across the entire list. Dimension measurement is the only reliable installed-font test.

Things worth knowing

  • The hash encodes the full presence bitmap, not just the detected font names. Two devices with different installed font sets but the same count of detected fonts will produce different hashes.
  • Firefox resistFingerprinting does not interfere with offsetWidth/offsetHeight of hidden spans. The signal returns normal even when resistFingerprinting is active.
  • Brave Standard mode does not farble font enumeration because it is dimension-based rather than canvas-based. The signal is unaffected by Brave privacy settings.
  • In SSR or non-browser environments where document is undefined, the signal returns absent immediately without attempting measurement.
  • The exact list of probed fonts, the test string, font size, and fallback family are deliberately not published. Treat the result shape and confidence as the stable interface; the probe list evolves between releases.

Last reviewed 2026-06-04