a constant signal renders at exactly the amplitude it was given
Check id audio-render-dc-integrity
What an ordinary browser yields
Every constant amplitude comes back exactly as given, one distinct value across the whole buffer (severity: warn). A uniform scale on every amplitude is not scored on Brave, which ships that farbling by default.
What a detector infers
The companion to the silence check below, and the input that one structurally cannot see. Rendering an empty graph and asserting every sample is zero catches an ADDITIVE perturbation — a noise floor injected into the output — and is blind by construction to a MULTIPLICATIVE one, because zero times any scale is still zero. Silence is precisely the signal that hides a scale, so a stack that multiplies the whole buffer by a per-site factor passes the silence check every time. A constant signal closes that gap. A ConstantSourceNode at a fixed offset wired straight to the destination is a wire, not a filter: the Web Audio specification fixes every output sample at the amplitude given, and the context is created at the rate it renders so no resampling sits in the path either. Reading anything else is a contradiction against the specification rather than against a reference value, which is what keeps this free of any table that could go stale. Three amplitudes are rendered rather than one because the shape of the deviation is itself the evidence: a uniform scale shows the same ratio at every amplitude, an additive bias does not, and a clamp only bites at the top — so the row can say which of the three it is instead of only that something is wrong. Measured on the reference machine: stock Chrome 150 and a Chromium stealth build both render 0.5, 0.25 and 0.125 bit-exactly, one distinct value across 4096 samples in every case. The multiplicative farbler this row was written to describe turned out to be a shipping browser. Measured on one origin: a stock Brave rendered every DC amplitude multiplied by the same factor, 0.99989 in that run — the uniform scale predicted above, arriving from a default install with nothing configured. Brave varies that factor per eTLD+1, so 0.99989 is one observed sample of what the scale can be rather than a property of the browser, and the row treats it that way: the SHAPE is what generalises and the value does not. That is a stock privacy feature rather than evidence of a stealth build, so the row declines on it, the same way the screen and canvas rows decline Brave's other farbling. The decline is keyed to the SHAPE and not to the browser alone, which is what keeps the row meaningful on Brave instead of switching it off there: the three amplitudes exist to tell the three deviations apart, and only the uniform scale is Brave's, so an additive noise floor or a clamp still scores on Brave, and every deviation of every shape still scores everywhere else. It also requires all three rendered amplitudes to be wrong, since a buffer-wide multiply cannot leave one of them untouched. It is deliberately not gated on the SIZE of the factor: a magnitude band would be narrower still, but calibrating one would need the range Brave's per-site factor can take and exactly one such factor has been measured, and inventing a band from a single sample is how a threshold starts making false accusations. The Brave half of the decline is also not read from the bare presence of navigator.brave, which is an ordinary own property any page can assign: the engine must measure as V8 through the RangeError oracle and navigator.brave.isBrave must stringify as a genuine native function, so a one-line assignment cannot buy silence on a row whose expected value comes from the Web Audio specification.
How to resolve it
Do not scale or offset Web Audio output to defeat fingerprinting. A perturbation applied to the whole buffer is readable from any signal whose value is fixed by the specification, and a constant source is the cheapest of those — the audio fingerprint the scale is meant to protect is considerably harder to read than the scale itself. Leave the render path native, or perturb nothing.
Nearby checks in Render & GPU
- WebGPU's build constants are identical in every realm
webgpu-sync-surface-vs-realmWebGPU's cheapest fingerprint is not the GPU at all. navigator.gpu.getPreferredCanvasFormat() and navigator.gpu.wgslLanguageFeatures are… - the GL limits the driver reports are limits the driver will actually honour
webgl-limits-vs-driverEvery other WebGL check on this page reads what getParameter SAYS. - ANGLE's translated shader is written in the dialect the renderer string implies
shader-backend-vs-rendererThe UNMASKED_RENDERER_WEBGL string is a label — a piece of text a page can rewrite to name any GPU and any graphics backend. - every extension WebGL advertises can actually be instantiated
webgl-extensions-vs-drivergetSupportedExtensions() returns a list a page can rewrite; getExtension(name) either hands back a real extension object or null, and that… - the clear path and the shader path paint opaque red to the same bytes
webgl-draw-path-invarianceOpaque red can be produced two ways: the fixed-function clear path, and a fragment shader emitting vec4(1,0,0,1). - a mediump claim of fp32 precision is delivered by the arithmetic
shader-mediump-claim-vs-arithmeticgetShaderPrecisionFormat is a claim about float precision; a shader that computes a value only fp32 can represent is the GPU keeping or… - silence renders as exact zero through the Web Audio graph
audio-render-silence-integrityThe other audio checks compare two renders of a sound; this one renders silence and asserts it stayed silent, which catches a different kind… - 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.
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 audio-render-dc-integrity belongs to.