Canvas, WebGL, audio, fonts, GPU, screen, WebRTC, network timing, automation signals, CDP input behavior
Human-like mouse curves, keyboard timing, and scroll patterns. One flag, behavioral detection passes
Human-level, server-verified. Passes Cloudflare Turnstile, FingerprintJS, BrowserScan — tested against 30+ detection sites
Same API as Playwright/Puppeteer. Just swap the import. 3 lines of code, 30 seconds to unblock
Background update checks, always on the latest stealth build. No manual updates needed
No subscriptions, no usage limits. MIT license. Just pip install cloakbrowser or npm install cloakbrowser
All tests verified against live detection services. Last tested: Apr 2026 (Chromium 146)
| Detection Service | Stock Playwright | CloakBrowser | Notes |
|---|---|---|---|
| reCAPTCHA v3 | 0.1 (bot) | 0.9 (human) | Server-side verified |
| Cloudflare Turnstile (non-interactive) | FAIL | PASS | Auto-resolve |
| Cloudflare Turnstile (managed) | FAIL | PASS | Single click |
| ShieldSquare | BLOCKED | PASS | Production site |
| FingerprintJS bot detection | DETECTED | PASS | demo.fingerprint.com |
| BrowserScan bot detection | DETECTED | NORMAL (4/4) | browserscan.net |
| bot.incolumitas.com | 13 fails | 1 fail | WEBDRIVER spec only |
| deviceandbrowserinfo.com | 6 true flags | 0 true flags | isBot: false |
| navigator.webdriver | true | false | Source-level patch |
| navigator.plugins.length | 0 | 5 | Real plugin list |
| window.chrome | undefined | object | Present like real Chrome |
| UA string | HeadlessChrome | Chrome/146.0.0.0 | No headless leak |
reCAPTCHA v3 score 0.9 — server-side verified (human-level)
Cloudflare Turnstile non-interactive challenge — auto-resolved
BrowserScan bot detection — NORMAL (4/4 checks passed)
FingerprintJS web-scraping demo — data served, not blocked
deviceandbrowserinfo.com behavioral bot detection — "You are human!" with humanize=True (24/24 signals passed)
| Feature | Playwright | playwright-stealth | undetected-chromedriver | Camoufox | CloakBrowser |
|---|---|---|---|---|---|
| reCAPTCHA v3 score | 0.1 | 0.3-0.5 | 0.3-0.7 | 0.7-0.9 | 0.9 |
| Cloudflare Turnstile | Fail | Sometimes | Sometimes | Pass | Pass |
| Patch level | None | JS injection | Config patches | C++ (Firefox) | C++ (Chromium) |
| Survives Chrome updates | N/A | Breaks often | Breaks often | Yes | Yes |
| Maintained | Yes | Stale | Stale | Unstable | Active |
| Browser engine | Chromium | Chromium | Chrome | Firefox | Chromium |
| Playwright API | Native | Native | No (Selenium) | No | Native |
pip install cloakbrowser or npm install cloakbrowser
Binary auto-downloads for your platform (Chromium 146)
Playwright or Puppeteer starts with our binary + stealth args
Standard Playwright/Puppeteer API, nothing new to learn
Cloudflare Turnstile — 3 live tests passing (headed mode, macOS)
# Basic — headless, default stealth config from cloakbrowser import launch browser = launch() # Headed mode (see the browser window) browser = launch(headless=False) # With proxy (HTTP or SOCKS5) browser = launch(proxy="http://user:pass@proxy:8080") browser = launch(proxy="socks5://user:pass@proxy:1080") # With human-like behavior browser = launch(humanize=True) # Auto-detect timezone/locale from proxy IP browser = launch(proxy="http://proxy:8080", geoip=True) # Persistent profile (cookies, localStorage survive restarts) from cloakbrowser import launch_persistent_context ctx = launch_persistent_context("./my-profile")
// With Playwright import { launch } from 'cloakbrowser'; const browser = await launch({ headless: false, proxy: 'http://user:pass@proxy:8080', geoip: true, humanize: true, }); // With Puppeteer import { launch } from 'cloakbrowser/puppeteer'; const browser = await launch({ headless: true });
# Docker docker run --rm cloakhq/cloakbrowser cloaktest # Python from cloakbrowser import launch browser = launch() page = browser.new_page() page.goto("https://example.com") browser.close() # JavaScript import { launch } from 'cloakbrowser'; const browser = await launch(); const page = await browser.newPage(); await page.goto("https://example.com"); await browser.close();