Veil drives real Chrome over raw CDP for AI agents — no Playwright, no Puppeteer, no WebDriver, zero runtime dependencies. To Cloudflare, Google, and every bot-check, Veil is Chrome. We don't reimplement the browser — we replace the automation layer that gets your agent caught.
Not an "anti-detect browser." Veil isn't a multi-accounting or ban-evasion tool. It's a developer runtime for AI agents and MCP hosts — TypeScript-native, accessibility-tree driven, built so an LLM can operate a real browser on real sites. Different job, different audience.
No navigator.webdriver, no automation switches, no Runtime.enable tell. Self-gating patches fire only when a value is genuinely anomalous — over-patching is itself a signature, so Veil doesn't.
An accessibility-tree snapshot returns stable integer refs — your agent never writes a brittle CSS/XPath selector. Human-like mouse (Bézier paths, eased timing) and real keystroke cadence.
Ships an MCP server, so any agent host gets stealth browsing as tools with zero glue — snapshot, click, fill, press, scroll, upload, and more.
Drives the native federated account chooser over CDP — agents are otherwise walled out of Google-SSO apps entirely. Veil is one of the only runtimes that can.
Blocks visited sites from port-scanning your localhost, private network, and tailnet — on by default. Your agent browses; the page can't reach back into your machine.
Node 24 / Bun ship a global WebSocket, so the entire CDP transport is ~120 lines Veil owns. Nothing to patch, nothing to leak, MIT-licensed.
# install (Bun + Chrome/Chromium on PATH) bun add github:acunningham-ship-it/veilbrowser # or from npm npm i @achamm/veilbrowser # drive real Chrome import { Browser } from "@achamm/veilbrowser"; const page = await (await Browser.launch()).newPage(); await page.goto("https://example.com"); const tree = await page.snapshot(); // a11y refs the agent can act on