How the browser privacy score works
Privacyassay measures selected information a website can read from your browser. Measurements run in the browser; your fingerprint is not uploaded. This page describes 0.9.7.
The score summarizes an experiment. It is not a probability of being tracked, a uniqueness estimate, or a complete browser privacy grade.
What the test covers
The catalog contains 33 readings across 13 categories, including canvas, WebGL, WebGPU, audio, fonts, layout, screen and device details. The raw report includes additional capability checks. WebRTC public-IP, cross-site storage and DRM key-system tests are optional and off by default.
Reading states
| State | Meaning |
|---|---|
| Shown | An observable value was returned, or a hidden value was recovered through a second route. |
| Blended | Output was masked or changed in repeated measurements, or, in the cross-site score, matched the standard value of a uniformizing browser family on both sites. |
| Refused | The API is unavailable, access was explicitly denied, the browser withheld every requested high-entropy client hint, or a completed optional test returned no exposed value. The row records which. |
| Unknown | The measurement was missing, invalid, failed or did not finish. It receives no protection credit. |
Two kinds of protection
A randomizer is credited for valid per-read variation or a reading that differs between the two sites. A uniformizer is credited when a reading carries its family's fixed value on both sites; that other users share the value is assumed from the family's documentation, not measured across cohorts or settings, and those rows are marked as assumed. The cross-site result also reports its score without them. A plain browser that shows the same value on both earns neither. Uniformity credit applies to the cross-site score only, for Tor Browser, Mullvad Browser and Firefox with resistFingerprinting (LibreWolf included), and never to fonts, which the tool cannot verify.
Second routes
Selected readings have a second route: a fresh same-origin frame (including a real WebGPU adapter request), or hit-testing with document.elementFromPoint for element geometry and MathML size. For those readings, established alternate-route exposure remains shown even if a later repeat fails; a stable ordinary alternate value prevents credit for noise on the main path. Valid variation and matching family-standard values are evaluated separately. Usable alternate reads that vary on valid repeats can support per-read variation; unavailable alternate reads add no evidence and do not automatically remove credit based on the main measurements. A usable frame value that disagrees with the family standard removes assumed-uniform credit. Cross-site differences require comparable usable values from available read routes on both sites; mismatched routes cannot prove variation. One-sided exposure remains shown. A reading refused or masked on one read or site and readable on the other counts as shown.
Score and completeness
Readings have weights of 3, 2 or 1. Each category is worth its heaviest reading, and earns the share of reading weight classified as blended or refused. Unknowns remain in the denominator.
category earned = category weight × hidden reading weight / total reading weight score = round(100 × sum(category earned) / sum(category weight))
For complete measurements, the bands are A at 90+, B at 75–89, C at 60–74, D at 40–59 and F below 40. These weights reflect judgment about potential identifying value, not measured entropy, identification likelihood or tracking probabilities; the grade bands are judgment too.
Grade I means incomplete. The displayed score is then a lower bound, accompanied by coverage and an upper bound that includes unknown readings and incomplete comparisons. Incomplete results do not satisfy CLI score thresholds. They should not be compared with complete results as equivalent.
Repeated and cross-site measurements
Canvas, GPU rendering, audio, font and layout measurements run again with the same stimuli. Volatile font lookup remains exposed with an incomplete comparison, without per-read protection credit. Failed repeats preserve established exposure and mark the comparison incomplete; readings with no established outcome stay unknown. Neither earns protection credit. Browser names, common values or missing local fonts do not establish protection.
The cross-site test opens a second origin as a top-level window for every browser. If the window is blocked, fails to respond or serves a different methodology version, the comparison is unmeasured. Results report the number of comparable readings that changed, without claiming a tracker can or cannot recognize you. Explicitly configured local IP companions reply to their configured home; an unconfigured local page does not use the public home as its reply target.
A reading counts as compared only when both sites returned a usable value. A missing, empty, error or timed-out value leaves the comparison incomplete while preserving established exposure. Different values from different read routes cannot establish origin-specific variation; equal recovered values remain comparable. Canvas is compared on its decoded pixels, not on the encoded PNG, so a browser that changes only the file bytes earns no canvas credit. Because of that change, 0.9.3 cross-site canvas results are not comparable with 0.9.2; a lower score removes earlier false credit and is not a browser regression. 0.9.4 scores a WebGL readback that the browser refuses with NotSupportedError (Mullvad, Tor) as a refused reading instead of unknown, so those browsers can now complete a run and are not comparable with 0.9.3.
Changing a reading does not prove resistance to averaging or linking through other attributes. Localhost comparisons are not equivalent to two registered domains. Compare the same browser/OS versions, settings, opt-ins and context.
Both sites repeat the scored rendering and capability reads. Per-read variation is distinct from stable values that differ between sites. Known exposure survives a failed comparison, but the comparison remains incomplete and forces grade I. Exposure coverage and comparison coverage are reported separately.
Optional checks and privacy
The WebRTC opt-in contacts a public STUN service and reports observed candidates, completion and failures. It is not a VPN-bypass certification. The storage opt-in tests selected persistent stores with confirmed writes and readbacks; failed controls remain unknown.
Storage writes finish before the second-site read. Explicit denials are write refusals. A cookie write that silently does not read back stays unknown unless the companion's own first-party write and readback of the same cookie API succeeds and the first-party read finds no token; missing or failed controls remain unknown. HTTP-cache checks are informational and require /__res and /__ctr server endpoints; static hosts without them leave these checks unmeasured. A completed WebGPU request returning no adapter leaves identity, limits and features refused unless a fresh frame recovers an adapter. SecurityError and NotAllowedError refusals are treated the same way; other failed requests leave the affected reading unknown.
DRM key systems are requested only with the DRM opt-in, since the browser may show a permission or install prompt. The default run records them as not run. Rejected, failed or timed-out key systems earn no credit in the secondary media diagnostic, and DRM never enters the findability score.
The hosted comparison loads a companion page, which receives a normal web request. Measured values return between windows inside your browser. Redaction is on by default for display and saved reports; it masks raw readings and browser/extension identity, while preserving scores, counts, leak labels and standard error classes. Review a report before sharing it. It does not affect scoring.
AI and other limits
The AI section checks web API availability. It cannot establish Firefox AI Controls, sidebar-assistant settings, cloud processing or retention. See Mozilla's AI Controls documentation for those settings.
The public hosted pair has no /__headers, /__res or /__ctr endpoints, so request-header diagnostics and those cache checks remain unmeasured. These diagnostics are outside scored-catalog coverage.
Browser telemetry, network-layer fingerprinting, comprehensive tracker blocking, bounce tracking and behavioral tracking are outside this score. No population of fingerprints is collected for uniqueness estimates. Compatibility requires testing on each browser and platform.
Reproduce and contribute
Saved reports identify methodology version and completion state. Historical 0.9.1-beta captures are not comparable with current scores. See the technical methodology for every weight and the benchmark instructions for reproductions.
Contribute minimal examples with browser version, operating system and settings. Keep raw fingerprints out of public issues and use the security reporting process for sensitive findings.