Browser Fingerprint & Privacy Leak Inspector: Code Examples

See exactly what your browser leaks to third-party trackers — canvas hash, WebGL renderer, audio fingerprint, installed fonts, and 30+ signals. Nothing leaves your browser.

ZERO UPLOAD · ALL LOCAL
  1. The scan runs automatically when you open this page — no input needed.
  2. Each section shows a group of signals your browser exposes. Rows marked TRACKABLE are the highest-entropy signals used to identify you.
  3. The entropy score at the top estimates how uniquely identifiable your browser is across the web.
  4. Use the Copy buttons next to any row to copy that value to your clipboard.
  5. The Installed Fonts section lists which fonts from a 30-font probe were detected on your system.
Scanning browser APIs…
~0 bits

Analysing fingerprint…

27+ bits VERY HIGH
19 – 26 bits HIGH
9 – 18 bits MODERATE
0 – 8 bits LOW

IDENTITY

USER AGENTTRACKABLE
APP VERSION
PLATFORM
VENDOR
WEBDRIVER

HARDWARE

CPU THREADS
DEVICE MEMORY
SCREEN RESOLUTIONTRACKABLE
AVAILABLE SCREEN
COLOUR DEPTH
PIXEL DEPTH
PIXEL RATIO
ORIENTATION
TOUCH POINTS
BATTERY LEVEL
BATTERY CHARGING

GRAPHICS

CANVAS HASHTRACKABLE
WEBGL VENDOR
WEBGL RENDERERTRACKABLE
WEBGL EXT COUNT
WEBGL EXTENSIONS
MAX TEXTURE SIZE
WEBGL 2
WEBGPU

AUDIO

AUDIO FINGERPRINTTRACKABLE
SAMPLE RATE
BASE LATENCY

NETWORK & PRIVACY

ONLINE
DO NOT TRACK
COOKIES ENABLED
CONNECTION TYPE
DOWNLINK
RTT
SAVE DATA

BROWSER ENVIRONMENT

LANGUAGE
LANGUAGESTRACKABLE
TIMEZONETRACKABLE
TIMEZONE OFFSET
PLUGIN COUNT
PLUGINS
LOCAL STORAGE
SESSION STORAGE
INDEXEDDB
WEBSQL
CODEC H.264
CODEC VP8
CODEC VP9
CODEC AV1
CODEC HEVC
SPEECH VOICES
VOICE NAMES

SYSTEM PREFERENCES

COLOUR SCHEME
REDUCED MOTION
CONTRAST
POINTER
HOVER
FORCED COLOURS

INSTALLED FONTS

INSTALLED FONTSTRACKABLE
Show detected fonts (30 probed)

Brave Browser Fingerprint Protection

Brave actively randomizes the signals that fingerprinting scripts collect most, offering strong protection without requiring users to switch away from a mainstream browser. Its farbling mechanism, documented in the Brave browser wiki, applies controlled noise to canvas output, WebGL parameters, AudioContext processing, and font enumeration on a per-origin, per-session basis.1

The randomized values stay consistent within a single session but change between sessions and across different origins, which makes cross-site and cross-session linking impractical without breaking site functionality.2 Enabling Standard Shields mode activates farbling for all sites without additional configuration; Aggressive mode extends coverage to additional vectors including first-party trackers.3

Consequently, Brave earns the highest anti-fingerprinting score in independent browser privacy testing suites that measure resistance across dozens of simultaneous signals.4 Unlike Tor Browser, Brave routes traffic normally, so standard browsing performance remains unaffected.

Which APIs Brave farbling targets

Farbling applies noise at the API output level rather than blocking APIs entirely, which allows legitimate site functionality to continue while defeating stable fingerprint collection.5 The canvas and AudioContext modifications produce values that pass site functionality tests because the noise magnitude is small, enough to change the hash on each new origin but not enough to visually distort canvas rendering or make audio output inaudible.

How Brave farbling works

Consequently, sites that draw charts, run audio processing, or export canvas images continue to work normally. The WebGL renderer modification goes further: rather than returning noisy GPU strings, Brave suppresses the WEBGL_debug_renderer_info extension entirely when Shields are active, returning empty strings instead of the real GPU vendor and renderer.6 Building on this, hardware API values like hardwareConcurrency and deviceMemory are replaced with plausible but non-identifying values, reducing the precision with which scripts can estimate your CPU and RAM tier.

The consistency within a session is what preserves usability. A site that reads your canvas hash on page load and again during interaction sees the same farbled value both times, so its logic behaves as expected. You can observe this directly in the fingerprint inspector: reload the same page repeatedly and the farbled rows hold steady, then open a different site or a new session and watch them shift. This balance between stability and variation is the core design choice behind farbling.7

Shields levels and per-site configuration

Brave Shields operates at two levels. Standard Shields activates the full farbling suite for all sites by default; this is the setting in a fresh Brave installation and covers the vast majority of fingerprinting vectors without any user configuration. Aggressive Shields extends coverage to some first-party tracking domains that Standard mode allows.8 The per-site override panel in the address bar lets you raise or lower the Shields level for individual sites where fingerprinting protection conflicts with required functionality.

What Brave does not solve alone

Yet most sites do not require the high-entropy signals that farbling modifies, so compatibility issues are rare in practice. Brave does not farble every signal; timezone, screen resolution, and browser language remain unmodified because normalizing them would break too many legitimate site features. This means that a determined tracker can still combine the unfarbled signals with behavioral analysis to build a partial profile, even when the high-entropy canvas and WebGL surfaces are fully protected. Understanding which signals Brave modifies and which it leaves intact helps you evaluate whether additional measures like a VPN or a more restrictive browser are needed for your specific threat model.

Where Brave still needs testing

Furthermore, Brave's per-origin randomization means that even if a single site manages to extract a stable hash on one visit, that hash is useless for linking your identity on a different site because the values will differ across origins. The practical implication is that you should test your own setup rather than relying on general claims about Brave's protection level, since the exact signals that change depend on your specific hardware, browser version, and Shields configuration. CapyToolkit makes this testing straightforward by showing each signal row and whether it changes between a default browser and Brave with Shields active.

Testing Brave fingerprint protection with CapyToolkit

Testing the effectiveness of Brave's protections requires comparing a default browser against Brave with Shields active on the same machine. Open CapyToolkit Browser Fingerprint Inspector in Chrome to record your baseline signals, then open it in Brave; the canvas hash, WebGL renderer, audio fingerprint, and hardware concurrency values should all differ. Furthermore, open the tool in a new Brave window to confirm that the canvas hash changes between sessions, demonstrating that farbling prevents stable re-identification.

