{"slug": "594-kb-to-orbit-a-browser-for-ai-agents-with-no-chromium-attached", "title": "594 KB to orbit: a browser for AI agents with no Chromium attached", "summary": "A developer built navette, a 594 KB Rust binary that drives the WebKit engine already shipped with the host OS instead of bundling headless Chromium, and exposes it to AI agents over MCP with nine tools including navigate, read, screenshot, click and type. Benchmarks on an M1 with 8 GB of RAM show a resident daemon cold start of 24–37 ms, navigate-to-readable-content in 8–11 ms, actions in 1–2 ms, 79 MB peak RAM and a 100-page crawl in 0.9–2.8 s, versus 216 MB install size and 536 MB peak RAM for Playwright plus Chromium. The project is open source on GitHub with a reproducible benchmark harness.", "body_md": "Houston, we deleted Chromium: your agent's browser is 594 KB and ships with your OS. Full WebKit, MCP-native, resident at 24 ms.\n\n**Houston, we deleted Chromium.**\n\nEvery AI agent that touches the web today drags the same luggage: **headless Chromium**.\n\nPlaywright 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.*\n\nMeanwhile, your computer **already ships a full browser engine**. macOS has WebKit. Windows has WebView2 — which is Chromium, preinstalled. Linux has WebKitGTK.\n\nSo 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.\n\n**594 KB installed. No Chromium. No download.**\n\nOne binary, three modes:\n\n```\nnavette serve --port 8765     # HTTP API on loopback\nnavette mcp                   # MCP stdio server for agent hosts\nnavette install-daemon        # resident: warm from login\n```\n\nNine 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.\n\nUnder 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**.\n\nSame machine (M1, 8 GB), same corpus (100 local pages + 20 real URLs), reproducible with one command (`python3 navbench.py`):\n\n| Metric | navette | Playwright + Chromium | Lightpanda | \n|---|---|---|---|\n| Install size | **0.6 MB** | 216 MB | 80 MB | \n| Cold start (resident daemon) | **24–37 ms** | n/a | ~320 ms boot / launch | \n| Cold start (fresh process) | 531–984 ms | 934–1539 ms | ~320 ms | \n| Navigate → readable content | **8–11 ms** | 12–33 ms | 3–16 ms | \n| Act (type + click) | **1–2 ms** | 33 ms | 18–204 ms | \n| Peak RAM (process tree) | 79 MB | 536 MB | 41 MB | \n| Crawl 100 pages | **0.9–2.8 s** | 1.8–4.0 s | 0.9–2.6 s | \n| Real-web success (20 URLs) | **95–100%** | — | 85% | \n\nTwo honest disclosures, because benchmark posts die without them:\n\nThe 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.**\n\nI pointed the resident daemon at a login form and a research loop and let an agent drive through MCP only:\n\n`\"You logged into a secure area!\"`), screenshot the authenticated page.\nFull walkthrough with the verbatim tool calls and screenshots is in [`demo/JOURNEY.md`](https://github.com/slabbdev/navette/blob/main/demo/JOURNEY.md).\n\n``` js\ncargo build --release\n./target/release/navette serve --port 8765\n\n# or let your agent host own the lifecycle:\n./target/release/navette mcp\n```\n\nRegister it in any MCP client (ZCode example):\n\n```\n{ \"mcp\": { \"servers\": { \"navette\": {\n    \"command\": \"/path/to/navette\", \"args\": [\"mcp\"] } } } }\n```\n\nThen just talk to your agent: *\"open this dashboard, check if the deploy banner is there, screenshot it for me.\"*\n\nHeadless 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.\n\nApple 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.\n\nRepo, benchmarks and the reproducible harness: [https://github.com/slabbdev/navette](https://github.com/slabbdev/navette)\n\nIf you run agents locally, I'd genuinely love your feedback — especially the failure cases.", "url": "https://wpnews.pro/news/594-kb-to-orbit-a-browser-for-ai-agents-with-no-chromium-attached", "canonical_source": "https://dev.to/slabb/594-kb-to-orbit-a-browser-for-ai-agents-with-no-chromium-attached-1odg", "published_at": "2026-10-01 13:31:53+00:00", "updated_at": "2026-10-01 13:44:22.373357+00:00", "lang": "en", "topics": ["ai-agents", "agent-protocols", "ai-tools", "developer-tools", "ai-infrastructure"], "entities": ["navette", "Chromium", "WebKit", "Playwright", "Browserbase", "Steel", "Hyperbrowser", "Lightpanda"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/594-kb-to-orbit-a-browser-for-ai-agents-with-no-chromium-attached", "markdown": "https://wpnews.pro/news/594-kb-to-orbit-a-browser-for-ai-agents-with-no-chromium-attached.md", "text": "https://wpnews.pro/news/594-kb-to-orbit-a-browser-for-ai-agents-with-no-chromium-attached.txt", "jsonld": "https://wpnews.pro/news/594-kb-to-orbit-a-browser-for-ai-agents-with-no-chromium-attached.jsonld"}}