Signals
Every signal the SDK collects, what it measures, and the weight it carries in similarity matching. A signal's weight is how much it distinguishes one device from another, which is its entropy, not merely how stable it is.
Weights come in four tiers. Distinguishing signals are device-specific and decide identity; bucketing signals are near-ubiquitous and only group candidates. The persistence engine page explains how these weights feed the 0.82 / 0.62 similarity thresholds and the entropy gate.
Signal catalog
| Signal | What it is | Weight | Rationale |
|---|---|---|---|
canvas | Hash of a 2D canvas render: text, shapes, blends. | Distinguishing · 4 | High entropy from the exact GPU, driver, and OS text stack. A browser update can rewrite it, so it is never the only signal, but it is a primary distinguisher. |
webgl | Hash of a WebGL scene render. | Distinguishing · 4 | High entropy from the GPU pipeline. Same drift risk as canvas, same importance. |
webglVendor | Unmasked GPU vendor and renderer string. | Distinguishing · 4 | Distinctive and fairly stable. Reads as "Apple M4" versus "Apple M5", so it is the single best separator of similar-model machines. |
fonts | Set of installed fonts detected by render measurement. | Distinguishing · 4 | User-installed fonts add real entropy on top of the stock OS set, and the set changes slowly. Jaccard overlap tolerates a few additions. |
audio | Hash of an OfflineAudioContext oscillator render. | Distinctive · 3 | Reflects the audio DSP stack. Distinctive, but shifts occasionally, so it sits a tier below the render hashes. |
screen | Resolution including scaling, plus color depth. | Distinctive · 3 | Varies across models and external displays. Docking to a monitor or changing scaling moves it. |
hardwareConcurrency | Logical CPU core count reported by the browser. | Population · 2 | Stable, but a whole product line shares one value, so it narrows the field rather than identifying a machine. |
languages | Ordered browser language list, e.g. ["de-DE", "en"]. | Population · 2 | Narrows locale, but millions share "en-US". |
timezone | IANA timezone from the Intl API, e.g. Europe/Berlin. | Population · 2 | Stable and follows the person, but everyone in a city shares it. |
platform, vendor, deviceMemory, colorDepth, touch, userAgent | OS platform, browser vendor, RAM bucket, color depth, touch class, UA string. | Bucketing · 1 | Near-ubiquitous or fast-changing. Every Mac shares the platform; the RAM bucket is capped and coarse. Useful for grouping candidates cheaply, weak for identity. |
ip / asn | Request IP and its autonomous system, resolved server-side. | Network hint | Corroboration only. Mobile devices rotate IPs daily and whole households share one address, so it can nudge a score but never decide a match. |
How to read the tiers
Two devices only merge when their distinguishing signals agree, not when their common signals line up. A browser update that rewrites the canvas and WebGL hashes leaves the GPU renderer, fonts, screen, and audio in agreement, so the same device still re-links. Two different laptops with the same OS, CPU, and browser build differ on the render hashes and GPU renderer, so they stay separate.