Rows marked TRACKABLE in the inspector reflect the highest-entropy signals; verifying that those rows show "blocked" or a different value confirms that Brave's protection is active. Conversely, signals like timezone, screen resolution, and language are not farbled; they remain accurate because normalizing them would break too many legitimate site features.

Notes

Brave farbling affects these specific APIs. HTMLCanvasElement.toDataURL() and toBlob() receive per-site random pixel noise consistent within a session but different across origins. navigator.hardwareConcurrency returns a random value from the set {2, 4, 8} regardless of actual CPU core count when Shields are active. navigator.deviceMemory reports 8 regardless of actual device RAM. The WEBGL_debug_renderer_info extension returns empty strings for UNMASKED_VENDOR_WEBGL and UNMASKED_RENDERER_WEBGL. OfflineAudioContext oscillator output receives per-site noise injected into the frequency response values. navigator.plugins returns an empty array. Font probing via CanvasRenderingContext2D.measureText() returns results from a randomized font subset.

Shields levels: Standard blocks third-party trackers and activates farbling. Aggressive additionally blocks some first-party trackers. Per-site Shields settings are accessible via the Brave address bar and take effect immediately without a restart.

Examples

Canvas hash: Chrome vs. Brave (Standard Shields)

Chrome:  c84efb8e3a92d710fbcae2f5b0078efb  (stable across page loads)
Brave:   7a1df3c94b21e6f902b3... (changes per origin and session)

The canvas hash in Brave will differ from Chrome on the same machine and will differ again in the next Brave session. Cross-site linking through canvas hash is not possible.

Hardware concurrency in Brave with Shields up

Chrome:  `navigator.hardwareConcurrency` → 12  (real CPU core count)
Brave:   `navigator.hardwareConcurrency` → 8   (farbled to nearest set value)

Brave returns one of {2, 4, 8} rather than the real count. The exact value varies per session.

WebGL renderer in Brave with Shields up

Chrome:  `UNMASKED_RENDERER_WEBGL` → "ANGLE (NVIDIA GeForce RTX 4070...)"
Brave:   `UNMASKED_RENDERER_WEBGL` → ""  (extension blocked)

Brave suppresses `WEBGL_debug_renderer_info` entirely when Standard or Aggressive Shields are active, returning empty strings rather than noisy GPU names.

Try in the tool

What farbling changes, API by API

  • navigator.hardwareConcurrency random value from {2, 4, 8}, regardless of real core count
  • navigator.deviceMemory reports 8 regardless of actual device RAM
  • WEBGL_debug_renderer_info returns empty strings for vendor and renderer
  • navigator.plugins returns an empty array

Verify with the Browser Fingerprint & Privacy Leak Inspector tool.

Try it in the tool ↑
Sources
  1. 1.

    Brave, "Fingerprint Randomization," brave.com/privacy-updates/3-fingerprint-randomization, 2020. https://brave.com/privacy-updates/3-fingerprint-randomization/

  2. 2.

    Brave, "Fingerprinting Defenses 2.0," brave.com/privacy-updates/4-fingerprinting-defenses-2.0, 2021. https://brave.com/privacy-updates/4-fingerprinting-defenses-2.0/

  3. 3.

    Brave, "Fingerprinting Protections," github.com/brave/brave-browser/wiki/Fingerprinting-Protections, 2024. https://github.com/brave/brave-browser/wiki/Fingerprinting-Protections

  4. 4.

    PrivacyTests.org, "Browser Privacy Test Results," privacytests.org, accessed July 2026. https://privacytests.org/

  5. 5.

    Brave, "Issue #10808 — navigator.hardwareConcurrency farbling," github.com/brave/brave-browser, 2021. https://github.com/brave/brave-browser/issues/10808

  6. 6.

    Brave, "QA Tests | Fingerprinting | Farbling," dev-pages.brave.software/fingerprinting/farbling.html, accessed July 2026. https://dev-pages.brave.software/fingerprinting/farbling.html

  7. 7.

    Canopy Press, "Brave vs Firefox vs Mullvad: Who Stops Fingerprinting?" canopy.press, 2025. https://canopy.press/brave-vs-firefox-vs-mullvad-who-stops-fingerprinting/

  8. 8.

    Brave Support, "How do I use Shields while browsing?" support.brave.app, accessed July 2026. https://support.brave.app/hc/en-us/articles/360022806212-How-do-I-use-Shields-while-browsing

FAQ

Firefox Fingerprinting Protection

When you want configurable anti-fingerprinting in a mainstream browser, Firefox resistFingerprinting is one of the most transparent options. Enabling privacy.resistFingerprinting in about:config activates a suite of browser-level protections developed through the Firefox Tor Uplift project, which ported Tor Browser's anonymization techniques into mainstream Firefox.1

With RFP enabled, screen dimensions are rounded to the nearest 200 pixels with a minimum of 1000x900, timezone is frozen to UTC, navigator.hardwareConcurrency is capped at 2, navigator.oscpu returns a generic string, and several WebGL parameters are masked.2 Firefox 120 extended partial RFP protections to the Strict mode in Enhanced Tracking Protection, providing a subset of these protections without the full about:config change.3

Consequently, Firefox offers a gradient of fingerprinting protection from zero through partial to maximum without requiring any extensions or external tools. Building on this, RFP is the most transparent implementation in any mainstream browser because its specific modifications are publicly documented in the Firefox source code.

Enabling privacy.resistFingerprinting and what it changes

Setting privacy.resistFingerprinting to true in Firefox about:config activates browser-level interception for a defined set of fingerprinting APIs, and the change takes effect immediately for all new page loads without requiring a browser restart. The most visible change is screen dimension rounding: a 1920x1080 monitor reports screen.width 1000 and screen.height 900, the minimum rounded value, which effectively masks the actual display resolution from any script that reads the screen object.4 The timezone freeze to UTC affects all time-related computations, including Date.prototype.getTime() comparisons that depend on local offset and Intl.DateTimeFormat outputs, making every Firefox RFP user appear to be in the same global timezone.5

What privacy.resistFingerprinting changes

navigator.hardwareConcurrency frozen at 2 prevents CPU tier classification.6 Consequently, these frozen values match those of every other Firefox RFP user on every other machine, making the modified signals identical across a large population of Firefox users globally. Building on this, the canvas modification intercepts toDataURL() and injects a session-consistent random perturbation to the pixel buffer before returning it. This approach differs from Brave's per-site randomization: Firefox RFP uses the same perturbation within a session regardless of which site is queried.

