Comparison
Agreement inside one fingerprint
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 readings | What keeps the parts agreeing | Where such a set contradicts itself | Clock and language next to the exit | |
|---|---|---|---|---|
| An ordinary browser as it is | Nothing | The machine itself | Nowhere: it is one honest machine | Both belong to the machine |
| Incognito | Nothing in the device readings | The machine itself | Nowhere in the device | Both belong to the machine |
| Separate profiles of the same browser | Nothing in the device readings | The machine itself | Nowhere in the device | Both belong to the machine |
| An extension that swaps values in the page | The properties on its own list | Whoever wrote that list | Where the same thing is read by a second road | Declared, and only where the list reaches |
| A VPN | The exit address only | Nobody: the device is untouched | Between the country of the exit and the clock of the machine | Both stay the machine's |
| A virtual machine per account | The whole guest system | The guest system itself | Inside the guest they agree, and the guest is one machine for every account in it | Set by hand inside the guest |
| Separate hardware per account | Nothing: it is a second machine | The machine itself | Nowhere | The machine's own, or set by hand |
| A browser with the engine itself changed | The whole set, derived from the profile's number | The generator draws the device as one machine | Checked by relationships rather than by values | Both 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 next
Page, extension or engine
The same eight ways sorted by the depth the change is made at.
Browser fingerprint
What the set is made of and how it is put together.
Entropy
Why a rare value narrows the crowd around you.
Fingerprint and its editor
What you can pick by hand and what picking it costs.
A window wider than the screen
One contradiction that a single line of script finds.
Read your own values first
The check reads 12 values in your browser and sends nothing anywhere.