Skip to content

Comparison

Agreement inside one fingerprint

A platform rarely reads one value. It reads several at once and asks whether they could belong to the same machine, which is why a single corrected reading can be louder than no correction at all.

What a platform reads together

A fingerprint is not one answer but a set of them. The reader asks a simpler question than which value is rare: whether these values fit one machine.

A rare value on its own is only a rare value. A pair that no machine has ever produced is an answer.

  • Graphics card and architecture

    A card sold for one processor family next to an architecture hint belonging to another.

  • Screen and pixel ratio

    Multiply one by the other and the result has to be a panel somebody actually makes.

  • Latency and connection type

    The browser derives the type from the latency, so a pair that disagrees came from elsewhere.

  • Declared memory and the heap limit

    The limit a page can read is computed from the memory the machine reports.

How the set is drawn here

The device is not kept on disk. It is derived again at every launch from the profile's own number, so one profile gets one machine and two profiles get two.

The parts are drawn from each other rather than one by one. Cores and memory come from the family the graphics card belongs to, and on a phone profile the screen, the ratio, the card and the fonts all come from one handset.

Values taken from the browser's rules

Some readings are not free to invent. The engine rounds the round trip time, caps the downlink and derives the connection type from both, so a plausible looking number the engine never returns is checked in one line.

The same holds for the heap limit a page reads. It follows the memory the profile declares.

  • Round trip time and downlink

    Rounded and capped the way the engine rounds and caps them, not the way they look plausible.

  • Connection type

    Derived from the latency rather than drawn, because the browser derives it too.

  • Cameras and microphones

    Never zero: a profile claiming no camera would hand one over on the very next call.

Eight ways along one axis

Read the table as scope rather than as a score. A way of working is not worse for leaving alone what it never promised to touch.

The last row is ours, and every cell in it is either produced by code you can open or measured on the built engine.

What changes in the readingsWhat keeps the parts agreeingWhere such a set contradicts itselfClock and language next to the exit
An ordinary browser as it isNothingThe machine itselfNowhere: it is one honest machineBoth belong to the machine
IncognitoNothing in the device readingsThe machine itselfNowhere in the deviceBoth belong to the machine
Separate profiles of the same browserNothing in the device readingsThe machine itselfNowhere in the deviceBoth belong to the machine
An extension that swaps values in the pageThe properties on its own listWhoever wrote that listWhere the same thing is read by a second roadDeclared, and only where the list reaches
A VPNThe exit address onlyNobody: the device is untouchedBetween the country of the exit and the clock of the machineBoth stay the machine's
A virtual machine per accountThe whole guest systemThe guest system itselfInside the guest they agree, and the guest is one machine for every account in itSet by hand inside the guest
Separate hardware per accountNothing: it is a second machineThe machine itselfNowhereThe machine's own, or set by hand
A browser with the engine itself changedThe whole set, derived from the profile's numberThe generator draws the device as one machineChecked by relationships rather than by valuesBoth follow the exit country

What the clock follows

A profile behind a proxy takes its country from the exit, and the clock and the language list follow that answer.

A value chosen by hand wins over the draw and pulls its partner along: a chosen timezone brings the language stack of that country, and a chosen language brings the hours.

Reading it back in the browser

Agreement on paper is not agreement in a window. A build is accepted by opening a real profile and reading every value back, including from an invisible frame and a background worker.

A shorter version of the same reading runs on this site. It asks your own browser the same questions and sends nothing anywhere.

What this comparison does not claim

  • It does not claim that a device agreeing with itself keeps an account. Behaviour, payment details and the history of the account are read as well, and no browser touches those.
  • It does not describe any named product. These are ways of working, and what somebody else's build does is not ours to measure.
  • It does not claim to know what each platform checks. Nobody publishes that, and the pairs above are simply the ones a browser has to keep straight on its own.
  • Not every reading is answered inside the engine yet. What a build does not declare is still corrected from the page, and the app decides that in one place.
  • The acceptance figures come from one build on one machine. Another build and another machine give other rows.

How to check this

Every statement above has a file behind it, and most have a stand that runs the code rather than reading it.

The whole device is derived from the profile's number, and the parts are drawn from each other
packages/shared/src/index.js
Agreement is asserted by running the generator over hundreds of profiles, not by reading the source
apps/desktop/test/fingerprint-consistency.js
Every value is read back inside a running browser, including from a frame and a worker
apps/desktop/src/lib/fpAudit.js · apps/desktop/test/fp-audit.js
The acceptance run of the built engine records what it expected and what it read
engine/приёмка-отчёт.json

Questions

Why can one corrected value be worse than none?
Because the correction has to agree with everything left untouched. A value no real browser returns, or a second road to the same picture that disagrees with the first, is an answer rather than a guess.
Does a profile get a new device after an update?
No. A profile keeps the generation it was created under, and a wider pool of machines is offered to new profiles instead.
What happens to a value I pick by hand?
It wins over the draw. A value that does not belong to the chosen template is dropped, and the app names what it dropped rather than showing a pinned value that stopped applying.
Does the clock really follow the proxy?
Yes. The exit country is asked of geolocation providers through the proxy itself, and the timezone and the language list are taken from that answer.
Can I look at my own values first?
Yes. The check on this site reads 12 values in your own browser and sends nothing anywhere.

Read your own values first

The check reads 12 values in your browser and sends nothing anywhere.