User Agent Parser

Paste any User-Agent string and read off the browser, rendering engine, operating system, device class and CPU architecture, with a copyable JSON breakdown.

Turn a User-Agent string into something readable. Your own User-Agent is loaded by default. Paste any other string to see how it decomposes, and copy the JSON breakdown for a bug report or a test fixture.

Browser
Engine
Operating system
Device type
CPU architecture

Why User-Agent strings look like that

Three decades of pretending to be each other

A modern User-Agent is not a description, it is a fossil record. Nearly every desktop browser still opens with Mozilla/5.0, a token that has meant nothing since Netscape lost the browser war. It survives because early servers sniffed for Mozilla before serving frames, so every competitor added the token to avoid being downgraded. Once one browser lies to get the good version of a page, the rest must lie identically or lose users.

The same spiral produced the rest of the string. Chrome sends AppleWebKit/537.36 (KHTML, like Gecko) even though it stopped using WebKit in 2013 and KHTML has been dead far longer. Edge appends Edg/ rather than Edge/ specifically because too many sites had a substring check for the old token and served a broken fallback. Safari's real version hides in a Version/ token while the trailing Safari/537.36 is frozen. This is why parsing must be ordered from most specific to least: every Chromium fork also claims to be Chrome, and every WebKit browser also claims to be Safari, so the first confident match has to win.

What you can and cannot trust

The string is a client-supplied header, which means it is a hint and never evidence. Any HTTP client can send anything, and users routinely spoof it through extensions or developer tools. Treat it as diagnostic colour in a log, not as an authorisation input or a security boundary.

Even when nobody is lying, the values are increasingly coarse. Chrome and Edge now freeze the minor version segments to 0.0.0 and report a reduced platform string, so Windows NT 10.0 covers both Windows 10 and Windows 11 and macOS has been pinned at 10_15_7 for years regardless of the actual release. Firefox rounds its OS details similarly. If a version number looks suspiciously round, it probably is.

Device detection is the shakiest part. There is no device field in the string; it is inferred from the presence or absence of tokens like Mobile, iPad or Tablet. Android tablets are the classic trap, since many are identified only by the absence of the Mobile token, and iPadOS deliberately presents itself as a desktop Mac in its default configuration.

Use feature detection instead, mostly

For anything that changes behaviour, test the capability rather than the label. if ('share' in navigator) is correct and durable; if (isSafari) breaks the moment another engine ships the same API or Safari ships a fix. For layout, CSS media queries describe the actual viewport and input method far better than a device guess ever will.

Where the User-Agent still earns its place is analytics, crash triage and reproducing bugs. Knowing that a stack trace only appears on Gecko, or that a layout break is confined to Samsung Internet, turns an unreproducible report into a specific test case. The modern replacement is the User-Agent Client Hints API, which exposes the same facts as structured values and requires an explicit request for high-entropy details such as the full platform version.

Open-source note: implemented in vanilla JavaScript with no third-party libraries.

FAQ

Why does Chrome say it is Mozilla and Safari at the same time?
Historical compatibility. Servers once sniffed for Mozilla before sending modern markup, and later for Safari before sending WebKit-specific CSS. Every browser added those tokens to avoid being served a degraded page, and removing them now would break sites that still check.
Can I trust the User-Agent for security decisions?
No. It is a request header the client fully controls and can set to any value. Use it for diagnostics and statistics only. Anything that gates access or enforces a policy must rely on authentication, not on a self-reported string.
Why is my macOS version reported as 10.15.7?
Safari and Chrome deliberately freeze the reported macOS version at 10_15_7 to reduce fingerprinting surface. The browser knows the real version but will not put it in the header. Client Hints can expose it, but only when the site explicitly asks.
How does the tool tell a tablet from a phone?
It looks for an iPad token, an Android string without the Mobile token, or an explicit Tablet marker. This mirrors what most libraries do, but it is inherently a heuristic. Some Android tablets are indistinguishable from large phones by string alone.
Does this send my User-Agent anywhere?
No. Parsing runs entirely in your browser with regular expressions, and nothing is uploaded. The default value is read locally from navigator.userAgent and never leaves the page.
What should I use instead of User-Agent sniffing?
Feature detection for capabilities, CSS media queries for layout, and the User-Agent Client Hints API when you genuinely need platform facts. Client Hints give structured values and keep high-entropy details behind an explicit opt-in.