Fingerprint testing guide

CreepJS results explained: lies, trash, headless scores and FP ID

CreepJS is a well-known open-source fingerprinting test. Its results page is dense and uses its own terms. This guide explains the main fields, and what to do about them.

Direct answer

CreepJS counts “lies” when built-in browser functions do not behave like the native ones. It counts “trash” when a value fails a sanity check. The Headless block gives three scores: like headless, headless and stealth. FP ID is a hash of the values CreepJS trusts. A high lies count means that an extension, script or tool rewrote browser functions. A stock browser can still show a few like-headless items.

What CreepJS is, and its main fields

CreepJS is a research project by Abraham Juliot, published under the MIT License. Its goal is to show weak spots in anti-fingerprinting browsers and extensions. Its targets include Tor Browser, Brave, puppeteer-extra and CanvasBlocker.

The only official site is abrahamjuliot.github.io/creepjs. The project says that copies on other domains are unauthorized mirrors. Open the page and wait until “FP ID: Computing…” changes to a hash.

Field names as they appear on the CreepJS page and in its source code, checked on 2026-11-03.
FieldWhat it showsWhat to look for
FP IDA hash of the “stable fingerprint”: screen, navigator, worker, canvas, WebGL, audio, fonts, time zone and more. Parts that lied are left out. Browser version numbers are left out too.An ID that changes between visits with no change on your side
FuzzyA second hash that CreepJS builds from the full set of valuesUse it as a second reference point
lies (N)The number of failed tests on built-in functions. Click it to see each function and the test it failed.Any number above zero
trash (N)Values that fail a sanity check, such as a count that is not a whole number, or a value that acts like a functionAny number above zero
HeadlessThree scores: like headless, headless and stealthAny headless or stealth score above 0%
ResistanceKnown privacy browsers and extensions, such as Brave, Tor Browser, Privacy Badger or Privacy PossumA tool you did not expect to see

Lies and trash: what a high count means

CreepJS tests built-in functions for signs that something replaced them. It checks canvas functions such as getImageData, measureText and fillText. It checks Date and Intl time functions, audio functions, WebGPU, and the screen and navigator values.

Each function gets many small tests. Examples are “failed toString”, “failed descriptor” and “failed undefined properties”. The lies count is the total of failed tests over all functions. So one replaced function can add many lies.

A high lies count means that an extension, a page script or a tool rewrote browser functions in JavaScript. Sites can read the same traces.

Lies also change your FP ID. CreepJS drops every part that lied, such as the screen or canvas, and hashes only what is left.

Trash is smaller. It lists values that cannot be real, for example a number that should be whole but is not.

  • Click the lies count and read the function names. They point to the part that was changed, such as canvas or time zone.
  • Turn off extensions one at a time, and run the test again. Privacy and user agent extensions are common sources.

Headless and stealth scores, and why a stock browser shows some items

Each score is the share of its signals that are true. Click a score to see each signal. The like-headless bar turns red only at 100%. The headless and stealth bars are red at any value.

ScoreSignals it readsOn a stock browser
Like headlessNo window.chrome, no plugins, notifications denied, light colour scheme, PDF viewer off, no taskbar, window as large as the screen, SwiftShader graphics, no Web ShareCan be above 0%. Light mode, blocked notifications, a hidden taskbar or full screen set some signals.
Headlessnavigator.webdriver is on or was removed, or “HeadlessChrome” is in the user agent of the page or a workerShould be 0%
StealthTraces of stealth plugins: a patched iframe, window.chrome added late, a fake chrome.runtime, a wrapped Function.toString, or a different GPU in the page and in a workerShould be 0%

So treat a like-headless score as information, not a verdict. A headless or stealth score above 0% is a stronger signal. It points to automation, or to a tool that patched the page.

Privacy extensions can add lies on a stock browser, because CreepJS is built to find them. Brave, and Firefox or Tor Browser with fingerprint protection, change some values on purpose. CreepJS names them under Resistance.

Get plain-language verdicts

CreepJS shows what it found, but not which items matter. Our free fingerprint test gives a pass, warning or fail for each check, and says how to fix it.

It fails a check only for a value that a stock browser never shows. Stock Chrome, Edge and Firefox on Windows, macOS and Linux pass, and we check this every week. Things that normal setups cause are warnings.

It covers the same areas as lies and stealth: replaced functions, Proxy wrappers, automation, and workers or iframes with other values. It also checks noise, fonts, time zone, leaks and TLS.

Frequently asked questions

What do lies mean in CreepJS?

A lie is a failed test on a built-in browser function. It means the function does not behave like the native one, usually because an extension, script or tool replaced it.

Why does my CreepJS FP ID change?

A value in the stable fingerprint changed, such as the screen, fonts, graphics card or time zone. The ID also changes when a part starts or stops lying, because CreepJS leaves out parts that lied.

Is a like-headless score bad?

Not by itself. Normal settings such as light mode, blocked notifications or a hidden taskbar set some like-headless signals. Headless and stealth scores above 0% are the stronger signals.

Does CreepJS tell me if a site will block me?

No. CreepJS is a research and education project. It shows what a script can find, not what a given site does with it. For a pass, warning or fail on each check, run our free fingerprint test.