the same audio render reproduces itself
Check id audio-render-reproducibility
What an ordinary browser yields
Repeated renders of an identical graph agreeing to within 1e-6 relative; on Chromium, agreeing exactly. N/A when OfflineAudioContext is absent (severity: warn).
What a detector infers
An OfflineAudioContext render involves no output device and no clock. It is arithmetic on fixed inputs, performed on the CPU, so its output is a pure function of the operations the browser carries out - render the same graph twice and the result is not merely close, it is bit-identical. That makes 'does it reproduce itself' a question with no reference value anywhere in it: nothing is compared against a table of expected sums, so nothing goes stale when Chromium changes its compressor or its wavetable. MEASURED on Chrome 150: six consecutive renders of the same graph (5000 frames, triangle at 1000Hz through a DynamicsCompressor at threshold -50, knee 40, ratio 12, attack 0, release 0.25) produced ONE distinct sum, a relative spread of exactly 0, and identical raw samples. The audio fingerprint is a well known signal and the usual countermeasure is to perturb the samples; perturbation drawn fresh on each call destroys the one property the render is guaranteed to have. Measured with per-call multiplicative noise of the magnitude an anti-detect tool was reported to use, between 1e-4 and 3.5e-3: five renders gave five distinct sums at a relative spread of 1.3e-3, a thousand times the threshold. WHAT IT CANNOT SEE, stated because the row would otherwise imply more than it measured: perturbation drawn ONCE PER SESSION reproduces itself perfectly inside a single page and is invisible here - measured with a session-constant factor, five renders gave one distinct sum and spread 0. Brave's farbling works that way. Averaging across many sessions recovers the underlying value, but one page load cannot, and the passing detail says so rather than claiming a clean bill of health. THE THRESHOLD IS RELATIVE, AT 1e-6, RATHER THAN EXACT EQUALITY, and that choice comes from this file's own history: the analyser row shipped once in a form that fired on honest Firefox because Gecko re-analyses per call. Reproducibility was measured on Chromium only, so the threshold absorbs any ULP-scale jitter an unmeasured engine might have - for scale, the cross-architecture variation this technique exploits is about 4e-7 relative - while still sitting three orders of magnitude below the noise it looks for. Widening it to exact equality should wait for Gecko and WebKit measurements.
How to resolve it
Per-call randomisation of the audio buffer is self-defeating: it is the one thing a device-free render cannot do, so it converts a common fingerprint into a rare anomaly - the noise is far larger than the hardware variation it means to hide, and it announces itself by moving. If the audio fingerprint must be changed, change it to a different STABLE value that the same browser reproduces on every render, rather than to a moving one.
Read in the wild by
Scrapfly
Derives the audio fingerprint from OfflineAudioContext arithmetic and argues that randomised perturbation is a category error, being orders of magnitude larger than the hardware variation it hides.
OfflineAudioContext(1, 5000, 44100), triangle @1000Hz -> DynamicsCompressor(-50, 40, 12, 0, 0.2); x86 258.09814036649186 vs Apple Silicon 258.09813991968986
The math behind audio fingerprintingEvery attribution traces to a published artifact. See the sources and their limits.
Nearby checks in Render & GPU
- the GPU named by the renderer string can actually render
webgl-performance-caveat-vs-renderergetContext("webgl", {failIfMajorPerformanceCaveat: true}) asks Chromium for a context only if it can supply one without a major performance… - 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 constant signal renders at exactly the amplitude it was given
audio-render-dc-integrityThe companion to the silence check below, and the input that one structurally cannot see. - 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-reproducibility belongs to.