Browser & OS Detection · Browser Tests
User-Agent Client Hints Test
See which client hints your browser volunteers, and which it makes a site ask for.
navigator.userAgentData is undefined here, so there is nothing to read. Firefox and Safari have not implemented the User-Agent Client Hints API — they still send the classic user-agent string instead. That is a real difference between browsers, not a script that was blocked.
Low entropy — sent unasked
Brand list
High entropy — only on request
Raw values
Every value is read straight from navigator.userAgentData in your browser and never leaves this page. Nothing is guessed: anything your browser withholds is shown as not returned.
On this page
What User-Agent Client Hints actually are
Client Hints are the replacement for the single, overloaded user-agent string. Rather than announcing your browser, version, engine and platform in one line attached to every request, the browser splits them into named values — Sec-CH-UA, Sec-CH-UA-Platform, Sec-CH-UA-Mobile — and releases the most precise ones only when a site asks.
The system has two halves. Request headers carry the values on the wire, and navigator.userAgentData exposes the same values to JavaScript, with a method called getHighEntropyValues() for the detailed set. Chromium browsers — Chrome, Edge, Opera, Brave — implement both. Firefox and Safari implement neither.
Not a plugin, not a setting
You cannot switch client hints on or off. Whether the panel above shows a platform name or an explanation is decided entirely by which browser you happen to be running.
The low-entropy hints sent unasked
Three values are sent with every request without anyone requesting them. The platform, reported as a short string like Windows, macOS or Android; a mobile flag expressed as ?0 or ?1; and the brand list, which carries each brand with its major version only, so Chromium 131 rather than 131.0.6778.86.
The brand list is deliberately awkward to parse. Alongside the real entry, browsers insert decoy brands with names such as Not_A Brand and Not.A/Brand, which change with each major release. This technique, borrowed from TLS and called GREASE, exists so that sites stop writing code that assumes the first brand in the list is the browser. If you are reading the list above and wondering what the nonsense entries are, that is exactly their job.
The high-entropy hints a site has to request
Everything more specific sits behind a request. A server opts in by sending an Accept-CH response header listing what it wants, after which the browser attaches those headers to later requests. A page can also ask directly from JavaScript, which is what the button above does.
- Architecture and bitness. Reported as x86 or arm, and 32 or 64. A 32-bit browser on 64-bit Windows additionally sets the WOW64 flag, which is a surprisingly specific configuration to be able to name.
- Platform version. On Android this reads as the real release, for example 14.0.0. On Windows Chromium reports a shortened, mapped value rather than the NT number, which is why it does not look like the “10.0” you see in the user-agent string.
- Full version list and uaFullVersion. The complete build numbers, one of the most precise single values a browser will hand over.
- Model. Non-empty on Android and some Chromebooks, where it names the device. Desktop browsers return an empty string.
Why browsers replaced the user-agent string
The old string had two problems. It was sent to everyone — the advertising script, the image host, the analytics pixel — not just the site that needed it. And it had frozen into nonsense, with every browser claiming to be Mozilla/5.0 and AppleWebKit for reasons that stopped being true two decades ago.
Chrome's answer was to reduce the string to a minimal form, where the version reads as Chrome/131.0.0.0, and move the detail into hints. Firefox and Safari took a different route: they kept the classic string but froze the parts that leaked the most, which is why macOS now always reports 10_15_7 regardless of the release you actually run.
The split is the story
A site can no longer treat one string as the truth. It has to decide which browser family it is talking to and use a different detection path for each. The HTTP headers test shows which of these values your browser actually put on the wire.
What client hints mean for privacy
Client hints are often described as a privacy improvement, and in one narrow sense they are: the precise values are no longer broadcast with every subresource request, and a browser can refuse to answer. But the high-entropy set, when granted, is a near-unique build identifier. Exact version, architecture, bitness and platform version together describe a smaller population than the old string did.
The honest reading is that this is a wash for trackers and a real improvement for engineering. Combining architecture and platform version with the graphics signals in a fingerprint gives a tracker another stable column. See the fingerprint test for how these values stack up, and the operating system test to watch client hints disagree with the other two sources that claim to know your OS.