# webgpu

> The WebGPU adapter's vendor, architecture, device and description, its features and seven limits, as one digest.

Source: https://whiskerjs.com/signals/webgpu/ (last updated 2026-10-26)

**webgpu at a glance (from the library code, signalsVersion 9)**

| Field | Value |
| --- | --- |
| Component name | `webgpu` |
| In the visitorId | yes |
| structuredId group | [gpu (graphics)](https://whiskerjs.com/docs/identifiers/#structuredid) |
| Hashing | always a digest (first 128 bits of SHA-256) |
| Excluded under | Brave (brave_farbling) |
| Inner timeout | 1000 ms |
| Added in | [signalsVersion 3](https://whiskerjs.com/whats-new/) |

> **In plain words:**
>
> WebGPU is the newer way for web pages to use the graphics chip. Before doing any work, a page can ask for an “adapter” and read what it is and what it can do. WhiskerJS reads only that description and turns it into a short code. It gives a second, independent view of the GPU next to WebGL.

## What it reads

1. `navigator.gpu.requestAdapter()`, with no options.
2. From the adapter’s `info` attribute: `vendor`, `architecture`, `device` and `description` (non-string values become empty).
3. The adapter’s `features` set, as a sorted list of names.
4. Seven entries of the adapter’s `limits`: `maxBindGroups`, `maxBufferSize`, `maxComputeInvocationsPerWorkgroup`, `maxComputeWorkgroupStorageSize`, `maxStorageBufferBindingSize`, `maxTextureDimension2D` and `maxVertexBuffers`.

No device is requested and the deprecated `requestAdapterInfo()` method is not called.

## How the technique works

The parts are written as `vendor=...;architecture=...;device=...;description=...;features=a,b,c;limits=n1,n2,...` and the whole string is always hashed, since `webgpu` is a large component. Sorting the features makes the value independent of the order the browser lists them in. The call is asynchronous; like every collector it races its own 1000 ms timeout.

## Why it helps

WebGPU adapters expose the GPU vendor and architecture as the browser chooses to present them, plus feature and limit sets that follow the GPU, the driver and the browser’s WebGPU implementation. That complements the WebGL components in the `gpu` group, and a mismatch between WebGPU and WebGL vendors is something your server can look at.

## Stability

It changes when the browser’s WebGPU implementation changes what it reports (new features or limits in an update), with a driver update, or when a different GPU is used. Where WebGPU is not available the component is consistently `unavailable`, which is stable too.

## Browser support and what blocks it

- `ok` in browsers that offer `navigator.gpu` and return an adapter, in [secure contexts](https://whiskerjs.com/glossary/#secure-context) only. Availability depends on the browser, its version and the operating system; check the [support matrix](https://whiskerjs.com/browsers/support-matrix/).
- `unavailable` / `no_api` where `navigator.gpu` is missing. In the container test runs used for these pages, headless Firefox and WebKit had no `navigator.gpu`.
- `unavailable` / `no_context` when no adapter is returned: headless Chromium in the same container exposed the API but returned no adapter.
- [Brave](https://whiskerjs.com/browsers/brave/): `excluded` / `brave_farbling` (since signalsVersion 6): since Brave 1.93 the adapter info has its fields emptied, so it carries nothing about the device.

## Privacy

It reveals graphics hardware details. Everything leaves the library only as a 32-character digest. `requestAdapter()` shows no prompt, and WhiskerJS makes no request.

## How WhiskerJS handles noise and failures

| Status | ruleId | When |
| --- | --- | --- |
| `ok` | none | adapter read; value is a digest |
| `unavailable` | `no_api` | no `navigator.gpu` or no `requestAdapter` |
| `unavailable` | `no_context` | `requestAdapter()` returned no adapter |
| `unavailable` | `no_digest` | no Web Crypto |
| `blocked` | `security_error`, `threw` | `requestAdapter()` rejected or a read threw |
| `excluded` | `brave_farbling`, `caller_excluded` | exclusion table or your `exclude` list |
| `timed_out` | `timeout`, `aborted` | 1000 ms inner timeout, budget, abort |

## Example value

```json
"webgpu": { "status": "ok", "value": "862da19ca084b185c1d8c76af676a08b", "hashed": true }
```

The headless test browsers used for these pages reported `{ "status": "unavailable", "ruleId": "no_context" }` (Chromium) and `no_api` (Firefox, WebKit).

## Questions and answers

### Does reading WebGPU start using my GPU?

WhiskerJS only calls navigator.gpu.requestAdapter() and reads the adapter's info, features and limits. It never requests a device, so no GPU work is submitted.

### Why is webgpu unavailable in my browser?

Either the browser has no navigator.gpu (no_api), for example because WebGPU is not shipped or not enabled there or the page is not a secure context, or it returned no adapter (no_context), which happens without a supported GPU.

### Why is the deprecated requestAdapterInfo not used?

It prints a warning in the console in browsers that deprecated it, and WhiskerJS never writes to the console. The adapter's info attribute gives the same fields.

## Related pages

- [webgl_renderer](https://whiskerjs.com/signals/webgl-renderer/): The GPU name through WebGL.
- [webgl_params](https://whiskerjs.com/signals/webgl-params/): WebGL limits and extensions.
- [WebGPU](https://whiskerjs.com/glossary/#webgpu): The API in one definition.
- [Secure context](https://whiskerjs.com/glossary/#secure-context): WebGPU is offered only on https pages.
