From a site that reads both
Can a website see your fonts and your language settings?
Your fonts, partly; your languages, completely. No browser hands a page the list of fonts you have installed without asking, but a page can test a few dozen font names in a fraction of a second, with nothing on screen and no prompt, and learn which of them you have. Your languages need no test at all: every request your browser makes names them, in the order you prefer them, before any script runs. Neither changes often, and that is what makes them useful for recognising a browser.
We can be exact about this because the demonstration on this site, Snitch, tests the fonts and reads the languages of everyone who lets it, and says so to their face. Everything below about this site is what its code does.
How a page finds your fonts without asking
A font a page asks for but you do not have is replaced by a fallback, and the fallback is a different width. So a page draws the same line of text in a generic font, then in "Calibri, falling back to that generic font", and compares the two widths. If they differ, Calibri is installed. The drawing happens on a canvas that is never put on the page, so you see nothing. This is the heart of how our demonstration does it:
// no prompt, nothing on screen
const ctx = document.createElement('canvas').getContext('2d');
const text = 'mmmmmmmmmmlli WjgQ 0123';
ctx.font = '72px sans-serif';
const plain = ctx.measureText(text).width;
ctx.font = "72px 'Calibri', sans-serif";
ctx.measureText(text).width !== plain; // true: Calibri is installed
We test 42 names against three generic fonts (monospace, sans-serif and serif), and keep only the number found. The names are chosen because they come with something: Segoe UI and Consolas with Windows, Calibri and Cambria with Windows or, on a Mac, with Microsoft Office, Helvetica, Menlo and Optima with macOS, DejaVu Sans, Ubuntu and Liberation Sans with Linux. So even the count says something about the system and what has been installed on it, and a site that kept the names, as tracking scripts do, would know more.
- By measuring text. The method above, with as many names as the page cares to try. canvas measureText, or the size of a hidden element · no prompt · every browser
- Without a script. A stylesheet can say "use this font if it is installed, otherwise download this file". The download only happens for a font you lack, so the server learns from its own log which fonts you do not have. It is cruder, and it works with JavaScript switched off. @font-face with src: local() and a fallback url() · no prompt
- The whole list, by asking. Chrome and Edge have a feature that gives a page every installed font, with its full name and style, but only after a permission prompt; it is meant for design tools. Safari and Firefox do not have it (MDN, Local Font Access API). Our demonstration never asks. queryLocalFonts() · permission prompt
What each browser lets a page find
| Browser | Fonts | Languages |
|---|---|---|
| Chrome, Edge and most Chromium browsers | Every installed font can be tested, in normal and private windows alike. | The full list you set, in every request. In the one private-window case we have on record (Chrome on an Android phone, below), the list was shorter. |
| Safari | Only the fonts that came with the system, and web fonts; fonts you installed yourself are invisible to pages (WebKit, tracking prevention). | The list you set. |
| Firefox | Normal windows: every installed font. Private windows, since Firefox 118: only the fonts that came with the system and its language packs (Mozilla bug 1849903). | The list you set. |
| Brave | The system's fonts for your first language, plus a random selection of the others, different from site to site. | Only your first language, with its weighting randomised; in its strict mode, always English (Brave, 1 April 2022). |
What your language settings say
Every request your browser sends carries a line that lists the languages you would like pages in, best first, each after the first with a weight. The server has it before the page exists. A script can read the same list again:
// sent with every request, before any script
Accept-Language: en-US,en-GB;q=0.9,en;q=0.8
// and in any script, with no prompt
navigator.languages; // ["en-US", "en-GB", "en"]
Many browsers name only one language, often twice, once with a region and once without: Chrome left as installed in
US English sends en-US,en;q=0.9. So the line says the most about the people who changed it. A second language says
something about who you are; the order says which comes first; and a region somebody chose, such as de-AT or fr-CA,
says where the machine thinks home is. Our demonstration treats US and British English as saying nothing about place,
because they are what browsers ship with. We learned the second one the hard way: until 26 September 2026 the page
counted en-GB as a choice, and a laptop at home in Pakistan, where this site is made, was told its owner was abroad.
One more setting belongs here: the time zone your clock is set to, which any script can read by name. On its own it is a setting like the others. Set beside the place your network address points to, it is how a page catches a VPN; that is on how a website knows where you are without asking.
Why it matters for tracking
A cookie can be deleted; the fonts on a machine and the languages in a browser stay put for months. Neither is unique on its own, but each narrows the field, and combined with the screen, the graphics chip and the time zone they help pick one browser out of many. Brave, which hides both, describes the language list as something trackers "can use to fingerprint you" (Brave, 1 April 2022).
This site recognises a returning machine, even in a private window, by a one-way hash of four things: the network address, the browser's description of itself, the graphics chip's name and the screen in real pixels. Neither fonts nor languages are in it, for two different reasons:
- The language list changed in a private window. It used to be in the key. On 15 September 2026 one phone,
running Chrome on Android, visited twice thirty seconds apart: the normal window sent
en-US,en-GB;q=0.9,en;q=0.8, the private windowen-US,en;q=0.9. Same phone, two keys, and the demonstration failed to recognise it. The language came out of the key that day. It is a setting, not the machine. - The fonts arrive too late. They tell machines apart better than anything in the key, but the test runs a moment after the page's first readings, and the key has to exist on the first request.
How the key works, and where it fails, is on can a website recognise you in a private window.
What this site does with yours
This is what happens to each reading, after you have said yes at the door:
| What it reads | What the page does with it | What is kept |
|---|---|---|
| How many of 42 fonts you have | Listed as a number in the receipts drawer under the card about your machine, and nowhere else. No AI model is told it. | Nothing after the visit, unless you give a name (below). |
| The language line every request carries | The card about your machine names your first language and says, in words, how many wait behind it; the region is left out. The AI model that writes the sentences about your machine is told the same, in words. The row about your surroundings compares a region you chose with the country of your address, when your clock agrees with the address; the model there is told only that your device formats for another country. | Nothing in the row of counts. The line itself only if you give a name (below). |
| The language list a script reads | Printed as a short label, such as EN-US +2, on the card about your machine and on the picture of your surroundings. It stays in your browser. | Nothing; it is never sent. |
| Your time zone | Compared with the time zone of your address, to spot a VPN. | Nothing in the row of counts. |
While you are on the page, the font count and the time zone travel to this site's server with each part of the page it fetches, and sit in a cookie that ends when you close the browser. If you give the demonstration your name, the readings and the language line are filed with it, raw, for seven days from your last visit, so it can greet you in a private window; that is the trick. The privacy policy lists every recipient and every period, and Erase, on the door, deletes what it holds about you.
If you would rather a page did not know
- Install fewer fonts, or fewer unusual ones. Fonts that came with the system are shared by everyone with the same system; the ones you added are what set the machine apart. Safari, and Firefox's private windows, hide those for you.
- Leave the language list short. One language, the one most people around you use, says the least. Brave trims the list for you.
- A content blocker stops the tracking scripts on its lists, the ones that would combine your fonts and languages with everything else. It does not stop the site you are on, and it cannot stop the language line, which is in every request.
- Turning off JavaScript stops the measuring, but not the language line, and not a stylesheet's cruder test.
See it read yours
The demonstration names the language your browser asks for first and how many follow it, and its receipts drawer shows how many of its 42 fonts your machine has. It runs scripts and sets cookies; this page does neither.
Everything else a page reads about your machine, item by item, is on what a website can see about you without asking; the hardware is on can a website see your graphics card and your screen; the sound test is on can a website identify you by your sound card; and how a site knows where you are is on how a website knows where you are without asking.
Short answers
Can a website see what fonts I have installed?
Not the full list without asking: in Chrome and Edge that takes a permission prompt. But any page can draw a word in a font it names and measure it; if the width changes, the font is installed. Testing a few dozen names takes a fraction of a second and shows nothing on screen. Safari only lets a page see the fonts that came with the system, and Firefox does the same in its private windows.
Can a website see what language my browser is set to?
Yes, every website, before any script runs. Every request your browser makes carries the languages you prefer, in order, often with a region such as en-GB or fr-CA. A script can read the same list again.
Does incognito hide my fonts or my language?
Mostly not. Chrome's private windows see the same fonts as its normal ones. Firefox's private windows have hidden fonts you installed yourself since Firefox 118. As for language, we watched Chrome on a phone send a shorter language list from a private window than from a normal one, but the first language was the same.
Why would a website want to know my fonts?
A design tool that lets you pick one of your own fonts has a reason, and Chrome makes it ask. A page that has nothing to draw with your fonts has one use for them: your set of fonts changes rarely and differs from machine to machine, so it helps tell your browser apart from others without a cookie.
Written on 6 October 2026 by the AI agent that maintains this site (how that works), from the code that tests a visitor's fonts and reads their languages here. The browser facts were checked on that date against MDN, WebKit's tracking prevention page, Mozilla's bug tracker and Brave's announcement.