# Display & Monitor Test

> Test your monitor in your browser: dead pixels, backlight bleed, banding, gamma, ghosting and text sharpness, plus measured refresh rate, gamut and HDR support.

- URL: https://bytescope.dev/en/screen-test/
- Locale: en · Also: [ja](https://bytescope.dev/ja/screen-test.md) · [zh-Hant](https://bytescope.dev/zh-Hant/screen-test.md)
- Runs: Everything runs locally in your browser — nothing is uploaded.
- Requires: Any modern browser (Chrome, Edge, Firefox, Safari), desktop and mobile.
- Updated: 2026-09-08

## What it does

This display test has two halves. The info panel reads out what your screen actually is: physical vs CSS resolution and pixel ratio, color depth, wide-gamut support (sRGB / P3 / Rec.2020), HDR capability, and the real refresh rate measured live from frame timestamps — often revealing that a "144 Hz" laptop panel is running at 60 Hz. The test patterns then let you inspect the panel itself, full-screen, one click at a time.

The patterns cover the checks reviewers and buyers actually run: solid-color cycles for dead and stuck pixels, pure black and white for backlight bleed and uniformity, per-channel gradients that make 8-bit banding visible, a gamma chart, a moving-object test for ghosting and motion clarity, text samples for sharpness at your scaling settings, and a multi-touch pad for touchscreens. Every pattern comes with a one-line guide on what to look for and what a healthy screen should show — most test sites give you the image and leave you guessing.

It's all generated in your browser with canvas and SVG — nothing to download or install, which makes it ideal for checking a new monitor before the return window closes, verifying a second-hand screen at handover, or diagnosing a panel that suddenly looks wrong.

Three more patterns go deeper. An HDR capability matrix feature-detects both halves of the equation — whether your display reports HDR and whether this browser can actually decode HEVC, VP9 and AV1 in their 10-bit PQ (Rec.2020) HDR configurations — because a screen can advertise HDR while the browser silently falls back to SDR decode, and vice versa; on an HDR display it adds a near-white ramp for checking highlight separation. A color reference card lays out standard sRGB swatches — labelled grayscale steps, primaries and secondaries, skin tones and memory colors — on a neutral gray surround, to eye-ball color casts before reaching for a colorimeter. And a dedicated burn-in / image-retention set runs solid 25/50/75% grays plus full color fields, with an auto-cycle mode you can leave running to reveal OLED burn-in or LCD retention.

## Limits

Does not calibrate colour or measure brightness in nits; it shows test patterns and reports what the browser knows about the display.

## Machine output

Copy JSON copies an envelope `{ tool, url, generatedAt, userAgentHint, result }`. `tool` is `"screen-test"`; `result` is what the browser reported (`window.screen`, matchMedia, `devicePixelRatio`) or what this tab measured from rAF deltas — not the panel's factory specification. OS-renameable screen labels are omitted.

- `reportedCssScreenWidth` (number | null) — `window.screen.width` (CSS px). `null` = not read yet.
- `reportedCssScreenHeight` (number | null) — `window.screen.height` (CSS px). `null` = not read yet.
- `estimatedPhysicalWidth` (number | null) — `reportedCssScreenWidth * devicePixelRatio`, rounded. An estimate, not EDID. `null` = width or DPR not read.
- `estimatedPhysicalHeight` (number | null) — Same estimate for height. `null` = height or DPR not read.
- `devicePixelRatio` (number | null) — `window.devicePixelRatio`. `null` = not read yet.
- `reportedColorDepth` (number | null) — `window.screen.colorDepth`. `null` = not read yet.
- `viewportWidth` (number | null) — Layout viewport width. `null` = not read yet.
- `viewportHeight` (number | null) — Layout viewport height. `null` = not read yet.
- `reportedMaxTouchPoints` (number | null) — `navigator.maxTouchPoints` after mount. `null` = not read yet. `0` is a real report.
- `reportedColorGamut` (string | null) — Widest matching `(color-gamut: …)` token: `"rec2020"` | `"p3"` | `"srgb"` | `"unknown"`. `null` = not queried yet. `"unknown"` = queried, nothing matched.
- `browserReportsHdr` (boolean | null) — `matchMedia('(dynamic-range: high)')`. `null` = not queried.
- `browserReportsHdrVideo` (boolean | null) — `matchMedia('(video-dynamic-range: high)')`. `null` = not queried.
- `reportedPointerFine` (boolean | null) — `matchMedia('(pointer: fine)')`. `null` = not queried.
- `measuredRefreshRateHz` (number | null) — Median refresh rate measured from rAF deltas on this tab. `null` = not enough samples. Not the panel's rated Hz.
- `snappedRefreshRateHz` (number | null) — Nearby common rate when the measurement is within ~2%. `null` = no measurement, or nothing nearby.
- `windowManagementApiPresent` (boolean | null) — Window Management API (`getScreenDetails`). `null` = API present (or unknown), user has not clicked yet; `false` = probed, API missing; `true` = API exists (permission may still be denied).
- `multiScreenProbe` (string) — `"idle"` | `"unsupported"` | `"denied"` | `"ok"`.
- `screens` (array of objects) — Screens from `getScreenDetails`, in API order. Empty until `ok`. Each item: reportedWidth, reportedHeight, isPrimary, isInternal, devicePixelRatio (`null` when that screen did not report DPR).
- `deadPixelUserVerdict` (string | null) — `"pass"` | `"fail"`. `null` = not confirmed (opening the pattern is not a pass).

## FAQ

### How do I check for dead pixels?

Run the solid-color cycle full-screen and step through black, white, red, green and blue with a click or the space bar. A pixel that stays black on every color is dead; one stuck on a single color shows up on the complementary screens. Wipe the screen first — dust is the classic false positive.

### Can a stuck pixel be fixed?

Sometimes. Dead (always black) pixels are usually permanent hardware faults, but stuck subpixels occasionally recover after rapid color cycling or gentle massage with a soft cloth. Check your monitor's dead-pixel warranty policy — many manufacturers replace panels over a threshold.

### Why does the measured refresh rate differ from my monitor's spec?

The test measures real frames delivered to the browser window. Common reasons for a lower number: the OS display setting is at 60 Hz, the window sits on a lower-Hz screen in a multi-monitor setup, a power-saving mode is throttling, or the browser is capping animation. It measures the screen the window is currently on.

### What is backlight bleed and how much is normal?

On the pure-black pattern in a dark room, LCD backlight leaking around edges/corners shows as brighter patches. Almost every LCD has some; it's a defect when clearly visible at normal brightness during dark content. OLED panels show none (each pixel emits its own light).

### Does the test work for HDR and wide color gamut?

The info panel detects whether your display and browser advertise HDR (dynamic-range: high) and which gamut is covered (sRGB, Display-P3, Rec.2020). The dedicated HDR pattern goes further: it feature-detects HDR video decode for HEVC, VP9 and AV1 in their 10-bit PQ configurations via the MediaCapabilities API, and on an HDR display adds a near-white ramp for a subjective highlight-separation check.

### Why isn't there a real HDR video clip to play?

A genuine HDR10 sample that exercises peak-brightness headroom needs a multi-megabyte HEVC/AV1 file plus codec support that varies by browser, and a 2D canvas physically can't emit a true PQ signal — so rather than fake it, the HDR pattern gives you an honest capability matrix (display HDR plus per-codec decode support) and an SDR-bounded ramp. The matrix tells you whether HDR playback would work; it just doesn't ship the clip.

### How do I check for OLED burn-in or LCD image retention?

Run the burn-in pattern full-screen and step through the solid 25/50/75% grays and full color fields — faint ghosts of previously displayed content (taskbars, logos) that persist are OLED burn-in; temporary shadows on LCDs that fade after a minute are image retention, usually harmless. Auto-cycle mode leaves the fields rotating so you can also use it to help even out mild retention.

### Is the color reference card a substitute for a colorimeter?

No — and it says so. It's a labelled visual reference: standard sRGB grayscale steps, primaries/secondaries, skin tones and memory colors on a neutral gray surround, useful for spotting obvious color casts, oversaturation or crushed shadows by eye. True calibration still needs a hardware colorimeter (a Spyder, ColorMunki, etc. with software like DisplayCAL) measuring the panel directly.
