# pointer

> The accuracy of the primary pointing device from the pointer media query: fine (mouse), coarse (touch) or none. Reported, not in either id.

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

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

| Field | Value |
| --- | --- |
| Component name | `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:**
>
> Browsers tell pages how accurate the main pointing device is, so a page can make buttons bigger for fingers. A mouse or trackpad is fine, a finger is coarse. WhiskerJS records which one the browser reports for the primary device.

## What it reads

The CSS `pointer` media feature through `window.matchMedia()`. Nothing else: no events, no pointer positions, no input is read.

## How the technique works

| Order | Query | Value reported |
| --- | --- | --- |
| 1 | `(pointer: fine)` | `fine` |
| 2 | `(pointer: coarse)` | `coarse` |
| 3 | `(pointer: none)` | `none` |

The first match is reported; no match gives `unavailable` with `no_match`.

## Why it helps

It separates desktops and laptops from phones and tablets with no extra API. On your server it is a cross-check: a result that claims a phone but reports a fine pointer and no touch points is unusual. The `media_query_mismatch` integrity flag already compares a related query with `maxTouchPoints`.

## Stability

Stable on most devices. It changes when the primary input changes: a tablet with a keyboard and trackpad attached, a convertible laptop folded into tablet mode, or a phone with a mouse plugged in. That is why it is reported but kept out of both ids for now; it can join the id once measurement shows it is stable. 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 (headless Chromium 153, Chrome 155, Firefox with and without its privacy settings, and WebKit, on a Linux server) every browser reported the same value in every collection. No browser class excludes it.

## Privacy

It says what kind of input device is in use, which the page could also learn from the user’s own clicks and taps. It needs no permission and shows no prompt. Leave it out with `collect({ exclude: ['pointer'] })` if you do not need it; no id changes.

## How WhiskerJS handles noise and failures

| Status | ruleId | When |
| --- | --- | --- |
| `ok` |   | one of the values above |
| `unavailable` | `no_api` | no `matchMedia` |
| `unavailable` | `no_match` | no value matched |
| `blocked` | `threw`, `security_error` | `matchMedia` throws |
| `excluded` | `caller_excluded` | you excluded it |
| `timed_out` | `timeout`, `aborted` | budget or abort |

Like every component it also carries `durationMs` (how long its collector ran, 0.1 ms) and `revision` (1).

## Example value

```json
"pointer": { "status": "ok", "value": "fine", "hashed": false, "durationMs": 0.1, "revision": 1 }
```

## Questions and answers

### What is a fine pointer?

An accurate pointing device such as a mouse or a trackpad. A finger on a touch screen is coarse; a device with no pointer at all, such as some TVs, reports none.

### Why is it not in the visitorId?

Plugging in a mouse or using a tablet with a keyboard cover can change it. It stays outside the ids until measurement shows it is stable.

## Related pages

- [any_pointer](https://whiskerjs.com/signals/any-pointer/): Every pointing device, not only the primary one.
- [hover](https://whiskerjs.com/signals/hover/): Whether the primary pointer can hover.
- [touch_support](https://whiskerjs.com/signals/touch-support/): Touch points and touch events, in the id.
- [What changes the id](https://whiskerjs.com/docs/identifiers/#what-changes-the-id): Why signals outside the id leave it alone.
