Orange textured background

Signal

CSS probe

Fingerprints the browser's CSS engine by measuring default UA-stylesheet dimensions for a set of HTML elements and testing a set of CSS feature declarations.

Reviewed

Tier 2 engine

What it measures

Two orthogonal CSS signals are combined into one hash. First, the default offsetWidth and offsetHeight of a curated set of HTML elements rendered in their UA-stylesheet state, including form controls and native widgets that browsers size very differently. Second, boolean support flags for a curated set of CSS property/value declarations queried via CSS.supports(), covering modern layout, color, and animation features.

Together these expose the browser's UA stylesheet defaults and CSS feature implementation set. Both dimensions and feature flags are determined entirely by the browser engine, not by the device hardware.

How it is collected

A hidden div container (positioned off-screen at top: -9999px) is appended to document.body. Each element spec is created, mounted, measured via offsetWidth and offsetHeight, then removed. Reading offsetWidth forces a synchronous layout per element; errors on individual elements fall back to the string 0,0. The CSS feature strings are then tested with CSS.supports(); if the API is absent, all flags default to false. All values are serialised and hashed via xxHash64. The container is removed in a finally block regardless of errors.

Confidence rules

ConfidenceTrigger
normaldocument.body exists and collection ran to completion
absentdocument is undefined, document.body is falsy, or top-level catch fires

Why engine-bound

UA stylesheets differ between browsers: Chrome, Firefox, and Safari apply different default width, height, padding, and margin to form elements and other native widgets. CSS feature support also varies by engine and engine version, spanning modern layout, color, and animation primitives. On the same OS and hardware, both the dimension readings and the feature flags are determined entirely by the browser engine, making the combined hash a reliable engine discriminator.

Things worth knowing

  • Worker and SSR environments: document is undefined in workers; returns absent immediately.
  • Some legacy and native-widget elements are included specifically because browsers differ in how they size them: some treat an element as a block, while others apply special UA styles.
  • Sync layout: reading offsetWidth/offsetHeight forces a layout flush for each element; typical total timing is 5-20 ms for the full element set.
  • No timeouts are applied; the function is synchronous after its async wrapper.

Last reviewed 2026-06-04