CloakHQ/CloakBrowserPublic

Stealth Chromium that passes every bot detection test. Drop-in Playwright replacement with source-level fingerprint patches. 30/30 tests passed.

AI summary: A privacy-first web browser designed to seamlessly bypass anti-bot protections and tracking.

Stars
29.7K
+62 today
Forks
2.4K
Watchers
139
Open issues
165
Open PRs
20
Contributors
~19
Commits
277
Branches
11

PythonMITCreated Feb 22, 2026Last push 1d agoLatest release chromium-v150.0.7871.114.4-pro+314 stars this week+369 this month

Star history

since Feb 22, 2026
010K20KFeb 2026Apr 2026Jun 2026Aug 2026
29.7K stars as of Aug 6, 2026, tracked back to Feb 22, 2026. Historical curve reconstructed from public GitHub event archives, calibrated to the current total.

Contribution activity

commits per day, last 52 weeks
AugSepOctNovDecJanFebMarAprMayJunJulAugMonWedFri2025-08-09: 0 commits2025-08-10: 0 commits2025-08-11: 0 commits2025-08-12: 0 commits2025-08-13: 0 commits2025-08-14: 0 commits2025-08-15: 0 commits2025-08-16: 0 commits2025-08-17: 0 commits2025-08-18: 0 commits2025-08-19: 0 commits2025-08-20: 0 commits2025-08-21: 0 commits2025-08-22: 0 commits2025-08-23: 0 commits2025-08-24: 0 commits2025-08-25: 0 commits2025-08-26: 0 commits2025-08-27: 0 commits2025-08-28: 0 commits2025-08-29: 0 commits2025-08-30: 0 commits2025-08-31: 0 commits2025-09-01: 0 commits2025-09-02: 0 commits2025-09-03: 0 commits2025-09-04: 0 commits2025-09-05: 0 commits2025-09-06: 0 commits2025-09-07: 0 commits2025-09-08: 0 commits2025-09-09: 0 commits2025-09-10: 0 commits2025-09-11: 0 commits2025-09-12: 0 commits2025-09-13: 0 commits2025-09-14: 0 commits2025-09-15: 0 commits2025-09-16: 0 commits2025-09-17: 0 commits2025-09-18: 0 commits2025-09-19: 0 commits2025-09-20: 0 commits2025-09-21: 0 commits2025-09-22: 0 commits2025-09-23: 0 commits2025-09-24: 0 commits2025-09-25: 0 commits2025-09-26: 0 commits2025-09-27: 0 commits2025-09-28: 0 commits2025-09-29: 0 commits2025-09-30: 0 commits2025-10-01: 0 commits2025-10-02: 0 commits2025-10-03: 0 commits2025-10-04: 0 commits2025-10-05: 0 commits2025-10-06: 0 commits2025-10-07: 0 commits2025-10-08: 0 commits2025-10-09: 0 commits2025-10-10: 0 commits2025-10-11: 0 commits2025-10-12: 0 commits2025-10-13: 0 commits2025-10-14: 0 commits2025-10-15: 0 commits2025-10-16: 0 commits2025-10-17: 0 commits2025-10-18: 0 commits2025-10-19: 0 commits2025-10-20: 0 commits2025-10-21: 0 commits2025-10-22: 0 commits2025-10-23: 0 commits2025-10-24: 0 commits2025-10-25: 0 commits2025-10-26: 0 commits2025-10-27: 0 commits2025-10-28: 0 commits2025-10-29: 0 commits2025-10-30: 0 commits2025-10-31: 0 commits2025-11-01: 0 commits2025-11-02: 0 commits2025-11-03: 0 commits2025-11-04: 0 commits2025-11-05: 0 commits2025-11-06: 0 commits2025-11-07: 0 commits2025-11-09: 0 commits2025-11-10: 0 commits2025-11-11: 0 commits2025-11-12: 0 commits2025-11-13: 0 commits2025-11-14: 0 commits2025-11-15: 0 commits2025-11-16: 0 commits2025-11-17: 0 commits2025-11-18: 0 commits2025-11-19: 0 commits2025-11-20: 0 commits2025-11-21: 0 commits2025-11-22: 0 commits2025-11-23: 0 commits2025-11-24: 0 commits2025-11-25: 0 commits2025-11-26: 0 commits2025-11-27: 0 commits2025-11-28: 0 commits2025-11-29: 0 commits2025-11-30: 0 commits2025-12-01: 0 commits2025-12-02: 0 commits2025-12-03: 0 commits2025-12-04: 0 commits2025-12-05: 0 commits2025-12-06: 0 commits2025-12-07: 0 commits2025-12-08: 0 commits2025-12-09: 0 commits2025-12-10: 0 commits2025-12-11: 0 commits2025-12-12: 0 commits2025-12-13: 0 commits2025-12-14: 0 commits2025-12-15: 0 commits2025-12-16: 0 commits2025-12-17: 0 commits2025-12-18: 0 commits2025-12-19: 0 commits2025-12-20: 0 commits2025-12-21: 0 commits2025-12-22: 0 commits2025-12-23: 0 commits2025-12-24: 0 commits2025-12-25: 0 commits2025-12-26: 0 commits2025-12-27: 0 commits2025-12-28: 0 commits2025-12-29: 0 commits2025-12-30: 0 commits2025-12-31: 0 commits2026-01-01: 0 commits2026-01-02: 0 commits2026-01-03: 0 commits2026-01-04: 0 commits2026-01-05: 0 commits2026-01-06: 0 commits2026-01-07: 0 commits2026-01-08: 0 commits2026-01-09: 0 commits2026-01-10: 0 commits2026-01-11: 0 commits2026-01-12: 0 commits2026-01-13: 0 commits2026-01-14: 0 commits2026-01-15: 0 commits2026-01-16: 0 commits2026-01-17: 0 commits2026-01-18: 0 commits2026-01-19: 0 commits2026-01-20: 0 commits2026-01-21: 0 commits2026-01-22: 0 commits2026-01-23: 0 commits2026-01-24: 0 commits2026-01-25: 0 commits2026-01-26: 0 commits2026-01-27: 0 commits2026-01-28: 0 commits2026-01-29: 0 commits2026-01-30: 0 commits2026-01-31: 0 commits2026-02-01: 0 commits2026-02-02: 0 commits2026-02-03: 0 commits2026-02-04: 0 commits2026-02-05: 0 commits2026-02-06: 0 commits2026-02-07: 0 commits2026-02-08: 0 commits2026-02-09: 0 commits2026-02-10: 0 commits2026-02-11: 0 commits2026-02-12: 0 commits2026-02-13: 0 commits2026-02-14: 0 commits2026-02-15: 0 commits2026-02-16: 0 commits2026-02-17: 0 commits2026-02-18: 0 commits2026-02-19: 0 commits2026-02-20: 0 commits2026-02-21: 0 commits2026-02-22: 3 commits2026-02-23: 5 commits2026-02-24: 1 commit2026-02-25: 2 commits2026-02-26: 2 commits2026-02-27: 7 commits2026-02-28: 2 commits2026-03-01: 5 commits2026-03-02: 7 commits2026-03-03: 6 commits2026-03-04: 10 commits2026-03-05: 10 commits2026-03-06: 3 commits2026-03-07: 1 commit2026-03-08: 5 commits2026-03-09: 2 commits2026-03-10: 4 commits2026-03-11: 4 commits2026-03-12: 2 commits2026-03-13: 2 commits2026-03-14: 2 commits2026-03-15: 7 commits2026-03-16: 0 commits2026-03-17: 0 commits2026-03-18: 1 commit2026-03-19: 0 commits2026-03-20: 0 commits2026-03-21: 0 commits2026-03-22: 0 commits2026-03-23: 0 commits2026-03-24: 0 commits2026-03-25: 0 commits2026-03-26: 0 commits2026-03-27: 1 commit2026-03-28: 0 commits2026-03-29: 5 commits2026-03-30: 2 commits2026-03-31: 1 commit2026-04-01: 0 commits2026-04-02: 2 commits2026-04-03: 0 commits2026-04-04: 0 commits2026-04-05: 3 commits2026-04-06: 3 commits2026-04-07: 5 commits2026-04-08: 0 commits2026-04-09: 8 commits2026-04-10: 5 commits2026-04-11: 1 commit2026-04-12: 1 commit2026-04-13: 0 commits2026-04-14: 0 commits2026-04-15: 1 commit2026-04-16: 3 commits2026-04-17: 0 commits2026-04-18: 1 commit2026-04-19: 0 commits2026-04-20: 0 commits2026-04-21: 0 commits2026-04-22: 0 commits2026-04-23: 0 commits2026-04-24: 0 commits2026-04-25: 0 commits2026-04-26: 0 commits2026-04-27: 5 commits2026-04-28: 4 commits2026-04-29: 0 commits2026-04-30: 0 commits2026-05-01: 1 commit2026-05-02: 0 commits2026-05-03: 0 commits2026-05-04: 0 commits2026-05-05: 0 commits2026-05-06: 1 commit2026-05-07: 1 commit2026-05-08: 0 commits2026-05-09: 0 commits2026-05-10: 2 commits2026-05-11: 7 commits2026-05-12: 3 commits2026-05-13: 2 commits2026-05-14: 0 commits2026-05-15: 2 commits2026-05-16: 1 commit2026-05-17: 0 commits2026-05-18: 3 commits2026-05-19: 1 commit2026-05-20: 2 commits2026-05-21: 2 commits2026-05-22: 0 commits2026-05-23: 0 commits2026-05-24: 5 commits2026-05-25: 2 commits2026-05-26: 2 commits2026-05-27: 1 commit2026-05-28: 0 commits2026-05-29: 1 commit2026-05-30: 0 commits2026-05-31: 0 commits2026-06-01: 0 commits2026-06-02: 0 commits2026-06-03: 0 commits2026-06-04: 0 commits2026-06-05: 0 commits2026-06-06: 0 commits2026-06-07: 0 commits2026-06-08: 0 commits2026-06-09: 3 commits2026-06-10: 0 commits2026-06-11: 0 commits2026-06-12: 0 commits2026-06-13: 0 commits2026-06-14: 0 commits2026-06-15: 1 commit2026-06-16: 0 commits2026-06-17: 0 commits2026-06-18: 0 commits2026-06-19: 0 commits2026-06-20: 4 commits2026-06-21: 1 commit2026-06-22: 3 commits2026-06-23: 8 commits2026-06-24: 3 commits2026-06-25: 0 commits2026-06-26: 2 commits2026-06-27: 0 commits2026-06-28: 3 commits2026-06-29: 4 commits2026-06-30: 0 commits2026-07-01: 1 commit2026-07-02: 2 commits2026-07-03: 1 commit2026-07-04: 3 commits2026-07-05: 2 commits2026-07-06: 0 commits2026-07-07: 1 commit2026-07-08: 2 commits2026-07-09: 5 commits2026-07-10: 0 commits2026-07-11: 1 commit2026-07-12: 0 commits2026-07-13: 0 commits2026-07-14: 1 commit2026-07-15: 2 commits2026-07-16: 1 commit2026-07-17: 0 commits2026-07-18: 1 commit2026-07-19: 0 commits2026-07-20: 0 commits2026-07-21: 1 commit2026-07-22: 6 commits2026-07-23: 5 commits2026-07-24: 2 commits2026-07-25: 2 commits2026-07-26: 2 commits2026-07-27: 4 commits2026-07-28: 1 commit2026-07-29: 1 commit2026-07-30: 2 commits2026-07-31: 2 commits2026-08-01: 0 commits2026-08-02: 0 commits2026-08-03: 0 commits2026-08-04: 2 commits2026-08-05: 5 commits2026-08-06: 0 commits2026-08-07: 0 commits2026-08-08: 0 commits
273 commits in the last yearLessMore

