Fingerprint Diff

Two device fingerprints, with only the differing attributes shown. The question is never what a device looks like — it is what changed between two sessions, and twenty-eight matching rows hide the two that matter.

src/components/ui/fingerprint-diff.tsx

About

From the component's own source, where it was written.

Two device fingerprints side by side, with the differing attributes called out.

Fingerprints are thirty-odd attributes of which twenty-eight usually match, so matching rows are collapsed by default. The question is never "what does this device look like" — it is "what changed between these two sessions", and everything identical is noise hiding the two lines that matter.

A missing attribute is shown as absent rather than blank. A fingerprint that *stopped reporting* its canvas hash is itself a signal — usually an anti-detect browser — and rendering it as an empty cell loses that entirely.

Install

npx astralyx-ui add fingerprint-diff

Usage

import { FingerprintDiff } from '@/components/ui/fingerprint-diff'

<FingerprintDiff attributes={attributes} leftLabel="Session A" rightLabel="Session B" />

Composer

Change the props and the source below follows.

Session 8f21 · 11 AugSession c904 · 2 Sep3 of 10 differ
canvas_hash !
a41f9c22
not reported
webgl_vendor !
Apple Inc.
Google Inc. (Apple)
timezone !
Europe/London
Europe/Kyiv
Props
tsx
<FingerprintDiff attributes={attributes} leftLabel="Session A" rightLabel="Session B" />

Examples

Two devices compared

API

Generated from the source, so it cannot fall behind the code. One table per exported component, then hooks, functions and types.

FingerprintDiff

Extends Omit<ComponentProps<'div'>, 'children'>.

PropTypeDefaultDescription
attributesFingerprintAttribute[]required{ key, label?, left, right, significance? }.
leftLabelReactNode'Session A'—
rightLabelReactNode'Session B'—
defaultShowMatchingbooleanfalseMatching rows are collapsed behind a count, and always reachable.
identicalMessageReactNode'Every attribute matches.'—
significanceLabelstring'high significance'Accessible name for the high-significance marker.
valuesshown as absent—A null renders as "not reported", never as blank. A fingerprint that stopped reporting its canvas hash is itself a signal — usually an anti-detect browser.

Types

FingerprintAttribute

Two device fingerprints side by side, with the differing attributes called out.

FieldTypeDescription
keystring—
label?ReactNode—
left?string | number | null—
right?string | number | null—
significance?'high' | 'normal'Marks the attributes worth escalating on. A changed timezone is not a changed WebGL vendor.