The transparency is what makes RFP different from proprietary approaches. Every frozen value and rounding rule is visible in the Firefox source, so you can inspect exactly which signals change rather than trusting a vendor summary. You can confirm the active protections in the fingerprint inspector, where the timezone row moves to UTC and hardwareConcurrency drops to 2 the moment RFP takes effect on a new page load.

What RFP leaves exposed

Despite its broad coverage, privacy.resistFingerprinting leaves several signals accessible to fingerprinting scripts. The audio fingerprint is partially reduced but not fully randomized; OfflineAudioContext processing is modified, but the degree of modification is less aggressive than Brave's per-site noise injection. The canvas hash is modified rather than fully randomized per site, which means that within a single Firefox RFP session, the same canvas hash is returned to every site, different from Chrome but consistent across origins within the session.

When Firefox protection is worth the trade-off

The installed font set receives some restriction but not the comprehensive subset-limiting that Brave applies. Browser language and locale are not frozen, leaving Accept-Language and Intl.DateTimeFormat locale data exposed. Consequently, a Firefox RFP user is distinguishable from a standard Chrome user but may not be fully unlinkable across sites within a single session if multiple sites receive the same session-consistent canvas hash.7 Building on this, combining Firefox RFP with uBlock Origin in strict mode and blocking additional third-party JavaScript addresses the remaining gaps more completely.

Firefox with uBlock Origin in strict mode

The most practical combined Firefox configuration for fingerprinting resistance pairs privacy.resistFingerprinting with uBlock Origin set to medium or hard blocking mode. uBlock Origin in hard mode blocks third-party scripts by default, which prevents most fingerprinting JavaScript from executing at all, the most effective mitigation because a blocked script cannot collect any signals regardless of what Firefox exposes. RFP addresses the case where fingerprinting code executes as first-party or slips through uBlock's domain filters.

Consequently, the combination defends at two independent layers that address different parts of the fingerprinting pipeline: uBlock Origin prevents most fingerprinting JavaScript from executing at all by blocking the third-party domains that serve the tracking scripts, and RFP limits what any successfully-executed script can collect from the browser's hardware and configuration APIs even when the script runs as first-party code that uBlock cannot block by domain alone.

Why two layers matter

Furthermore, Firefox's container tabs feature allows session isolation per site, which prevents the same-session canvas hash consistency problem that standard Firefox RFP creates.8 Building on this, this combined approach provides stronger fingerprinting protection than Brave's default configuration in the specific scenario where a fingerprinting script executes as first-party JavaScript on a site, because RFP's canvas modification plus uBlock Origin's script blocking creates two independent barriers.

Notes

privacy.resistFingerprinting effects: screen.width and screen.height are rounded to the nearest 200px multiple (minimum 1000x900), regardless of actual monitor resolution. Intl.DateTimeFormat().resolvedOptions().timeZone returns 'UTC' and Date.prototype.getTimezoneOffset() returns 0. navigator.hardwareConcurrency returns 2. navigator.oscpu returns 'Intel Mac OS X 10.15' (a historical frozen value). navigator.deviceMemory is undefined when RFP is active. Canvas APIs return modified pixel data to prevent canvas fingerprinting. AudioContext frequency response data is modified to prevent audio fingerprinting. navigator.userAgent returns a spoofed Firefox/macOS string. The WEBGL_debug_renderer_info extension is suppressed.

Firefox 120+ Strict Enhanced Tracking Protection enables a subset: timezone and some canvas protections, but not all RFP behaviors. Setting location: about:config, preference name: privacy.resistFingerprinting, type: Boolean, default: false.

### What changes are visible in CapyToolkit

After enabling RFP, CapyToolkit should show the timezone row changing to UTC, hardwareConcurrency moving to 2, and canvas/audio values becoming modified. These visible changes make it easier to confirm that the setting is active before you rely on it for sensitive browsing.

Examples

`screen.width` in Firefox RFP vs. default Firefox

Default Firefox:  `screen.width` → 1920 (real monitor width)
Firefox RFP on:   `screen.width` → 1000 (rounded to minimum 1000x900)

RFP rounds all screen dimensions to the nearest 200px and enforces a 1000x900 minimum, regardless of actual monitor size.

`navigator.hardwareConcurrency` in Firefox RFP

Default Firefox:  `navigator.hardwareConcurrency` → 12 (real CPU core count)
Firefox RFP on:   `navigator.hardwareConcurrency` → 2  (frozen value)

Freezing hardwareConcurrency to 2 makes all Firefox RFP users appear to share the same low-end CPU configuration, preventing CPU tier identification.

Try in the tool

Exact frozen values when RFP is active

  • rounded to nearest 200px, minimum 1000x900
  • frozen to 2
  • UTC / 0
  • undefined

Verify with the Browser Fingerprint & Privacy Leak Inspector tool.

Try it in the tool ↑
Sources
  1. 1.

    Tor Project, "Tor at the Heart: Firefox," blog.torproject.org, 2018. https://blog.torproject.org/tor-heart-firefox/

  2. 2.

    Mozilla Support, "Resist Fingerprinting," support.mozilla.org, accessed July 2026. https://support.mozilla.org/en-US/kb/resist-fingerprinting

  3. 3.

    Mozilla, "Firefox 120 Release Notes," firefox.com, 2023. https://www.firefox.com/en-US/firefox/120.0/releasenotes/

  4. 4.

    Mozilla Bugzilla, "Bug #1330882 — Window dimension rounding under resistFingerprinting," bugzilla.mozilla.org, 2019. https://bugzilla.mozilla.org/show_bug.cgi?id=1330882

  5. 5.

    Mozilla Bugzilla, "Bug #1709867 — Fine-grained control of RFP timezone spoofing," bugzilla.mozilla.org, 2023. https://bugzilla.mozilla.org/show_bug.cgi?id=1709867

  6. 6.

    Mozilla, "Fingerprinting Protection," support.mozilla.org, accessed July 2026. https://support.mozilla.org/en-US/kb/firefox-protection-against-fingerprinting

  7. 7.

    MozillaWiki, "Security/Contextual Identity Project/Containers," wiki.mozilla.org, accessed July 2026. https://wiki.mozilla.org/Security/Contextual_Identity_Project/Containers

  8. 8.

    Mozilla, "Firefox Fingerprinting Protection," firefox.com, accessed July 2026. https://www.firefox.com/en-US/features/block-fingerprinting/