Signals and awards

derived from tracked data
  • Widely adopted

    29,675 stars

  • Actively maintained

    Pushed within 48 hours

  • Permissive license

    MIT

  • Continuous integration

    Automated checks passing

  • Repeat trending

    18 trending appearances

What CloakBrowser does

CloakBrowser is a specialized, open-source web browser engineered for extreme privacy and automated web scraping without detection. It patches standard browser fingerprinting vectors—such as Canvas APIs, WebGL, and User-Agent strings—at the source code level to present completely unique or randomized profiles. Unlike standard browsers with privacy extensions, CloakBrowser natively defeats advanced anti-bot systems (like Cloudflare Turnstile or DataDome) by mimicking human interaction patterns and masking automation frameworks. It is heavily utilized for web scraping, privacy research, and managing multiple isolated online identities.

Data engineers, privacy researchers, and marketers needing robust web automation and identity isolation. Requires familiarity with proxy configuration and web scraping concepts.

  • Native Fingerprint Spoofing: Randomizes or customizes hardware and software fingerprints at the browser engine level.
  • Anti-Bot Evasion: Defeats complex JavaScript challenges and CAPTCHAs natively.
  • Isolated Profiles: Manages completely separate browser sessions with distinct cookies, local storage, and fingerprints.
  • Automation Ready: Seamlessly integrates with Puppeteer and Playwright without triggering automation detection flags.
  • Proxy Integration: Built-in support for rotating proxies per profile or individual tab.

Where teams use it

Undetected Web Scraping

Data engineers use the browser to reliably scrape data from websites protected by aggressive anti-bot software.

Multi-Account Management

Social media managers and marketers safely manage multiple accounts without linking them via browser fingerprints.

Privacy Research

Security researchers use the tool to analyze how trackers behave when presented with varying browser characteristics.

Automated Testing

QA teams run end-to-end tests on production sites without their traffic being blocked or flagged by WAFs.

Getting started: Download the pre-compiled binary for your OS, or launch via Docker and connect your automation script to the debugging port.

README

main branch

CloakBrowser

PyPI npm License Last Commit
Stars PyPI Downloads npm Downloads Docker Pulls


Stealth Chromium that passes every bot detection test.

Not a patched config. Not a JS injection. A real Chromium binary with fingerprints modified at the C++ source level. Antibot systems score it as a normal browser — because it is a normal browser.

Cloudflare Turnstile — 3 Tests Passing
Cloudflare Turnstile — 3 live tests passing (headed mode, macOS)


Drop-in Playwright/Puppeteer replacement for Python and JavaScript.
Same API, same code — just swap the import. 3 lines of code, 30 seconds to unblock.

  • 71 source-level C++ patches — canvas, WebGL, audio, fonts, GPU, screen, WebRTC, network timing, automation signals, CDP input behavior
  • humanize=True — human-like mouse curves, keyboard timing, and scroll patterns. One flag, behavioral detection passes
  • Pro: 0.9 reCAPTCHA v3 score — human-level, server-verified
  • Passes Cloudflare Turnstile, FingerprintJS, BrowserScan — tested against 30+ detection sites
  • Auto-downloads the right binary — free or Pro based on your license
  • pip install cloakbrowser or npm install cloakbrowser — binary auto-downloads, zero config
  • Latest binary, free to trysign in with GitHub, point the newest build at your hardest target, scale to thousands of sessions on Pro

Try it now — no install needed:

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 (Playwright):

import { launch } from 'cloakbrowser';

const browser = await launch();
const page = await browser.newPage();
await page.goto('https://example.com');
await browser.close();

