Every signal, in one index
32 signals in 6 categories. 5 of them ask your permission first. The other 27 are read the moment a page opens, with no prompt and nothing to decline, which is the part most people are surprised by.
Browser (5)
What your browser announces about itself on every request.
| Signal | JavaScript call | Asks permission |
|---|---|---|
| User agent | navigator.userAgent | No |
| Browser | navigator.userAgentData?.brands ?? navigator.userAgent | No |
| Operating system | navigator.userAgentData?.platform ?? navigator.userAgent | No |
| Language | navigator.languages | No |
| Cookies enabled | navigator.cookieEnabled | No |
Network (8)
What your connection reveals, from your public IP to your headers.
| Signal | JavaScript call | Asks permission |
|---|---|---|
| IP address | fetch('/api/ip') | No |
| IPv4 address | fetch('/api/ip') then check for ':' in the address | No |
| Public IP | fetch('/api/ip') | No |
| Private IP | not readable by a website | No |
| IP location | fetch('/api/ip') returning the platform's geo headers | No |
| Connection type | navigator.connection | No |
| Request headers | reconstructed from navigator, not read directly | No |
| Referrer | document.referrer | No |
Location (6)
What the Geolocation API can pin down, only with your permission.
| Signal | JavaScript call | Asks permission |
|---|---|---|
| Location | navigator.geolocation.getCurrentPosition(success, error) | Yes |
| Zip code | navigator.geolocation.getCurrentPosition then a reverse geocode | Yes |
| Postal code | navigator.geolocation.getCurrentPosition then a reverse geocode | Yes |
| Address | navigator.geolocation.getCurrentPosition then a reverse geocode | Yes |
| Timezone | Intl.DateTimeFormat().resolvedOptions().timeZone | No |
| Elevation | position.coords.altitude from getCurrentPosition | Yes |
Display (6)
The size, density and graphics of the screen you are reading on.
| Signal | JavaScript call | Asks permission |
|---|---|---|
| Screen resolution | screen.width and screen.height | No |
| Viewport size | window.innerWidth and window.innerHeight | No |
| Color depth | screen.colorDepth | No |
| Device pixel ratio | window.devicePixelRatio | No |
| WebGL renderer | gl.getParameter(gl.getExtension('WEBGL_debug_renderer_info').UNMASKED_RENDERER_WEBGL) | No |
| GPU | gl.getParameter(gl.getExtension('WEBGL_debug_renderer_info').UNMASKED_VENDOR_WEBGL) | No |
Device (5)
Hardware hints your browser exposes to any page you open.
| Signal | JavaScript call | Asks permission |
|---|---|---|
| Device type | navigator.maxTouchPoints with navigator.userAgent | No |
| Device memory | navigator.deviceMemory | No |
| CPU cores | navigator.hardwareConcurrency | No |
| Battery | navigator.getBattery() | No |
| Touch support | navigator.maxTouchPoints | No |
Privacy (2)
Signals about tracking, and how identifiable you are overall.
| Signal | JavaScript call | Asks permission |
|---|---|---|
| Do Not Track | navigator.doNotTrack | No |
| Browser fingerprint | the combination of every signal above, hashed locally | No |