FAQ

Tor Browser Fingerprint Protection

For anonymity-focused browsing, Tor Browser makes all users appear to share the same fingerprint. Rather than randomizing signals per site or masking hardware values, Tor Browser's approach is anonymity through uniformity: every Tor Browser user on the same major version produces the same canvas hash, the same User-Agent string, the same screen dimensions, and the same font set.1 This design is deliberate. When one person's Tor Browser fingerprint looks different from another's, that difference becomes a tracking signal.

By making all fingerprints identical, Tor Browser eliminates per-user identification within the Tor user population. Consequently, tracking a specific Tor Browser user requires behavioral analysis or network-level deanonymization rather than passive fingerprinting. Building on this, Tor Browser's Security Levels, Standard, Safer, and Safest, progressively disable more browser features, with Safest disabling JavaScript entirely, which eliminates the entire JavaScript-accessible fingerprinting surface at the cost of compatibility with most modern websites.2

How Tor achieves a uniform fingerprint

Tor Browser's uniformity is enforced by a set of patches applied on top of Firefox ESR that normalize the browser environment across all Tor users on the same major version. The canvas API intercept returns a blank result rather than real rendered pixel data, making every Tor Browser installation return the same canvas output regardless of the underlying GPU and font configuration.3 The User-Agent string is set to a fixed value shared by all Tor Browser users, reporting Windows and a specific Firefox ESR version regardless of the actual OS.

How Tor Browser normalizes identity

Letterboxing constrains the inner viewport to multiples of 200x100 pixels, preventing window size from becoming a fingerprinting signal.4 Consequently, passive fingerprinting scripts that collect canvas, User-Agent, screen size, and WebGL data receive the same values from every Tor Browser user, making individual identification through these signals structurally impossible. Building on this, the font set is limited to a Tor-specific standard list, preventing font probe detection from revealing the actual installed fonts on the host machine.

The letterboxing bars you see around the page are the visible cost of this uniformity. The outer window can be any size, but Tor clips the usable area to a 200x100 grid so the reported dimensions stay fixed. You can watch the effect in the fingerprint inspector: even after you drag the Tor window to a different size, the screen width and height rows report the same rounded values as every other Tor user on that version.

Security level trade-offs

Standard security level enables JavaScript on all sites, activates the fingerprinting-resistance suite, and provides the strongest compatibility with modern websites. Safer level disables JavaScript on HTTP-only (non-HTTPS) sites and blocks additional high-risk browser features. Safest level disables JavaScript entirely on all sites, which eliminates the entire JavaScript fingerprinting surface because fingerprinting scripts cannot execute at all.5

Why Tor is not a normal browser

Yet Safest mode breaks most modern websites, since JavaScript is required for navigation, forms, and content loading on virtually all contemporary sites. Consequently, users who need both anonymity and site compatibility typically use Standard or Safer mode, relying on Tor Browser's passive fingerprinting protections rather than JavaScript blocking. Building on this, the Security Level selector is accessible through the shield icon in the Tor Browser toolbar, and changes take effect immediately without requiring a browser restart.

When Tor's anonymity model is and is not sufficient

Tor Browser's fingerprinting resistance is designed to be effective only when the browser is used exactly as distributed, without any user modifications that distinguish one installation from another. Adding browser extensions to Tor Browser, changing the default font size, resizing the window beyond the letterboxed boundaries that Tor enforces, or logging into personal accounts all destroy the uniformity that is the entire foundation of Tor's anti-fingerprinting model. Each modification makes one Tor user's environment distinct from every other Tor user, creating a unique fingerprinting surface within a population that is supposed to be completely indistinguishable.

Consequently, the Tor Project explicitly recommends against adding extensions and against maximizing the browser window to sizes beyond what Tor controls, because even a single customization such as installing a font extension or resizing the viewport breaks the carefully maintained uniformity that makes every Tor Browser installation indistinguishable from every other one in the global user population.6

Where fingerprinting resistance stops

Furthermore, Tor Browser's network anonymization routes traffic through three relays (guard, middle, and exit), providing transport-layer anonymity that supplements the fingerprint uniformity.7 Yet Tor's anonymity model does not protect against deanonymization attacks that combine fingerprint uniformity with behavioral patterns; the timing of requests, the sequence of sites visited, or the content of form inputs can narrow a user's identity even when the fingerprint itself is uniform.8

Notes

Tor Browser technical details: based on Firefox ESR with specific patches maintained by the Tor Project. Security Level Standard: JavaScript enabled on all sites; canvas API returns a blank or null result rather than real rendered output; fingerprinting-resistant values from Firefox RFP are active. Security Level Safer: JavaScript disabled on HTTP-only sites; additional APIs blocked; canvas blocked more aggressively. Security Level Safest: JavaScript disabled on all sites; maximum API blocking.

Letterboxing: the browser viewport is rounded to multiples of 200x100 pixels to prevent window size fingerprinting, the outer window may be larger, but the inner viewport is always a multiple of 200x100. Font set: limited to a standard Tor Browser-specific font list, preventing font probe detection of additional installed fonts. User-Agent: reports the same Firefox string as all other Tor Browser users on the same major version. WebGL: disabled at Safer security level by default.

Examples

Canvas output in Tor Browser vs. Chrome on the same machine

Chrome:       canvas hash = c84efb8e3a92d710fbcae2f5b0078efb
Tor Browser:  canvas hash = [null / blank / consistent empty value]

Tor Browser intercepts canvas `toDataURL()` and returns a blank result, making the canvas hash identical for all Tor users.

Security Level selector location

Click the shield icon in the Tor Browser toolbar.
Select Standard, Safer, or Safest.
The change takes effect immediately without restart.

Safest disables JavaScript on all sites; Standard provides the best compatibility while keeping fingerprinting resistance active.

Try in the tool

The uniformity mechanisms

  • Letterboxing inner viewport constrained to multiples of 200x100 pixels
  • Security levels Standard, Safer, Safest, with Safest disabling JavaScript entirely
  • Network path three relays: guard, middle, and exit

Verify with the Browser Fingerprint & Privacy Leak Inspector tool.

