Skip to content
All fingerprint checks
Engine & OS oracles

a Windows face that loads by name is also visible to text layout

Pim· Clearcote Research 3 min readCheck id font-loads-by-name-vs-layout

Under a Windows claim on Chromium, every candidate face that loads through local() also changes the width of text when requested as a font-family, in canvas text or in layout.

What a detector infers

This is the row above asked in the other direction. A page can learn whether a font is installed by loading it by name, new FontFace(x, 'local("Franklin Gothic Medium")').load(), or by asking for it as a font-family and measuring whether text drawn with a generic fallback changes width. On Windows both questions are answered from the same DirectWrite font collection. The row above catches a face that measures but will not load, which is a stand-in under a borrowed name.

This one catches a face that loads but does not measure: it is installed, since local() reached it, yet a font-family request for the same name falls back to the generic in canvas text and in layout alike. The only way to produce that is to filter the family lookup while leaving the local() path alone, which is what a browser shaping its font list from the inside tends to do.

The candidate list is 116 Windows faces that loaded and measured on genuine Chrome and Edge 153 on Windows 11. A face that does not load casts no vote, so a list entry missing from some other install only loses coverage and never raises an accusation. Icon fonts are left out, because they have no Latin glyphs and look absent to the probe string even on a real install. The Chromium default generics are left out too.

How to resolve it

A font list has to be the same through every path a page can use to reach it. Filtering the names font-family resolves while local() can still load the face leaves that face both provably installed and provably hidden, which no real Windows install produces. Present the host's fonts as they are, or remove a face from the machine itself rather than from one lookup inside the browser.

Declined off Chromium, because Firefox matches local() against individual face names (so "Segoe UI Light" loads there without being a family), and off a Windows claim, which has not been measured.

The font stack under the user agent

Read in the wild by

CloakBrowser issues

A user compared the v150 binary with genuine Chrome on the same Windows 11 machine and found it detected 70 of the 136 fonts Chrome detects. The maintainers answered that the published font set is derived from the profile seed. That answer covers which fonts are shown, but not a face that stays loadable by name while it is hidden from layout.

CloakHQ/CloakBrowser #474 (v150 binary diverges from Chrome for fonts)

CloakHQ/CloakBrowser#474

CloakBrowser (measured)

Franklin Gothic Medium loads through local() but moves none of the three generics in canvas text or layout. This held on every launch measured: the 152 SDK defaults with a random seed, nine fixed seeds, headless and headed, the stock configuration of a scraping service, and the 150 and 151 Pro binaries. 146 and 148 show the face through both paths.

116 candidate faces on one Windows 11 host. Chrome 153 in four modes, Edge 153, Brave 153, Clearcote r27 default and seeded, CloakBrowser 146 and 148: 0 hidden. CloakBrowser 150.0.7871.114.3-pro (59 load), 151.0.7922.108.3-pro (97 load) and 152.0.7977.83 (116 load): Franklin Gothic Medium hidden. Firefox 144: 20 single faces load without being families, which is why Gecko is declined.

CloakBrowser (measured)

Every attribution traces to a published artifact. See the sources and their limits.

Nearby checks in Engine & OS oracles

See all 14 checks in Engine & OS oracles
Who builds this test

Clearcote is a browser built for fingerprint coherence

It is a Chromium fork, maintained by the same people who wrote this reference. It ships as a compiled browser rather than as a stealth script injected into someone else's — which is a description of how it is built, and is not an argument about how it behaves on this check.

This audit takes no position on how Clearcote scores on Engine & OS oracles checks, on this one, or anywhere else. It has no baseline corpus of other people's fingerprints to rank you against and no vendor scoreboard — nearly every check is self-referential, asking one browser the same question through two independent APIs and reporting whether both answers can be true at once. It runs identically on any browser, including ours. Run it on yours and read the result yourself.

See the other checks in Engine & OS oracles — the family font-loads-by-name-vs-layout belongs to.