Guide
Decoding User-Agent strings and the Client Hints that replace them
Every HTTP request from a browser carries a User-Agent header that names the browser, its engine and the operating system. Server logs, analytics exports and bug reports are full of these strings, and they are notoriously hard to read: a Chrome string mentions Mozilla, AppleWebKit, KHTML, Gecko and Safari. This parser turns a string into plain facts and shows what your own browser sends, including the newer Client Hints.
Why the strings are so strange
Browsers have copied each other’s tokens for decades to avoid being served degraded pages by sites that checked for a specific browser. Chrome’s string still contains AppleWebKit/537.36 (KHTML, like Gecko) and Safari/537.36 for that reason, and Edge adds Edg/ to the end of a Chrome string. A parser therefore has to look for the most specific token in the right order rather than the first familiar word.
What the parser extracts
The Bowser library identifies the browser and its version, the rendering engine, the operating system with its version and marketing name where known, and the device type: desktop, mobile, tablet or TV. For phones and tablets it also reports the vendor and model when the string includes them, which Android devices often do and iPhones do not.
Spotting bots and scripts
Crawlers and HTTP libraries usually identify themselves, so a pattern match finds names such as Googlebot, Bingbot, GPTBot, curl, wget and python-requests. That is good enough for filtering logs, but anyone can send any User-Agent. To confirm that a visitor claiming to be Googlebot really is, do a reverse DNS lookup of its IP address and check that the name ends in googlebot.com or google.com and resolves back to the same IP.
Frozen and reduced values
To limit fingerprinting, browsers have frozen parts of the string. Chrome and Edge report Windows NT 10.0 on both Windows 10 and 11, Safari and Chrome on Mac always say Mac OS X 10_15_7, and Chrome on Android sends a generic Android 10; K in its reduced form. Minor version numbers are often replaced with zeros. The parser points this out whenever a frozen value appears.
User-Agent Client Hints
Chromium browsers offer a structured replacement. navigator.userAgentData gives brands, a mobile flag and the platform without asking, and getHighEntropyValues returns details such as the platform version, CPU architecture, device model and full version list. Press “Read client hints” to see what your browser reports; Firefox and Safari do not implement the API, and the panel says so.
A worked example
Choosing “Edge on macOS” fills in a string ending in Edg/130.0.0.0. The parser reports Microsoft Edge 130.0.0.0 on macOS 10.15.7 (Catalina), device type desktop, and adds the frozen-value note, because the real macOS version could be much newer than Catalina. The Googlebot sample is identified as a crawler, with the reminder to verify it by DNS.
Use with care
User-Agent strings are fine for statistics and for reading bug reports. They are a poor basis for feature detection or security: check for the feature itself, and never trust a header the client controls.
Related tools
- Access Log Analyzer summarises user agents across a whole log file.
- HAR Analyzer shows the requests a browser made.
- JavaScript Keycode Tester inspects keyboard events in this browser.
- Browser Storage Inspector reports this browser’s storage quota.
Checked against the current version of the User-Agent Parser on .

