drawing the same scene twice produces the same pixels
The same scene drawn several times into one context reads back byte-identical every time. Brave's stock farbling makes it differ and is declined rather than scored.
What a detector infers
Canvas noise is usually reasoned about as a trade: give up a stable hash, gain an unlinkable one. A deployed commercial collector shows why that trade can be a loss. Its canvas collector renders its text pass TWICE into the same context and compares the two readbacks; when they differ it discards the value entirely and reports the literal string 'unstable'.
So a build that reseeds its perturbation on every call does not hand that collector a new fingerprint — it hands it a much rarer one, because 'cannot draw the same thing twice' describes a far smaller population than any particular canvas hash does.
The other half of the argument is what the noise was bought for, and measurement on the same vendor's identity matcher answers it: changing BOTH canvas digests on an otherwise-unchanged device moved the confidence score from 0.99 to about 0.97 and did not mint a new visitor at all. A signal that costs a unique tell and buys 0.02 of confidence is not worth paying for.
This row is the temporal counterpart to canvas-subrect-consistency: that one renders once and compares a windowed read against the full read, which catches noise indexed by offset inside the returned buffer; this one renders repeatedly and catches noise that reseeds between calls. A build can pass either and fail the other, which is why they are separate.
How to resolve it
Seed canvas noise per session, not per call: the same input should give the same output for the lifetime of the page. Per-call reseeding does not produce a new identity on a real matcher, and it produces a tell that no ordinary browser produces.
Nearby checks in Render & GPU
- a browser that implements EME can satisfy its mandatory ClearKey baseline
eme-clearkey-baselineEncrypted Media Extensions is the DRM entry point, and it has one part that cannot be missing. - one canvas encodes the same pixels through toBlob and toDataURL
canvas-toblob-vs-todataurlA canvas has three exits — getImageData, toDataURL and toBlob — and a build that perturbs canvas readback has to perturb all three… - the WebGL2 element-count limits are reported beside the renderer that claims them
webgl-max-elements-readoutMAX_ELEMENTS_INDICES and MAX_ELEMENTS_VERTICES are hints the driver publishes about how many indices and vertices it draws efficiently in… - the WebGPU preferred canvas format is reported beside the claimed platform
webgpu-canvas-format-readoutnavigator.gpu.getPreferredCanvasFormat() returns the texture byte order the platform's compositor wants to be handed — and that preference… - reading the same framebuffer twice returns the same bytes
webgl-repeat-readback-determinismThe same assertion as the canvas row beside it, asked one layer down the graphics stack, and separate from it because a build can be… - MathML scripts are shaped with real metrics, not flattened to text
mathml-metrics-vs-osMathML metrics sit in the long tail of a deployed collector's signal inventory, read through an <mmultiscripts> element. - a hidden child realm lays text out exactly as the page does
hidden-iframe-layout-agreementA deployed commercial agent does not run most of its collectors in the page. - the time a hidden frame takes to be created and measured in is reported
hidden-iframe-completion-budgetThe second failure mode of the hidden-frame modality, and one nothing in this audit could previously report: not a wrong answer, but no…
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 Render & GPU 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 Render & GPU — the family canvas-repeat-render-determinism belongs to.