Also works with Puppeteer: import { launch } from 'cloakbrowser/puppeteer' (details)

For sites with anti-bot protection, add a residential proxy and these flags:

browser = launch(
    proxy="http://user:pass@residential-proxy:port",  # residential IP, not datacenter
    geoip=True,       # match timezone + locale to proxy IP
    headless=False,    # some sites detect headless even with C++ patches
    humanize=True,     # human-like mouse, keyboard, scroll
)
const browser = await launch({
    proxy: 'http://user:pass@residential-proxy:port',
    geoip: true,
    headless: false,
    humanize: true,
});

See Troubleshooting for site-specific issues (FingerprintJS, Kasada, reCAPTCHA).

Install

Python:

pip install cloakbrowser

JavaScript / Node.js:

# With Playwright
npm install cloakbrowser playwright-core

# With Puppeteer
npm install cloakbrowser puppeteer-core

.NET / C#:

dotnet add package CloakBrowser

Community-maintained .NET client built on Microsoft.Playwright. See dotnet/README.md for the full API.


On first run, the stealth Chromium binary is automatically downloaded (~200MB, cached locally).

Optional: Auto-detect timezone/locale from proxy IP:

pip install 'cloakbrowser[geoip]'

Migrating from Playwright? One-line change:

- from playwright.sync_api import sync_playwright
- pw = sync_playwright().start()
- browser = pw.chromium.launch()
+ from cloakbrowser import launch
+ browser = launch()

page = browser.new_page()
page.goto("https://example.com")
# ... rest of your code works unchanged

Star to show support — Watch releases to get notified when new builds drop.


Latest: v0.5.5 — 71 source-level stealth patches (Chromium 150.0.7871.114.3 — all platforms)

  • CloakBrowser Pro — the latest binary (Chromium 150.0.7871.114.3, 71 source-level patches) is available to Pro subscribers on Linux, Windows, and macOS. Set a license_key (licenseKey in JS) or the CLOAKBROWSER_LICENSE_KEY env var and the wrapper fetches the latest build automatically. See CloakBrowser Pro
  • .NET 8 / C# client — CloakBrowser now ships as a NuGet package (CloakBrowser), mirroring the Python and JS wrappers.
  • 71 fingerprint patches — rendering consistency improvements across Linux and Windows, corrected GPU/display/graphics parameters to match stock Chrome profiles
  • Windows native GPU passthrough — real hardware values pass through directly instead of being spoofed, matching real browser behavior
  • HTTP proxy inline credentials — new network-layer support for proxies with inline authentication
  • extension_paths — load Chrome extensions in all launch functions
  • Humanize actionability — auto-wait for visible, enabled, stable elements before humanized actions
  • Per-call human_config — override humanize settings on individual method calls
  • Composable JS helpersbuildLaunchOptions() and humanizeBrowser() for custom Playwright integrations
  • Native SOCKS5 proxyproxy="socks5://user:pass@host:port" works directly in all launch functions, Python + JS. QUIC/HTTP3 tunnels through SOCKS5 via UDP ASSOCIATE
  • Proxy signal removal — DNS/connect/SSL timing zeroed, proxy cache headers stripped, Proxy-Connection header leak removed
  • Chromium 146 upgrade — rebased all patches from 145.0.7632.x to 146.0.7680.177
  • WebRTC IP spoofing--fingerprint-webrtc-ip=auto resolves your proxy's exit IP and spoofs WebRTC ICE candidates. Auto-injected when using geoip=True (no extra network call)
  • humanize=True — one flag makes all mouse, keyboard, and scroll interactions behave like a real user. Bézier curves, per-character typing, realistic scroll patterns
  • Stealthy with zero flags — binary auto-generates a random fingerprint seed at startup. No configuration required
  • Timezone & locale from proxy IPlaunch(proxy="...", geoip=True) auto-detects timezone and locale
  • Persistent profileslaunch_persistent_context() keeps cookies and localStorage across sessions, bypasses incognito detection

See the full CHANGELOG.md for details.

Why CloakBrowser?

  • Config-level patches breakplaywright-stealth, undetected-chromedriver, and puppeteer-extra inject JavaScript or tweak flags. Every Chrome update breaks them. Antibot systems detect the patches themselves.
  • CloakBrowser patches Chromium source code — fingerprints are modified at the C++ level, compiled into the binary. Detection sites see a real browser because it is a real browser.
  • Source-level stealth — C++ patches handle fingerprints (GPU, screen, UA, hardware reporting) at the binary level. No JavaScript injection, no config-level hacks. Most stealth tools only patch at the surface.
  • Same behavior everywhere — works identically local, in Docker, and on VPS. No environment-specific patches or config needed.
  • Works with AI agents and automation frameworks — drop-in stealth for browser-use, Crawl4AI, Scrapling, Stagehand, LangChain, Selenium, and more. See integrations.

CloakBrowser doesn't solve CAPTCHAs — it prevents them from appearing. No CAPTCHA-solving services, no proxy rotation built in — bring your own proxies, use the Playwright API you already know.

CloakBrowser Pro

Anti-bot systems change every week and an older binary quietly degrades. The latest build is the one that keeps passing. Try it free, then upgrade when you're running for real.

  • Free, latest build (Chromium 150) — the newest binary, the exact one that stays green against live detection. Free with a GitHub sign-in, one concurrent session. Grab your key or run cloakbrowser login, then throw it at your hardest target.
  • Pro — when it's part of production scraping, QA, monitoring, or automation: scale to 5, 20, 200, 2,000, or more concurrent sessions, always first on the newest patches, with hands-on support. Linux, Windows, macOS. See plans and pricing →
  • v146 — the older build stays free on GitHub Releases. A quick first look, but it ages fast as detection evolves.
cloakbrowser login          # GitHub sign-in for a free key, or paste a paid key
# ...or set it directly (env var, license_key= param, or ~/.cloakbrowser/license.key):
export CLOAKBROWSER_LICENSE_KEY=cb_xxxxxxxx

Try the latest free → cloakbrowser.dev/free · Scale up on Pro → cloakbrowser.dev

Test Results

All tests verified against live detection services. Results below are for the latest Pro/current build unless noted. Last tested: Jul 2026 (Chromium 150).

Detection Service Stock Playwright CloakBrowser Notes
reCAPTCHA v3 0.1 (bot) 0.9 (human) Pro/current build; 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 Pro/current build; 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
CDP detection Detected Not detected isAutomatedWithCDP: false
TLS fingerprint Mismatch Identical to Chrome ja3n/ja4/akamai match
Tested against 30+ detection sites

Proof

reCAPTCHA v3 — Score 0.9
Pro/latest build: reCAPTCHA v3 score 0.9 — server-side verified (human-level)

Cloudflare Turnstile — Success
Cloudflare Turnstile non-interactive challenge — auto-resolved

BrowserScan — Normal
BrowserScan bot detection — NORMAL (4/4 checks passed)

FingerprintJS — Passed
Pro/latest build: FingerprintJS web-scraping demo — data served, not blocked

deviceandbrowserinfo.com — You are human!
deviceandbrowserinfo.com behavioral bot detection — "You are human!" with humanize=True (24/24 signals passed)

Comparison

Feature Playwright playwright-stealth undetected-chromedriver CloakBrowser
reCAPTCHA v3 score (Pro/current) 0.1 0.3-0.5 0.3-0.7 0.9
Cloudflare Turnstile Fail Sometimes Sometimes Pass
Headless / Docker detection Flagged Flagged Flagged Passes
Patch level None JS injection Config patches C++ (Chromium)
Survives Chrome updates N/A Breaks often Breaks often Yes
Maintained Yes Stale Stale Active
Browser engine Chromium Chromium Chrome Chromium
Playwright API Native Native No (Selenium) Native

