Headless browsers are the least glamorous layer of the AI stack and, increasingly, the one that decides what an agent can actually do. For a decade the default answer has been Chrome: fork it, strip the interface, hope it fits in a container. Lightpanda's bet is that the right answer is a browser that never had an interface to strip.

The project was among the top movers on GitHub's trending page on Saturday, adding 827 stars in a day and standing at roughly 36,000 with 1,700 forks. It is a headless browser written from scratch in Zig — not a Chromium fork, not a WebKit patch. There is no graphical rendering engine at all. JavaScript executes on V8, HTML is parsed with html5ever, pages are fetched through libcurl. What remains is the surface automation actually touches: a DOM, XHR and fetch, cookies, clicks, form input, network interception, proxies, an ad blocker, an optional robots.txt check, and two automation protocols, Chrome DevTools Protocol and WebDriver BiDi.

The vendor's benchmarks are the argument. Over 933 real pages on an AWS m5.large, peak memory for 100 pages measured 123 MB against 2 GB for headless Chrome, and 100 pages took 5 seconds against 46. That is roughly 16x less memory and 9x faster. It is a vendor benchmark on a vendor page mix, not an independent audit, and page mix decides everything in this kind of test.

The more interesting design choice landed in June, when the project shipped `lightpanda agent`. You describe a task in plain language and the browser drives itself: navigating, clicking through flows, filling forms, extracting structured data. It is provider-agnostic by construction — Anthropic, OpenAI, Gemini, Vertex AI, Mistral, Hugging Face, Vercel AI Gateway, OpenRouter, any OpenAI-compatible endpoint via `OPENAI_BASE_URL`, or local models through Ollama and llama.cpp, plus a `--no-llm` REPL for people who just want the browser.

What the agent session produces is the point. The work is captured as a PandaScript: plain JavaScript with a small set of native browser primitives built into Lightpanda. Save it with `/save`, replay it with `lightpanda run script.js`. Replays are deterministic and cost no tokens — the model is used once, to write the program. "Prototype with the LLM and ship the output to production without a model at runtime," as the README puts it.

The same logic shows up in the MCP server. Over stdio it is a single connection; started with `lightpanda mcp --port 9223` it serves HTTP instead, and each `Mcp-Session-Id` gets its own browsing session — its own page, cookies and memory — so two agents no longer clobber each other's tab. Send the same id and they deliberately share one.

The caveats are not small. The licence is AGPL-3.0. Telemetry is on by default and needs `LIGHTPANDA_DISABLE_TELEMETRY=true` to switch off. There is no native Windows binary (WSL only), no Android or Termux build, and the Linux binaries are glibc-linked, so Alpine fails with a linker error. `--dump png` is a text-only rendering of the page, not a screenshot. Most importantly, the feature list is shorter than Chrome's, and the Web Platform Tests results the project publishes daily are the honest scoreboard for the gaps — the failures tend to be exactly the browser APIs that break real sites.

Why it matters: coupling the model and the browser into one process, then recording the session as replayable code, turns an agent run from an opaque chat transcript into an artifact you can review, diff and run in CI. The catch is the one every crawler team knows: the web is not deterministic. Selectors move, consent walls change, accounts expire. A recorded script is only as stable as the page it was recorded against.