Chrome-agent: LLM-native browser automation tool written in Rust A new open-source tool called chrome-agent, built in Rust, provides an LLM-native browser automation tool that reduces page representation to ~50 tokens using the accessibility tree, compared to ~2,000 tokens from Playwright. The 3 MB binary requires no runtime dependencies and combines action and observation in a single call, aiming to minimize token usage for AI agents. The project is independent and not affiliated with Google or the Chrome team. Browser automation that speaks LLM. Disclaimer:This is an independent, community-driven project. It is not affiliated with, endorsed by, or sponsored by Google or the Chrome team. You're not the user. Your LLM is. You don't need to read this README. Your agent does. Install it, run chrome-agent --help , and let the LLM figure it out. The CLI embeds its own usage guide, every error comes with a hint for the next action, and --json mode outputs structured data an agent can parse without you writing a single adapter. This page is here because GitHub expects one. agent-browser https://github.com/vercel-labs/agent-browser Vercel is a feature-complete browser automation platform: dashboard, cloud providers, annotated screenshots, iOS support, AI chat, auth vault, 40K lines of Rust. It's excellent. chrome-agent is the opposite bet. Instead of adding features, it removes tokens. | chrome-agent | agent-browser | | |---|---|---| Page snapshot | ~50 tokens a11y noise stripped, 66% reduction | ~200 tokens full a11y tree | Element IDs | backendNodeId — stable across inspects | Sequential @e1, @e2 — reassigned every snapshot | Action + observe | click n12 --inspect 1 call | click @e1 then snapshot 2 calls | Stealth | 7 native CDP patches incl. Runtime.enable skip | Delegated to cloud providers | Content extraction | read articles , extract auto-detect lists/tables | None built-in | Binary | 3 MB, zero runtime | 3 MB + Next.js dashboard + cloud SDKs | Codebase | ~8.8K lines | 40K lines | agent-browser gives you a platform with monitoring, cloud browsers, and visual debugging. chrome-agent gives your LLM the smallest possible representation of a webpage and gets out of the way. If your agent needs a dashboard, use agent-browser. If your agent needs to spend tokens on reasoning instead of page parsing, use this. Every token your agent spends understanding a page is a token it doesn't spend reasoning about the task. chrome-agent is built around one idea: minimize the tokens between "what does this page look like?" and "what should I do next?" This means: Accessibility tree over DOM. Playwright returns ~2,000 tokens of raw HTML. chrome-agent returns ~50 tokens of a11y tree with stable element IDs. No CSS selectors to write, no DOM to parse. One binary, zero runtime. 3 MB Rust binary. No Node.js, no npm, no Playwright runtime. npx chrome-agent just works. Linux builds are fully static musl — no glibc dependency, runs on any distro. Action + observation in one call. --inspect on any action command returns the page state after the action. One round-trip instead of two. Errors are instructions. Every error includes a hint field telling the agent what to do next. {"ok":false, "error":"...", "hint":"run inspect"} . Stealth by default intent. 7 CDP patches including the detection vector nobody talks about Runtime.enable . Connect to real Chrome for the hardest protections. Content extraction without selectors. read for articles, extract for repeating data, network for API payloads. The agent never writes CSS selectors. This is not a general-purpose browser testing framework. It's a tool that makes an LLM effective at browsing the web. chrome-agent goto news.ycombinator.com --inspect ~50 tokens instead of ~2,000: uid=n1 RootWebArea "Hacker News" uid=n50 heading "Hacker News" level=1 uid=n82 link "Show HN: A New Browser Tool" uid=n97 link "Rust 2025 Edition Announced" ... Click + see the new page in one call: chrome-agent click n82 --inspect UIDs are based on Chrome's backendNodeId . They don't change between inspects. Click n82 now or five minutes from now. chrome-agent 3 MB Rust binary | CDP over WebSocket v Chrome headless, no Node.js, no runtime | If you've hit this... | chrome-agent does this instead | |---|---| | Playwright snapshots burn 2K tokens | a11y tree: ~50 tokens. 40x less context spent on page state. | | CSS selectors break after every deploy | UIDs from Chrome's backendNodeId . Stable as long as the DOM node exists. | | Click then inspect = 2 round-trips | --inspect on any command. One call, action + observation. | | 200MB of Node + npm + Playwright | 3 MB binary. npx chrome-agent works out of the box. | | Cloudflare blocks your headless Chrome | 7 CDP patches. Runtime.enable never called the detection vector nobody talks about . | | Writing per-site scraping selectors | read for articles, extract for lists/tables/cards, network for API payloads. No selectors. | | Errors are stack traces | {"ok":false, "error":"...", "hint":"run inspect"} -- parseable, actionable. | | Each command launches a fresh browser | Sessions persist. Chrome stays alive between calls. ~10ms startup. | | Agent can't access your logged-in accounts | --copy-cookies grabs cookies from your real Chrome. Works with X.com, Gmail, dashboards. | | Infinite scroll shows 10 items | inspect --scroll --limit 50 scrolls and collects. Tested on X.com: 50 tweets from a live timeline. | | Two agents sharing one browser = chaos | --browser agent1 , --browser agent2 . Separate Chrome instances. | For AI agents -- installs a SKILL.md your agent reads automatically npx skills add sderosiaux/chrome-agent Or just the binary npm install -g chrome-agent prebuilt npx chrome-agent --help no install cargo install chrome-agent from source Navigate and see the page chrome-agent goto https://example.com --inspect Click by uid chrome-agent click n12 --inspect Fill a form chrome-agent fill --uid n20 "user@test.com" CSS selectors work too chrome-agent click --selector "button.submit" chrome-agent fill --selector "input name=email " "hello@test.com" Article content Readability -- like Firefox Reader Mode chrome-agent read Visible text, scoped and capped chrome-agent text --selector "main" --truncate 500 Run JS chrome-agent eval "document.title" Screenshot returns a file path, not binary chrome-agent screenshot | Command | What it does | |---|---| goto