navette-browser 1.4.0

The browser for agents — one tiny binary driving the WebView your OS already ships.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
  "article": {
    "title": "594 KB to orbit: a browser for AI agents with no Chromium attached",
    "description": "Houston, we deleted Chromium: your agent's browser is 594 KB and ships with your OS. Full WebKit, MCP-native, resident at 24 ms.",
    "published": false,
    "body_markdown": "---\ntitle: 594 KB to orbit: a browser for AI agents with no Chromium attached\ndescription: Houston, we deleted Chromium: your agent's browser is 594 KB and ships with your OS. Full WebKit, MCP-native, resident at 24 ms.\npublished: false\ntags: showdev, rust, ai, webdev\n---\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 \u2014 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 \u2014 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 \u2014 the protocol agents already speak.\n\n**594 KB installed. No Chromium. No download.**\n\n## What it is\n\nOne binary, three modes:\n\n```sh\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 \u2014 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 \u2014 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\n## The numbers\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\u201337 ms** | n/a | ~320 ms boot / launch |\n| Cold start (fresh process) | 531\u2013984 ms | 934\u20131539 ms | ~320 ms |\n| Navigate \u2192 readable content | **8\u201311 ms** | 12\u201333 ms | 3\u201316 ms |\n| Act (type + click) | **1\u20132 ms** | 33 ms | 18\u2013204 ms |\n| Peak RAM (process tree) | 79 MB | 536 MB | 41 MB |\n| Crawl 100 pages | **0.9\u20132.8 s** | 1.8\u20134.0 s | 0.9\u20132.6 s |\n| Real-web success (20 URLs) | **95\u2013100%** | \u2014 | 85% |\n\nTwo honest disclosures, because benchmark posts die without them:\n\n1. **Lightpanda is the fastest page-*reader*** (3.3 ms through a zero-bias raw-CDP probe \u2014 I measured it through a fair minimal client, not just through Playwright). It parses a partial DOM and cannot render, screenshot, or act. If your agent only reads static pages, use it \u2014 or plain fetch + readability.\n2. **The two rows Lightpanda wins (fresh boot, peak RAM) are the price of rendering.** Three WebKit helper processes and a backing store are what buy screenshots and full fidelity. That tax *is* the product.\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\n## The demo that sold me on it\n\nI pointed the resident daemon at a login form and a research loop and let an agent drive through MCP only:\n\n- **Act 1 \u2014 authenticate**: type credentials, click, verify the session (`\"You logged into a secure area!\"`), screenshot the authenticated page.\n- **Act 2 \u2014 research**: DuckDuckGo \u2192 extract results \u2192 open one (it was dead \u2014 moved on) \u2192 read the article \u2192 screenshot.\n\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## Try it\n\n```sh\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```json\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\n## The honest limits\n\n- **macOS today.** Windows (WebView2) and Linux (WebKitGTK/WPE) are the next backends \u2014 the 8 primitives are engine-agnostic by design, and the engine strategy is written down: system-first, official embed (WebView2 Fixed Version) or distro packages as fallback. Never vendor a browser the way Playwright does.\n- **The automation long tail is missing.** Network interception, file uploads, hover, dialogs \u2014 Playwright has twenty years of API surface. The core agent loop (navigate, read, see, act, wait, sessions) is complete; the tail is the roadmap.\n- **Fresh-process cold start can't beat a blind engine.** A full WebKit spawns three helper processes; Lightpanda spawns none because it renders nothing. That's why navette ships a resident mode: warm from login, 24 ms forever.\n\n## Why this matters\n\nHeadless Chromium is the Postgres of web automation. navette is trying to be the embedded SQLite \u2014 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**\n\nIf you run agents locally, I'd genuinely love your feedback \u2014 especially the failure cases.\n\n---\n\n**Update \u2014 v1.4.0 (Oct 4):**\n\n- The agent loop is complete on every OS: **file upload** (in-memory content through a page-side DataTransfer \u2014 no OS dialog, identical JS on all three engines) and **scroll** join the API. **16 MCP tools** now. CI proves the upload round-trip on macOS, Windows and Linux: upload a file, let the page's own JS read it, assert the result.\n- Worth the release on its own: the eval wrapper on Windows/Linux silently discarded its value \u2014 every `/evaluate` and `/read` outside the fold path returned `undefined`. Fixed, and CI tests it explicitly now.\n- **Release binaries attached** (macOS arm64 658 KB, Windows x64 / Linux x64 ~1.2 MB \u2014 still ~180\u00d7 smaller than Playwright's download): https://github.com/slabbdev/navette/releases/tag/v1.4.0\n- Stated plainly, still missing: OS-level keyboard/mouse input (synthetic events today), request/response network interception, OS file-dialog automation.\n",
    "tags": [
      "showdev",
      "rust",
      "ai",
      "webdev"
    ]
  }
}