Skip to content
All fingerprint checks
Engine & OS oracles

text layout uses the font scaler of the operating system claimed

Pim· Clearcote Research 3 min readCheck id text-scaler-vs-claimed-os

The share of 0.01 px size steps that change the text width matches the claimed OS: nearly all of them on Windows and macOS, about two in three on Linux, Android and ChromeOS.

What a detector infers

Every operating system draws text with its own font scaler: DirectWrite on Windows, Core Text on macOS, FreeType on Linux, Android and ChromeOS. Blink first snaps a font size to hundredths of a pixel, then hands it to that scaler, and the two families of scaler treat those hundredths differently. DirectWrite keeps them, so stepping a font size up by 0.01 px changes the width of a line of text almost every time.

FreeType works in 1/64-pixel fixed point, so neighbouring hundredths often collapse onto the same internal size and about a third of the steps change nothing. The audit steps a 54-character string through 200 such sizes and counts the steps that change its width. Measured on 2026-09-24: Chrome on Windows 11 changed on 99% of steps, a Linux browser on 66%, and the same Linux browser presenting a Windows user agent on 66%.

The figure was identical for sans-serif, serif and monospace, and in canvas measureText and page layout alike, which is how a property of the scaler rather than of a font looks. No reference widths are involved: the browser's widths are only compared with themselves, so the fonts installed and the browser version do not matter. The scaler is picked by the host OS below Blink, so navigator.platform, the user agent and the font list never reach it.

How to resolve it

Run the browser on the operating system it claims, or claim the one it runs on; the scaler cannot be selected from inside the browser. Clearcote's Linux build claims Linux by default for this reason, and its hosted browsers run on Windows machines. The row declines at a device pixel ratio above 1 when it reads the Windows pattern, because a HiDPI Linux screen produces that pattern too (measured: 99% at 2x), so it never accuses a real Linux user of running Windows.

The font stack under the user agent

Read in the wild by

Scrapfly

Published the underlying observation: one text measurement at a fractional font size separates FreeType from DirectWrite and Core Text, and a Linux build presenting Windows still measures at the FreeType value. Their model is that FreeType floors the size to 1/64 px; our measurement agrees on the effect but finds slightly more change than a strict 1/64 grid allows, so this row scores the measured rate instead of the model.

textWidth(24.5555) on Chrome 150: Windows and macOS 458.16650390625, Linux 458.108642578125.

scrapfly.dev: What getClientRects reveals about FreeType

Clearcote (measured)

Clearcote 149 in its Linux Docker image, with CC_PLATFORM=windows, presents a Windows user agent and navigator.platform "Win32" but changes text width on 476 of 720 hundredth steps, the Linux figure. With the default Linux persona the same reading is coherent and this row passes. Recorded as a known gap for a Windows persona on a Linux host.

720 consecutive hundredths from 20 to 27.2 px, sans-serif/serif/monospace, canvas and getBoundingClientRect: Windows Chrome 714/720, Clearcote Linux (either persona) 476/720.

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 text-scaler-vs-claimed-os belongs to.