---
title: "Stealth browser options for automation: 7 free tools compared"
description: "7 free stealth tools for browser automation, read on GitHub and PyPI in September 2026: what each one changes, how current it is, and what a benchmark measured."
canonical: "https://scalebrowser.net/blog/stealth-browser"
last_modified: "2026-09-25"
published: "2026-09-25"
author: "davide"
category: "stealth-tools"
---

> ## Documentation Index
> Fetch the complete documentation index at: https://scalebrowser.net/llms.txt
> Use this file to discover all available pages before exploring further.

# Stealth browser options for automation: 7 free tools compared

> 7 free stealth tools for browser automation, read on GitHub and PyPI in September 2026: what each one changes, how current it is, and what a benchmark measured.

Automation that meets a bot defence usually reaches for a free stealth tool next, and seven free ones come up again and again, from a JavaScript plugin to a rebuilt Chromium. They look interchangeable in a README and differ in one decisive point: where in the stack they intervene. We read each tool's repository and package statistics between 22 and 24 September 2026 and put them next to the one public benchmark that ran them on the same targets.

## What is a stealth browser?

A stealth browser is a browser setup for automation that tries to remove the traces a website can use to recognise remote control. The seven free tools do that at three depths:

- **A script inside the page.** Evasion scripts run before the site's own code and overwrite values such as `navigator.webdriver`. The Puppeteer stealth plugin and playwright-stealth work this way.
- **A patched driver.** The library that talks to the browser changes how it speaks to it, so fewer protocol side effects reach the page. undetected-chromedriver, nodriver and Patchright work this way.
- **A patched browser.** The browser binary itself is rebuilt with changes in its source. Camoufox does this for Firefox and CloakBrowser for Chromium.

The depth decides what a tool can reach. A script cannot change the [TLS handshake](/blog/ja4-tls-fingerprint), and a driver cannot change what the graphics card draws.

## Which 7 free stealth tools exist, and how do they compare?

Two of the seven have not published a release since 2024 or earlier, and the other five released within the last six months. The table lists what each tool changes and the state of its latest release.

<Evidence source="GitHub API, PyPI and npm registries, read 22 to 24 September 2026">

| Tool | Depth and licence | Latest release |
| --- | --- | --- |
| puppeteer-extra-plugin-stealth | script in the page, MIT | 2.11.2, 1 March 2023 |
| playwright-stealth (Python) | script in the page, MIT | 2.0.3, 4 April 2026 |
| undetected-chromedriver | patched driver for Selenium, GPL-3.0 | 3.5.5, 17 February 2024 |
| nodriver | patched driver, CDP only, AGPL-3.0 | 0.50.3, 13 May 2026 |
| Patchright | patched Playwright driver, Apache-2.0 | 1.63.0, 8 September 2026 |
| Camoufox | patched Firefox build, MPL-2.0 | 152.0.4 beta 30, 1 September 2026 |
| CloakBrowser | patched Chromium build, MIT | Chromium 152.0.7977.82.1, 23 September 2026 |

</Evidence>

