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 mid-2024; the PyPI name is now carried by an actively maintained fork (Mattwmaster58), which released 2.0 with a cleaner API and merged the outstanding pull requests. It is MIT-licensed and very widely used: roughly 2.4 million PyPI downloads a month.
It works 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 nothing in the package touches the Playwright driver's own CDP side effects or the network layer.
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 | Not addressed |
| 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 September 2026. playwright-stealth is open source (mit); details change — check its project for the latest.
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 (2.x) is updated. 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 network layers 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.
Related 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 with GitHub. No card.