CloakBrowser

Stealth Chromium that passes every bot detection test.
Drop-in Playwright/Puppeteer replacement. Same API, same code — just swap the import. 3 lines of code, 30 seconds to unblock.
- 48 source-level C++ patches — canvas, WebGL, audio, fonts, GPU, screen, WebRTC, network timing, automation signals
- 0.9 reCAPTCHA v3 score — human-level, server-verified
- Passes Cloudflare Turnstile, FingerprintJS, BrowserScan — tested against 30+ detection sites
npm install cloakbrowser — binary auto-downloads, auto-updates, zero config
- Free and open source — no subscriptions, no usage limits
- Works with any framework — tested with browser-use, Crawl4AI, Scrapling, Stagehand (example), LangChain, Selenium, and more
Install
npm install cloakbrowser playwright-core
npm install cloakbrowser puppeteer-core
On first launch, the stealth Chromium binary auto-downloads (~200MB, cached at ~/.cloakbrowser/).
Usage
Playwright (default)
import { launch } from 'cloakbrowser';
const browser = await launch();
const page = await browser.newPage();
await page.goto('https://protected-site.com');
console.log(await page.title());
await browser.close();
Puppeteer
Note: Playwright is recommended for sites with reCAPTCHA Enterprise. Puppeteer's CDP protocol leaks automation signals that reCAPTCHA Enterprise can detect. This is a known Puppeteer limitation, not specific to CloakBrowser.
import { launch } from 'cloakbrowser/puppeteer';
const browser = await launch();
const page = await browser.newPage();
await page.goto('https://protected-site.com');
console.log(await page.title());
await browser.close();
Options
import { launch, launchContext, launchPersistentContext } from 'cloakbrowser';
const browser = await launch({
proxy: 'http://user:pass@proxy:8080',
});
const browser = await launch({
proxy: { server: 'http://proxy:8080', bypass: '.google.com', username: 'user', password: 'pass' },
});
const browser = await launch({ headless: false });
const browser = await launch({
args: ['--fingerprint=12345'],
});
const browser = await launch({
timezone: 'America/New_York',
locale: 'en-US',
});
const browser = await launch({
proxy: 'http://proxy:8080',
geoip: true,
});
const context = await launchContext({
userAgent: 'Custom UA',
viewport: { width: 1920, height: 1080 },
locale: 'en-US',
timezone: 'America/New_York',
});
const ctx = await launchPersistentContext({
userDataDir: './chrome-profile',
headless: false,
proxy: 'http://user:pass@proxy:8080',
});
const page = ctx.pages()[0] || await ctx.newPage();
await page.goto('https://example.com');
await ctx.close();
Auto Timezone/Locale from Proxy IP
When using a proxy, antibot systems check that your browser's timezone and locale match the proxy's location. Install mmdb-lib to enable auto-detection from an offline GeoIP database (~70 MB, downloaded on first use):
npm install mmdb-lib
const browser = await launch({ proxy: 'http://proxy:8080', geoip: true });
const context = await launchContext({ proxy: 'http://proxy:8080', geoip: true });
const browser = await launch({ proxy: 'http://proxy:8080', geoip: true, timezone: 'Europe/London' });
Note: For rotating residential proxies, the DNS-resolved IP may differ from the exit IP. Pass explicit timezone/locale in those cases.
CLI
Pre-download the binary or check installation status from the command line:
npx cloakbrowser install
npx cloakbrowser info
npx cloakbrowser update
npx cloakbrowser clear-cache
Utilities
import { ensureBinary, clearCache, binaryInfo, checkForUpdate } from 'cloakbrowser';
await ensureBinary();
console.log(binaryInfo());
clearCache();
const newVersion = await checkForUpdate();
if (newVersion) console.log(`Updated to ${newVersion}`);
Test Results
| reCAPTCHA v3 | 0.1 (bot) | 0.9 (human) |
| Cloudflare Turnstile | FAIL | PASS |
| FingerprintJS | DETECTED | PASS |
| BrowserScan | DETECTED | NORMAL (4/4) |
| bot.incolumitas.com | 13 fails | 1 fail |
navigator.webdriver | true | false |
| CDP detection | Detected | Not detected |
| TLS fingerprint | Mismatch | Identical to Chrome |
| | Tested against 30+ detection sites |
Configuration
CLOAKBROWSER_BINARY_PATH | — | Skip download, use a local Chromium binary |
CLOAKBROWSER_CACHE_DIR | ~/.cloakbrowser | Binary cache directory |
CLOAKBROWSER_DOWNLOAD_URL | cloakbrowser.dev | Custom download URL |
CLOAKBROWSER_AUTO_UPDATE | true | Set to false to disable background update checks |
CLOAKBROWSER_SKIP_CHECKSUM | false | Set to true to skip SHA-256 verification after download |
Migrate From Playwright
- import { chromium } from 'playwright';
- const browser = await chromium.launch();
+ import { launch } from 'cloakbrowser';
+ const browser = await launch();
const page = await browser.newPage();
// ... rest of your code works unchanged
Platforms
| Linux x86_64 | 145 | 48 | ✅ Latest |
| Linux arm64 (RPi, Graviton) | 145 | 48 | ✅ Latest |
| macOS arm64 (Apple Silicon) | 145 | 26 | ✅ Latest |
| macOS x86_64 (Intel) | 145 | 26 | ✅ Latest |
| Windows x86_64 | 145 | 48 | ✅ Latest |
Requirements
- Node.js >= 18
- One of:
playwright-core >= 1.40 or puppeteer-core >= 21
Troubleshooting
Site detects incognito / private browsing mode
By default, launch() opens an incognito context. Some sites (like BrowserScan) detect this. Use launchPersistentContext() instead — it runs with a real user profile:
import { launchPersistentContext } from 'cloakbrowser';
const ctx = await launchPersistentContext({
userDataDir: './my-profile',
headless: false,
});
This also gives you cookie and localStorage persistence across sessions.
reCAPTCHA v3 scores are low (0.1–0.3)
Avoid page.waitForTimeout() — it sends CDP protocol commands that reCAPTCHA detects. Use native sleep instead:
await page.waitForTimeout(3000);
await new Promise(r => setTimeout(r, 3000));
Other tips for maximizing reCAPTCHA scores:
New update broke something? Roll back to the previous version
When auto-update downloads a newer binary, the previous version stays in ~/.cloakbrowser/. Point CLOAKBROWSER_BINARY_PATH to the older cached binary:
export CLOAKBROWSER_BINARY_PATH=~/.cloakbrowser/chromium-145.0.7632.159.2/chrome
export CLOAKBROWSER_BINARY_PATH=~/.cloakbrowser/chromium-145.0.7632.109.2/Chromium.app/Contents/MacOS/Chromium
set CLOAKBROWSER_BINARY_PATH=%USERPROFILE%\.cloakbrowser\chromium-145.0.7632.159.7\chrome.exe
Links
License
- Wrapper code (this repository) — MIT. See LICENSE.
- CloakBrowser binary (compiled Chromium) — free to use, no redistribution. See BINARY-LICENSE.md.
Use against financial, banking, healthcare, or government authentication systems without authorization is expressly prohibited.