Showcase · Headless browser
NeoBrowser
A headless web browser for agents and crawlers, in the spirit of Lightpanda.
No rendering, just the page's content and its controls. DNS, TLS 1.3 and 1.2 with certificate verification, HTTP/1.1, cookies, the WHATWG HTML parser, CSS selectors and form submission are all written in the language and ship as one static binary, with no OpenSSL, libcurl or C library underneath.
Results
9.20× faster than Lightpanda24.7× faster than Chrome
5.87× faster than Lightpanda11.2× faster than Chrome
4.51× faster than Lightpanda7.63× faster than Chrome
12.1× faster than Lightpanda37.8× faster than Chrome
26.1× faster than Lightpanda85.3× faster than Chrome
3.06× less than Lightpanda14.0× less than Chrome
2.17× less than Lightpanda10.0× less than Chrome
1.58× less than Lightpanda6.33× less than Chrome
5.48× less than Lightpanda20.4× less than Chrome
x86-64 Linux, every browser on the same two AMD EPYC Genoa vCPUs · Vultr dedicated 2 vCPU instance, Ubuntu 24.04, Linux 6.8 · 1 November 2026 · bench/compare.py
Medians of 20 runs after a warm-up. Every run is a fresh process from start to exit, timed together with its peak RSS by GNU time, and every page comes from a local server so the network is out of the picture. The pages are saved copies of the real ones with scripts, styles and external subresources removed, because NeoBrowser does not run JavaScript or CSS yet; Lightpanda and Chrome still start their JavaScript engines. All three build the page's DOM: NeoBrowser then prints the readable text, Lightpanda (fetch --dump) and Chrome (--dump-dom) serialize the tree. Lightpanda 1.1.0-nightly.11471; Chrome for Testing 156.0.8078.80, headless shell. Chrome's memory is its largest process, which understates its total. Deployed size: NeoBrowser's static binary, with no C library; the Lightpanda binary, which also loads the system C library; the headless shell's directory. Not implemented yet: JavaScript, CSS layout, HTTP/2 and the CDP protocol, so Puppeteer and Playwright cannot drive it yet.
What it does
- Sessions an agent drives with JSON commands: go to a page, click links and buttons, fill and submit forms, check boxes, go back
- The WHATWG HTML parser: 99.4% of the html5lib tree-construction tests and all of the tokenizer tests that start in the data state
- CSS selectors with querySelector and matches, checked against soupsieve: combinators, attributes, :not/:is, :nth-child of S and form states
- Cookies across redirects, and GET or POST forms in urlencoded, multipart or plain text
- TLS 1.3 and 1.2 with certificate chains verified against the system trust store: RSA and ECDSA (P-256, P-384)
- HTTP/1.1 with chunked bodies, gzip and deflate, and redirects that change method as the standard says
Usage
$ neobrowser fetch https://www.python.org/ --dump title
Welcome to Python.org
# readable text, links (URL, tab, text) or the raw HTML
$ neobrowser fetch https://news.ycombinator.com/ --dump links
{"cmd":"goto","url":"https://example.org/login"}
{"cmd":"fill","selector":"input[name=user]","value":"ada"}
{"cmd":"check","selector":"#remember"}
{"cmd":"click","text":"Sign in"}
{"cmd":"text"}
# one JSON reply per command, such as
# {"ok":true,"url":"…","status":200,"title":"…"}
$ neobrowser session < session.jsonl