How It Works

CloakBrowser is a thin wrapper (Python + JavaScript) around a custom-built Chromium binary:

  1. You installpip install cloakbrowser or npm install cloakbrowser
  2. First launch → binary auto-downloads for your platform (Chromium 146)
  3. Every launch → Playwright or Puppeteer starts with our binary + stealth args
  4. You write code → standard Playwright/Puppeteer API, nothing new to learn

The binary includes 71 source-level patches covering canvas, WebGL, audio, fonts, GPU, screen properties, WebRTC, network timing, hardware reporting, automation signal removal, and CDP input behavior mimicking.

These are compiled into the Chromium binary — not injected via JavaScript, not set via flags.

Binary downloads are verified against a pinned Ed25519 signature on the published checksums before extraction, so the download is confirmed authentic (genuinely ours) and not just intact. A compromised mirror cannot serve a tampered or downgraded binary.

API

launch()

from cloakbrowser import launch

# Basic — headless, default stealth config
browser = launch()

# Headed mode (see the browser window)
browser = launch(headless=False)

# Latest binary — pass a key (free via `cloakbrowser login`, or paid) or set CLOAKBROWSER_LICENSE_KEY
browser = launch(license_key="cb_xxxxxxxx")

# With proxy (HTTP or SOCKS5)
browser = launch(proxy="http://user:pass@proxy:8080")
browser = launch(proxy="socks5://user:pass@proxy:1080")

# With proxy dict (bypass, separate auth fields)
browser = launch(proxy={"server": "http://proxy:8080", "bypass": ".google.com", "username": "user", "password": "pass"})

# With extra Chrome args
browser = launch(args=["--disable-gpu"])

# With timezone and locale (sets binary flags — no detectable CDP emulation)
browser = launch(timezone="America/New_York", locale="en-US")

# Auto-detect timezone/locale from proxy IP (requires: pip install cloakbrowser[geoip])
# Also auto-injects --fingerprint-webrtc-ip to prevent WebRTC IP leaks (no extra cost)
# Note: makes HTTP calls through your proxy to resolve exit IP (ipify.org, checkip.amazonaws.com)
browser = launch(proxy="http://proxy:8080", geoip=True)

# Explicit timezone/locale always win over auto-detection
browser = launch(proxy="http://proxy:8080", geoip=True, timezone="Europe/London")

# WebRTC IP spoofing only (no geoip dep needed — resolves exit IP via HTTP call through proxy)
browser = launch(proxy="http://proxy:8080", args=["--fingerprint-webrtc-ip=auto"])

# Explicit WebRTC IP (no network call)
browser = launch(proxy="http://proxy:8080", args=["--fingerprint-webrtc-ip=1.2.3.4"])

# Human-like mouse, keyboard, and scroll behavior
browser = launch(humanize=True)

# With slower, more deliberate movements
browser = launch(humanize=True, human_preset="careful")

# Without default stealth args (bring your own fingerprint flags)
browser = launch(stealth_args=False, args=["--fingerprint=12345"])

Returns a standard Playwright Browser object. All Playwright methods work: new_page(), new_context(), close(), etc.

launch_async()

import asyncio
from cloakbrowser import launch_async

async def main():
    browser = await launch_async()
    page = await browser.new_page()
    await page.goto("https://example.com")
    print(await page.title())
    await browser.close()

asyncio.run(main())

launch_context()

Convenience function that creates browser + context in one call with user agent, viewport, locale, and timezone:

from cloakbrowser import launch_context

context = launch_context(
    user_agent="Custom UA",
    viewport={"width": 1920, "height": 1080},
    locale="en-US",
    timezone="America/New_York",
)
page = context.new_page()
page.goto("https://protected-site.com")
context.close()

Extra kwargs are forwarded to Playwright's browser.new_context() — use this for storage_state, permissions, extra_http_headers, etc. without needing a persistent profile folder:

from cloakbrowser import launch_context

# Restore a saved session (cookies, localStorage) from a JSON file
context = launch_context(storage_state="state.json")
page = context.new_page()
page.goto("https://example.com")
# Save state back for next run
context.storage_state(path="state.json")
context.close()

launch_context_async()

Async counterpart to launch_context(). Same signature and kwargs forwarding:

import asyncio
from cloakbrowser import launch_context_async

async def main():
    ctx = await launch_context_async(storage_state="state.json")
    page = await ctx.new_page()
    await page.goto("https://example.com")
    await ctx.storage_state(path="state.json")
    await ctx.close()

asyncio.run(main())

launch_persistent_context()

Same as launch_context(), but with a persistent user profile. Cookies, localStorage, and cache persist across sessions.

Use this when you need to:

  • Stay logged in across runs (cookies/sessions survive restarts)
  • Bypass incognito detection (some sites flag empty, ephemeral profiles)
  • Load Chrome extensions (extensions only work from a real user data dir)
  • Build natural browsing history (cached fonts, service workers, IndexedDB accumulate over time, making the profile look more realistic)
  • Play DRM-protected video (Widevine) — with a sideloaded CDM, the wrapper enables Widevine on the first launch (see Widevine / DRM)
from cloakbrowser import launch_persistent_context

# First run — creates the profile
ctx = launch_persistent_context("./my-profile", headless=False)
page = ctx.new_page()
page.goto("https://protected-site.com")
ctx.close()  # profile saved

# Next run — cookies, localStorage restored automatically
ctx = launch_persistent_context("./my-profile", headless=False)

# Load Chrome extensions
ctx = launch_persistent_context(
    "./my-profile",
    headless=False,
    extension_paths=["./my-extension"],
)

Supports all the same options as launch_context(): proxy, user_agent, viewport, locale, timezone, color_scheme, geoip, extension_paths.

Async version: launch_persistent_context_async().

Storage quota and incognito detection: the binary normalizes storage quota by default (this also hides the real disk size). Detectors that infer private/incognito mode from quota — e.g. BrowserScan's incognito check (−10%) — read the default as incognito. Raise it to present as a regular profile:

ctx = launch_persistent_context("./my-profile", args=["--fingerprint-storage-quota=5000"])

Widevine / DRM

The binary is built with Widevine support, but the Widevine CDM is a proprietary Google component we can't redistribute. Get it one of two ways (full background in #96):

Fetch it — no Chrome install needed; pulls the CDM from Google's component server (Linux x86-64 only; SHA-256 + CRX3-signature verified). It lands at ~/.cloakbrowser/WidevineCdm, which the wrapper auto-detects — no env var needed:

python3 bin/fetch-widevine.py

Or copy it from an existing Chrome install, next to the binary:

cp -r /opt/google/chrome/WidevineCdm ~/.cloakbrowser/chromium-<version>/WidevineCdm

(In Docker, just pass -e CLOAKBROWSER_FETCH_WIDEVINE=1 — the entrypoint runs the fetch automatically; see the Docker note below.)

With the CDM in place, launch_persistent_context() enables Widevine on the first launch — the wrapper auto-writes the CDM hint file into the profile, so you don't need the manual two-launch workaround. This lets you play DRM-protected video (e.g. Netflix, Spotify Web).

from cloakbrowser import launch_persistent_context

