A non-touch desktop has a fine pointer + hover
On a desktop UA with maxTouchPoints=0, both (any-pointer: fine) and (hover: hover) match; either one failing to match fails the check.
What a detector infers
This check applies only when the UA identifies a desktop platform (Windows, Macintosh, Mac OS X, X11, Linux, CrOS, and not Android/Mobile) and navigator.maxTouchPoints is 0; anything else reads N/A. In that case it queries matchMedia for (any-pointer: fine) and (hover: hover), and fails if either one does not match.
The two features say slightly different things: (any-pointer: fine) asks whether any available input mechanism is a fine pointer — a mouse, trackpad or stylus — while (hover: hover) asks whether the primary input mechanism can hover. Both are answered by the browser from the input devices the platform actually reports. A headless environment has no pointing device attached and so matches neither.
A detector reading a desktop UA that claims no touch input yet exposes no fine pointer, or no hover, concludes that the platform string describes a machine that isn't there: the identity says desktop-with-a-mouse, the input layer says nothing is connected. Severity is warn.
How to resolve it
Run against an environment that has a real pointing device — headful on a desktop session, or a virtual display where the browser sees a pointer — so the input media features reflect the platform the UA claims. Do not patch the media-query results in JS; they are resolved by the engine and re-read from other realms.
Read in the wild by
Commercial detector A
A commercial detector's ips.js fingerprint script evaluates the hover, any-hover, pointer and any-pointer media features through a cached window.matchMedia helper, each written to its own slot in the payload it posts to /tl.
A commercial detector ips.js teardown (emro.cat, "How I Broke the Anti-Bot Behind Nike, Kick and Twitch", Apr 2026). Solver probe-to-slot map, blog.txt:673-679 of "mapped: 427/427 probes": 180:hover(fn_26346), 325:any_hover(fn_14183), 135:pointer(fn_15673), 210:any_pointer(fn_166750) — four distinct slots in the new Array(428) payload template (1.txt:40731, 2.txt:15127). Decompiled IR shows four separate probe functions calling the matchMedia-bound helper `gkz`: func_02fb2c -> ("hover","none","hover") [1.txt:45525], func_0309d7 -> ("any-hover","none","hover") [1.txt:46374], func_0315d3 -> ("pointer","none","coarse","fine") [1.txt:47044], func_030ac2 -> ("any-pointer","none","coarse","fine") [1.txt:46408]; gkz binds window.matchMedia at func_003173 [1.txt:2450].
Every attribution traces to a published artifact. See the sources and their limits.
Nearby checks in Screen & display
- The reported colour gamut is carryable by the reported colour depth
colour-gamut-vs-colour-depthscreen.colorDepth and the colour-gamut media query are two readings of one panel, and a measured sweep of a deployed identity matcher found… - Screen has an OS chrome inset (avail < screen on either axis)
taskbar-presentscreen.availWidth/availHeight describe the area left over after the OS reserves space for its own chrome — a Windows taskbar, a macOS dock… - The outer window fits within the screen
window-boundsThe check asserts only the zoom-invariant bound: window.outerWidth/outerHeight must be non-zero and must fit within the screen. - A Windows browser window with no frame at all covers the screen, as only fullscreen does
frameless-window-vs-fullscreenOn Windows every top-level window carries invisible resize borders — about 8 px at the left, right and bottom — and outerWidth/outerHeight… - maxTouchPoints coheres with pointer media
touch-pointer-coherenceA one-directional coherence test: if navigator.maxTouchPoints is greater than zero, matchMedia("(any-pointer: coarse)") is expected to… - A Chrome or Firefox engine claiming macOS reports no touch points
touch-points-vs-claimed-macosNeither Chrome nor Firefox has a source for touch points on macOS. - Screen dimensions resolve via native prototype getters
screen-descriptorsFor width, height, availWidth, availHeight, colorDepth and pixelDepth this asks two questions: does the screen instance carry an own… - screen.orientation agrees with the screen's own dimensions
orientation-vs-screen-dimsscreen.orientation.type and screen.width/height are both device-space values sourced from the same display metrics, so they must agree: a…
Clearcote is a browser built for fingerprint coherence
It is a Chromium fork, maintained by the same people who wrote this reference. It ships as a compiled browser rather than as a stealth script injected into someone else's — which is a description of how it is built, and is not an argument about how it behaves on this check.
This audit takes no position on how Clearcote scores on Screen & display checks, on this one, or anywhere else. It has no baseline corpus of other people's fingerprints to rank you against and no vendor scoreboard — nearly every check is self-referential, asking one browser the same question through two independent APIs and reporting whether both answers can be true at once. It runs identically on any browser, including ours. Run it on yours and read the result yourself.
See the other checks in Screen & display — the family pointer-hover-desktop belongs to.
