# screen_resolution

> The screen size in CSS pixels, larger side first, so that rotating a phone does not change it.

Source: https://whiskerjs.com/signals/screen-resolution/ (last updated 2026-10-26)

**screen_resolution at a glance (from the library code, signalsVersion 9)**

| Field | Value |
| --- | --- |
| Component name | `screen_resolution` |
| In the visitorId | yes |
| structuredId group | [device (screen, memory, CPU)](https://whiskerjs.com/docs/identifiers/#structuredid) |
| Hashing | plain value; a digest only when longer than 128 characters or not printable ASCII |
| Excluded under | Firefox resistFingerprinting (firefox_rfp); Tor Browser and Mullvad Browser (rfp_hardened); Safari Advanced Fingerprinting Protection (safari_afp) |
| Inner timeout | 1000 ms |
| Added in | [signalsVersion 1](https://whiskerjs.com/whats-new/) |

> **In plain words:**
>
> This is the size of your screen as the browser reports it, for example 1920x1080 on a common monitor or 932x430 on a large phone. WhiskerJS always writes the longer side first, so turning a phone sideways does not change it. It is a simple value, but it separates many devices.

## What it reads

`screen.width` and `screen.height`. Both are rounded to whole numbers and written as `<larger>x<smaller>`.

## How the technique works

The `screen` object describes the display the window is on, in CSS pixels. On phones and tablets the two numbers swap when the device rotates; sorting them removes that difference. If either value is missing or not a finite number, the component is `unavailable` / `no_api`.

## Why it helps

Screen sizes cluster around common models, but the combination with other device values (colour depth, CPU threads, memory, touch support) separates devices well. On phones the CSS screen size often follows the model closely. It is in the `device` group.

## Stability

It changes when the window moves to a different monitor, when the primary display changes, when the operating system’s display scaling changes (which changes the CSS pixel size), or on a new device. It does not follow the window size in normal browsers. Because the value is in CSS pixels, some browsers also report a different size while the page is zoomed; WhiskerJS does not correct for that. Note that a different monitor or scaling setting changes the `device` part of the structuredId; see [What changes the id](https://whiskerjs.com/docs/identifiers/#what-changes-the-id).

## Browser support and what blocks it

- `ok` in all browsers.
- [Firefox resistFingerprinting](https://whiskerjs.com/browsers/firefox-rfp-and-tor/): `excluded` / `firefox_rfp`, and [Tor Browser and Mullvad Browser](https://whiskerjs.com/browsers/firefox-rfp-and-tor/): `excluded` / `rfp_hardened`, because the screen is reported as the content area.
- [Safari with Advanced Fingerprinting Protection](https://whiskerjs.com/browsers/safari-macos/): `excluded` / `safari_afp`, because the window size is reported as the screen size.
- Related integrity check: [`media_query_mismatch`](https://whiskerjs.com/docs/integrity/#media_query_mismatch) fires when the CSS device size disagrees with `screen` (it does not run for the privacy classes).
- Headless browsers often report a fixed default size; the container test runs used for these pages reported `1280x720` in Chromium, Firefox and WebKit.

The same `screen.width` and `screen.height` are compared with a clean iframe by the [`iframe_mismatch`](https://whiskerjs.com/docs/integrity/#iframe_mismatch) check and checked for patched getters by [`native_tampering`](https://whiskerjs.com/docs/integrity/#native_tampering).

## Privacy

A screen size is coarse device information, read without permission or prompt, reported as plain text (it is short and ASCII). WhiskerJS sends nothing itself.

## How WhiskerJS handles noise and failures

| Status | ruleId | When |
| --- | --- | --- |
| `ok` | none | for example `1920x1080` |
| `unavailable` | `no_api` | no `screen`, or width or height not a number |
| `blocked` | `security_error`, `threw` | reading threw |
| `excluded` | `firefox_rfp`, `rfp_hardened`, `safari_afp`, `caller_excluded` | exclusion table or your list |
| `timed_out` | `timeout`, `aborted` | 1000 ms inner timeout, budget, abort |

## Example value

```json
"screen_resolution": { "status": "ok", "value": "2560x1440", "hashed": false }
```

Other typical values: `1920x1080`, `932x430`.

## Questions and answers

### Does rotating my phone change screen_resolution?

No. WhiskerJS always reports the larger side first, so portrait and landscape give the same value, for example 932x430.

### Is this the physical resolution of the display?

No. screen.width and screen.height are in CSS pixels. A high-density display reports a smaller size than its physical pixels; the ratio between them is the separate pixel_ratio component.

### Why is it excluded under Firefox resistFingerprinting and Safari Advanced Fingerprinting Protection?

resistFingerprinting (also in Tor Browser and Mullvad Browser) reports the content area of the window as the screen size, and Safari Advanced Fingerprinting Protection reports the window size as the screen size. Either way the value describes the window, not the screen.

## Related pages

- [pixel_ratio](https://whiskerjs.com/signals/pixel-ratio/): The device pixel ratio, outside the ids.
- [screen_frame](https://whiskerjs.com/signals/screen-frame/): Taskbar and dock space, outside the ids.
- [color_depth](https://whiskerjs.com/signals/color-depth/): Another screen property in the device group.
- [Firefox resistFingerprinting, Tor and Mullvad](https://whiskerjs.com/browsers/firefox-rfp-and-tor/): Where it is excluded.
- [iframe_mismatch flag](https://whiskerjs.com/docs/integrity/#iframe_mismatch): Compares screen width and height with a clean frame.
