{"slug": "show-hn-fab-a-fast-browser-cli-for-ai-agents", "title": "Show HN: Fab – a fast browser CLI for AI agents", "summary": "Developer Ian K. released fab, an open-source browser CLI for AI agents, claiming 92.5% task pass rate versus 73.1% for LLM plus chrome-devtools-mcp, at a median 16.6 seconds per task versus 40.7 seconds and $0.0044 per task versus $0.0133. The blind suite of 40 tasks on 20 unseen apps, measured 2026-09-24 with the same planner LLM and strict outcome checks, is documented in the project's bench/LOG.md under \"Blind gate: held-out-3\". fab emits JSON Lines output, accepts JSON Schema for structured results, and pulls logins and secrets from 1Password, Bitwarden or the macOS Keychain so credentials never reach the agent.", "body_md": "Ever noticed how painfully sluggish it is for agents to use a web browser?\n`fab`'s sole mission is to fix that. A beacon of perf in the hellscape of clunky\nagentic browser tooling. It's also cheaper and more accurate than the\nalternatives.\n\n<sub>\"Customize my October training block\": two session swaps among look-alikes,\na new court day, save. Same LLM (mercury-2.5), real time. Left: the LLM driving\nchrome-devtools-mcp, 35.0 s. Right: fab, 2.7 s.</sub>\n\nYour agent says what it wants done, in words. fab does the clicking, typing, reading and signing in, and hands back the result.\n\n|  | LLM + chrome-devtools-mcp | fab | \n|---|---|---|\n| tasks passed | 73.1% | **92.5%** | \n| median time per task | 40.7 s | **16.6 s** | \n| cost per task | $0.0133 | **$0.0044** | \n\n<sub>A blind suite of 40 tasks on 20 unseen apps, same planner LLM, strict\noutcome checks, measured 2026-09-24. How it's measured: [`bench/LOG.md`](https://github.com/ianks/fast-agentic-browser/blob/main/bench/LOG.md)\n(\"Blind gate: held-out-3\").</sub>\n\n```\nfab do \"open news.ycombinator.com and tell me the top story and its points\"\nfab do \"search for Ada Lovelace and tell me when she was born\" --url en.wikipedia.org\nfab do \"log in to github.com\"                                  # your saved login, 2FA included\nfab do \"what's the total of refunded orders?\" --url localhost:3000/orders    # exact, across every page\nfab do \"pay with {{card number}}, expiry {{expiry}}, CVC {{CVC}}, but don't place the order\"\nfab do 'sign up as \"qa+1@acme.dev\" with {{new password}}' --url localhost:3000/signup\nfab do '{\"do\": \"every job on all pages\", \"url\": \"jobs.example.com\",\n         \"records\": {\"properties\": {\"title\": {\"type\": \"string\"}, \"salary\": {\"type\": [\"number\", \"null\"]}}}}'\nfab close\n```\n\nAgents declare what they want back as JSON Schema and get exactly that shape\n([docs/output.md](https://github.com/ianks/fast-agentic-browser/blob/main/docs/output.md)); words are for people.\n\nNo, and there never will be. For the first time in history, the dreams of the\nUnix philosophy are finally being realized by LLMs. One-shotting bash pipelines\nis viable now. This is an **extremely** powerful way to shape data, and MCP prevents\nthat. Just let the LLMs use bash, sheesh.\n\n**One output format.** Every command prints JSON Lines: a `start` event, a\n`record` per result, and one `end` with the answer or a typed error, on success\nand failure alike ([docs/output.md](https://github.com/ianks/fast-agentic-browser/blob/main/docs/output.md)).\n\n**Scrape in plain English.** Ask for data from a list and fab streams a record\nper item as it pages through it, opening each item's page when a field lives\nthere:\n\n```\nfab do \"every job on all pages: title, company, and the salary from its page\" --url jobs.example.com \\\n  | jq -c 'select(.t==\"record\").data' > jobs.jsonl\n```\n\nfab writes the request's logic as a small program (loops, conditions, limits;\n`--print` shows it, `fab run` runs one). The items, fields, pages and detail\npages are handled by code in the page: an LLM maps each page layout to its fields\nonce, detail pages are fetched in parallel, and values are copied exactly. The\neval (`bench/scrape`, 20 cases on generated sites, 1,746 records: numbered\npages, Next buttons, Load more, endless scroll, two-row records, 3-level\nnesting, client-rendered details, sponsored items, missing fields) is exact on\nall 20 in most runs, with an occasional miss where the LLM maps a field\nwrong; 1,000 products with their pages take about 20 s.\n\n**Secrets never reach your agent.**\n\n- Logins come from 1Password, Bitwarden or the macOS Keychain, and are typed only on the site they're saved for.\n- `{{plain words}}` stands for anything else in your password manager.\nPasswords, codes, card numbers and keys stay`••••` everywhere, and fab asks\nyou once per site before it uses a card, an identity or a key.\n- A `{{new password}}` is generated and saved before it's typed.\n- `fab secrets` shows what's connected.\n\n```\ncargo install --locked fast-agentic-browser\nfab doctor\n```\n\nHigh-level steps need an `OPENROUTER_API_KEY` (in the environment or\n`~/.config/fab/env`).\n\n**Agents** drive fab through the CLI:\n\n- **The CLI skill:**`fab --skill` prints it,`fab --skill --install` adds it to\nClaude Code, and`--install codex|agents|<dir>` puts it elsewhere. Commands\non one session (`-s NAME` , default`default` ) share one browser window and\nits logins.\n- **Concurrency:** requests that overlap (several`fab do` at once) run side\nby side in tabs of the same browser, sharing its logins; each caller's next\nstep continues on its own tab (name callers with`FAB_CLIENT` ). At most`FAB_POOL_MAX` tabs (default 4) — more requests wait their turn — and idle\ntabs close after`FAB_POOL_IDLE` seconds (60).\n- **Durable tasks:** a request survives a crash.`fab tasks list` shows them,`fab tasks resume ID` continues one from its last confirmed step, and`fab tasks resolve` settles a step whose outcome is uncertain (did the\nclick land?) before anything is repeated.\n\n**Browser.** fab uses your default browser (Chrome, Edge, Brave, Firefox, …) in\na window you can watch, with its own profile. `--headless` hides the window,\n`--browser firefox` picks one, and `--connect auto` works in your running Chrome.\n\n`fab-bench` runs the suites, races and the decision dataset\n(`fab-bench bench --mode agent --suite bench/heldout3.toml`), and the scrape\neval (`fab-bench scrape run`). `scripts/demo` opens a live browser with a\nterminal wired to it, for trying requests by hand. The history of\nevery change and its measured effect is in [`bench/LOG.md`](https://github.com/ianks/fast-agentic-browser/blob/main/bench/LOG.md).\n\nLicensed under either of [Apache License, Version 2.0](https://github.com/ianks/fast-agentic-browser/blob/main/LICENSE-APACHE) or\n[MIT license](https://github.com/ianks/fast-agentic-browser/blob/main/LICENSE-MIT) at your option.", "url": "https://wpnews.pro/news/show-hn-fab-a-fast-browser-cli-for-ai-agents", "canonical_source": "https://github.com/ianks/fast-agentic-browser", "published_at": "2026-09-29 20:27:39+00:00", "updated_at": "2026-09-29 20:47:55.216322+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "developer-tools", "ai-crawlers"], "entities": ["fab", "Ian K.", "chrome-devtools-mcp", "1Password", "Bitwarden", "macOS Keychain", "GitHub", "mercury-2.5"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/show-hn-fab-a-fast-browser-cli-for-ai-agents", "markdown": "https://wpnews.pro/news/show-hn-fab-a-fast-browser-cli-for-ai-agents.md", "text": "https://wpnews.pro/news/show-hn-fab-a-fast-browser-cli-for-ai-agents.txt", "jsonld": "https://wpnews.pro/news/show-hn-fab-a-fast-browser-cli-for-ai-agents.jsonld"}}