The open-source playwright-stealth alternative
playwright-stealth is the quickest way to add stealth to Playwright in Python: one wrapper and every page gets a set of JavaScript evasions. But the evasions are overrides on a stock browser, and its own maintainer calls it a proof of concept. Clearcote sets those values natively in the engine instead, so there is no override for a page to find.
What is playwright-stealth?
playwright-stealth is a Python port of puppeteer-extra-plugin-stealth for Playwright. The original port by AtuboDad has not been updated since 2023; the PyPI name is now carried by a maintained fork (Mattwmaster58), which released 2.0 with a cleaner API and merged some of the outstanding pull requests (latest release 2.0.3, April 2026). It is MIT-licensed and very widely used: roughly 3 million PyPI downloads a month.
It works mainly by registering init scripts on every context, each patching one tell: navigator.webdriver, navigator.languages, plugins, the WebGL vendor, chrome.runtime and so on. The maintainer is candid about the ceiling. The README says not to expect it to bypass anything but the simplest bot detection, and describes it as a starting point. The reasons are structural: a JavaScript override can be caught with Function.prototype.toString or a property-descriptor check, the page's init scripts don't reach Web Workers, and while its wrapper also sets a couple of launch flags and the User-Agent and Sec-CH-UA headers, nothing in the package touches the Playwright driver's own CDP side effects or the TLS handshake.
Clearcote vs playwright-stealth
| Feature | Clearcote | playwright-stealth |
|---|---|---|
| Approach | Engine-level C++ patches: native values | JavaScript init scripts on a stock browser |
| Detectable seam | None: native in the page, iframes and workers | Overrides visible via toString, descriptors and worker re-reads |
| Fingerprint identity | Coherent persona from one seed (canvas, WebGL, fonts, navigator) | A few hand-set values over the host's real ones |
| Driver / CDP side effects | Held back at launch (isolated worlds) and in the engine | Not addressed; stock Playwright driver |
| TLS / network coherence | ClientHello follows the claimed Chrome version | TLS not addressed; sets the User-Agent and Sec-CH-UA headers only |
| Framework | Playwright & Puppeteer (Python, Node, .NET) | Playwright (Python) |
| Setup | Swap the browser binary | Wrap Playwright in one line |
| Cost | Open build free; latest build free with GitHub; Pro $49/mo | Free & open (MIT) |
Comparison compiled November 2026. playwright-stealth is open source (mit); details change — check its project for the latest.
Measured: 12 tools on the same 10 sites
We ran the open-source browsers-benchmark harness 5 times, finishing on 27 October 2026. Each tool ran on its own US residential IP, in a different order each run. A pass means the harness's own check for that site found the page itself, not a block or challenge page. Clearcote measured on a Windows desktop (latest build); other tools on a Linux server.
The harness tests tf-playwright-stealth, a fork of playwright-stealth; its rows are marked.
| Tool | Headed | Headless |
|---|---|---|
| Clearcote0.63.2 · r52 | 78%39/50 | 80%40/50 |
| Camoufox0.5.8 · v156.0.1-beta.36 | 72%36/50 | 80%40/50 |
| Invisible Playwright0.43.0 · Firefox | 76%38/50 | 78%39/50 |
| CloakBrowser0.6.4 | 74%37/50 | 64%32/50 |
| SeleniumBase (CDP mode)4.49.0 · Chrome | 74%37/50 | — |
| nodriver0.50.6 · Chrome | 74%37/50 | 40%20/50 |
| Zendriver0.17.1 · Chrome | 64%32/50 | 60%30/50 |
| tf-playwright-stealth (Firefox)1.2.0 | 58%29/50 | 62%31/50 |
| tf-playwright-stealth (Chromium)1.2.0 | 56%28/50 | 50%25/50 |
| Playwright (Chromium)1.62.0 | 56%28/50 | 30%15/50 |
| Playwright (Firefox)1.62.0 | 54%27/50 | 54%27/50 |
| Patchright1.64.3 · Chrome | 24%12/50 | 26%13/50 |
Sites: a search results page, a community forum, a software company's site, a luxury retailer, a marketplace product page, a ticketing site, a fashion retailer, a travel booking site, an airline, a social network. This is a snapshot from one network and one week: results move with every release, every proxy and the sites themselves, and no tool loaded every site every time. Raw results (JSON).
Why teams pick Clearcote
Native, not overridden
Every playwright-stealth evasion replaces a real browser function with a JavaScript one, and that replacement is observable. Clearcote changes the value inside Chromium, so the function a page inspects is the real native one.
The same answer in every realm
Init scripts patch the page. Re-read the same value from a Web Worker or a fresh iframe and you get the unpatched original. Engine-level values agree everywhere.
A whole identity, not a handful of fields
One --fingerprint seed produces a consistent machine across canvas, WebGL, audio, fonts, screen and hardware, instead of a few overrides layered on top of the real host.
Keep your Playwright code
Clearcote is a Chromium binary. Point executable_path at it, or use the SDK's launch(), and the rest of your Playwright script stays the same.
When playwright-stealth might be the better pick
- You want to try something in five minutes on a lenient target and don't want to manage a browser binary.
- Your targets only check the obvious tells like
navigator.webdriver. - You already run Clearcote and want to know if you still need it: you don't. Its evasions duplicate values the engine already sets, and adding JavaScript overrides on top brings back the seam the engine removes.
FAQ
Does playwright-stealth still work?
It still installs and runs, and the maintained fork's latest release is 2.0.3 (April 2026). Whether it is enough depends on the target. Its own README warns it only handles the simplest detection, because JavaScript overrides can be detected and it leaves the driver and the TLS layer unchanged.
What is the difference between playwright-stealth and Clearcote?
playwright-stealth injects JavaScript into a stock Chromium to override a set of values. Clearcote is a modified Chromium where those values are native, consistent across frames and workers, with a matching TLS fingerprint underneath. You drive both with ordinary Playwright.
Should I use playwright-stealth together with Clearcote?
No. The engine already reports coherent values, and layering JavaScript overrides on top replaces native functions with detectable ones. Launch Clearcote with plain Playwright.
Is there a playwright-stealth for Node.js?
The Node equivalent is playwright-extra with the puppeteer-extra stealth plugin, which has the same JavaScript-override design. Clearcote works the same way from Python, Node and .NET.
More than twice the patches of any fork we compared.
Patches compiled into Chromium, by approach. Script-based tools don't change the engine at all.
Stealth plugins
e.g. puppeteer-extra-plugin-stealth
Patched drivers
e.g. undetected-chromedriver, nodriver
Other Chromium forks
free and paid builds
Clearcote Pro
r57, Chromium 156
Published patch counts, October 2026. The range covers other forks' free and paid builds; Clearcote's is the Pro build.
365 checks, free, on your own browser
The fingerprint test every Clearcote build is held to. Run it on whatever you use today and compare.
Run the testThe open build's patches are public
The free open build is BSD-3, reproducible from source and needs no account. The Pro build adds private patches on top.
Open on GitHub57 engine releases, 7 Chromium majors
Every patch is carried to each new Chromium. The latest build gets new majors the day they ship.
See the releasesRelated reading
Try the open-source Chromium alternative
Free and open source, a drop-in for Playwright & Puppeteer, coherent down to the TLS handshake.
Free for one browser: GitHub, a card check or a company Google account. Never charged.