| Component name | any_pointer |
|---|---|
| In the visitorId | no (reported, kept out of both ids) |
| structuredId group | none |
| Hashing | plain value; a digest only when longer than 128 characters or not printable ASCII |
| Excluded under | no browser class |
| Inner timeout | 1000 ms |
| Added in | signalsVersion 11 |
| Collector revision | 1 (reported as revision with every result) |
A device can have more than one way to point: a laptop can have a trackpad and a touch screen. The any-pointer media query asks about all of them. WhiskerJS records every kind present: fine, coarse, both, or none.
What it reads
The CSS any-pointer media feature through window.matchMedia(): the queries (any-pointer: fine), (any-pointer: coarse) and, when neither matches, (any-pointer: none).
How the technique works
- Without
matchMediathe component isunavailable/no_api. - Each of
fineandcoarsethat matches is kept, in that order, and the kept values are joined with a comma:fine,coarseorfine,coarse. - If neither matches,
(any-pointer: none)givesnone; if that does not match either,unavailable/no_match.
Unlike the other media query components, it does not stop at the first match, because several input devices can be present at once.
Why it helps
fine,coarse is typical of touch-screen laptops and of tablets with a trackpad cover, a smaller group than plain desktops or phones. On your server it adds context to touch_support and the user agent. The media_query_mismatch integrity flag uses the same query to spot a coarse pointer without any touch points.
Stability
It changes when an input device is attached or removed (a mouse plugged into a tablet, a keyboard cover with a trackpad). That is why it is reported outside both ids. Added in library PR #29 (2026-10-27) at signalsVersion 11: it is outside both ids, so adding it changed no id and needed no version bump.
Browser support and what blocks it
Every current engine answers the query. In the hosted CI runs of PR #29 every browser (Chromium 153, Chrome 155, Firefox with and without its privacy settings, WebKit; headless on Linux) reported fine in every collection. No browser class excludes it.
Privacy
It says which kinds of input devices are attached, nothing about how they are used. No permission, no prompt, no events. Leave it out with collect({ exclude: ['any_pointer'] }) if you do not need it; no id changes.
How WhiskerJS handles noise and failures
| Status | ruleId | When |
|---|---|---|
ok |
fine, coarse, fine,coarse or none |
|
unavailable |
no_api |
no matchMedia |
unavailable |
no_match |
no query matched |
blocked |
threw, security_error |
matchMedia throws |
excluded |
caller_excluded |
you excluded it |
timed_out |
timeout, aborted |
budget or abort |
Example value
"any_pointer": { "status": "ok", "value": "fine,coarse", "hashed": false, "durationMs": 0.1, "revision": 1 }
Questions and answers
Why can any_pointer report two values?
any-pointer describes every input device, not only the main one. A laptop with a touch screen has a trackpad (fine) and a touch screen (coarse), so both match and WhiskerJS reports fine,coarse.
How is it different from pointer?
pointer describes only the primary device. any_pointer describes all of them, so a touch laptop reports pointer fine and any_pointer fine,coarse.