Try it in the tool ↑
Sources
  1. 1.

    Tor Project, "Fingerprinting Protections," support.torproject.org, accessed July 2026. https://support.torproject.org/tor-browser/features/fingerprinting-protections/

  2. 2.

    Tor Project, "Security Levels," support.torproject.org, accessed July 2026. https://support.torproject.org/tor-browser/features/security-levels/

  3. 3.

    Tor Project, "Why we ship JavaScript enabled by default," support.torproject.org, accessed July 2026. https://support-efc5f0.pages.torproject.net/tbb/tbb-34/

  4. 4.

    Mozilla Bugzilla, "Bug #1407366 — Letterboxing implementation," bugzilla.mozilla.org, 2019. https://bugzilla.mozilla.org/show_bug.cgi?id=1407366

  5. 5.

    Privacy Guides, "Tor security slider flaw," privacyguides.org, May 2025. https://www.privacyguides.org/articles/2025/05/02/tor-security-slider-flaw/

  6. 6.

    Tor Project, "Tor at the Heart: Firefox," blog.torproject.org, 2018. https://blog.torproject.org/tor-heart-firefox/

  7. 7.

    Wikipedia, "Tor (network)," wikipedia.org, accessed July 2026. https://en.wikipedia.org/wiki/Tor_(network)

  8. 8.

    RouteHarden, "Tor, Onion Routing, and Circuit-Level Anonymity," routeharden.com, 2024. https://routeharden.com/blog/tor-onion-routing-and-circuit-anonymity

FAQ

Chrome Fingerprint Exposure

Among mainstream desktop browsers, Chrome exposes the broadest default fingerprinting surface. Chrome has no built-in fingerprinting protection and exposes most signals by default. navigator.hardwareConcurrency returns the real CPU core count, navigator.deviceMemory returns the real RAM class, screen.width and screen.height report accurate display dimensions, and the WEBGL_debug_renderer_info extension returns the full GPU vendor and renderer strings.

The canvas API returns real rendered pixel data, enabling stable hash collection. UA Reduction, shipped in Chrome 107, froze the minor version number to 0.0.0.0, reducing the entropy of the User-Agent string component, but this change did not address canvas, WebGL, audio, or hardware API signals, which remain the primary fingerprinting surface.1

Consequently, Chrome provides the largest exposed fingerprint surface of any mainstream browser by default. Building on this, Google's Privacy Sandbox initiative focuses on replacing third-party cookies with cohort-based advertising APIs but does not restrict JavaScript fingerprinting signals, leaving Chrome's hardware exposure profile unchanged.2

What Chrome exposes by default

Chrome's default configuration exposes the full fingerprinting signal set without any attenuation. The canvas API produces hardware-specific rendering that generates a stable hash unique to each GPU, driver, and font configuration. The WEBGL_debug_renderer_info extension is available by default, returning the GPU model and driver information that directly identifies the graphics hardware tier. OfflineAudioContext completes fully and returns real audio processing results that reflect CPU floating-point behavior.

Why Chrome exposes a detailed profile

navigator.hardwareConcurrency and navigator.deviceMemory both report real hardware values without any capping or randomization. Consequently, a Chrome user without additional extensions or privacy software provides one of the most complete passive fingerprint profiles available in any mainstream browser.3 Building on this, Chrome's widespread adoption means that Chrome fingerprints are the most common profile type in fingerprinting databases, which paradoxically reduces some entropy by making common Chrome configurations less distinctive. Yet the hardware variation within Chrome's user base is large enough that specific GPU and CPU combinations remain highly unique.

The absence of any built-in protection is the defining characteristic here. Chrome ships with every signal exposed and offers no native setting to attenuate it, so the protection burden falls entirely on the user. You can see the full exposed set in the fingerprint inspector, where hardwareConcurrency, deviceMemory, and the WebGL renderer all report their real values on a default Chrome install with no modifications applied.

UA Reduction and its actual entropy impact

Chrome 107's UA Reduction change froze the minor, build, and patch version components of the User-Agent string to 0.0.0 for all Chrome installations worldwide, which means every Chrome 107 user now reports an identical version string regardless of their actual build number.4 Previously, the full Chrome build number was included in every HTTP request and JavaScript API call, which allowed fingerprinting scripts to identify even minor Chrome updates and distinguish between users on different release channels. After UA Reduction, all Chrome users on major version 107 report "107.0.0.0" regardless of their specific build, eliminating the per-build tracking vector from the passive UA string.

How to compare Chrome with privacy browsers

The practical entropy reduction from this change is modest; the UA string was already one of the lower-entropy components compared to canvas and WebGL. Furthermore, the User-Agent Client Hints API provides a mechanism for servers to request the full version string via Accept-CH, which means UA Reduction primarily affects passive collection rather than active collection.5 Consequently, the fingerprinting signals that drive the highest entropy, canvas hash, WebGL renderer, and audio fingerprint, are unchanged by UA Reduction. Building on this, Chrome's stated rationale was to reduce UA entropy gradually and nudge sites toward the structured Client Hints API.

Extension options for Chrome users

Chrome users who want any fingerprinting protection must rely entirely on browser extensions, since Chrome itself provides no built-in anti-fingerprinting features whatsoever. uBlock Origin in medium or hard blocking mode prevents third-party fingerprinting scripts from executing, which is the most effective approach when the scripts are loaded from known third-party domains that uBlock's filter lists already cover. CanvasBlocker adds random noise to HTMLCanvasElement.toDataURL() and toBlob() exports, changing the canvas hash on each page load so that the same machine produces a different hash every time.6

Yet no Chrome extension can fully replicate Brave's farbling depth because Chrome's extension API does not allow the same low-level API interception that Brave's built-in native implementation uses to modify values before JavaScript ever sees them, which means extension-based protections always operate one layer above the browser engine and can be detected by scripts that check for consistent API behavior across multiple call sites.7

Why extensions are only partial

Consequently, extension-based canvas blocking is detectable: a canvas hash that changes on every access is itself a fingerprinting signal indicating the presence of a spoofing extension. Furthermore, Chrome extension permissions have been progressively restricted through Manifest V3, which limits the ability of privacy extensions to intercept API calls before they return data to scripts.8 Building on this, the most complete fingerprinting protection available for Chrome users who cannot switch browsers remains the combination of uBlock Origin in strict mode plus CanvasBlocker.

Notes

Chrome fingerprinting exposure: navigator.hardwareConcurrency returns the real logical CPU core count. navigator.deviceMemory returns the real device RAM rounded to {0.25, 0.5, 1, 2, 4, 8}. screen.width and screen.height report real CSS pixel dimensions. window.devicePixelRatio reports the real display scaling factor. WEBGL_debug_renderer_info is available; UNMASKED_VENDOR_WEBGL and UNMASKED_RENDERER_WEBGL return real GPU vendor and renderer strings. HTMLCanvasElement.toDataURL() returns real GPU-rendered pixel data. OfflineAudioContext.startRendering() returns real audio processing results.

