Browser Fingerprinting Experiment
This page demonstrates the mlsl-fp web component - a lightweight, privacy-conscious
fingerprinting library that combines client-side browser signals with server-side network and TLS
data gathered at the CDN edge, without storing cookies or PII.
How it works
gathers client signals
signed JWT issued
base64 payload + JWT
TLS / JA4 data
sent to your endpoint
Client Hints are delegated to the edge origin so the CDN can request high-entropy UA values (platform version, architecture, model) on behalf of the page.
Signals gathered
A deterministic 128-bit MurmurHash3 fingerprint built from stable,
low-entropy signals. Consistent across sessions without cookies. Combined with a JA4
cipher hash at the edge to produce a combinedId.
Parsed from the User-Agent string via UAParser.js, then enriched with high-entropy Client Hints for accurate version detection (especially on Chromium where the frozen UA reports incorrect versions).
OS name and version from UA parsing, cross-referenced with
sec-ch-ua-platform / sec-ch-ua-platform-version Client Hints
at the edge. Mismatches between the two sources are flagged.
Form factor (Mobile / Tablet / Desktop), CPU core count,
device memory tier, and max touch points. Mobile flag is cross-checked against
sec-ch-ua-mobile.
Unmasked GPU vendor and renderer strings extracted via the
WEBGL_debug_renderer_info extension. Highly device-specific and
contributes to the hardware identity hash.
Processes a triangle-wave oscillator through a dynamics
compressor in an OfflineAudioContext. Tiny numeric differences in
the rendered waveform reveal the underlying audio stack and DSP implementation.
Probes browser APIs that behave differently in private browsing (storage quotas, FileSystem API, IndexedDB behaviour) to infer whether the session is incognito without user interaction.
IANA timezone, preferred locale, hour cycle (12h/24h), and
numbering system resolved via the Intl API. Timezone mismatches
with the IP-derived location can indicate VPN usage.
CSS media queries probed at runtime: pointer precision (hover), HDR display support, forced-colors accessibility mode, and P3 wide colour-gamut. Together these narrow down the display class of the device.
The Bunny CDN exposes the JA4 TLS client fingerprint as a request header. The cipher-hash component is extracted and combined with the browser murmurId to form a network-layer identity.
Real IP from x-real-ip, full x-forwarded-for
chain, hop count, and mismatch detection. Enriched via proxycheck.io with geolocation,
ISP, ASN, and proxy / VPN classification.
Each pixel request is validated against a short-lived HMAC-SHA256
JWT issued by the edge. The token binds the murmurId and page origin,
preventing replay and cross-origin abuse.
https://fpj4a-8s80c.bunny.run.