Only one public benchmark has run several of these tools against the same live targets. Ian L. Paterson [tested 7 tools against 31 targets](https://ianlpaterson.com/blog/anti-detect-browser-benchmark-patchright-nodriver-curl-cffi/) in three sweeps from one residential IP address and published the results on 13 May 2026. Two of his seven are not stealth browsers: vanilla Playwright, the untreated baseline, and curl_cffi, an HTTP client.

<Evidence source="Ian L. Paterson, Anti-Detect Browser Benchmark 2026, 31 targets, 3 sweeps, published 13 May 2026" href="https://ianlpaterson.com/blog/anti-detect-browser-benchmark-patchright-nodriver-curl-cffi/">

| Tool | OK, gated, blocked of 31 |
| --- | --- |
| nodriver | 28, 3, 0 |
| CloakBrowser | 26, 3, 2 |
| curl_cffi, HTTP client | 26, 3, 2 |
| Patchright | 25, 3, 3 |
| Camoufox | 25, 3, 3 |
| rebrowser-playwright | 24, 2, 5 |
| vanilla Playwright, untreated | 24, 2, 5 |

</Evidence>

The Puppeteer stealth plugin, playwright-stealth and undetected-chromedriver were not part of that test, so no result stands next to them.

## Why does the control plane matter more than the patches?

The control plane is the protocol and library that drive the browser, and it leaves traces no patch to fingerprint values can remove. Paterson's reading of his own results: "Automation-protocol-fingerprinting targets are the cliff: Playwright forks fail regardless of patch quality, and defeating that layer takes a control plane that is not Playwright." CloakBrowser, a Chromium rebuilt with source-level patches, still landed two targets behind nodriver, which leaves Chrome's fingerprint values as they are and talks to it without Playwright.

The input is a second trace that the benchmark did not score. On our own signature bench on 24 August 2026, two runs per tool against Chrome 141, nodriver 0.50.3 produced clicks with `isTrusted: false` at coordinate 0,0 and not a single pointer event. The tool that the benchmark ranked first was the most conspicuous one at the input layer.

### Is the Puppeteer stealth plugin still maintained?

No. The last commit to the [Puppeteer stealth plugin](/blog/puppeteer-stealth) is from 1 March 2023, and its repository carries 238 open issues, 41 of which match "detected".

### What does playwright-stealth change?

playwright-stealth applies 18 evasion scripts to a Playwright context, most of them overwriting `navigator` values and the `chrome` object. The project's README calls [playwright-stealth](/blog/playwright-stealth) "a proof-of-concept starting point".

### How does nodriver differ from undetected-chromedriver?

nodriver drops Selenium and chromedriver and speaks the Chrome DevTools Protocol directly; undetected-chromedriver patches chromedriver and keeps Selenium. The same author calls [nodriver](/blog/nodriver) "the official successor" of the older package.

### What does Patchright patch?

Patchright patches Playwright's protocol leaks, among them `Runtime.enable` and `Console.enable`, and keeps Playwright's interface. Its list of patches names no fingerprint surface; the [Patchright review](/blog/patchright) sets its 25 of 31 targets against Playwright's 24.

### How does Camoufox work?

[Camoufox](https://camoufox.com/) is a Firefox build with changes in its C++ source, and it "works with your existing Playwright code out of the box". It therefore presents a Firefox identity rather than a Chrome one. How many of its downloads run an old version is in our report on [Camoufox in production](/blog/camoufox).

### What does CloakBrowser add?

[CloakBrowser](https://github.com/CloakHQ/CloakBrowser) rebuilds Chromium with 87 source-level patches across canvas, WebGL, audio, fonts, GPU, screen and WebRTC, and it describes itself as a "Drop-in Playwright/Puppeteer replacement". That keeps a Playwright or Puppeteer control plane on top of the patched browser. The [CloakBrowser review](/blog/cloakbrowser) looks at the noise it switches on by default.

#### Why patch Chromium itself?

Patching the browser reaches the values a script cannot, from rendering to network behaviour. It does not remove the traces of the driver on top, which is why the depth of the patches and the choice of control plane are two separate decisions.

## So which should you pick?

| Situation | Pick | Why |
| --- | --- | --- |
| A quick script against sites without a commercial bot defence | no stealth tool | nothing on those sites checks for one |
| Python, one identity per run, AGPL acceptable | nodriver | no blocked target in the benchmark; input traces remain |
| Existing Playwright code, protocol leaks are the problem | Patchright | same interface, protocol leaks patched |
| Chrome fingerprint values must change, Playwright code stays | CloakBrowser | patched Chromium, 26 of 31 in the benchmark |
| A Firefox identity is acceptable | Camoufox | fingerprint changes in the browser itself |
| Agents that keep many identities signed in across runs | a browser built around persistent profiles | the seven leave profiles and identities to your own code or a separate manager |

Our verdict: choose by control plane first and by patch count second. The measured difference between a patched Chromium and an unpatched one was smaller than the difference between Playwright and a direct CDP connection, and none of the seven addresses how the input looks. Input is one of the four layers that decide [how sites detect bots](/blog/bot-detection). If your code runs on Playwright or Puppeteer today, the [migration guide](/docs/migrate/playwright) shows how to attach it to a profile over CDP.

<ProductMention />
