A "normal browser".
normalbrowser shows up to websites as a completely normal browser. Real Google Chrome and Firefox. Anti-bot systems see a completely real, normal browser, because it is one. Drop-in support for Playwright and Puppeteer.
npm install normalbrowserpip install normalbrowserdocker run --rm normalbrowser/normalbrowser testFirst launch downloads the browser build (about 200 MB), checks its SHA-256 and caches it. Free for 1 session with nothing to sign up for, or 3 at a time with a free account.
Install it, then write the code you were already writing
The API is Playwright's. Pick your language, paste the sample, run it. The browser opens with a fresh device identity and human-like input already on.
import { chromium } from 'normalbrowser';
const browser = await chromium.launch({
headless: false,
humanize: true, // on by default; shown for clarity
persona: { country: 'US', seed: 42 },
});
const page = await browser.newPage();
await page.goto('https://example.com');
await page.getByRole('link', { name: 'More information' }).click();
console.log(await page.title());
await browser.close();One line. Or none, if you let the CLI redirect the playwright import for you and leave the file alone.
- import { chromium } from 'playwright';
+ import { chromium } from 'normalbrowser';
// Everything below this line is unchanged.npx normalbrowser run ./my-script.jsPuppeteer via normalbrowser/puppeteer, anything else over the CDP server mode. Docs
Built into the browser, not bolted onto the page
Most stealth tooling is a JavaScript shim on top of a stock browser. Detectors know exactly what those look like. This is a different kind of thing.
Patched at the source
Canvas, WebGL, audio, fonts, screen, hardware, timezone, WebRTC and the automation flags are changed in C++ and compiled in. There is no injected script for a detector to find, and nothing racing the page load.
Two layers of stealth
The fingerprint is one layer, the driver is the other. Automation goes through a channel the page cannot see, and every identity gets its own stable, self-consistent device.
Drop-in replacement
Same Playwright and Puppeteer API, in JavaScript, Python and Java. Locators, auto-waiting, assertions, request interception. Your scripts and your muscle memory carry over.
Human-like input, on by default
Pointer paths with real acceleration and overshoot, keystrokes with real rhythm, generated inside the browser as trusted events, including into cross-origin iframes. Turn it off with humanize: false.
What it runs on
Real Google Chrome, not Chromium: the same branded build Google ships, with our patches applied. Plus Firefox, with three language wrappers, and a version table that grows as new upstream releases get tracked.
| OS | Arch | Google Chrome | Firefox |
|---|---|---|---|
| Windows | x64 | yes | yes |
- JavaScript / TypeScriptnpm
npm install normalbrowser - PythonPyPI
pip install normalbrowser - JavaMaven Central
implementation("com.normalbrowser:normalbrowser:0.1.0")
npx normalbrowser install fetches the current build. Older builds stay available by version.| Engine | Version | Upstream | Patches | Released | Status |
|---|---|---|---|---|---|
| Google Chrome | 138 | 138.0.7204.96 | 12 | 2026-08 | current |
| Firefox | 153 | 153.0 (reports 152) | 23 | 2026-08 | current |
Tested against the detectors people actually hit
Stock Playwright on the left, normalbrowser on the right, same machine, same network. Run the scoreboard yourself with one command. Your exit IP and persona change the result, so read it that way.
| Service | Stock Playwright | normalbrowser | Notes |
|---|---|---|---|
| reCAPTCHA v3 score | TBD | TBD | Server-side verified |
| Cloudflare Turnstile | TBD | TBD | Managed challenge, auto-resolves |
| Cloudflare Bot Management | TBD | TBD | |
| DataDome | TBD | TBD | |
| PerimeterX / HUMAN | TBD | TBD | |
| Akamai Bot Manager | TBD | TBD | |
| FingerprintJS Pro | TBD | TBD | Bot detection + visitor id |
| CreepJS | TBD | TBD | Trust score |
| BrowserScan | TBD | TBD | |
| bot.incolumitas.com | TBD | TBD | |
| Sannysoft | TBD | TBD | |
| pixelscan.net | TBD | TBD |
| Signal | Stock | Ours |
|---|---|---|
| navigator.webdriver | true | false |
| CDP / automation channel visible to page | yes | no |
| isTrusted on synthetic input | true (shallow) | true, native |
| Input reaches cross-origin iframes | partly | yes |
| OS cursor moved by automation | no | no |
| Canvas / WebGL / audio hash per identity | shared | distinct, stable |
| TLS fingerprint matches claimed browser | yes | yes |
| HTTP/2 fingerprint matches claimed browser | yes | yes |
| WebRTC leaks real IP behind proxy | yes | no |
| Timezone / locale / Intl agree with IP | no | yes |
npx normalbrowser scoreboard --control=stockWhat people run on it
Anything that needs a browser the site treats as a visitor instead of a script.
Market intelligence
Price monitoring, catalogue tracking and public listing collection at a scale where a stock browser just gets blocked.
Accounts and profiles
Run many accounts you own from one machine, each with its own stable device identity, without them being linked to each other.
Brand and ad verification
See what a real visitor in a given country sees: the creative, the landing page, the redirect chain. Not the version served to bots.
QA and engineering
Test your own anti-bot rules, replay production flows, and drive third-party sites in end-to-end tests that would otherwise fail on a challenge page.
AI agents
Give an agent a browser it can actually use. The built-in MCP server returns snapshots with stable refs, so the model clicks what it saw.
Monitoring
Uptime, content-change and compliance monitoring across sites that treat headless traffic as an attack.
Four steps, no configuration
The complexity is in the build, not in your setup.
- 1
Install the package
npm, pip, Maven or NuGet. The package is the client, and it is small.
- 2
The browser downloads itself
On first launch, or with normalbrowser install. About 200 MB, SHA-256 verified, cached per user.
- 3
Playwright starts our binary
The client points the driver at the patched build and applies a persona: locale, timezone, screen, hardware, all consistent with each other.
- 4
You write normal code
Locators, clicks, typing, assertions. Input is generated natively and arrives as trusted events.
What the patches cover
Every item below is a change to the engine source, compiled into the binary. The count per build is in the version table.
An MCP server ships in the box
Claude, Cursor or any MCP client can drive the browser directly. Snapshots come back with stable [ref=eN] handles, so the model clicks the thing it saw instead of making up a selector, and it can check its own disguise with browser_audit.
{
"mcpServers": {
"normalbrowser": {
"command": "npx",
"args": ["normalbrowser", "mcp"]
}
}
}Free during the beta, up to 3 sessions.
Every feature on every plan. What changes is how many sessions can run at once on a machine.We are not taking payments yet. The paid tiers are shown so you know what is coming.
Free
The whole thing. Sign in for more of it.
- 1 session with no account
- 3 sessions with a free account
- Every feature, no time limit
- Community
No card, no trial clock. The free key is issued the moment you sign in.
Member
Coming soonFor one person and a few jobs.
Payments open after the beta.
- 50 concurrent sessions
- 1 license key
- Cancel any time
- Hands-on support
VIP
Coming soonReal concurrency for a small team.
Payments open after the beta.
- 200 concurrent sessions
- Multiple license keys
- Usage across machines
- Hands-on support
Sponsor
Coming soonProduction fleets.
Payments open after the beta.
- 2,000 concurrent sessions
- Early access to engine builds
- Invoicing
- Priority support
Gamer
Coming soonNo cap. Run whatever you want.
Payments open after the beta.
- Unlimited concurrent sessions
- Patch requests
- Security review, procurement
- Priority support, named engineer
- Latest Google Chrome and Firefox builds, with compatibility updates
- Windows
- JavaScript / TypeScript, Python and Java
- Playwright, Puppeteer and CDP
- Human-like input, on by default
- Persistent profiles and reproducible identities
- Proxy support with WebRTC leak-proofing
- MCP server for AI agents
During the beta nothing is for sale and nothing is charged. The paid tiers above are what they will cost when payments open, in USD, billed monthly, cancel any time. Sign in now and the free key you get is yours for good.
Frequently Asked Questions
Is this a Playwright plugin or a real browser?
A real browser. We ship patched Chrome and Firefox builds with the fingerprint and input changes compiled in at the C++ level. Nothing gets injected into the page, so there is no script for a detector to find.
Do I have to change my code?
Usually not. Swap the import from playwright to normalbrowser, or run your script through the CLI and leave the import alone. The API is the same as Playwright.
What do I actually get for free?
The whole product, every engine, every feature, every platform. 1 session at a time with nothing signed up for, 3 at a time with a free account. No card, no trial clock.
What is human-like input, and can I turn it off?
Pointer paths, timing and keystroke rhythm modelled on real people, generated inside the browser. It is on by default. Pass humanize: false to launch when you want raw speed, for example in tests against your own systems.
A site that used to work started blocking me. Now what?
On a paid plan that is our problem. Open a ticket with the site and a repro and we ship a fix in the next engine build. The version table on this page shows what is current.
How do I set the license key?
Set NORMALBROWSER_LICENSE_KEY in the environment. Nothing changes in your code. A key works on any number of machines; the limit is sessions per machine, and the dashboard shows where the key has been used.
What happens when I cancel?
You keep the concurrency you paid for until the end of the billing period, then the client falls back to the free tier. Nothing stops working, it just drops back to 3 sessions at a time on your free key.
Is there a hosted option?
Yes, on request. If you would rather not run the binaries yourself, email us and we will set you up with a managed pool.
Can I redistribute the binaries?
No. Internal use on as many machines as you like is fine; bundling the browser into a product you sell needs an OEM licence.
What will you not do?
We do not solve CAPTCHAs, and we do not help with anything you are not allowed to automate. See the acceptable use policy.
Something else? Read the docs or email us, the address is in the footer.
Try it on the site that blocks you
Free for 1 session with no account, 3 with one. No card, nothing held back.