navigator.userAgent uses reduced form (minor version frozen to 0.0.0) since Chrome 107. Sec-CH-UA, Sec-CH-UA-Mobile, and Sec-CH-UA-Platform are sent by default on all requests. Chrome on Android: same exposure profile as desktop Chrome. Chrome on iOS: uses WebKit rendering engine, not Blink; canvas hash and WebGL behavior differ from desktop Chrome.

Examples

Chrome UA string before and after UA Reduction (Chrome 107)

Before (Chrome 106): Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.5249.119 Safari/537.36
After (Chrome 107+):  Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36

The minor version is frozen to 0.0.0, but the OS, architecture, and major version remain in the UA string. Canvas and WebGL fingerprinting are not affected by this change.

`navigator.hardwareConcurrency` in Chrome vs. Brave on the same machine

Chrome:  `navigator.hardwareConcurrency` → 12  (real value)
Brave:   `navigator.hardwareConcurrency` → 8   (farbled)

Chrome reports the real CPU core count; Brave replaces it with a value from {2, 4, 8} when Shields are active.

Try in the tool

What Chrome exposes with no built-in protection

  • navigator.hardwareConcurrency / deviceMemory real values, no capping
  • WEBGL_debug_renderer_info available, returns real GPU vendor and renderer strings
  • UA Reduction, since Chrome 107 froze minor, build, and patch version to 0.0.0 only

Verify with the Browser Fingerprint & Privacy Leak Inspector tool.

Try it in the tool ↑
Sources
  1. 1.

    Chromium, "User-Agent Reduction Overview," chromium.org, 2022. https://www.chromium.org/updates/ua-reduction/

  2. 2.

    Google Privacy Sandbox, "User-Agent Reduction Android Model and Version," privacysandbox.google.com, 2022. https://privacysandbox.google.com/blog/user-agent-reduction-android-model-and-version

  3. 3.

    Chrome Developer, "User-Agent Client Hints," developer.chrome.com, accessed July 2026. https://developer.chrome.com/docs/privacy-security/user-agent-client-hints

  4. 4.

    MDN, "User-Agent Reduction," developer.mozilla.org, accessed July 2026. https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/User-agent_reduction

  5. 5.

    GitHub, "CanvasBlocker," github.com/kkapsner/CanvasBlocker, 2024. https://github.com/kkapsner/CanvasBlocker

  6. 6.

    Castle Blog, "Detecting Noise in Canvas Fingerprinting," blog.castle.io, 2023. https://blog.castle.io/detecting-noise-in-canvas-fingerprinting/

  7. 7.

    Chrome Developer, "What is Manifest V3," developer.chrome.com, accessed July 2026. https://developer.chrome.com/docs/extensions/develop/migrate/what-is-mv3

  8. 8.

    Electronic Frontier Foundation, "Manifest V3: The Good, the Bad, and the Ugly," eff.org, accessed July 2026. https://www.eff.org/deeplinks/2021/12/chrome-users-beware-manifest-v3-and-your-privacy

FAQ

Safari Fingerprint Protection

Across Safari versions, Apple has taken the most consistent cross-version anti-fingerprinting policy of any mainstream browser. Apple blocked the WEBGL_debug_renderer_info extension in Safari 12, making WebGL renderer strings unavailable since 2018.1 WebRTC on iOS Safari has used mDNS token substitution for local IP addresses since iOS 14, preventing LAN IP exposure.2 iOS 26 introduced Advanced Fingerprinting and Tracking Protection (AFP) as a default-on feature, extending protection to canvas rendering output, audio processing, and font access.3 Intelligent Tracking Prevention (ITP), active since Safari 11, partitions cookies and localStorage across sites.4 Consequently, Safari's anti-fingerprinting posture has expanded with each major release rather than being delivered as a single configuration option.

Building on this, Safari on iOS and Safari on macOS differ in their protection depth; iOS AFP is enabled by default, while macOS Safari 26 requires the user to enable it in Preferences, creating a difference between the iOS and macOS fingerprint profiles even on the same major Safari version.5

Safari's anti-fingerprinting history from Safari 12 to AFP in iOS 26

Safari began restricting fingerprinting-relevant APIs earlier than any other mainstream browser. The WEBGL_debug_renderer_info block in Safari 12 (2018) removed WebGL GPU identification from all Safari versions, years before Brave's farbling or Chrome's UA Reduction.1 Intelligent Tracking Prevention, introduced in Safari 11, applied cross-site cookie partitioning that reduced cookie-based tracking while laying the technical groundwork for further isolation.4

What Safari limits by default

Safari 14 introduced privacy report indicators showing blocked cross-site trackers. iOS 14 changed WebRTC ICE candidate generation to use mDNS tokens instead of real LAN IPs, addressing the WebRTC IP leak without disabling WebRTC functionality.2 Consequently, each Safari major release has added an anti-fingerprinting or anti-tracking capability, creating an incremental posture rather than a single configurable setting. Building on this, iOS 26 AFP represents the most significant expansion of Safari's anti-fingerprinting coverage, targeting the canvas, audio, and font signals that previous Safari versions left exposed.

The WebRTC change is a good example of Apple's pattern: block the leak without breaking the feature. By substituting an mDNS token for the real LAN address, Safari hides the local IP that fingerprinting scripts used to read while keeping video and voice calls working. You can verify the effect in the fingerprint inspector, which shows an mDNS token such as a3f4b5c6.local instead of a private network address on iOS Safari.3

iOS 26 AFP in practice

AFP activates automatically after upgrading to iOS 26 and applies to all Safari browsing including private windows. In Settings > Safari > Privacy, Advanced Fingerprinting and Tracking Protection appears as a toggle that is on by default.6 When AFP is active, canvas rendering output is modified before returning to scripts, WebGL rendering output undergoes normalization, audio processing results are altered to reduce DAC-specific variation, and font access is limited to a common subset.

How AFP changes Safari fingerprinting

Consequently, CapyToolkit Browser Fingerprint Inspector will show different canvas hash values and a reduced font list on iOS 26 compared to earlier iOS versions on the same device.7 Building on this, AFP's normalization approach means the canvas hash may be consistent across sessions for a given user, just different from the pre-AFP hash, whereas Brave's farbling changes the hash across sessions. Users checking their fingerprint after upgrading should run the inspector twice to confirm whether the canvas hash is session-stable (AFP normalization) or session-variable (Brave-style farbling).

