Screen & display
Your Display Fingerprint
Resolution, DPI, color depth, gamut, HDR, refresh rate, orientation, and CSS media-query preferences, all things a script can read without permission.
Screen & display
Measuring refresh rate over ~300 ms...
Sanity checks anti-bot systems run
availWidth ≤ screen.width. Violating this is impossible on real hardware.outerWidth > innerWidthfor framed browser windows. Outer = 0 is the CDP tell.- Aspect ratio should match a real panel (16:9, 16:10, 3:2). 4:3 at odd resolutions is suspicious.
- devicePixelRatio integer values are typical (1, 2, 3). Fractional values like 1.25 or 1.5 exist on Windows scaling, but they should stay stable across events on the page.
- Color gamut "rec2020" is very rare, treat it as high-signal.
Media queries that leak preferences
prefers-color-scheme, prefers-reduced-motion, and forced-colorsall reflect the user's OS-level accessibility settings. They're small but composable, and headless browsers with default configs always answer "no-preference", which itself is signal after enough samples.
Frequently asked questions
→Why is screen resolution a fingerprint?
Because the combination of screen.width, screen.height, availWidth/availHeight, and devicePixelRatio produces hundreds of distinct values across the population. A 1920x1080 @ 1x monitor is common; a 3456x2234 @ 2x MacBook Pro 16 display is nearly unique. Anti-bot vendors also flag suspicious sizes like 800x600 or 1024x768 (Puppeteer defaults).
→What is the difference between innerWidth and outerWidth?
innerWidth is the viewport, the area web content actually renders in. outerWidth is the entire browser window including chrome (tabs, address bar). On real browsers outer > inner. Headless browsers driven via CDP often report outerWidth = 0, one of the strongest single tells.
→Why measure refresh rate?
Because it varies with hardware. 60 Hz is the desktop default; laptops with high-refresh panels show 120 or 144; ProMotion iPhones and MacBooks show 120 (or 30/60/90 adaptively). Cloud VMs almost always show 60 exactly. It's a small signal but it composes.
→What are color-gamut and dynamic-range media queries?
CSS media queries that expose the display's capabilities. color-gamut can be srgb, p3, or rec2020. dynamic-range can be standard or high. p3 + high implies a modern MacBook or high-end phone; srgb + standard is the common baseline. Useful cross-checks against the claimed OS and hardware.
→How should scrapers configure the display?
Set a plausible viewport (1366x768 or 1920x1080 for desktop), a devicePixelRatio of 1 or 2, color depth of 24, and don't leave outerWidth at 0. In Playwright: browser.newContext({ viewport, deviceScaleFactor, screen }). In Puppeteer: page.setViewport() plus setting window.screen properties via evaluateOnNewDocument.