Screen and window dimensions look mundane, but a handful of measurements together narrow you down sharply. Here is what a page reads from your display.
On this page
A page can read the size of your screen, the size of the window inside it, and the density of the pixels between them, and it can do all of that without asking permission and without you noticing.
Ask someone what a website can learn about their computer and they will usually mention files or cookies. Almost nobody mentions the rectangle of glass in front of them. Yet the size of your screen, the size of your browser window, and the density of the pixels inside it are among the most stable facts a page can collect — they do not change between visits, they require no permission, and they are different for almost everyone.
What a page can measure
A small set of values, all available from ordinary JavaScript, describes your display and your window.
screen.widthandscreen.heightgive the full panel resolution in CSS pixels.screen.availWidthandscreen.availHeightgive the usable area, after subtracting things like a dock or a taskbar.window.innerWidthandwindow.innerHeightdescribe the viewport — the area a page actually renders into.window.outerWidthandwindow.outerHeightdescribe the whole browser window, chrome included.screen.colorDepthreports how many bits are used per pixel, usually 24.devicePixelRatiorelates CSS pixels to physical pixels.
Individually, each is unremarkable. Nobody is identified by owning a 1920 by 1080 monitor. But the combination is far more specific than the parts, which is the recurring theme of browser fingerprinting: many ordinary values multiplied together produce a rare result.
The numbers that betray a maximised window
The most revealing of these is the viewport, and there is a counter-intuitive reason for it.
Full-screen resolutions are shared by enormous numbers of people. A 1920 by 1080 display is close to the most common configuration in the world, and reporting it makes you ordinary. The viewport, by contrast, is your screen minus your browser’s interface minus anything else on screen. It takes values like 1512 by 823 or 1287 by 694 — odd numbers that arise from the particular height of your browser’s tab strip and toolbar, at your particular zoom level.
That is why a maximised window is more distinctive than a small one: it is derived from your exact screen and your exact browser build, so the same odd number appears every time you visit. A window you have casually resized is less stable, but it reflects your personal habits, which is its own kind of signature.
A page can also watch the viewport change: if it listens for the resize event, it can record how you adjust your window over a session, or note whether you never touch it.
| Value | What it describes | How distinctive |
|---|---|---|
screen.width / height | The physical panel | Common configurations are shared widely |
screen.availHeight | Panel minus system bars | Narrows the field slightly |
window.innerHeight | The viewport | Often an odd number, quite distinctive |
devicePixelRatio | Physical pixels per CSS pixel | Usually 1, 1.5, 2 or 3, coarse alone |
screen.colorDepth | Bits per pixel | Almost always 24; contributes little |
Pixel density
devicePixelRatio is coarse but it is not useless. On a typical laptop it holds at 1; on a high-density display it reads 2 or more, and on some scaled configurations it takes intermediate values like 1.25 or 1.5. It separates broad classes of machine — ordinary displays, Retina-class panels, low-end Android hardware — and it explains why a site might serve you a higher-resolution image. You can see yours on the device pixel ratio test.
Two values above are, in practice, nearly constant:
| Value | What it usually reads |
|---|---|
devicePixelRatio | 1, 1.5, 2 or 3 |
screen.colorDepth | 24 bits |
Colour depth
Colour depth is the least interesting of the group. Nearly every modern system reports 24 bits, so it contributes almost nothing on its own. The exception is the small population of machines running unusual display configurations, where an unexpected value stands out because it is rare.
A preference that became a signal
One further display-adjacent value has crept into fingerprinting: your colour scheme preference. Pages can read it with the prefers-color-scheme media query, or window.matchMedia('(prefers-color-scheme: dark)'), to decide whether to show a light or dark theme.
That is a legitimate use, and it is why the query exists at all. But it has a side effect. Dark mode adoption is uneven, it is tied to operating system and to habit, and a page that records it gains a stable bit of information about you for free. The dark mode test shows you which value your browser reports, alongside the related contrast and motion preferences that sites can read the same way.
What this means in practice
You cannot do much about your screen, and chasing a common resolution is not worth changing hardware for. What you can do is understand the shape of the problem. Know your viewport, not just your monitor: the odd number your maximised window produces is the one that follows you around, and the screen resolution tool reports it as a script would see it. Do not reach for a spoofing extension: faking a screen size that contradicts your actual rendering creates inconsistencies elsewhere, which makes you easier to spot rather than harder.
Reading your own numbers
The concrete move is to compare what your display reports with what you expected. Open the screen resolution tool and look at the table of values it collects — the viewport, the available area and the full panel side by side. If one of the numbers surprises you, that is the one carrying information about you. For the wider picture of how a display value combines with everything else a page can read, see what browser fingerprinting is.