Skip to content
All fingerprint checksCapability surfaces

emoji advance widths are identical in a fresh realm

Check id emoji-surface-vs-realm

What an ordinary browser yields

Identical advance widths in both realms — both are shaped by the same platform font through the same engine.

What a detector infers

Emoji do not render from the page's fonts but from a platform font supplied by the operating system — Segoe UI Emoji on Windows, Apple Color Emoji on macOS, Noto Color Emoji on Linux and Android. Their advance widths, measured through canvas measureText, therefore describe the OS's font stack rather than anything the browser reports about itself. This check measures a spread of emoji, including a ZWJ sequence and text-presentation symbols that stress the shaping path differently, and requires the widths to match in a fresh realm. What it deliberately does not do is compare those widths against a per-OS reference table. Such a table would let it name the operating system, which is tempting, but it would also rot with every font update and start accusing ordinary browsers — and there is already a better OS oracle on this page in Math.tanh, which reads the C library directly and cannot go stale. So this stays a realm comparison: severity warn, because font stacks are the one place where an extension or a userstyle can legitimately intervene.

How to resolve it

If the widths disagree across realms, text measurement is being intercepted in the page world only. Note that font metrics are a poor thing to fake: they must stay consistent with the platform you claim, with the fonts you claim to have installed, and with every other realm at once.

What is font fingerprinting?

Read in the wild by

CreepJS

Builds ~90 emoji strings and measures their rendered metrics as a platform-font signal.

src/fonts/index.ts — getPixelEmojis, EMOJIS in src/utils/helpers.ts

CreepJS (abrahamjuliot/creepjs)

Kasada

Measures a handful of emoji as part of its render fingerprint.

emoji_wavy_dash, emoji_white_circle, emoji_up_arrow, emoji_left_arrow, emoji_double_exclamation

Kasada ips.js teardown — the full 427-probe list

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

Other checks in Capability surfaces

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 Capability surfaces 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 Capability surfaces — the family emoji-surface-vs-realm belongs to.