invisible layer / device identity
experiment 26 · navigator api · no permissions
you were identified
before you clicked.
Every browser exposes a set of hardware and environment properties that require no permission dialog, no click, and no user action whatsoever. Combined, they form a stable identifier unique to your device.
8 passive readings. No click. No permission dialog. Enough to narrow your device to 1 in 300,000 users — before you've done anything. These values don't change when you clear cookies, use a VPN, or open a private window.
cores
memory
touch points
device fingerprint hash
computing...
▶ how does passive device fingerprinting work?

These APIs were designed to help websites adapt their content — serve the right resolution, pick the right codec, show the right language. The side effect is that every value you expose for legitimate adaptation is also a dimension of a fingerprinting vector.

The combination of hardware concurrency, device memory, color depth, pixel ratio, touch points, timezone, language, and screen dimensions creates a joint probability space. Each value alone is widely shared. Together, the intersection is rare — typically 1 in tens of thousands to 1 in millions, depending on the device.

None of these require a permission dialog. They are readable synchronously on the main thread with zero user interaction. They are stable across browser restarts, private windows, and VPN changes.

  • navigator.hardwareConcurrency — logical CPU core count
  • navigator.deviceMemory — GB of RAM (rounded to nearest power of 2)
  • screen.colorDepth — bits per pixel in the display
  • window.devicePixelRatio — physical vs CSS pixel ratio
  • navigator.maxTouchPoints — max simultaneous touch contacts
  • Intl.DateTimeFormat().resolvedOptions().timeZone — IANA timezone string
  • navigator.language / navigator.languages — locale preference chain
  • screen.width × screen.height — physical screen resolution