# WidevineCdm sideloaded next to the binary -> Widevine works on first launch
ctx = launch_persistent_context("./my-profile", headless=False)
  • Linux only. Chromium's hint-file mechanism is Linux/ChromeOS-specific. On Windows the CDM can't initialise (DRM host verification) and macOS uses a different layout, so seeding is a no-op there.
  • Auto by presence. No flag needed — a sideloaded CDM is the opt-in. Point at a CDM in a non-default location with CLOAKBROWSER_WIDEVINE_CDM=/path/to/WidevineCdm, or disable seeding entirely with CLOAKBROWSER_WIDEVINE=0.
  • Docker — auto-fetch (opt-in). No Chrome to copy from inside the image, so the official image can fetch the CDM for you. Run with -e CLOAKBROWSER_FETCH_WIDEVINE=1 and it pulls the CDM from Google's component server (the same source Chrome uses) on first launch, caches it at ~/.cloakbrowser/WidevineCdm in the mounted volume, where the wrapper auto-detects it — for free or Pro binaries, and for docker exec'd scripts alike. Off by default — no network call unless you opt in — and best-effort, so a failed fetch never blocks launch. The download is signature- and checksum-verified before install. Bare-metal Linux users can run the same fetcher directly: python3 bin/fetch-widevine.py (pip-only installs can grab that one self-contained file from the repo).

CLI

Pre-download the binary, diagnose your setup, or manage the cache from the command line:

python -m cloakbrowser login        # Get a free key via GitHub, or save a paid key
python -m cloakbrowser logout        # Remove the saved key (revert to the free binary)
python -m cloakbrowser install      # Download binary with progress output
python -m cloakbrowser info         # Diagnostics: binary that will launch, license tier, env checks
python -m cloakbrowser update       # Check for and download newer binary
python -m cloakbrowser clear-cache  # Remove cached binaries

login with no argument prompts you to paste a license key or press Enter to get a free key via a GitHub sign-in; login <key> saves a key directly. Both validate the key, then store it at ~/.cloakbrowser/license.key so every launch picks it up.

info reports the binary that will actually launch given your license, runs a quick launch test (and flags missing system libraries on Linux), shows your license tier, and checks fonts, GeoIP, and optional dependencies. Add --quick to skip the launch test or --json for machine-readable output. Add --proxy <url> to resolve the exit IP, timezone, and locale a launch would apply through that proxy (the same geoip=True resolution; downloads the GeoIP DB if not cached) — useful for confirming a proxy hands you a timezone/locale that matches its exit IP.

CLOAKBROWSER_RELEASE_CHANNEL=preview also applies to install, info, and update. info shows the exact version that will launch and whether Preview resolved to Stable for the current platform.

The same commands are available via npx cloakbrowser <command> (JS) and the cloakbrowser CLI (.NET).

Utility Functions

from cloakbrowser import binary_info, clear_cache, ensure_binary

# Check binary installation status
print(binary_info())
# {'version': '146.0.7680.177.5', 'platform': 'linux-x64', 'installed': True, ...}

# Force re-download
clear_cache()

# Pre-download binary (e.g., during Docker build)
ensure_binary()

JavaScript / Node.js API

CloakBrowser ships a TypeScript package with full type definitions. Choose Playwright or Puppeteer — same stealth binary underneath.

Playwright (default)

import { launch, launchContext, launchPersistentContext } from 'cloakbrowser';

// Basic
const browser = await launch();

// Pro — use the latest binary (or set CLOAKBROWSER_LICENSE_KEY env var)
const browser = await launch({ licenseKey: 'cb_xxxxxxxx' });

// With options
const browser = await launch({
  headless: false,
  proxy: 'http://user:pass@proxy:8080',
  args: ['--fingerprint=12345'],
  timezone: 'America/New_York',
  locale: 'en-US',
  humanize: true,
});

// Convenience: browser + context in one call
const context = await launchContext({
  userAgent: 'Custom UA',
  viewport: { width: 1920, height: 1080 },
  locale: 'en-US',
  timezone: 'America/New_York',
});
const page = await context.newPage();

// Persistent profile — cookies/localStorage survive restarts, avoids incognito detection
const ctx = await launchPersistentContext({
  userDataDir: './chrome-profile',
  headless: false,
  proxy: 'http://user:pass@proxy:8080',
});

Note: Each example above is standalone — not meant to run as one block.

All Python options work in JS: stealthArgs: false to disable defaults, geoip: true to auto-detect timezone/locale from proxy IP.

Puppeteer

Note: The Playwright wrapper is recommended for sites with reCAPTCHA Enterprise. Puppeteer's CDP protocol leaks automation signals that reCAPTCHA Enterprise can detect, causing intermittent 403 errors. This is a known Puppeteer limitation, not specific to CloakBrowser. Use Playwright for best results.

import { launch } from 'cloakbrowser/puppeteer';

const browser = await launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://example.com');
await browser.close();

Utility Functions (JS)

import { ensureBinary, clearCache, binaryInfo } from 'cloakbrowser';

// Pre-download binary (e.g., during Docker build)
await ensureBinary();

// Check installation status
console.log(binaryInfo());

// Force re-download
clearCache();

Human Behavior

Pass humanize=True to make all mouse, keyboard, and scroll interactions indistinguishable from real users. All Playwright calls (page.click(), page.fill(), page.type(), page.mouse.*, page.keyboard.*, Locator API) and Puppeteer calls (page.click(), page.type(), page.mouse.*, page.keyboard.*, ElementHandle API) are automatically replaced with human-like equivalents. No code changes needed.

browser = launch(humanize=True)
page = browser.new_page()
page.goto("https://example.com")
page.locator("#email").fill("user@example.com")  # per-character timing, thinking pauses
page.locator("button[type=submit]").click()       # Bézier curve, realistic aim point
// Playwright
import { launch } from 'cloakbrowser';
const browser = await launch({ humanize: true });
// Puppeteer
import { launch } from 'cloakbrowser/puppeteer';
const browser = await launch({ humanize: true });

What changes:

Interaction Default With humanize=True
Mouse movement Instant teleport Bézier curve with easing and slight overshoot
Clicks Instant Realistic aim point + hold duration
Keyboard Instant fill Per-character timing, thinking pauses, occasional typos with self-correction
Scroll Jump Accelerate → cruise → decelerate micro-steps
fill() Instant value set Clears existing content, types character by character

Presetsdefault (normal speed) or careful (slower, more deliberate, idle micro-movements between actions):

browser = launch(humanize=True, human_preset="careful")
const browser = await launch({ humanize: true, humanPreset: 'careful' });

Custom config — override any parameter:

browser = launch(humanize=True, human_config={
    "mistype_chance": 0.05,              # 5% typo rate with self-correction
    "typing_delay": 100,                 # slower typing (ms per character)
    "idle_between_actions": True,        # micro-movements between clicks
    "idle_between_duration": [0.3, 0.8], # idle duration range (seconds)
})
const browser = await launch({
    humanize: true,
    humanConfig: {
        mistype_chance: 0.05,
        typing_delay: 100,
        idle_between_actions: true,
        idle_between_duration: [0.3, 0.8],
    }
});

Access the original un-patched Playwright page at page._original if you need raw speed for a specific call.

Note (Playwright): Always use page.click(selector), page.type(selector, text), page.hover(selector), or page.locator(selector).* — these go through the full humanize pipeline. Avoid page.query_selector()ElementHandle objects bypass all patches, so mouse movement teleports, keyboard events fire without timing, and scroll has no human curve.

Note (Puppeteer): Both selector-based methods (page.click(), page.type()) and ElementHandle methods (el.click(), el.type()) are fully humanized. page.$(), page.$$(), and page.waitForSelector() return patched handles automatically.

Contributed by @evelaa123 — full Playwright and Puppeteer API coverage.

Configuration

