navigator.hardwareConcurrency is plausible
Check id hardware-concurrency
What an ordinary browser yields
An integer between 1 and 128 — typically 4, 8, 12, or 16 on consumer hardware.
What a detector infers
This is an info-severity observation, not a scored failure — it reports navigator.hardwareConcurrency and only notes whether the value is an integer in the range 1–128. The bounds are loose on purpose: real machines span that whole range, so the check cannot tell you a value is wrong, only that it is outside anything a physical CPU would present. Its research value is as context for other signals rather than as a verdict of its own: a detector rarely scores the core count in isolation, but does correlate it with deviceMemory, the claimed platform, and the render path (a persona claiming a 32-core workstation while reporting 2GB of memory and a software rasteriser is incoherent as a set, even though each field is individually legal).
How to resolve it
Nothing to fix if the value is a normal core count; this check is contextual and not scored. If it does read out of range, set hardwareConcurrency to an integer matching the machine class your persona describes, and keep it consistent with deviceMemory.
Read in the wild by
Kasada
Reads hardwareConcurrency in both realms.
window_hardware_concurrency, window_hardware_concurrency_direct, iframe_hardware_concurrency
ips.js 427-probe teardown (emro.cat, Apr 2026)
Akamai
Lists CPU cores as a hardware signal.
signal_categories.md - 2. Hardware - Hardware concurrency
Edioff/akamai-analysis — signal_categories.mdEvery attribution traces to a published artifact. See the sources and their limits.
Nearby checks in Navigator identity
- eval.toString().length matches the engine (V8 = 33)
etslThe string a JS engine returns for a native function's source is an implementation detail, and its length differs per engine… - navigator.productSub === 20030107 (Chromium)
product-subnavigator.productSub is a frozen legacy constant, not a live value: Chrome, Safari and Opera return "20030107" while Firefox returns… - a Firefox user-agent reports the Gecko productSub constant 20100101
gecko-productsub-hardcodenavigator.productSub is a constant compiled into the engine, and the two families disagree: every Gecko build hardcodes it to "20100101"… - navigator.deviceMemory is a power-of-two spec value
device-memory-boundsnavigator.deviceMemory does not report actual RAM — the spec requires the UA to quantise it to a coarse power-of-two rung before exposing… - the machine delivers no more parallelism than it claims cores
hardware-concurrency-vs-parallelismThe plain hardwareConcurrency row can only ask whether the number looks sane, because no second API reports a core count. - the Keyboard API's presence matches the claimed engine and form factor
keyboard-api-vs-platformThe Keyboard API — navigator.keyboard, with getLayoutMap and lock — ships in desktop Chromium and nowhere else: not in Gecko, not in WebKit… - browser-brand and context hints agree with a fresh realm
brand-hints-vs-realmSome of the cheapest signals to fake are the ones that say which browser this is: navigator.brave exists only in Brave, window.duckduckgo… - location.origin is the serialisation of its own protocol, host and port
location-origin-coherenceAn origin is not stored next to a URL, it is serialised from it: for an http or https document, origin is exactly the scheme, followed by…
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 hardware-concurrency belongs to.