invisible_playwright is a free, open source data extraction & web scraping project written in Python and released under MIT. It has 2,549 GitHub stars, 276 forks and 3 open issues, and was last pushed 15 hours ago. On this registry it ranks #69 of 149 tracked projects in Data Extraction & Web Scraping, with 5 head-to-head comparisons available.

What is invisible_playwright?

invisible_playwright is a free, MIT-licensed Python package that makes Playwright's headless Firefox present as a real browser and behave like a real user, built for developers whose scrapers must clear bot detection such as reCAPTCHA, hCaptcha and Cloudflare Turnstile.

What it is

invisible_playwright lives in the Python web-scraping ecosystem as a drop-in companion to Playwright. It ships a Firefox build patched at the C++ source level, plus a driver that supplies the browser API. The fingerprint is set inside the engine rather than injected into the page, covering navigator, screen, GPU/WebGL, canvas, fonts, audio, WebRTC, timezone and network. Headless and headed sessions expose the same values, and there is no JavaScript shim or property override for a detection script to read.

The concrete problem is that a stock p.firefox.launch() from Playwright is detectable, and the common workaround — patching properties from injected JavaScript — leaves seams that anti-bot vendors look for. The project frames detection as two questions: is this a real browser, and is a real person using it. It answers both at the browser level instead of the page level, replacing the JS-shim approach and the default Playwright Firefox launch with an engine-level one. Sites protected by Cloudflare, Akamai, DataDome, reCAPTCHA, hCaptcha and Cloudflare Turnstile score those answers, per the README and topic list.

Key capabilities

  • Firefox patched at the C++ source level, so the fingerprint — navigator, screen, GPU/WebGL, canvas, fonts, audio, WebRTC, timezone, network — is set in the engine, not injected into the page, with no JS shim or override.
  • Drop-in Playwright surface: from invisible_playwright import InvisiblePlaywright, with sync and async APIs, and the browser object remains a playwright.sync_api.Browser or playwright.async_api.Browser.
  • Humanized input in the driver: clicks, hovers and drags follow a Bezier-curve mouse path, and each input is byte-identical to a real mouse with the real input source, pressure and trusted events.
  • A distinct fingerprint per session across roughly 200 fields such as GPU, audio, fonts and screen; sf.seed is logged so a run can be replayed, and seed=42 reproduces the same GPU, canvas hash and audio context.
  • Proxy support for socks5, socks4, http and https, with DNS routed through the proxy by default so there is no local leak.
  • pin={} forces individual values such as gpu.renderer and gpu.vendor while the rest of the fingerprint stays seed-derived.
  • Out-of-scope Playwright surfaces — tracing, HAR, CDP and the API request context — refuse with a sentence explaining why instead of misbehaving quietly.

Who uses it and how

  • Python developers with existing Playwright scraping code, who switch by changing two import and launch lines and leaving the rest of their calls untouched.
  • Scrapers targeting sites behind reCAPTCHA, hCaptcha and Cloudflare Turnstile, with the topic list also naming Akamai and DataDome as the anti-bot systems in scope.
  • Teams rotating egress IPs through a proxy, where the browser timezone is auto-derived from the egress IP unless an explicit IANA zone is passed.
  • Pipelines that need reproducibility, using the logged seed or an explicit seed= value to repeat a run with identical fingerprint fields.
  • Collections running several sessions that each require a distinct fingerprint rather than one shared profile.

Getting started

Install with pip install invisible-playwright, then run the one-time python -m invisible_playwright fetch to download the sha256-verified browser — 240 MB on Windows, 262 MB on Linux x86_64 and 253 MB on Linux arm64, about 550 MB unpacked. Python 3.11 or newer is required.

How it compares

The facts provided name no paid product this project replaces and no sibling tool it sits beside, so invisible_playwright stands alone in this registry on that axis. The systems it is measured against are the detection suites themselves — reCAPTCHA, hCaptcha, Cloudflare Turnstile, and per the topic list Akamai and DataDome — rather than alternative libraries.

When to use it — and when not to

A self-hoster must run the one-time fetch and carry the 240–262 MB download, about 550 MB unpacked, alongside Python 3.11 or newer. It is the wrong pick if the work needs tracing, HAR, CDP or the API request context, since those surfaces are deliberately refused, or if the target host is macOS, which the supported platform list does not include. Weigh the licence and maintenance terms yourself: the project is MIT-licensed with 2,050 stars, 236 forks and 3 open issues at the time of writing.

project readme (upstream, from github) — read inline
invisible_playwright

Free antidetect browser stealth for Playwright: undetected Firefox fingerprint, headless or headed.
Python web scraping and captcha bypass. Open source, and it passes every bot detection test.

invisible_playwright - 5/5 detection suites passed

How it works

Anti-bots ask two questions, and reCAPTCHA, hCaptcha and Cloudflare Turnstile score the answers. invisible_playwright answers yes to both.

1. Is this a real browser? Yes. It is Firefox, patched at the C++ source level.

  • The browser fingerprint is set inside the engine, not injected into the page: navigator, screen, GPU/WebGL, canvas, fonts, audio, WebRTC, timezone, network. Headless or headed, the same values either way.
  • No JS shim, no override, no seam to read.

2. Is a real person using it? Yes. The actions are humanized in the driver.

  • Every click, hover and drag follows a natural mouse path with human timing, no teleporting cursor.
  • Each input is byte-identical to a real mouse: real input source, pressure, trusted events.

Install