Env Variable Default Description
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 for binary
CLOAKBROWSER_AUTO_UPDATE true Set to false to disable background update checks
CLOAKBROWSER_SKIP_CHECKSUM false Only applies to a custom CLOAKBROWSER_DOWNLOAD_URL: set to true to skip its checksum check. Signature verification on the official download path is mandatory and cannot be skipped.
CLOAKBROWSER_GEOIP_TIMEOUT_SECONDS 5 Max seconds for GeoIP resolution before continuing without it
CLOAKBROWSER_WIDEVINE_CDM Path to a sideloaded WidevineCdm directory (overrides auto-detection next to the binary). See Widevine / DRM
CLOAKBROWSER_WIDEVINE 1 Set to 0 to disable automatic Widevine hint-file seeding for persistent contexts
CLOAKBROWSER_FETCH_WIDEVINE 0 Docker only: set to 1 to auto-fetch the Widevine CDM on container start (Linux x86-64 only). See Widevine / DRM
CLOAKBROWSER_VERSION Pin to an exact Chromium version for rollback (e.g. 148.0.7778.215.2). Works with Free and Pro binaries
CLOAKBROWSER_RELEASE_CHANNEL stable Set to preview to opt into the Preview binary channel

Fingerprint Management

The binary is stealthy by default — no flags needed. It auto-generates a random fingerprint seed at startup and spoofs all detectable values (GPU, hardware specs, screen dimensions, canvas, WebGL, audio, fonts). Every launch produces a fresh, coherent identity.

How fingerprinting works:

Scenario What happens
No flags Random seed auto-generated at startup. GPU, screen, hardware specs, and all noise patches are spoofed automatically. Fresh identity each launch.
--fingerprint=seed Deterministic identity from the seed. Same seed = same fingerprint across launches. Use this for session persistence (returning visitor).
--fingerprint=seed + explicit flags Explicit flags override individual auto-generated values. The seed fills in everything else.

The binary detects its platform at compile time — a macOS binary reports as macOS with Apple GPU, a Linux binary reports as Linux with NVIDIA GPU. The wrapper overrides this on Linux by passing --fingerprint-platform=windows, so sessions appear as Windows desktops (more common fingerprint, harder to cluster). Use --fingerprint-platform for cross-platform spoofing when running the binary directly.

Tip: Use a fixed seed when revisiting the same site. A random seed makes every session look like a different device — which can be suspicious when hitting the same site repeatedly from the same IP. For reCAPTCHA v3 Enterprise and similar scoring systems, a fixed seed produces a consistent fingerprint across sessions, making you look like a returning visitor:

browser = launch(args=["--fingerprint=12345"])
const browser = await launch({ args: ['--fingerprint=12345'] });

Default Fingerprint

Every launch() call sets these automatically. The wrapper applies platform-aware defaults — on Linux it spoofs as Windows for a more common fingerprint, on macOS it runs as a native Mac browser:

Flag Linux/Windows Default macOS Default Controls
--fingerprint Random (10000–99999) Random (10000–99999) Master seed for canvas, WebGL, audio, fonts, client rects
--fingerprint-platform windows macos navigator.platform, User-Agent OS, GPU pool selection

The binary auto-generates everything else from the seed: GPU, hardware concurrency, device memory, and screen dimensions. Each seed produces a unique, consistent fingerprint. Override with explicit flags if needed.

Using the binary directly? It works out of the box with zero flags -- the binary auto-spoofs everything. Pass --fingerprint=seed for a persistent identity, or use explicit flags like --fingerprint-gpu-renderer to override any auto-generated value.

Additional Flags

Supported by the binary but not set by default — pass via args to customize:

Flag Controls
--fingerprint-gpu-vendor WebGL UNMASKED_VENDOR_WEBGL (auto-generated from seed + platform)
--fingerprint-gpu-renderer WebGL UNMASKED_RENDERER_WEBGL (auto-generated from seed + platform)
--fingerprint-hardware-concurrency navigator.hardwareConcurrency (auto-generated: 8)
--fingerprint-device-memory navigator.deviceMemory in GB (auto-generated: 8)
--fingerprint-screen-width Screen width (auto-generated: 1920 Win/Linux, 1440 macOS)
--fingerprint-screen-height Screen height (auto-generated: 1080 Win/Linux, 900 macOS)
--fingerprint-brand Browser brand: Chrome, Edge, Opera, Vivaldi
--fingerprint-brand-version Brand version (UA + Client Hints)
--fingerprint-platform-version Client Hints platform version
--fingerprint-timezone Timezone (e.g. America/New_York)
--fingerprint-locale Locale (e.g. en-US)
--fingerprint-storage-quota Override storage quota in MB — affects storage.estimate(), storageBuckets, and legacy webkit APIs. Auto-normalized when --fingerprint is set
--fingerprint-taskbar-height Override taskbar height (binary defaults: Win=48, Mac=95, Linux=0)
--fingerprint-windows-font-metrics Chromium 148+ binary only (no-op on earlier builds). Align font metrics with the Windows platform when spoofing Windows on Linux — used in the FingerprintJS config. Requires Windows fonts installed (see Font Setup on Linux); no effect without them
--fingerprint-webrtc-ip WebRTC ICE candidate IP replacement. Use auto to resolve from proxy exit IP (makes an HTTP call through the proxy), or pass an explicit IP. Auto-injected when geoip=True
--fingerprint-noise=false Disable noise injection (canvas, WebGL, audio, client rects) while keeping the deterministic fingerprint seed active
--fingerprint=off Chromium 148+ binary only. Pass-through debug mode — turns spoofing off and presents the machine's real native fingerprint (keeps only the baseline any Chrome needs). The binary strips the injected seed and --fingerprint-platfor

(README truncated)

View on GitHub

Recent activity

commits and pull requests

Recent open issues

view all

Discussions

all 26

Releases and announcements

