WebGL and AudioContext Fingerprinting: GPU and Audio Signals
For high-entropy browser tracking, WebGL and AudioContext are among the most revealing signals. WebGL exposes graphics hardware details, while AudioContext exposes CPU and audio-processing behavior through a silent test tone. These signals are harder to block than canvas because they require more invasive browser restrictions.
How WebGL and AudioContext signals complement each other
WebGL and AudioContext fingerprinting read two completely different parts of your machine, which is what makes them so powerful when combined. WebGL exposes the entire graphics stack: GPU vendor, renderer name, supported extensions, texture limits, and shader precision, all returned through a single extension query.1 AudioContext exposes CPU and audio processing behavior through an offline signal that never reaches your speakers, capturing floating-point rounding differences that vary across processor architectures and driver implementations.2
Consequently, a tracker that collects both values can compare your graphics profile with your audio profile, which gives it two independent ways to recognize the same browser. Building on this, blocking only one surface can leave the other one intact, so privacy checks should review both rows in the fingerprint inspector. A browser that randomizes canvas but leaves WebGL untouched still exposes a detailed graphics profile, and one that masks the renderer string but allows unmodified audio processing still leaks CPU-level identifying information through the audio hash.
How scripts use both signals together
Scripts usually do not rely on WebGL or AudioContext in isolation because each signal alone provides only a partial view of the device. They collect a cluster of values from both APIs, hash the combined cluster, and store the resulting identifier for later comparison across sessions and sites. WebGL contributes the graphics profile with GPU-specific renderer strings, while AudioContext contributes a separate processing profile derived from CPU floating-point behavior that is unlikely to match another user's browser exactly.2
This pairing is powerful because the two signals come from different layers of the device. A browser update may change one hash, but the other can still provide continuity. When both remain stable, the tracker gains confidence that the same browser returned even if cookies, IP address, or timezone changed. This dual-signal resilience is what makes WebGL and AudioContext pairing so much harder to defeat than canvas alone: spoofing one hash without the other creates an inconsistency that advanced fingerprinting systems can detect and flag.
When browser protections change these values
When a browser protects against fingerprinting, it usually changes WebGL and AudioContext before it touches lower-entropy signals like language or timezone. Brave can return empty WebGL renderer strings and inject per-site noise into AudioContext frequency data.3 Firefox with privacy.resistFingerprinting can mask WebGL parameters and alter audio rendering output.4 Tor Browser goes further by disabling WebGL at higher security levels, which removes the graphics surface but may break maps, 3D tools, and browser games.5
How each browser's approach affects the signal
Brave's per-site farbling means the WebGL renderer string returns empty when Shields are active, while AudioContext frequency data receives noise that changes per origin. Firefox RFP masks the renderer string to a generic value and modifies audio output at the engine level. Tor Browser removes WebGL entirely at higher security levels. Consequently, you should treat WebGL and AudioContext as advanced signals that reveal how aggressive your browser protection is.
You can confirm what your browser exposes by opening the fingerprint inspector and checking the WebGL and AudioContext rows directly. A browser with strong protections shows an empty or randomized renderer string and noise in the audio curve, while an unprotected one reveals the full graphics and audio stack. Testing both before and after enabling a protection makes the difference easy to see and act on.
Running the inspector in CapyToolkit turns these differences into a visible report you can act on. The WebGL and AudioContext rows show exactly what each browser exposes, so you can compare a protected profile against an unprotected one and decide which trade-offs you are willing to accept. A quick before and after test is the most reliable way to confirm a protection is actually doing its job.
Reading both signals in CapyToolkit
Reading the Browser Fingerprint Inspector gives you a practical way to compare protection levels. Open the page in a default browser, record the WebGL renderer and AudioContext hash, then repeat the check in Brave, Firefox with resistFingerprinting, or Tor Browser. A stable WebGL string and a stable audio hash mean the page can collect detailed hardware signals. A missing renderer string, a normalized audio value, or a null result means the browser has already reduced the tracking surface. This side-by-side test shows which settings matter for your own device rather than relying on generic privacy claims. Pay special attention to whether the WebGL renderer string disappears entirely or merely changes to a generic value, because the difference between blocking and spoofing affects both your privacy level and your compatibility with WebGL-dependent sites like 3D maps and browser-based games.
If you need stronger protection than a VPN
If your privacy goal is to hide your IP address from websites and your ISP, a VPN is the right tool for that specific job. If your privacy goal is to reduce browser recognizability through fingerprinting, a VPN does not change WebGL or AudioContext values because those values come from browser JavaScript APIs that run locally, not from the network route your packets travel through.
Pair a VPN with a browser that farbles, masks, or disables high-entropy signals. Brave with Shields active, Firefox with privacy.resistFingerprinting, and Tor Browser each address these signals more directly than network tools. For everyday browsing, test the result after each change so your setup actually reduces the signals that fingerprinting scripts can read. The most effective everyday combination is a privacy-focused browser with built-in farbling plus a VPN for network-level anonymity, because the two tools address completely different layers of the tracking stack and complement each other without overlap.
How fingerprinting scripts collect WebGL and AudioContext in practice
In a real fingerprinting implementation, WebGL and AudioContext collection happens within the first few hundred milliseconds of page load, before visible content renders. A script creates an offscreen WebGL canvas using document.createElement('canvas').getContext('webgl'), then queries the WEBGL_debug_renderer_info extension immediately. The full renderer string returns synchronously without any user interaction or permission request. Simultaneously, a separate script instantiates an OfflineAudioContext, attaches an OscillatorNode and DynamicsCompressorNode, and calls startRendering() to produce the audio hash asynchronously.
Both signals combine with a canvas fingerprint collected through the 2D context on the same offscreen canvas element. Scripts bundle all three hashes into a single identifier object alongside screen dimensions, timezone, and language, then send the combined object to a first-party or third-party analytics endpoint using navigator.sendBeacon(), which fires reliably even when the user navigates away before the network request completes.6 The entire collection sequence leaves no stored data on your device and requires no browser notification or permission dialog.
Why collection timing makes blocking harder
Because WebGL and AudioContext data is collected before the page is visually complete, extension-based blockers that inject their protection code after page scripts run can arrive too late to intercept the initial collection. Browser-level protections that apply before any JavaScript executes, such as Brave's built-in farbling and Firefox RFP's engine-level interception, address this timing gap. Extensions that rely on content script injection may miss the first collection event on fast-loading pages.
GPU vendor identification and what it reveals about your device
GPU vendor identification is one of the most precise hardware classification signals in the fingerprinting stack. The WEBGL_debug_renderer_info UNMASKED_RENDERER_WEBGL string includes the GPU manufacturer, the specific model line, and the rendering backend.7 On Windows Chrome, "ANGLE (NVIDIA GeForce RTX 4070 Direct3D11 vs_5_0 ps_5_0)" identifies the manufacturer (NVIDIA), the product tier (RTX 4070), the Windows API version (Direct3D11), and the shader model (vs_5_0). On macOS Chrome, the same GPU produces "ANGLE (Apple, ANGLE Metal Renderer: Apple M3 Pro, Unspecified Version)" instead, because macOS routes WebGL through the Metal API.
Each GPU generation within a vendor family produces a distinct model string. Adreno 740 and Adreno 750 are different strings despite being both Qualcomm mobile GPUs. This level of granularity lets fingerprinting systems determine the device's purchase year, price segment, and performance tier from a single API call. Combining the renderer string with navigator.hardwareConcurrency and navigator.deviceMemory produces a three-signal device tier fingerprint that is stable across browser updates until the user upgrades their hardware.
How platform-level blocking changes the renderer string
Brave returns null for the WEBGL_debug_renderer_info extension object when Shields are active, which prevents the renderer and vendor strings from being read entirely. Firefox with RFP spoofs both values to a generic string that does not identify the underlying GPU. Tor Browser disables WebGL entirely at the Safer and Safest security levels. You can verify which behavior your browser applies by checking the WebGL row in the fingerprint inspector: a null value confirms extension blocking, a generic string confirms spoofing, and an empty row confirms WebGL is disabled.
When to use this
Use this guide to understand advanced fingerprinting vectors and protect against GPU-based and audio-based tracking.
Examples
WebGL fingerprint signals
A script queries your GPU vendor, renderer name, and supported extensions.
Your browser reports: Vendor: "Google Inc. (NVIDIA)", Renderer: "ANGLE (NVIDIA GeForce GTX 1080 Direct3D11...)", GL_VERSION: "OpenGL ES 3.0". This combination identifies your GPU model and driver.
`AudioContext` fingerprint before and after mitigation
A script generates an audio signal and analyses the frequency response curve. Your machine produces: "94.30.15,99.17,49.15,63.81..."
With audio fingerprinting blocked (Firefox resistFingerprinting), the script receives null or a flat signal, preventing unique identification.
- 1.
Mozilla Developer Network, "WebGL: 2D and 3D graphics for the web," developer.mozilla.org, July 2025. https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API
- 2.
FingerprintJS, "audio.ts," github.com, accessed June 2026. https://github.com/fingerprintjs/fingerprintjs/blob/master/src/sources/audio.ts
- 3.
Brave, "Fingerprinting defenses 2.0," brave.com, accessed June 2026. https://brave.com/privacy-updates/4-fingerprinting-defenses-2.0/
- 4.
Mozilla Bugzilla, "Apply Resist Fingerprinting Protection to WebGL," bugzilla.mozilla.org, accessed June 2026. https://bugzilla.mozilla.org/show_bug.cgi?id=1428033
- 5.
Tor Project, "Security levels - Features," torproject.org, accessed June 2026. https://support.torproject.org/tor-browser/features/security-levels/
- 6.
Mozilla Developer Network, "Navigator: sendBeacon() method," developer.mozilla.org, accessed June 2026. https://developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon
- 7.
Crawlex, "AudioContext fingerprinting: the OscillatorNode signature explained," crawlex.net, accessed June 2026. https://blog.crawlex.net/blog/audiocontext-fingerprinting/