Anti-detect / Engine-level fingerprint protection

Engine-level fingerprint protection, and how it differs from a script on top.

There are two ways to change what a website reads from a browser. One adds a script to every page that overrides JavaScript values after the browser has started. The other changes the browser engine itself, so the values are native wherever they are read. Browz does the second. This page explains what a site can observe with each, and how to check any browser yourself.

The two approaches

A layer on top, or the engine underneath.

A script layered on top

  • An extension, an automation plugin or a launcher adds JavaScript to each page before the page’s own code runs
  • The script replaces getters and functions such as navigator.userAgent or canvas.toDataURL with its own
  • The browser underneath is unchanged, so anything the script doesn’t reach still gives the original answer
  • Quick to build and to update, which is why it is common

A change in the engine

  • The browser’s own source code is changed and the browser is rebuilt
  • The code that answers navigator.userAgent, draws a canvas or lists fonts returns the profile’s value directly
  • No script is added to any page, so every scope and every header is answered by the same code
  • It takes more engineering, and the changes are carried forward to each new engine version

A script on top

What a page can observe.

A page is a program running in the same JavaScript world as the script that changed it, so it can inspect that script’s work. These are well-known comparisons. A careful script layer closes some of them, and each one it closes is another thing to keep in step with every browser release.

01

Replaced functions stop reading as native

Ask a built-in function for its source and a browser answers function get userAgent() { [native code] }. A function replaced by a script answers with the script’s own text, unless the script also replaces Function.prototype.toString, and that replacement can be found the same way from a fresh iframe, which has an untouched copy.

02

Properties move

In a normal browser, navigator.userAgent is a getter on Navigator.prototype, with a fixed set of flags. A script that defines the value on the navigator object itself, or redefines the getter, changes where the property lives, its descriptor, or the order properties are listed in. Each is one comparison for a page.

03

Workers and iframes disagree with the page

A page can read the same values from a Web Worker, a service worker or a new iframe. A script injected into the page doesn’t run in those scopes unless it is injected into each of them, in time. When the page says one thing and its worker another, the difference is the signal.

04

Timing gaps

An injected script has to run before the page’s own code. A value read very early, or from a frame created before the script was applied, can still be the real one.

05

Headers and JavaScript disagree

The user agent and client hints also travel in request headers, written by the network stack. A script changes what JavaScript reads and leaves the headers alone, so the server sees two different browsers in one visit.

06

Noise that never repeats

Scripts that add random noise to canvas or audio readings return a different answer each time. Reading twice and comparing is enough to see it.

In the engine

What changes when the engine answers.

When the value comes from the browser’s own code, the comparisons above have nothing to compare.

01

Functions stay native

Nothing in the page was replaced, so there is nothing for toString or a property descriptor to reveal.

02

One answer in every scope

The page, its iframes, its workers and the request headers are all served by the same code, so they agree without anything having to be injected anywhere.

03

No race at start-up

The value is there before the first script of the first page runs.

04

Stable from visit to visit

A profile’s values are derived once and stored, so a returning task presents the same device it presented last time.

Being native is the start. The values also have to describe one believable device and agree with each other and with the network the visit comes from, which is a matter of what is chosen, not where it is set.

Test it yourself

Three checks that tell the two apart.

Our free browser fingerprint test runs in the page, sends nothing and works in any browser. Run it in the browser you use now, then in any browser you are considering.

  1. Built-in functions untouched

    The test asks nearly forty built-in getters and methods for their source, using a clean copy of toString from a fresh iframe. Any that a script replaced are listed by name.

  2. Page vs Web Worker, page vs iframe

    It reads the user agent, platform, languages, processor count and more from the page, a Web Worker and a new iframe, and shows any reading that differs.

  3. Stable readings, no automation flags

    It reads canvas and audio twice to see whether noise is being added, and checks the flags automation tools set. Attach your agent or script first, so you test the browser the way it will run.

Our own result: on 13 Nov 2026, Browz 0.1.9 on macOS passed 15 of 15 consistency checks in our fingerprint test, headless and headed (the test’s JSON). On Windows and Linux the same test found no inconsistencies (Windows JSON, Linux JSON).

Browz

What Browz changes in the engine.

Browz runs its own browser engine. These are the changes that matter here; the full list, with dated results, is on the anti-detect page.

01

Changed inside the engine, not injected

