What it measures
The raw byte value returned by navigator.storage.estimate().quota — a browser-computed estimate of available persistent storage, typically a fraction of actual disk size. In incognito and private-browsing mode, browsers cap this value artificially low. When the quota is above 0 but below INCOGNITO_THRESHOLD_BYTES = 120 MB, the signal flags degraded confidence as an incognito hint.
The raw byte integer is hashed directly with no bucketing or rounding. This means the hash discriminates disk-size classes across sessions, but can also shift between collections if significant amounts of data are written to or deleted from disk.
How it is collected
After confirming navigator.storage.estimate is available, the signal awaits storage.estimate() and extracts the quota field, defaulting to 0 if absent. The incognito flag is computed by checking whether quota is between 1 and INCOGNITO_THRESHOLD_BYTES (exclusive). The hash is produced by passing String(quota) — the decimal byte count — directly to xxHash64 with no delimiter, since it is a single value.
Confidence rules
| Confidence | Trigger |
|---|---|
| normal | quota >= 120 MB (INCOGNITO_THRESHOLD_BYTES), or quota === 0 |
| degraded | quota > 0 and quota < 120 MB — suggests incognito or private browsing mode |
| absent | navigator.storage or .estimate is unavailable, or estimate() throws |
Why engine-bound
The Storage API quota calculation is implemented differently per browser engine and policy. Chrome computes quota as approximately 60% of available disk space; Firefox uses its own calculation, often lower than Chrome on the same disk; Safari applies stricter caps under ITP. In incognito mode, all major browsers artificially limit quota — Chrome to approximately 120 MB, Firefox to approximately 50 MB, Safari varies. The raw quota value is therefore a function of browser engine, version, and browsing mode rather than just hardware.
Things worth knowing
- quota === 0 is treated as normal rather than degraded because a zero quota most likely means the API returned an empty estimate, not that incognito mode is active.
- The raw byte integer is hashed with no bucketing — small disk changes between sessions can shift the hash even in normal mode.
- navigator.storage is available in web workers; the signal can be collected from a worker context.
- Firefox resistFingerprinting does not appear to alter storage quota values.

