A fully transparent canvas pixel reads back as zero
Every pixel with alpha 0 reads back as (0, 0, 0, 0). N/A on Brave, whose canvas farbling is a stock privacy feature (severity: warn).
What a detector infers
A 2D canvas stores its pixels premultiplied: each colour channel is kept already multiplied by alpha. A pixel with alpha 0 therefore holds no colour at all, and when getImageData converts back to straight alpha it can only return (0, 0, 0, 0) — Skia's unpremultiply step returns zero for a zero alpha on the CPU path and on both GPU paths. So colour found under a fully transparent pixel was put there after the canvas drew it, by something perturbing the readback.
The probe draws grey text and arcs onto a transparent canvas and counts transparent pixels that carry colour. Measured on stock Chrome on Windows and Linux, headed and headless, on Edge on Windows, on Playwright's Chromium and on chrome-headless-shell: none, out of roughly 8,000 transparent pixels each, and none on the 49 most recent audit visits across Chrome, Edge, Firefox, Safari and Android. A JavaScript noise layer put colour under 136 of them.
In the audit's stored corpus, a cluster of captures claiming Chrome 146 on six different GPUs carried ±1 colour on isolated transparent pixels, and five captures were dirty here while their flat fill read back exact — noise the flat-fill row cannot see. The probe uses a CPU-backed canvas (willReadFrequently) and draws no colour emoji, because a GPU readback of an emoji bitmap once left a single stray pixel on a macOS machine. Brave farbles canvas output by design and is N/A, as in the 1×1 canvas row.
How to resolve it
Turn canvas noise off where canvas output is read. A transparent pixel has no colour to vary, so noise applied across the whole readback writes values that no premultiplied canvas can return.
Nearby checks in Render & GPU
- Grey drawing reads back as grey
canvas-grey-stays-greyText, arcs and gradients drawn in a neutral grey on a transparent canvas read back with the three colour channels equal. - A Direct3D renderer only appears under a Windows claim
d3d-renderer-only-on-windowsDirect3D is a Windows API. ANGLE, the layer Chromium renders WebGL through, only names it in the unmasked renderer string when it is running… - A Direct3D 11 renderer reports the caps ANGLE's D3D11 backend fixes
webgl-d3d11-fixed-capsWhen ANGLE runs WebGL on Direct3D 11 at feature level 11 — the renderer string reads Direct3D11 vs_5_0 ps_5_0 — it does not ask the driver… - Every extension WebGL hands out is one it advertises
webgl-gettable-is-advertisedIn Chrome, getSupportedExtensions() and getExtension() read the same set: an extension the context can hand out is one it lists, and one it… - WebGL state reads back what the page just set
webgl-state-reads-backSome WebGL parameters are not capabilities but state the page itself controls. - readPixels writes only the pixels it was asked to read
webgl-readpixels-sentinelreadPixels writes into an array the page supplies, and the WebGL specification is precise about the edges: when the requested rectangle… - A worker OffscreenCanvas encodes the pixels it reads back
offscreen-canvas-exits-agreeA canvas has more than one way out. getImageData hands pixels straight to script; convertToBlob encodes the same pixels into a file, and… - WebGPU's preferred canvas format belongs to the claimed OS
webgpu-canvas-format-vs-osnavigator.gpu.getPreferredCanvasFormat() returns the texture format the platform's compositor wants to be handed, and Chrome on Windows and…
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-alpha-zero-reads-black belongs to.