Browz runs its own browser engine. The values a site reads are changed in the browser’s C++ code, so no script is added to the pages you visit and there is nothing in JavaScript for a site to catch out.

02

One device, not a pile of random values

Each profile is derived from a real device type and a seed. Its platform, screen, fonts, graphics, voices and languages are chosen together, so they agree with each other and stay the same from one session to the next.

03

Text drawn its own way, without noise

Most tools add random noise to canvas images, and detectors look for exactly that. Browz gives each profile its own small, stable change to how text is drawn. The images stay as clean as a normal Mac’s, but differ between profiles.

04

Real graphics, chosen labels

WebGL and WebGPU draw with your real GPU, so the pictures they make are genuine. The vendor and renderer names a site reads can be automatic, set by you, or left real. WebGPU can be switched off for a profile.

05

Audio left native

Audio fingerprints are left as your computer makes them by default, because noisy audio is a known tell. Audio noise is there if you want it.

06

Fonts and element sizes

The font list matches the device type the profile presents, and the sizes a page measures for text and boxes come from the same fonts, so the two can’t disagree.

07

WebRTC can’t give away your address

WebRTC is replaced with the exit’s address, or disabled, so a page can’t use a video-call connection to find the real IP of your network.

08

Port-scan protection

Pages can’t probe the services running on your own computer (localhost), a check some sites use to recognise the same machine behind different accounts. Early connections a page asks the browser to open are covered too.

09

Automation doesn’t change the fingerprint

Driving a profile with Playwright, Puppeteer or MCP doesn’t alter the device or network fingerprint it presents. Automate only where the site’s terms allow it.

10

The TLS fingerprint is Chrome’s

TLS and HTTP/2 come from the engine’s own, unmodified network stack. In our tests the TLS fingerprint (JA4) and HTTP/2 settings were the same as stock Google Chrome’s.

11

CSS sees what JavaScript sees

Media queries for the screen agree with the size and pixel density scripts read, a cross-check many detectors run.

What public test sites report

Test siteWhat it checksBrowz result
CreepJSLies (values that contradict the engine), headless and stealth scores0 lies on 8/8 visits; 0% headless, 0% stealth; a different fingerprint ID per profile, stable after a restart
BrowserScanAuthenticity score, bot check, and a visitor ID that links visitsAuthenticity 100% on 3 of 3 profiles (22 Oct 2026), bot “No”, three different visitor IDs, each the same after a restart
tls.peet.wsThe TLS and HTTP/2 handshake (JA4, Akamai HTTP/2 fingerprint)Identical to stock Google Chrome: JA4 t13d1517h2_8daaf6152771_cb7bf5808d99, same ciphers, groups and HTTP/2 settings

Results for a fresh Browz profile on its default settings, from our published results. Installed Chrome profiles run your own Google Chrome and have their own controls: see Engines.

FAQ

About engine-level protection.

What is engine-level fingerprint protection?

It means the values a website reads from a browser, such as the user agent, screen, fonts, graphics and timezone, are changed in the browser engine’s own code rather than by a script added to each page. The values are then native wherever a page reads them: in the page, an iframe, a worker or a request header.

How can a website tell that a script changed a value?

By checking what the script touched. A replaced function no longer reads as native code, a redefined property sits in a different place with different flags, and a worker or a fresh iframe that the script didn’t reach still reports the original value.

Is an engine-level change enough on its own?

It removes the marks a script layer leaves. The values still have to describe one believable device and agree with each other, and the network matters too: the proxy, the TLS fingerprint and how the browser is driven. That is why Browz presents one consistent device per profile and leaves the engine’s network stack unmodified.

How do I test which approach a browser uses?

Run our free browser fingerprint test in it. The “Built-in functions untouched”, “Page vs Web Worker” and “Page vs iframe” checks are the ones that separate the two approaches. It runs in the page and sends nothing.

Does Browz add any script to the pages I visit?

No. The Browz engine changes values in its own code, and its agent tools read the browser’s accessibility tree and send real input events, so no script is added to the page for fingerprinting or for automation.

Does this apply to AI agents too?

Yes. Driving a profile over MCP, Playwright or Puppeteer doesn’t change the device or network fingerprint the profile presents. Use agents only where a site’s terms allow it; our acceptable use policy applies to agents the same as to people.

Browz

One consistent device for every profile and agent.

For Mac, Windows and Linux. Free for 5 profiles.