The flag emoji
A country flag is two regional indicator symbols that a font may draw as one flag. Apple's emoji font does, Google's Noto Color Emoji does, and so does every Android device. The Windows emoji font does not: it draws the letters U and S side by side. A probe draws the US flag to a small canvas and reads the pixels; the colours present tell flag from letters without any reference image.
A session that claims Windows and draws a flag is running on something else, usually a Linux host with a colour emoji font installed. One that claims macOS and draws letters has the reverse problem. It is the same class of tell as font fingerprinting: text is rendered by the host, whatever the User-Agent says.
Five dates and the timezone database
JavaScript parses a date-only ISO string such as 1937-12-01 as UTC and 12/1/1937 as local time. Subtract the two and you get the local zone's offset from UTC on that day. One deployed widget does this for the years 999, 1060, 1937, 1945 and 1989 and reads the zone name from Intl.DateTimeFormat().resolvedOptions().timeZone.
Today's offset is easy to fake by overriding getTimezoneOffset and the Intl zone name. Historical offsets are not: before standard time most places used local mean time, with offsets in minutes and seconds set by longitude, and wartime years carry offsets that applied for a few months. Only a real timezone database knows them. If the zone name says Europe/Amsterdam and the 1937 offset is not Amsterdam's, the zone was set in JavaScript, not in the engine. This is the deeper version of a timezone and IP mismatch.
Intl strings, the keyboard and fonts
Intl output comes from locale data shipped with the engine. Format a few unusual things and the result depends on the language:
| Probe | English, UTC | Dutch, Amsterdam |
|---|---|---|
| Compact number 2.1e16 | 21,000 trillion | 21.000 biljoen |
| List with "or" | a, b, or c | a, b of c |
| Display name eo-UA | Esperanto (Ukraine) | Esperanto (Oekraïne) |
These have to agree with navigator.languages, with the Accept-Language header and with the timezone, and because locale data changes between releases they also have to fit the claimed browser version. Desktop Chromium adds navigator.keyboard.getLayoutMap(); the layout does not have to match the language, but it has to be plausible for it.
Font probes work the same way. One widget tests 52 names chosen to separate platforms, such as Segoe Fluent Icons for Windows, Apple Symbols for Apple, Cantarell and Ubuntu for Linux desktops and Carlito for Office or ChromeOS. One name proves little (an iPhone reports Carlito), but Segoe Fluent Icons next to Cantarell occurs on no real machine. The coherent answer is to run on a host whose OS, fonts, timezone and language really match the exit IP, which is how a managed web data API keeps these values consistent.
