Anti-Detect Browser that passes every bot detection test. Drop-in Playwright replacement. https://github.com/feder-cr/invisible_playwright#why-its-powerful
Find a file
feder-cr 0375cf3f79 docs(README): tighten positioning + benchmark vs camoufox and CloakBrowser
Three changes aimed at making the project's value legible in 5 seconds
for someone landing from a Trending list or HN thread:

- New tagline + quantified bullet hook at top. Concrete numbers
  (0.90 reCAPTCHA, 0 CreepJS lies, 5/5 detection suites passed) up
  front instead of generic "passes the hardest detectors" wording.

- Comparison table rewritten. The commercial-stack columns (Multilogin,
  GoLogin, AdsPower, Dolphin Anty, Kameleo) were noise for the OSS
  audience we want to reach. Replaced with the two relevant
  source-level peers: Camoufox (Firefox, currently in a long
  maintenance gap) and CloakBrowser (Chromium, fresh, but capped at
  the Chromium reCAPTCHA ceiling).

- "Why it's powerful" opens with explicit positioning vs the two
  peers, plus the reCAPTCHA v3 score that's the most defensible
  numeric claim.

No code change. Repo homepage URL set separately via API to deep-link
the "Why it's powerful" section so visitors from external links land
on the value pitch rather than the badges row.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 08:26:12 -07:00
.githooks ci: add pre-push hook to block red pushes 2026-05-20 13:25:08 -07:00
.github ci: fix firefox --version check (stdout match, not exit code) 2026-05-25 07:25:23 -07:00
docs feat: initial public release 2026-05-12 22:32:58 -07:00
examples feat: initial public release 2026-05-12 22:32:58 -07:00
scripts feat: initial public release 2026-05-12 22:32:58 -07:00
src/invisible_playwright feat: deterministic reCAPTCHA cookie pre-seed via Bayesian browsing history 2026-05-24 20:01:26 -07:00
tests feat: deterministic reCAPTCHA cookie pre-seed via Bayesian browsing history 2026-05-24 20:01:26 -07:00
.gitignore feat: initial public release 2026-05-12 22:32:58 -07:00
CHANGELOG.md docs: rename source-fork repo references invisible-firefox -> invisible_firefox 2026-05-23 11:09:27 -07:00
CODE_OF_CONDUCT.md chore: add community standards (CoC, contributing, security, templates) 2026-05-18 11:46:16 -07:00
CONTRIBUTING.md docs: rename source-fork repo references invisible-firefox -> invisible_firefox 2026-05-23 11:09:27 -07:00
LICENSE feat: initial public release 2026-05-12 22:32:58 -07:00
pyproject.toml release: 0.1.8 - fix #20 cross-origin iframe regression (pref-only) 2026-05-23 10:05:02 -07:00
README.md docs(README): tighten positioning + benchmark vs camoufox and CloakBrowser 2026-05-25 08:26:12 -07:00
SECURITY.md docs: rename source-fork repo references invisible-firefox -> invisible_firefox 2026-05-23 11:09:27 -07:00

invisible_playwright

tests License: MIT Python 3.11+ Firefox 150.0.1 GitHub release GitHub stars browser launches

LinkedIn

Stealth Firefox that passes every bot detection test. Drop-in Playwright replacement, fingerprint patched at the C++ level — not a JavaScript shim.

  • 0.90 / 1.0 reCAPTCHA v3 — server-verified human score
  • 0 CreepJS lies — fingerprint internally coherent, no contradictions
  • FingerprintJS Pro: bot/VPN/tampering/devtools all "not detected"
  • 5/5 detection suites passed (reCAPTCHA v3, FingerprintJS Pro, CreepJS, BrowserLeaks WebRTC, bot.sannysoft.com)
  • Real Firefox 150 binary — Gecko, not Chromium; spoofs applied to canvas, WebGL, audio, fonts, screen, WebRTC, navigator, timezone, SOCKS5 auth, DevTools detection
  • 100% Playwright API compatible — sync + async, change 2 lines and your existing scripts work

Results

Google reCAPTCHA v3 - 0.90 / 1.0

Top-tier score. Google classifies the session as "very likely a human". Most anti-detect stacks plateau around 0.3-0.7.

reCAPTCHA score 0.90

Fingerprint Pro - bot: not detected, VPN: false, tampering: false, dev tools: not detected

FingerprintJS Pro's full Smart Signals battery flips every flag to "Not detected". Browser correctly identified as Firefox 150 on Windows 10. Confidence score 0.9.

FingerprintPro not detected

CreepJS - 0 lies, fingerprint is internally coherent

