Houston, we deleted Chromium: your agent's browser is 594 KB and ships with your OS. Full WebKit, MCP-native, resident at 24 ms.
Houston, we deleted Chromium.
Every AI agent that touches the web today drags the same luggage: headless Chromium.
Playwright downloads ~400 MB of browser on every machine your agent touches. Cloud browser APIs (Browserbase, Steel, Hyperbrowser) rent you Chrome by the subscription β and your pages leave your machine. And all of this to do what an agent actually needs: open a page, read it, take a screenshot, click a button, fill a form.
Meanwhile, your computer already ships a full browser engine. macOS has WebKit. Windows has WebView2 β which is Chromium, preinstalled. Linux has WebKitGTK.
So I built navette (French for shuttle): a single Rust binary that drives the WebView your OS already ships, and speaks MCP β the protocol agents already speak.
594 KB installed. No Chromium. No download.
One binary, three modes:
navette serve --port 8765 # HTTP API on loopback
navette mcp # MCP stdio server for agent hosts
navette install-daemon # resident: warm from login
Nine MCP tools: navigate, read, screenshot, click, type, evaluate, wait, sessions, session_close. The screenshot comes back as MCP image content β your agent literally sees the page.
Under the hood: a WKWebView per session living in a ghost window (real pixels, parked off-screen so it renders but nobody sees it). Navigation completion is event-driven β I implemented WKNavigationDelegate in Rust with raw objc2 message sends, and the content extraction runs inside the didFinish callback, so a warm navigate + full markdown read costs 8 ms.
Same machine (M1, 8 GB), same corpus (100 local pages + 20 real URLs), reproducible with one command (python3 navbench.py):
| Metric | navette | Playwright + Chromium | Lightpanda |
|---|---|---|---|
| Install size | 0.6 MB | 216 MB | 80 MB |
| Cold start (resident daemon) | 24β37 ms | n/a | ~320 ms boot / launch |
| Cold start (fresh process) | 531β984 ms | 934β1539 ms | ~320 ms |
| Navigate β readable content | 8β11 ms | 12β33 ms | 3β16 ms |
| Act (type + click) | 1β2 ms | 33 ms | 18β204 ms |
| Peak RAM (process tree) | 79 MB | 536 MB | 41 MB |
| Crawl 100 pages | 0.9β2.8 s | 1.8β4.0 s | 0.9β2.6 s |
| Real-web success (20 URLs) | 95β100% | β | 85% |
Two honest disclosures, because benchmark posts die without them:
The claim I'll defend: nobody else combines 0.6 MB + 1 ms actions + a 0.9 s hundred-page crawl + full WebKit rendering + a resident 24 ms mode.
I pointed the resident daemon at a login form and a research loop and let an agent drive through MCP only:
"You logged into a secure area!"), screenshot the authenticated page.
Full walkthrough with the verbatim tool calls and screenshots is in demo/JOURNEY.md.
cargo build --release
./target/release/navette serve --port 8765
./target/release/navette mcp
Register it in any MCP client (ZCode example):
{ "mcp": { "servers": { "navette": {
"command": "/path/to/navette", "args": ["mcp"] } } } }
Then just talk to your agent: "open this dashboard, check if the deploy banner is there, screenshot it for me."
Headless Chromium is the Postgres of web automation. navette is trying to be the embedded SQLite β the browser agents bring with them, for the fastest-growing half of the agent world: agents that run locally, on machines that already have an engine.
Apple shipped a Safari MCP server for coding agents this year. The thesis is being validated from above. navette is it from below: tiny, open, cross-platform-bound.
Repo, benchmarks and the reproducible harness: https://github.com/slabbdev/navette
If you run agents locally, I'd genuinely love your feedback β especially the failure cases.