22 total
  1. Chromium v150.0.7871.114.4 — Stealth Build (Pro)chromium-v150.0.7871.114.4-proJul 31, 202655 downloads

    ## CloakBrowser Pro — Chromium 150.0.7871.114.4 A coherence release on the Chromium 150 line for **Linux (x64 + arm64)**. Windows and macOS stay on the current stable `150.0.7871.114.3`; the fixes below that apply to those platforms ship with their next build. With a valid Pro license, your wrapper picks up this build automatically within the hour on Linux. Get Pro at **https://cloakbrowser.dev**. ### What's changed in the binary 73 source-level patches (up from 71). Everything here is coherence work — making the spoofed identity hold together more tightly across frames, launch modes, seeds, and locales. - **Consistent identity under CDP user-agent overrides** — subframes no longer disagree with the top frame about the browser identity when a custom user agent is set over CDP. Mainly affects Puppeteer, which sets one on every page session. - **Closer Windows persona text rendering** — font availability and text measurements track a real Windows install more closely. - **Complete locale coverage** — every supported locale now resolves to a coherent profile, with Greek (`el-GR`, `el-CY`) added. - **Headed window geometry coherence** on the Windows persona; headless is unchanged.

  2. Chromium v150.0.7871.114.3 — Stealth Build (Pro)chromium-v150.0.7871.114.3-proJul 18, 2026165 downloads

    ## CloakBrowser Pro — Chromium 150.0.7871.114.3 The Pro line moves to **Chromium 150**, available on **all five platforms** at once — Linux x64, Linux arm64, Windows x64, macOS arm64, and macOS x64. With a valid Pro license, your wrapper picks up this build automatically within the hour. Get Pro at **https://cloakbrowser.dev**. ### What's changed in the binary 71 source-level patches. A full rebase onto the Chromium 150 line with the complete patch set ported forward, plus a round of coherence work. Moving from the previous stable, this covers everything since `148.0.7778.215.5`. - **Closer alignment with a real Chrome install** across speech and language profiles, font handling, storage reporting, Windows system colors and selection rendering, and graphics parameters. - **Coherent Apple Silicon profiles** — chip, memory, screen, display scaling, and graphics limits are chosen together as one plausible Mac rather than independently, and display characteristics hold together across headed and headless launches. - **Puppeteer fix** — `navigator.userAgentData` now reports coherent brands and versions under `puppeteer-core`, which previously could come back blank. - **More self-co

  3. Chromium v148.0.7778.215.5 — Stealth Build (Pro)chromium-v148.0.7778.215.5-proJul 5, 2026176 downloads

    ## CloakBrowser Pro — Chromium 148.0.7778.215.5 The latest Pro build — the biggest fingerprint update yet — now on **Windows and Linux** (x64 + arm64). macOS follows shortly. With a valid Pro license, your wrapper picks up this build automatically within the hour. Get Pro at **https://cloakbrowser.dev**. ### What's changed in the binary - **More common, more coherent hardware identities** — each `--fingerprint` seed is built from the most common real-world hardware values (screen, GPU, RAM, CPU cores, color depth, fonts, audio), chosen together so they form a popular, self-consistent device with no internal contradictions. - **Deeper, more consistent Windows persona** — expanded and localized font populations, tighter graphics/display alignment, and seed-coherent screen, color depth, and audio across browser- and OS-level signals. - **Expanded NVIDIA GPU profiles**, each matched to a plausible CPU, RAM, and screen combination. - **Window and screen geometry coherence** in both headed and headless modes (pairs with the wrapper's new maximized-window default). - **Greater WebGL and WebGPU realism**, including consistent behavior under timing inspection. - **Cleaner proxy behavior

  4. Chromium v148.0.7778.215.3 — Stealth Build (Pro)chromium-v148.0.7778.215.3-proJun 27, 2026156 downloads

    ## CloakBrowser Pro — Chromium 148.0.7778.215.3 The latest Pro build, with fingerprint and consistency improvements across **Linux, Windows, and macOS** (Apple Silicon + Intel). With a valid Pro license, your wrapper picks up this build automatically within the hour. Get Pro at **https://cloakbrowser.dev**. ### What's changed in the binary - Fingerprint refinements and cross-platform alignment so every platform reports a coherent, real-looking profile. ### New in the wrapper (v0.4.4) - **Version pinning / rollback** — pin an exact Chromium build with `browser_version=` (`browserVersion` in JS, `BrowserVersion` in .NET) or the `CLOAKBROWSER_VERSION` env var. If a new build ever regresses on one of your sites, roll back to the previous one instantly. Works for Free and Pro. - Per-OS version resolution, so a release for one platform no longer affects the others. ```bash pip install -U cloakbrowser # Python npm update cloakbrowser # JavaScript dotnet add package CloakBrowser # .NET ``` ### Roll back to the previous build ```python launch(license_key="cb_...", browser_version="148.0.7778.215.2") ``` ```bash CLOAKBROWSER_VERSION=148.0.7778.215.2 # env var,

  5. Chromium v148.0.7778.215.2 — Stealth Build (Pro)chromium-v148.0.7778.215.2-proJun 22, 202642 downloads

    ## Stealth Chromium Build: CloakBrowser Pro The first **CloakBrowser Pro** build: Chromium `148.0.7778.215.2` with **59 source-level fingerprint patches**. Anti-bot vendors fingerprint your Chromium version. Running 148 keeps you matched to the current Chrome wave instead of standing out on an aging build. **v146 stays free forever** on GitHub Releases and the wrapper (Python + JS) stays MIT. Pro is the latest build; the previous major version is always free. When the next major Chromium ships, **v148 rolls down to free**. Early-adopter pricing is live → https://cloakbrowser.dev ### What's new in 148 - Rebased the full patch set across two Chromium major versions (146 → 147 → 148), re-applying every patch to current Chromium internals, so your browser version matches what real Chrome users run today - Cross-API fingerprint consistency improvements for Chromium 148 profiles - WebRTC fingerprint hardening: network signals matched to real Chrome - Font metric alignment for Windows profiles via the opt-in `--fingerprint-windows-font-metrics` flag (requires Windows fonts installed) - **macOS now available** — Apple Silicon and Intel, with native real-GPU and locale handling ### I

Code frequency

additions and deletions
+15.9K-15.9KWeek of 2026-02-22: +7,729 linesWeek of 2026-02-22: -309 linesWeek of 2026-03-01: +5,596 linesWeek of 2026-03-01: -820 linesWeek of 2026-03-08: +7,217 linesWeek of 2026-03-08: -393 linesWeek of 2026-03-15: +196 linesWeek of 2026-03-15: -43 linesWeek of 2026-03-22: +28 linesWeek of 2026-03-22: -22 linesWeek of 2026-03-29: +1,150 linesWeek of 2026-03-29: -196 linesWeek of 2026-04-05: +10,094 linesWeek of 2026-04-05: -360 linesWeek of 2026-04-12: +832 linesWeek of 2026-04-12: -64 linesWeek of 2026-04-19: +0 linesWeek of 2026-04-19: -0 linesWeek of 2026-04-26: +2,283 linesWeek of 2026-04-26: -317 linesWeek of 2026-05-03: +12 linesWeek of 2026-05-03: -6 linesWeek of 2026-05-10: +3,585 linesWeek of 2026-05-10: -689 linesWeek of 2026-05-17: +3,104 linesWeek of 2026-05-17: -250 linesWeek of 2026-05-24: +1,668 linesWeek of 2026-05-24: -720 linesWeek of 2026-05-31: +0 linesWeek of 2026-05-31: -0 linesWeek of 2026-06-07: +212 linesWeek of 2026-06-07: -11 linesWeek of 2026-06-14: +463 linesWeek of 2026-06-14: -195 linesWeek of 2026-06-21: +15,874 linesWeek of 2026-06-21: -573 linesWeek of 2026-06-28: +4,816 linesWeek of 2026-06-28: -1,535 linesWeek of 2026-07-05: +2,628 linesWeek of 2026-07-05: -701 linesWeek of 2026-07-12: +1,094 linesWeek of 2026-07-12: -135 linesWeek of 2026-07-19: +4,122 linesWeek of 2026-07-19: -617 linesWeek of 2026-07-26: +2,173 linesWeek of 2026-07-26: -104 linesWeek of 2026-08-02: +349 linesWeek of 2026-08-02: -83 linesFeb 22, 2026Aug 2, 2026
+75.2K lines added, -8.1K removed over the last year.

Commits per week