No contradictions between headless hints, spoofed values, and real rendering output. That "0 lies" is what kills most anti-detect browsers: one inconsistency (e.g. Chrome UA + Firefox WebGL) and the trust score collapses.

CreepJS 0 lies

BrowserLeaks WebRTC - no public IP leak

WebRTC srflx address is the proxy egress IP; host candidates are private LAN. The real public IP never leaks via STUN, even on pages that configure their own ICE servers. Stock Firefox exposes an mDNS hostname (e.g. abc-1234.local) as a host ICE candidate, which is itself a stable per-session signal detectors fingerprint. invisible_playwright replaces host candidates with synthetic private-LAN IPs that match the spoofed network, removing the mDNS tell.

WebRTC no leaks

bot.sannysoft.com - all checks pass

Every row green: WebDriver not present, Chrome-only properties absent, plugin/mime/languages arrays coherent, permissions API correct, iframe/source window checks pass.

Sannysoft all green


Why it's powerful

This is the actively maintained Firefox-based anti-detect browser in 2026. Camoufox pioneered the source-level patched Firefox approach, but the project has been in a roughly year-long maintenance gap and its base Firefox version is now several majors behind. CloakBrowser does the same thing for Chromium and works well, but it still hits the Chromium reCAPTCHA ceiling (~0.3-0.5). invisible_playwright ships Firefox 150 with weekly releases, source-level C++ patches end-to-end, and a measured 0.90 reCAPTCHA v3 score.

Most other anti-detect browsers patch Chromium at the JavaScript level - they override navigator, WebGLRenderingContext.getParameter, canvas APIs, and so on via injected scripts. This has two fatal problems:

  1. JS patches are detectable. Anti-bots enumerate native function .toString(), check descriptor configurability, compare property enumeration order, watch for prototype mutations. Every patch leaves a fingerprint of its own. CreepJS has an entire battery of "lies detectors" built around this.
  2. Chromium itself is now suspect. Residential-proxy bot traffic is overwhelmingly Chromium-based, so detectors weight anything Chromium-shaped as risky by default. Chromium-based forks inherit Chrome's open-source layers (BoringSSL, Blink, V8, ANGLE) cleanly, but they still cannot fully match Chrome in practice: Chrome ships closed-source components on top (Widevine, proprietary codecs, Google Update / Safe Browsing endpoints) that flip detectable JS feature flags and network signals, and forks lag Chrome's release cadence by days to weeks, leaving telltale version-specific behaviours that detectors lock onto.

invisible_playwright patches Firefox at the C++ level. The spoofed values come back out through the normal Gecko paths - there is no JS shim, no override, no Object.defineProperty. From the page's point of view, the browser is just telling the truth. Anti-bot lie-detectors have nothing to latch onto.

invisible_playwright spoofs all the layers that matter, together, coherently — Navigator, screen, GPU/WebGL, Canvas, fonts, audio, WebRTC, timezone, DevTools detection, SOCKS5 auth, and the rest. See feder-cr/invisible_firefox for the full per-layer breakdown of which C++ files are patched and why.

Everything is driven by preferences - no hardcoded values in the binary. You change one pref, you change the spoofed value.


How it compares

The other two open-source projects that take the same source-level patching approach are Camoufox (Firefox) and CloakBrowser (Chromium). Camoufox is the closest in spirit but has been in a maintenance gap for about a year — its base Firefox is now several major versions behind and new fingerprint inconsistencies have surfaced. CloakBrowser is a fresh Chromium fork; the binary is solid but on the reCAPTCHA v3 score it lands well below human-grade, the same Chromium ceiling that hits every Chromium-based stealth project.

invisible_playwright Camoufox CloakBrowser
Engine Firefox 150 Firefox (lagging, ~year-old base) Chromium
Patch depth C++ source C++ source C++ source
Maintenance Active (weekly releases) Maintenance gap (~1 year) Active
.toString() clean Native Gecko path Native Gecko path Native Chromium path
Canvas / WebGL / Audio C++ level ⚠️ Patched but drift vs current Firefox C++ level
SOCKS5 auth Patched ⚠️ Playwright proxy only
Self-hosted
reCAPTCHA v3 score 0.90 ~0.3-0.5 (regressed since base FF drift) ~0.3-0.5 (Chromium ceiling)
FP Pro - bot detected Not detected ⚠️ Sometimes detected ⚠️ Sometimes detected
CreepJS lies 0 ⚠️ Increasing as base FF ages 0

reCAPTCHA scores reflect our own testing on Windows 10; Camoufox and CloakBrowser results may vary as they evolve.