Safari on iOS vs. macOS fingerprint differences

iOS and macOS Safari produce structurally different fingerprint profiles even when running the exact same Safari major version number, which surprises many users who expect consistency across Apple platforms. On iOS, AFP is default-on for all users after upgrading to iOS 26, navigator.deviceMemory is undefined because Apple never implemented the API, WebRTC uses mDNS token substitution for local IP addresses, and canvas rendering output is modified before scripts can read the pixel buffer. On macOS Safari 26, AFP requires manual activation in Safari preferences, navigator.hardwareConcurrency returns the real Mac CPU core count, and the canvas hash reflects the full GPU-rendered value if the user has not opted into AFP protection.8

Furthermore, the rendering pipeline differs in ways that affect the canvas hash and other rendering-based signals: iOS Safari uses Metal and WebKit on ARM hardware with a GPU that shares memory with the CPU, while macOS Safari uses Metal and WebKit on either Apple Silicon or Intel, producing different floating-point rounding behavior in the rendering pipeline that fingerprinting scripts can detect even when the browser version number is identical.

Why iOS and macOS should be tested separately

Consequently, a fingerprinting script that collects signals from both an iOS and macOS Safari browser on the same Apple account cannot link them through passive signals alone, since the hardware architecture, AFP state, and available APIs are different. Building on this, developers testing fingerprinting behavior across Apple platforms should test iOS and macOS separately rather than assuming one represents the other.

Notes

Safari fingerprinting-relevant API behaviors: WEBGL_debug_renderer_info: blocked since Safari 12; getExtension('WEBGL_debug_renderer_info') returns null; UNMASKED_VENDOR_WEBGL and UNMASKED_RENDERER_WEBGL return empty strings. WebRTC local IP: since iOS 14, ICE host candidates use mDNS tokens (e.g., a3f4b5c6.local) instead of real LAN IPs; STUN-reflexive candidates still expose the public IP. navigator.deviceMemory: not implemented; returns undefined in all Safari versions.

navigator.hardwareConcurrency: returns real core count on macOS Safari; iOS Safari returns a value matching the device class. iOS 26 AFP (default-on): canvas output modified, WebGL rendering output modified, audio processing normalized, font access restricted to common subset. macOS Safari 26 AFP: available in Safari Settings > Privacy; requires manual enabling. ITP: partitions localStorage, SessionStorage, and cookies across sites; does not address hardware fingerprinting.

Examples

WebGL renderer in Safari vs. Chrome on the same Mac

Chrome (macOS):   `UNMASKED_RENDERER_WEBGL` → "Apple M2"
Safari (macOS):   `UNMASKED_RENDERER_WEBGL` → "" (extension blocked since Safari 12)

Safari has blocked `WEBGL_debug_renderer_info` since Safari 12. Scripts querying this extension receive null, making GPU identification impossible through WebGL.

AFP toggle location in iOS 26

Settings > Safari > Privacy
Advanced Fingerprinting and Tracking Protection: [toggle, default: on]

AFP is enabled by default after iOS 26 upgrade. Turning it off reverts canvas, audio, and font signal behavior to pre-AFP values.

Try in the tool

Safari's anti-fingerprinting timeline

  • Safari 11
  • Safari 12, 2018
  • since iOS 14
  • iOS 26 only; macOS Safari 26 requires manual activation

Verify with the Browser Fingerprint & Privacy Leak Inspector tool.

Try it in the tool ↑
Sources
  1. 1.

    WebKit, "WebKit Features in Safari 26.0," webkit.org, September 2025. https://webkit.org/blog/17333/webkit-features-in-safari-26-0/

  2. 2.

    9to5Mac, "iOS 26 Will Counter One of the Web's Most Invasive Tracking Methods," 9to5mac.com, July 2025. https://9to5mac.com/2025/07/29/with-ios-26-safari-will-counter-one-of-the-webs-most-invasive-tracking-methods/

  3. 3.

    WebKit, "Intelligent Tracking Prevention," webkit.org, accessed July 2026. https://webkit.org/tracking-prevention/

  4. 4.

    IETF Datatracker, "mDNS ICE Candidates," datatracker.ietf.org, accessed July 2026. https://datatracker.ietf.org/doc/draft-ietf-rtcweb-mdns-ice-candidates/

  5. 5.

    Medium, "Safari on macOS/iOS 26 Tracking Changes," billy-grace.medium.com, 2025. https://medium.com/billy-grace/safari-on-macos-ios-26-tracking-changes-whats-really-changing-31e2d26cb727

  6. 6.

    Singular.net, "iOS 26 WWDC Privacy," singular.net, 2025. https://www.singular.net/blog/ios-26-wwdc-privacy/

  7. 7.

    WebRTC Working Group, "mDNS ICE Candidates Editor's Draft," rtcweb-wg.github.io, accessed July 2026. https://rtcweb-wg.github.io/mdns-ice-candidates/draft-ietf-mdns-ice-candidates.html

  8. 8.

    Apple, "Safari Privacy Overview," developer.apple.com, accessed July 2026. https://developer.apple.com/documentation/safari-release-notes

FAQ

FingerprintJS Library

For developers evaluating browser-based recognition, FingerprintJS is the most widely used open-source browser fingerprinting library. Published on npm as @fingerprintjs/fingerprintjs,1 the library provides a single API: FingerprintJS.load() returns a Promise that resolves to an agent object, and agent.get() returns a result containing visitorId and confidence.2 visitorId is a stable hash derived from 40+ browser signals including canvas, WebGL, audio, screen, fonts, hardware, and User-Agent.3

confidence is a score from 0 to 1 indicating how reliably the visitorId identifies this specific browser across sessions. The open-source library (v5, MIT licensed; v4 used the Business Source License) runs entirely client-side.45 FingerprintJS Pro extends the same concept with server-side signal collection, TLS fingerprint, HTTP/2 session parameters, and bot detection logic, returning a higher-confidence requestId verified server-side.6 Consequently, FingerprintJS provides the reference implementation for how production fingerprinting systems combine dozens of signals into a single stable identifier used for fraud prevention and authentication.

Using the open-source library

The FingerprintJS open-source library initializes with a single async call. Calling FingerprintJS.load() returns a Promise that resolves to an agent, a lightweight object with a single method, get(). Calling agent.get() triggers signal collection: the library runs canvas rendering, WebGL parameter queries, OfflineAudioContext processing, font probing, and hardware API reads, then combines the results into a deterministic hash.

How FingerprintJS creates an identifier