pip install invisible-playwright
python -m invisible_playwright fetch      # one-time download, sha256-verified: 240 MB (Windows) / 262 MB (Linux x86_64) / 253 MB (Linux arm64), about 550 MB unpacked

Requires Python 3.11 or newer.

Supported platforms: Windows x86_64, Linux x86_64 / arm64.


Usage

Random fingerprint per session

Playwright's API, sync and async, with no code changes. The same objects, the same calls, the same return values. A few surfaces are out of scope - tracing, HAR, CDP, the API request context - and each one refuses with a sentence saying why rather than misbehaving quietly. 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 distinct fingerprint (GPU, audio, fonts, screen, ~200 fields) and Bezier-curve mouse motion.

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.

Log the seed to replay a run:

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. DNS is routed through the proxy by default, no local leak.

Timezone

The browser timezone follows timezone=:

# default: timezone is auto-derived from the egress IP (proxy egress if a
# proxy is set, otherwise the host's own public IP)
with InvisiblePlaywright(proxy=proxy) as browser:
    ...

# explicit IANA zone always wins, the only way to force a specific zone
with InvisiblePlaywright(proxy=proxy, timezone="America/New_York") as browser:
    ...

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 (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0, D3D11)",
        "gpu.vendor":   "Google Inc. (AMD)",
        "screen.width":  2560,
        "screen.height": 1440,
        "hardware.concurrency": 16,
    },
) as browser:
    ...

A GPU pin picks one of the validated personas rather than setting a free string, because the ~81 getParameter values and the extension list travel with the renderer name and a detector cross-checks them against it. A name the pool does not carry raises, and the error lists the ones it does.

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


CLI

The installed command is invisible-playwright, with a hyphen. python -m invisible_playwright works identically and needs nothing on PATH.

invisible-playwright fetch    # download the engine if missing, check every cached
                              # one against the seal, print the path
invisible-playwright version  # wrapper, core and engine versions, and where the
                              # engine is cached

Documentation, guides and comparisons

If you would rather prompt than script. This page is the engine, as a Python library. Two ways to use it without writing code, both one line: from an MCP client you already have (Claude Code, Claude Desktop, Cursor), claude mcp add stealth -- uvx aihawk, see the MCP server page; or with an interface and a model included, needing only an OpenRouter key, uvx aihawk ui --openrouter-key sk-or-..., see AIHawk. Same engine underneath, and the second is a client of the first.

All of it reads better, and is searchable, in the wiki, organised into four sections instead of one flat list:

  • Documentation - installation, the two-line switch from plain Playwright, proxy/timezone configuration, pinning specific fields, the CLI.
  • Guides - how detection actually works, in seven groups: browser identity, canvas/WebGL/fonts/ audio, network and WebRTC, the automation layer, AI agents, the detectors themselves explained from source, and testing.
  • Comparisons - against Camoufox, Patchright, nodriver and playwright-stealth, and the case for Firefox over Chromium generally.
  • Integrations - Scrapy, Crawlee, Robot Framework, CodeceptJS, test runners, Playwright MCP, and the frameworks it does not fit, by name.

If you don't know where to start: Three ways to make Playwright undetected is the map most other pages link back to, Playwright detected as a bot on one site is the troubleshooting order, and navigator.webdriver is not the tell you think it is explains the most famous property in this space and why patching it alone buys you almost nothing.

The detectors section now covers the commercial anti-bot products by name, each read from its own documentation or from confirmed reverse engineering: Cloudflare Bot Management and Turnstile, DataDome, Kasada, Akamai Bot Manager, PerimeterX, hCaptcha, Imperva, and the rest of the set.

Related projects

The other pieces of this one. The engine is the middle of three, and the two around it are how most people reach it:

  • invisible_core - seed to fingerprint to preferences, plus proxy and geolocation. This package pins it.
  • AIHawk - this engine as an MCP server (uvx aihawk, for any client that brings its own model) and, in the same package, an interface with a model included, from one command. The interface is a client of the server, with no private path to the browser.

The open-source neighbours. Which one fits depends on the layer your problem is at, and on whether you need Firefox or Chromium: three ways to make Playwright undetected works through what each layer can reach, and AI browser agents and stealth covers the frameworks that pick Chromium over CDP for you.

On the Firefox side

  • Camoufox - patches C++ too, wider surface, ships a fingerprint database instead of deriving one from a seed. Comparison.
  • LibreWolf - a privacy-defaults Firefox to browse with, not to automate.
  • arkenfox/user.js - hardening through preferences. Where a preference is enough, use it.

On the Chromium side


What is patched in the engine

Two rules hold across everything below. Every value is decided before a page can ask, inside the browser, so there is no JavaScript shim to find. And every value comes from one profile, so no two surfaces contradict each other, which is how a spoofed browser is usually caught. Source: feder-cr/firefox_antidetect_patch.

Identity

Rendering

Audio and media

Network

The automation layer


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/firefox_antidetect_patch.


Disclaimer

This project is for educational purposes only. It is provided as-is, with no warranties. I take no responsibility for how it is used. Use it at your own risk and in compliance with the laws of your jurisdiction.


Built by Federico Elia  LinkedIn

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

Frequently asked questions

Is invisible_playwright free to use?

invisible_playwright is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does invisible_playwright do?

Free antidetect browser stealth for Playwright: undetected headless Firefox fingerprint. Python scraping, recaptcha and bot detection bypass. Open source

What is invisible_playwright written in?

invisible_playwright is primarily written in Python. Its source is publicly available at https://github.com/feder-cr/invisible_playwright, and it has 2,549 GitHub stars.