If you need Firefox + active maintenance + the highest reCAPTCHA v3 score we've measured on any open-source anti-detect browser, this is the project for that combination.


Install

pip install git+https://github.com/feder-cr/invisible_playwright.git
python -m invisible_playwright fetch      # one-time ~100 MB download, SHA256-verified

Supported platforms: Windows x86_64, Linux x86_64.


Usage

Random fingerprint per session

100% Playwright-compatible - sync and async, all methods, zero API changes. If you already use Playwright, switching is two lines:

- from playwright.sync_api import sync_playwright
- with sync_playwright() as p:
-     browser = p.firefox.launch()
+ from invisible_playwright import InvisiblePlaywright
+ with InvisiblePlaywright() as browser:

Every session gets a unique, coherent fingerprint drawn from real-world Firefox telemetry (GPU / audio / fonts / ~400 other fields) and Bezier-curve mouse motion baked into the browser itself.

Sync

from invisible_playwright import InvisiblePlaywright

with InvisiblePlaywright(proxy={"server": "socks5://...", "username": "u", "password": "p"}) as browser:
    page = browser.new_page()
    page.goto("https://example.com")
    page.click("#submit")   # mouse arcs to the button on a Bezier curve

Async

from invisible_playwright.async_api import InvisiblePlaywright

async with InvisiblePlaywright(proxy={"server": "socks5://...", "username": "u", "password": "p"}) as browser:
    page = await browser.new_page()
    await page.goto("https://example.com")
    await page.click("#submit")

The browser object is a playwright.sync_api.Browser / playwright.async_api.Browser - every Playwright method works as-is.


Random fingerprint per session

from invisible_playwright import InvisiblePlaywright

with InvisiblePlaywright() as browser:
    page = browser.new_page()
    page.goto("https://creepjs-api.web.app")

Every call samples a new coherent profile. Log the seed to reproduce interesting runs:

sf = InvisiblePlaywright()
with sf as browser:
    print("seed =", sf.seed)
    # ...

Reproducible fingerprint

with InvisiblePlaywright(seed=42) as browser:
    ...   # same GPU, same canvas hash, same audio context, every run

Proxies

proxy = {
    "server": "socks5://gate.example.com:1080",
    "username": "user",
    "password": "pass",
}
with InvisiblePlaywright(proxy=proxy) as browser:
    ...

Schemes supported: socks5, socks4, http, https. Auth works on all of them (SOCKS5 via patched nsProtocolProxyService.cpp, HTTP/HTTPS via Playwright). DNS is routed through the proxy by default, no local leak.

Pinning specific fingerprint fields

By default everything comes from seed. To force specific values while the rest stays seed-derived:

with InvisiblePlaywright(
    seed=42,
    pin={
        "gpu.renderer": "ANGLE (NVIDIA, NVIDIA GeForce RTX 4090 Direct3D11)",
        "gpu.vendor":   "Google Inc. (NVIDIA)",
        "screen.width":  2560,
        "screen.height": 1440,
        "hardware.concurrency": 16,
    },
) as browser:
    ...

Full list of pinnable keys, how pinning interacts with the Bayesian sampler, and common patterns are in docs/pinning.md.


CLI

invisible_playwright fetch          # download the binary if missing
invisible_playwright path           # print the absolute path to the cached binary
invisible_playwright version        # wrapper and binary versions
invisible_playwright clear-cache    # remove all cached binaries

invisible_playwright takes a different angle than the major Firefox-hardening projects but stands on their shoulders:

  • arkenfox/user.js - the canonical Firefox configuration for privacy/security hardening via prefs. Reading arkenfox is how you understand which user.js knobs matter; invisible_playwright goes further by patching the C++ source where prefs alone are insufficient (Canvas noise, WebGL parameter overrides, font whitelisting, WebRTC IP swap, DevTools detection bypass).
  • LibreWolf - a Firefox fork bundled with sensible privacy defaults. Same audience, different distribution model: LibreWolf ships a configured Firefox binary, invisible_playwright ships source patches + a wrapper for automation.
  • Camoufox - the most well-known open-source anti-detect Firefox project. We share design goals on the fingerprint-spoofing side; the implementation approach differs (Camoufox patches a wider surface and ships its own fingerprint database, while invisible_playwright sticks closer to vanilla and drives spoofing from a Bayesian sampler).

License

MIT - see LICENSE. The patched Firefox binary is distributed under the MPL-2.0 (Firefox upstream license). The C++ patches against mozilla-central that produce that binary are at feder-cr/invisible_firefox.