The resulting visitorId is a hex string that identifies the browser-device combination. confidence.score reflects how many high-entropy signals were successfully collected; if canvas and WebGL are blocked by the browser, the score drops below 0.7 because the hash is based on fewer distinctive inputs.3 Consequently, visitorId is useful for fraud prevention, identifying the same browser making multiple suspicious requests, and for passwordless device recognition. Building on this, the library is appropriate for legitimate authentication and fraud use cases; it identifies a browser-device combination, not a specific person, which is an important distinction for GDPR and similar privacy law compliance.

The stability is the feature that makes the identifier useful in production. Because the hash depends only on the signal set, the same machine returns the same visitorId every time it visits, which is what lets a site recognize a returning browser without a cookie. You can watch this in action by running the FingerprintJS example in the fingerprint inspector, where the visitorId stays fixed across page reloads until a protection like Brave Shields changes the underlying canvas input.

FingerprintJS Pro vs. open source

FingerprintJS Pro adds server-side signal collection that cannot be replicated by client-side JavaScript alone. The Pro library sends collected browser signals to Fingerprint Inc.'s servers, which analyze TLS fingerprint characteristics, HTTP/2 session headers, IP geolocation, and bot detection signals in addition to the JavaScript-accessible browser APIs.6 The server returns a requestId, a cryptographically verified identifier that the application server can validate against the Fingerprint API to confirm authenticity.

How to use it responsibly

Consequently, Pro is substantially more robust against spoofing than the open-source library, because the server-side signals cannot be modified by JavaScript injection or extension-based interception. Yet the trade-off is that user data is sent to a third-party service, which requires disclosure in privacy notices and data processing agreements under GDPR.7 Building on this, for applications where fraud risk is high, account takeovers, payment fraud, and credential stuffing, Pro's server-side verification provides a meaningful improvement in reliability over the client-side-only hash.

Interpreting visitorId and confidence score

The visitorId is a deterministic hash of the browser's signal set; the same browser on the same device will produce the same visitorId across page loads and sessions as long as the underlying signals do not change. Significant browser events that change visitorId include: GPU driver updates that alter the canvas hash, upgrading to iOS 26 with AFP enabled (which modifies canvas output), and enabling Brave Shields (which farbles canvas, WebGL, and audio).

confidence.score provides a reliability estimate for this stability. A score of 0.9 or above indicates that high-entropy signals like canvas and WebGL were available and consistent.2 A score below 0.5 indicates that key signals were blocked or returned unstable values, for example, if the user enabled Firefox RFP between visits or switched browsers.

How to avoid over-trusting the score

Consequently, applications that use visitorId for authentication should pair it with a fallback mechanism for cases where the confidence score indicates instability. Building on this, visitorId changes when the user clears browser storage are expected; the library is designed to be resilient to storage clearing through hardware signal stability. However, a high confidence score does not guarantee that the visitorId identifies a specific person; it only confirms that the browser-device combination is stable. Applications should treat visitorId as one signal within a broader risk assessment rather than as a sole authentication factor, since the same score can represent either a genuinely unique browser or a common configuration shared by thousands of users.

Notes

FingerprintJS API reference: npm install @fingerprintjs/fingerprintjs. FingerprintJS.load({ apiKey?: string }): returns Promise. agent.get({ extendedResult?: boolean }): returns Promise. GetResult: { visitorId: string; confidence: { score: number; comment?: string }; components?: Record }. visitorId: a deterministic hash of collected signals, stable for the same browser-device combination across sessions.

confidence.score: a number from 0 to 1; 1.0 indicates high confidence that visitorId is stable; below 0.5 indicates instability due to blocked signals. FingerprintJS Pro: requires an API key from fingerprint.com; extends the open-source library with server-side signals (TLS fingerprint, HTTP/2 headers, IP geolocation, incognito detection). Returns requestId (a server-verified identifier) in addition to visitorId. The open-source library is MIT licensed. FingerprintJS Pro is a commercial product requiring a subscription. Both variants collect canvas, WebGL, audio, and hardware signals.

Examples

FingerprintJS open-source initialization

import FingerprintJS from '@fingerprintjs/fingerprintjs';

const fp = await `FingerprintJS.load()`;
const result = await fp.get();

console.log(result.visitorId);         // 'a3f4b5c6d7e8f9a0...'
console.log(result.confidence.score);  // 0.92

`FingerprintJS.load()` initializes the library. fp.get() collects signals and returns a result. visitorId is the stable identifier; confidence.score above 0.7 indicates reliable signal collection.

visitorId stability with Brave Shields on

Without Brave Shields:  visitorId = a3f4b5c6... (stable across loads)
With Brave Shields:     visitorId = f9e8d7c6... (different due to farbled canvas)

Enabling Brave Shields changes the canvas hash input to FingerprintJS, producing a different visitorId. The confidence.score may also drop if WebGL is blocked, reducing signal entropy.

Try in the tool

Reading confidence.score

  • high-entropy signals available and consistent
  • one or more high-entropy signals unavailable or unstable
  • key signals blocked or unstable across visits

Verify with the Browser Fingerprint & Privacy Leak Inspector tool.

Try it in the tool ↑
Sources
  1. 1.

    npm, "@fingerprintjs/fingerprintjs," npmjs.com. https://www.npmjs.com/package/@fingerprintjs/fingerprintjs

  2. 2.

    FingerprintJS, "API Reference," github.com. https://github.com/fingerprintjs/fingerprintjs/blob/master/docs/api.md

  3. 3.

    Crawlex, "FingerprintJS Internals: the Open-Source Signals vs the Commercial Pro Entropy," blog.crawlex.net, accessed June 2026. https://blog.crawlex.net/blog/fingerprintjs-internals/

  4. 4.

    FingerprintJS, "Licensing," github.com. https://github.com/fingerprintjs/fingerprintjs/blob/master/docs/licensing.md

  5. 5.

    Fingerprint, "FingerprintJS Version 5.0 Now Open-Source Under MIT License," fingerprint.com, October 2024. https://fingerprint.com/blog/fingerprintjs-version-5-0-mit-license/

  6. 6.

    Fingerprint, "Fingerprint Pro vs. FingerprintJS," fingerprint.com. https://fingerprint.com/github/

  7. 7.

    Electronic Frontier Foundation, "The GDPR and Browser Fingerprinting," eff.org, June 2018. https://www.eff.org/deeplinks/2018/06/gdpr-and-browser-fingerprinting-how-it-changes-game-sneakiest-web-trackers

FAQ