# screen_frame

> The space the system keeps at each screen edge for the taskbar, dock or menu bar, as top,right,bottom,left in CSS pixels. Not in either id.

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

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

| Field | Value |
| --- | --- |
| Component name | `screen_frame` |
| In the visitorId | no (reported, kept out of both ids) |
| structuredId group | none |
| Hashing | plain value; a digest only when longer than 128 characters or not printable ASCII |
| Excluded under | Firefox Fingerprinting Protection (firefox_fpp); Firefox resistFingerprinting (firefox_rfp); Tor Browser and Mullvad Browser (rfp_hardened); Safari Advanced Fingerprinting Protection (safari_afp) |
| Inner timeout | 1000 ms |
| Added in | [signalsVersion 2](https://whiskerjs.com/whats-new/) |

> **In plain words:**
>
> Your operating system keeps part of the screen for itself: the Windows taskbar, the macOS menu bar and Dock, a Linux panel. Browsers tell pages how much of the screen is available, so the difference shows how big that frame is and on which edge. WhiskerJS reports it as four numbers but keeps it out of the identifiers, because people move and hide their taskbars.

## What it reads

From `window.screen`: `width`, `height`, `availWidth`, `availHeight`, and, where the browser has them, `availTop` and `availLeft`.

## How the technique works

1. All four of `width`, `height`, `availWidth`, `availHeight` must be finite numbers, otherwise `unavailable`.
2. `top` is `availTop` (0 when missing), `left` is `availLeft` (0 when missing).
3. `right` is `width - availWidth - left`, `bottom` is `height - availHeight - top`.
4. The four values are rounded and written as `top,right,bottom,left`.

## Why it helps

The frame follows the operating system and the user’s layout: a 48 px taskbar at the bottom (`0,0,48,0`) is typical of Windows, a menu bar at the top is typical of macOS, and many setups are custom. It is useful context for your server and a consistency check against the platform.

Read it together with [`screen_resolution`](https://whiskerjs.com/signals/screen-resolution/) and [`platform`](https://whiskerjs.com/signals/platform/): a frame that fits the platform (a bottom taskbar on Windows, a top menu bar on macOS) is ordinary, while a desktop user agent with no frame at all is common in virtual machines, kiosks and headless setups.

## Stability

Medium to low. It changes when the taskbar or dock is moved, resized or set to hide, and with multiple monitors (on some systems `availTop` and `availLeft` are positions within a larger desktop, which then shows up here). That is why it is outside both ids.

## Browser support and what blocks it

- Available in all current browsers. Phones and tablets often report `0,0,0,0` or a small top frame for the status bar, depending on the browser.
- [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`: there the available area is reported equal to the screen. “No taskbar space” is also one of the traits WhiskerJS needs before it classes a Firefox as `firefox_rfp`.
- [Firefox with Fingerprinting Protection](https://whiskerjs.com/browsers/firefox/): `excluded` / `firefox_fpp`, because that protection collapses the available screen area to the screen.
- [Safari with Advanced Fingerprinting Protection](https://whiskerjs.com/browsers/safari-macos/): `excluded` / `safari_afp`, because that protection reports the window size as the screen size.

## Privacy

It reveals the user’s screen layout preference (taskbar position and size), nothing more. It is not in an id.

## How WhiskerJS handles noise and failures

| Status | ruleId | When |
| --- | --- | --- |
| `ok` |   | `top,right,bottom,left` |
| `unavailable` | `no_api` | no `screen`, or a size is not a finite number |
| `excluded` | `firefox_fpp`, `firefox_rfp`, `rfp_hardened`, `safari_afp` | browser classes `firefox_fpp`, `firefox_rfp`, `rfp_hardened`, `safari_afp` |
| `excluded` | `caller_excluded` | you excluded it |
| `timed_out` | `timeout`, `aborted` | budget or abort |

## Example value

All three headless test browsers in the container reported `0,0,0,0` (no taskbar on a virtual display). A Windows laptop with a bottom taskbar typically reports something like `0,0,48,0`.

## Questions and answers

### Why is screen_frame not in the id?

It changes when the user moves or resizes the taskbar or dock, hides it, or the window is on another monitor. That is too common for an identifier.

### What does 0,0,0,0 mean?

The browser reports no space kept by the system: for example a phone, a full-screen setup, a headless browser, or a browser that normalises the available area.

## Related pages

- [screen_resolution](https://whiskerjs.com/signals/screen-resolution/): The screen size, in the id.
- [pixel_ratio](https://whiskerjs.com/signals/pixel-ratio/): Another screen value outside the ids.
- [Firefox resistFingerprinting, Tor and Mullvad](https://whiskerjs.com/browsers/firefox-rfp-and-tor/): Where this component is excluded.
