Changing the User-Agent takes one extension and ten seconds. A browser on macOS can claim to be Chrome on Windows, and the request header will say so. The problem is that the header is no longer where a site looks first. Chrome now sends a second, structured description of itself, and a dozen other properties describe the machine independently. When the new story does not match the old one, the site has not learned that you are on Windows; it has learned that your User-Agent is fake.
Two ways a site learns what browser you are
The User-Agent string is the old way: one line sent as a header and exposed as navigator.userAgent. Since 2022 Chrome has reduced it. The platform part is frozen (Windows NT 10.0; Win64; x64 on every Windows version, Macintosh; Intel Mac OS X 10_15_7 on every Mac, Apple silicon included), and the version shows only the major number, as in Chrome/152.0.0.0.
User-Agent Client Hints are the new way. Chrome sends three low-entropy hints on every request (Sec-CH-UA with the brand list, Sec-CH-UA-Mobile, Sec-CH-UA-Platform) and, when the server asks for them with Accept-CH, high-entropy ones: platform version, architecture, bitness, device model and the full version list. The same data is available to scripts through navigator.userAgentData and getHighEntropyValues(). The details that were removed from the string live here.
Firefox and Safari do not implement Client Hints. Missing hints in Firefox are normal and are not a mismatch; a Chrome that lacks them is.
Where the mismatch comes from
| The User-Agent says | But | What the site concludes |
|---|---|---|
| Windows | Sec-CH-UA-Platform says "macOS" | The string was edited, the browser was not |
| Chrome 152 | The full version list says 148 | Someone changed the number in the string |
Chrome/152.0.6812.113 | Chrome only ever sends 152.0.0.0 in the string | The string was written by hand |
| Chrome | navigator.userAgentData is missing | Not Chrome, or a Chrome that has been cut open |
| Windows | navigator.platform returns MacIntel | The OS claim is false |
| Windows | The font list has Helvetica Neue and no Segoe UI | The OS claim is false |
| Windows | WebGL reports an Apple GPU | The OS claim is false |
The first row is the common one: an extension rewrote the header and navigator.userAgent and touched nothing else. The rest are the cross-checks a careful site runs, roughly in order of cost. None of them needs a permission, and all of them run on the first page load.
The other properties that have to agree
The User-Agent is one of at least six descriptions of the same machine, and a site compares them against each other:
navigator.platform.Win32,MacIntelorLinux x86_64. It predates Client Hints and still has to match.- Client Hints in the header versus in JavaScript. Both come from the browser, so they should be identical; a mismatch means one of them was patched.
- Fonts. Each operating system ships a core set (Segoe UI on Windows, Helvetica Neue and San Francisco on macOS) that a page can probe without permission.
- WebGL renderer. The GPU string names a vendor and often a driver stack (
Direct3D11on Windows,Metalon macOS) that only exists on one platform. - Speech voices. The
speechSynthesisvoice list is Microsoft voices on Windows and Apple voices on macOS. - Version age. A Chrome three major versions behind is rare among real users and common among tools that froze their identity months ago.
Every property above still describes the real machine. The edited string is the single value that disagrees with all of them, which is the easiest kind of lie to spot.
How to check
- Open the Lab and read the User-Agent and Client Hints rows. The Lab asks Chrome for the high-entropy hints and compares the header copy with the JavaScript copy, and both with the string.
- Read the operating-system row next to them. It cross-checks
navigator.platform, fonts, the GPU and voices against the platform the User-Agent claims. - If you use a User-Agent extension, turn it off and check again. The disagreement should disappear, which tells you the extension was the cause.
- Check the version too. If the string claims a full build number or an old major version, that is a flag on its own.
Check your own User-Agent and Client Hints
The Lab compares the User-Agent string, the Client Hints header and the JavaScript values, and checks that fonts, GPU and platform describe the same operating system.
How to fix it
If you only need your real browser to look normal: remove the User-Agent extension. A stock browser, up to date, passes every check above because every value comes from the same place.
If you need a browser to present a different identity: change the whole identity, not the string. The User-Agent, the Client Hints in the header and in JavaScript, navigator.platform, the font list, the GPU renderer and the voice list all have to describe the same operating system and the same browser version, and the version has to stay current after updates. That is a rendering-engine level change, not something a header rewrite can do.
Either way: do not invent a full version number, do not claim a platform your fonts and GPU contradict, and do not disable navigator.userAgentData in a Chromium browser to "hide" the hints. Absence is a signal too.
How Mango Browser handles the User-Agent
Mango supports Chrome/Chromium and Firefox profiles on Windows and macOS, and the User-Agent follows the engine, version and operating system selected for the profile. In Chromium profiles the Client Hints, in the header and in JavaScript, share that same identity, so the string, Sec-CH-UA-Platform, the full version list and navigator.userAgentData describe one browser. Firefox profiles keep Firefox's behaviour, including the absence of Client Hints, which is what a real Firefox shows.
The operating-system identity drives the rest: the font list is drawn from that OS's own pool, the WebGL renderer from a pool of real GPUs for that OS, the voice list follows the OS, and navigator.platform and screen values fit it. Change the OS on a profile and every one of those values changes together, which is the only way the cross-checks in this guide keep agreeing.