a Firefox user-agent reports the Gecko productSub constant 20100101
A Firefox user agent comes with navigator.productSub === "20100101", the value every Gecko build hardcodes. Chrome and Safari report "20030107" and never carry a Firefox UA.
What a detector infers
navigator.productSub is a constant compiled into the engine, and the two families disagree: every Gecko build hardcodes it to "20100101" — stock Firefox, ESR, Tor Browser, LibreWolf, Firefox for Android alike — while Chrome and Safari return "20030107". So a browser whose user agent declares itself Firefox but reports the Chromium value is contradicting its own engine claim: a Chromium base wearing a Firefox coat.
This is the mirror of the productSub check that gates on a Chrome UA, and it is the stronger of the two, scored critical, because the value is a compile-time constant that resistFingerprinting does not retune — no privacy Firefox trips it.
The gating is precise to avoid the one false positive available: it fires only on the full Gecko user-agent shape (an rv token, a Gecko build token, and a Firefox token together), and it never compares productSub against the UA's own Gecko/ token, because on Firefox for Android that token carries the rv version, for example Gecko/126.0, which is not the productSub date and would wrongly flag every mobile Firefox.
It reads two independent constants and asks only whether they name the same engine.
How to resolve it
navigator.productSub is compiled into the engine, so it cannot be chosen independently of the engine running underneath. Presenting a Firefox user agent from a Chromium base leaves productSub reporting the Chromium constant. Run the engine the user agent claims.
Read in the wild by
Camoufox issues
The Firefox anti-detect tooling tracker records a Chromium-style productSub riding a Firefox UA — the exact self-contradiction this reads.
daijro/camoufox #105, #145 (productSub hardcode)
daijro/camoufox#105Every 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 build branded Google Chrome carries Google's Widevine CDM
widevine-vs-chrome-brandingThe ClearKey row in this suite deliberately refuses to score Widevine, and for the question it asked that is correct: "does a… - a build branded Google Chrome decodes the codecs Google licenses
licensed-codecs-vs-chrome-brandingH.264 and AAC are patent-encumbered. Google licenses them for its branded Chrome; a Chromium compiled without the proprietary_codecs flag… - no other engine's properties exist on this one, even holding undefined
legacy-engine-props-absentThere is a difference between a property that returns undefined and a property that does not exist, and only one of them is what a real… - 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… - navigator.hardwareConcurrency is plausible
hardware-concurrencyThis is an info-severity observation, not a scored failure — it reports navigator.hardwareConcurrency and only notes whether the value is an… - 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.
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 gecko-productsub-hardcode belongs to.
