# any_pointer

> The pointing devices present, from the any-pointer media query: fine, coarse, fine,coarse (a touch laptop) or none. Reported, not in either id.

Source: https://whiskerjs.com/signals/any-pointer/ (last updated 2026-10-27)

**any_pointer at a glance (from the library code, signalsVersion 14)**

| Field | Value |
| --- | --- |
| 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](https://whiskerjs.com/whats-new/) |
| Collector revision | [1](https://whiskerjs.com/docs/api/#component) (reported as `revision` with every result) |

> **In plain words:**
>
> 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

1. Without `matchMedia` the component is `unavailable` / `no_api`.
2. Each of `fine` and `coarse` that matches is kept, in that order, and the kept values are joined with a comma: `fine`, `coarse` or `fine,coarse`.
3. If neither matches, `(any-pointer: none)` gives `none`; 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

```json
"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.

## Related pages

- [pointer](https://whiskerjs.com/signals/pointer/): The primary pointer only.
- [any_hover](https://whiskerjs.com/signals/any-hover/): Hover for any input device.
- [Integrity checks](https://whiskerjs.com/docs/integrity/): media_query_mismatch reads any-pointer too.
