Fingerprinting · Browser Tests

WebGL Fingerprint Test

Read your graphics card, driver strings and WebGL parameters, one of the strongest hardware signals.

Starting a WebGL context…

Reading your WebGL stack…

Asking the browser for its GPU strings, rendering limits and the full list of shader extensions it exposes.

Every value here is read from a WebGL context created in this tab. The vendor and renderer strings are a strong hardware signal, but they are shared by every machine with the same GPU and driver.

On this page
  1. What WebGL reveals
  2. The GPU strings
  3. Extensions and limits
  4. When the strings are withheld
  5. Why it is a strong signal
  6. What it cannot tell
  7. What you can do about it

What WebGL reveals about your graphics stack

WebGL exists so that a web page can draw 3D graphics without a plugin. To do that, the browser has to hand the page a real graphics context, and that context comes with a description of the hardware behind it. The vendor, the renderer, the driver's shader extensions and a long list of numeric limits all become readable to any script that asks.

That description is a fingerprinting goldmine because it is hardware-shaped. Your canvas hash can drift with a browser update, but your GPU and driver version stay put for months. The widget above opens a context, reads every parameter a fingerprinting script typically collects, and reduces the set to a single 32-character hash so you can see how stable the picture is between visits.

The same read a tracker makes

Nothing here is privileged. Any page can create a canvas, call getContext('webgl') and read the same values in a few milliseconds, without a permission prompt or any visible effect.

The masked and unmasked GPU strings

Every WebGL context exposes two strings by default. VENDOR and RENDERER are the masked forms, and browsers deliberately keep them vague, often returning values such as WebKit or WebKit WebGL so that a page cannot read the hardware directly. On their own they are not very useful to a tracker.

The precise names come from a separate, optional extension called WEBGL_debug_renderer_info. When it is present, its UNMASKED_VENDOR_WEBGL and UNMASKED_RENDERER_WEBGL parameters return the real strings, for example Google Inc. (NVIDIA) and a renderer line naming the GPU, the Direct3D feature level and the driver path. The widget lists both pairs so you can see exactly what your browser chooses to disclose.

Whether the extension is exposed is a policy decision, not a hardware one. Two identical laptops running different browser settings will show different amounts here, which is why the block above labels it as exposed or blocked rather than treating it as fixed. The graphics card test walks through the same strings from a hardware-identification angle.

Extensions and rendering limits

Beyond the names, a WebGL context answers questions about its own capabilities. getSupportedExtensions() returns the shader features the driver offers, from compressed texture formats such as WEBGL_compressed_texture_s3tc to depth-texture and instancing extensions. A WebGL2 context on a modern desktop GPU typically reports somewhere between forty and sixty of them; a software renderer reports far fewer, and the exact list is a strong hint about the driver.

The numeric parameters are just as revealing. MAX_TEXTURE_SIZE is 16384 or 32768 on most discrete and integrated GPUs but can be 4096 on older or virtualised hardware. MAX_VIEWPORT_DIMS, MAX_VERTEX_ATTRIBS, the aliased line-width range and the uniform vector counts all vary by driver, and taken together they form a combination that is far more specific than any single value.

When the strings are withheld

A missing unmasked renderer is normal, not a fault in your machine. Firefox generalises these strings on desktop as part of its fingerprinting resistance, and Safari limits the extension too, so you may see only the masked values and a generic vendor. Neither behaviour means WebGL is broken: drawing still works, and the limits and the extension list still come through.

The driver blocklist is a separate reason the name can disappear. Browsers keep a list of driver versions known to crash or render incorrectly, and when yours is on it the browser falls back to a software rasteriser. You will meet names such as SwiftShader on Chromium and llvmpipe on Linux and Firefox. That fallback is deliberate, and the panel reports it honestly rather than hiding it.

Why the GPU is such a strong signal

In fingerprinting research, the graphics stack is consistently one of the highest-entropy signals a page can read without permission. There are hundreds of GPU models, each with many driver versions, each exposing a slightly different extension set and limit table. A page that reads all of it can often place your machine in a group far smaller than the one your user agent puts you in.

It is also hard to fake convincingly. Overriding navigator.userAgent is a one-line change, but a spoofed renderer string that does not match the extension list, the texture limits and the canvas output underneath it stands out immediately. That mismatch is exactly what the browser fingerprint test looks for when it audits whether your signals agree with one another.

What WebGL cannot tell a site

It is worth being precise about the limits. A renderer string identifies a model, not a specific card, and it certainly does not identify a person. Any script that stores only the hash cannot tell two users of the same hardware apart, and cannot tell whether the value it holds belongs to one visitor or a thousand. The device hardware info test shows how coarse those hardware facts really are on their own.

WebGL can also be switched off. Some hardened browsers disable it outright, virtual machines fall back to a software rasteriser such as SwiftShader or llvmpipe, and remote desktops often report a generic adapter. In those cases the signal collapses to a value shared by everyone in the same situation, which makes it useless for tracking and makes the browser look unusual at the same time.

What you can do about it

WebGL is hard to fake well, and that shapes what is worth doing. Overriding one string through an extension is easy, but a renderer that disagrees with the extension list, the texture limits and the canvas underneath it is a contradiction a fingerprinting script can spot in a single pass.

The options that work are the blunt ones. A browser that reports generic values or adds noise, such as Firefox in its strict mode or Brave, reduces the signal without breaking 3D content. Disabling WebGL entirely is effective and costly, because maps, games and many data visualisations stop rendering, though some hardened browsers accept that trade.

Frequently Asked Questions

What does WebGL reveal about my computer?
A WebGL context hands over the GPU vendor and renderer strings, the WebGL and GLSL versions, every shader extension the driver exposes and a set of numeric rendering limits. No permission is required and nothing on screen changes. Together these values describe your graphics hardware and driver closely enough to separate one machine from another without a cookie.
Why does my renderer say ANGLE?
On Windows, Chrome and Edge route WebGL through ANGLE, a translation layer that passes graphics calls to Direct3D. So the renderer string reads something like ANGLE (NVIDIA, NVIDIA GeForce RTX 3060 Direct3D11 vs_5_0 ps_5_0, D3D11). It is the honest answer: your card is named, but the string also exposes the translation path being used.
Why is the GPU name shown as generic or hidden?
The WEBGL_debug_renderer_info extension that exposes the real name is optional. Browsers with fingerprinting protection can withhold it, so you see a generic vendor and renderer instead. Firefox does this when its resist-fingerprinting setting is on, and Safari limits the extension too. The rest of the parameters still come through, so a missing name is normal rather than a fault.
Is the WebGL hash unique to my device?
No. It is shared by everyone with the same GPU model, driver version and browser build, which can be millions of people. On its own it is one column among many. Its power is in combination: paired with canvas, audio and font signals it narrows a crowd fast, which is what the fingerprint test measures end to end.
Does this page send my GPU details anywhere?
No. The context is created, queried and discarded inside this tab, and nothing is written to storage or uploaded. You can watch the network panel while the reading loads and see no request leave. The graphics card test reads the same signals if you want a plainer, product-style answer about your GPU.