last 52 weeks
420Week of 2025-08-09: 0 commitsWeek of 2025-08-16: 0 commitsWeek of 2025-08-23: 0 commitsWeek of 2025-08-30: 0 commitsWeek of 2025-09-06: 0 commitsWeek of 2025-09-13: 0 commitsWeek of 2025-09-20: 0 commitsWeek of 2025-09-27: 0 commitsWeek of 2025-10-04: 0 commitsWeek of 2025-10-11: 0 commitsWeek of 2025-10-18: 0 commitsWeek of 2025-10-25: 0 commitsWeek of 2025-11-01: 0 commitsWeek of 2025-11-09: 0 commitsWeek of 2025-11-16: 0 commitsWeek of 2025-11-23: 0 commitsWeek of 2025-11-30: 0 commitsWeek of 2025-12-07: 0 commitsWeek of 2025-12-14: 0 commitsWeek of 2025-12-21: 0 commitsWeek of 2025-12-28: 0 commitsWeek of 2026-01-04: 0 commitsWeek of 2026-01-11: 0 commitsWeek of 2026-01-18: 0 commitsWeek of 2026-01-25: 0 commitsWeek of 2026-02-01: 0 commitsWeek of 2026-02-08: 0 commitsWeek of 2026-02-15: 0 commitsWeek of 2026-02-22: 22 commitsWeek of 2026-03-01: 42 commitsWeek of 2026-03-08: 21 commitsWeek of 2026-03-15: 8 commitsWeek of 2026-03-22: 1 commitsWeek of 2026-03-29: 10 commitsWeek of 2026-04-05: 25 commitsWeek of 2026-04-12: 6 commitsWeek of 2026-04-19: 0 commitsWeek of 2026-04-26: 10 commitsWeek of 2026-05-03: 2 commitsWeek of 2026-05-10: 17 commitsWeek of 2026-05-17: 8 commitsWeek of 2026-05-24: 11 commitsWeek of 2026-05-31: 0 commitsWeek of 2026-06-07: 3 commitsWeek of 2026-06-14: 5 commitsWeek of 2026-06-21: 17 commitsWeek of 2026-06-28: 14 commitsWeek of 2026-07-05: 11 commitsWeek of 2026-07-12: 5 commitsWeek of 2026-07-19: 16 commitsWeek of 2026-07-26: 12 commitsWeek of 2026-08-02: 7 commitsAug 9, 2025Aug 2, 2026
273 commits in the last 52 weeks.

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 — 2 commitsSun 1:00 — 4 commitsSun 2:00 — 3 commitsSun 3:00 — 0 commitsSun 4:00 — 0 commitsSun 5:00 — 1 commitsSun 6:00 — 2 commitsSun 7:00 — 1 commitsSun 8:00 — 0 commitsSun 9:00 — 1 commitsSun 10:00 — 0 commitsSun 11:00 — 0 commitsSun 12:00 — 1 commitsSun 13:00 — 0 commitsSun 14:00 — 0 commitsSun 15:00 — 1 commitsSun 16:00 — 1 commitsSun 17:00 — 2 commitsSun 18:00 — 1 commitsSun 19:00 — 2 commitsSun 20:00 — 4 commitsSun 21:00 — 1 commitsSun 22:00 — 10 commitsSun 23:00 — 7 commitsMon 0:00 — 3 commitsMon 1:00 — 7 commitsMon 2:00 — 8 commitsMon 3:00 — 0 commitsMon 4:00 — 2 commitsMon 5:00 — 0 commitsMon 6:00 — 0 commitsMon 7:00 — 4 commitsMon 8:00 — 1 commitsMon 9:00 — 2 commitsMon 10:00 — 0 commitsMon 11:00 — 1 commitsMon 12:00 — 0 commitsMon 13:00 — 0 commitsMon 14:00 — 0 commitsMon 15:00 — 1 commitsMon 16:00 — 0 commitsMon 17:00 — 4 commitsMon 18:00 — 3 commitsMon 19:00 — 3 commitsMon 20:00 — 1 commitsMon 21:00 — 5 commitsMon 22:00 — 2 commitsMon 23:00 — 1 commitsTue 0:00 — 1 commitsTue 1:00 — 2 commitsTue 2:00 — 1 commitsTue 3:00 — 2 commitsTue 4:00 — 1 commitsTue 5:00 — 4 commitsTue 6:00 — 3 commitsTue 7:00 — 2 commitsTue 8:00 — 1 commitsTue 9:00 — 2 commitsTue 10:00 — 3 commitsTue 11:00 — 1 commitsTue 12:00 — 0 commitsTue 13:00 — 0 commitsTue 14:00 — 0 commitsTue 15:00 — 1 commitsTue 16:00 — 1 commitsTue 17:00 — 1 commitsTue 18:00 — 1 commitsTue 19:00 — 1 commitsTue 20:00 — 8 commitsTue 21:00 — 4 commitsTue 22:00 — 1 commitsTue 23:00 — 3 commitsWed 0:00 — 3 commitsWed 1:00 — 4 commitsWed 2:00 — 0 commitsWed 3:00 — 5 commitsWed 4:00 — 1 commitsWed 5:00 — 0 commitsWed 6:00 — 2 commitsWed 7:00 — 4 commitsWed 8:00 — 2 commitsWed 9:00 — 0 commitsWed 10:00 — 0 commitsWed 11:00 — 0 commitsWed 12:00 — 3 commitsWed 13:00 — 1 commitsWed 14:00 — 0 commitsWed 15:00 — 0 commitsWed 16:00 — 3 commitsWed 17:00 — 2 commitsWed 18:00 — 5 commitsWed 19:00 — 2 commitsWed 20:00 — 2 commitsWed 21:00 — 0 commitsWed 22:00 — 4 commitsWed 23:00 — 1 commitsThu 0:00 — 0 commitsThu 1:00 — 2 commitsThu 2:00 — 1 commitsThu 3:00 — 11 commitsThu 4:00 — 3 commitsThu 5:00 — 3 commitsThu 6:00 — 1 commitsThu 7:00 — 3 commitsThu 8:00 — 1 commitsThu 9:00 — 0 commitsThu 10:00 — 0 commitsThu 11:00 — 0 commitsThu 12:00 — 1 commitsThu 13:00 — 1 commitsThu 14:00 — 0 commitsThu 15:00 — 0 commitsThu 16:00 — 0 commitsThu 17:00 — 2 commitsThu 18:00 — 3 commitsThu 19:00 — 1 commitsThu 20:00 — 4 commitsThu 21:00 — 3 commitsThu 22:00 — 1 commitsThu 23:00 — 4 commitsFri 0:00 — 2 commitsFri 1:00 — 0 commitsFri 2:00 — 2 commitsFri 3:00 — 1 commitsFri 4:00 — 1 commitsFri 5:00 — 2 commitsFri 6:00 — 0 commitsFri 7:00 — 4 commitsFri 8:00 — 0 commitsFri 9:00 — 2 commitsFri 10:00 — 0 commitsFri 11:00 — 0 commitsFri 12:00 — 0 commitsFri 13:00 — 0 commitsFri 14:00 — 0 commitsFri 15:00 — 0 commitsFri 16:00 — 0 commitsFri 17:00 — 1 commitsFri 18:00 — 3 commitsFri 19:00 — 2 commitsFri 20:00 — 3 commitsFri 21:00 — 3 commitsFri 22:00 — 1 commitsFri 23:00 — 2 commitsSat 0:00 — 4 commitsSat 1:00 — 0 commitsSat 2:00 — 3 commitsSat 3:00 — 1 commitsSat 4:00 — 1 commitsSat 5:00 — 1 commitsSat 6:00 — 0 commitsSat 7:00 — 0 commitsSat 8:00 — 1 commitsSat 9:00 — 0 commitsSat 10:00 — 0 commitsSat 11:00 — 0 commitsSat 12:00 — 0 commitsSat 13:00 — 0 commitsSat 14:00 — 0 commitsSat 15:00 — 0 commitsSat 16:00 — 0 commitsSat 17:00 — 0 commitsSat 18:00 — 0 commitsSat 19:00 — 0 commitsSat 20:00 — 2 commitsSat 21:00 — 1 commitsSat 22:00 — 2 commitsSat 23:00 — 3 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.
DateListRankStars gained
May 25, 2026daily#15+56
May 24, 2026daily#17+118
May 23, 2026daily#11+127
May 22, 2026daily#24+40
May 21, 2026daily#19+44
May 20, 2026daily#10+63
May 19, 2026daily#14+48
May 18, 2026daily#11+79
May 17, 2026daily#10+143
May 16, 2026daily#15+134
May 15, 2026daily#12+91
May 14, 2026daily#12+81
May 13, 2026daily#4+117
May 12, 2026daily#5+85
May 11, 2026daily#7+160
  • public-apis/public-apis

    A collective list of free APIs

    454.9K stars · Python

  • donnemartin/system-design-primer

    Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards.

    362.2K stars · Python

  • practical-tutorials/project-based-learning

    Curated list of project-based tutorials

    277.2K stars · Python

  • affaan-m/ECC

    The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.

    238.5K stars · JavaScript

  • affaan-m/ECC

    The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.

    234.7K stars · JavaScript

  • NousResearch/hermes-agent

    The agent that grows with you

    227K stars · Python