Skip to content
All fingerprint checksNavigator identity

navigator.deviceMemory is a power-of-two spec value

Check id device-memory-bounds

What an ordinary browser yields

deviceMemory is absent, or is exactly one of 0.25, 0.5, 1, 2, 4, 8, 16, or 32. On a real Chrome the reading is 8 or below (4 and 8 are the ordinary values), since the spec clamps it at 8.

What a detector infers

navigator.deviceMemory does not report actual RAM — the spec requires the UA to quantise it to a coarse power-of-two rung before exposing it, which is what makes it a low-entropy hint rather than a hardware readout. This check reads the property and tests membership in {0.25, 0.5, 1, 2, 4, 8, 16, 32}. Any other number (6, 12, 3, 64) is a value no shipping browser's quantiser can produce, so a detector seeing it infers the field was written by something other than the engine — the value itself is the evidence, independent of whether the number is otherwise plausible. The accepted set is deliberately wider than what stock Chrome actually emits: the spec clamps the exposed value to an upper bound of 8, so a real Chrome never reports above 8 no matter how much RAM is installed. The check still tolerates 16 and 32 rather than hard-failing on the ceiling, because the quantisation — not the cap — is the part of the signal it scores. If the property is not exposed at all, the check passes (undefined is a legitimate state). Severity is warn.

How to resolve it

Set deviceMemory to a power-of-two rung in 0.25–32 (4 and 8 are the common real-world values, and stock Chrome never exposes more than 8). If your config takes an arbitrary integer, round it to the nearest rung rather than passing raw RAM through.

Spec invariants as lie detectors

Read in the wild by

PerimeterX / HUMAN

Reads navigator.deviceMemory into its own field in the EV2 payload, in the same assignment run as the timezone offset.

stample/ifood/source/main.min.js:2 — `t[0]["OARNTn5iRnw="]=CD(),t[0][hQ(847)]=hU[hQ(848)]` where hU=navigator, hQ(847)="bRlYEyt6WCA=", hQ(848)="deviceMemory" (hQ_map.json entries 847/848), and CD() returns getTimezoneOffset(). EV2 field "bRlYEyt6WCA=" carries 32 in the captured iFood payload (all_fields_map.json line 1057).

Kasada

Reads deviceMemory in both realms.

window_device_memory, iframe_device_memory

ips.js 427-probe teardown (emro.cat, Apr 2026)

Akamai

Lists device memory as a hardware signal.

signal_categories.md - 2. Hardware - Device memory

Edioff/akamai-analysis — signal_categories.md

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

Nearby checks in Navigator identity

See all 26 checks in Navigator identity
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 Navigator identity 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 Navigator identity — the family device-memory-bounds belongs to.