bb is an agentic IDE that lets users control, customize, and automate a software-development environment through a desktop app, web app, command-line interface, or HTTP API. Developers use it to run work in observable threads that can be steered or handed off to other agents. Its catalogue add-ons provide skills and instructions for working with bb.
Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add get-bb/bb --skill browser-automationgit clone --depth 1 https://github.com/get-bb/bbWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/get-bb/bb/browser-automation)<a href="https://agentmods.dev/skills/get-bb/bb/browser-automation"><img src="https://agentmods.dev/badge/skills/get-bb/bb/browser-automation/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/get-bb/bb/browser-automation"><img src="https://agentmods.dev/badge/skills/get-bb/bb/browser-automation.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00042 | $0.01627 |
| Opus 5.5 | $0.00017 | $0.00651 |
| Sonnet 5.5 | $0.00008 | $0.00325 |
| Haiku 4.5 | $0.00004 | $0.00163 |
Grade A, and why
browser-automation scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 9d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 120 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Use bb browser-automation. Open one session, retain its session ID, then inspect,
act, and verify in short scripts.
--machine accepts an exact host ID or an unambiguous machine name. Exact IDs
take precedence over names; unknown or ambiguous names fail before opening a session.
Choose --backend local --headless --machine <host-id> for headless Chrome on
an enrolled host. Choose --backend desktop --machine <host-id> --desktop <instance-id> for a new desktop automation tab. Desktop tabs use the BB
browser's profile, including the user's signed-in cookies. Starting desktop
control opens the side panel and selects the browser tab only if its thread is
already focused. New or activated controller pages follow the same rule;
automation does not switch threads or bring the desktop window forward. While
controlled, a desktop tab never takes keyboard focus from the composer or other
apps; the user presses Take over to type into it. Headless sessions remain headless.
Plugin-owned local/headless Chrome launches with --no-sandbox, disabling Chrome's
sandbox. Desktop attachment does not change the browser's launch flags.
Resolve the explicit instance with bb browser instances --host <host-id> --json
first. Never silently choose a different host or mode.
Adding --tab <tab-id> takes control of an existing tab; do so only when the
user asked to use that tab. The CLI uses the
current thread, or --thread <id> outside a thread. Each session belongs to
that thread.
CLI opening:
bb browser-automation open --backend local --headless --machine <host-id> --json
bb browser-automation open --backend desktop --machine <host-id> --desktop <instance-id> --json
Run scripts:
bb browser-automation run <session-id> --script 'const p = await browser.getPage("main"); await p.goto("https://example.com"); await p.snapshot()' --json
bb browser-automation run <session-id> --script 'const p = await browser.getPage("main"); await p.click("ref/e6"); await p.snapshot()' --json
bb browser-automation screenshot <session-id> --page main --json
Take a fresh snapshot before using refs after navigation or document changes.
Use refs from that session's DevBrowser snapshot. Do not mix agent-browser refs
or invent selectors. Prefer a cheap URL/text/snapshot check after each action;
request a screenshot when visual verification matters. Use
await p.shot({type:"jpeg",maxEdge:960,quality:70}); undefined inside scripts to
return a bounded JPEG file.
run and screenshot return JSON with hostId and images, where each image
has path, mimeType, width, and height. The path is in the browser session's
temporary directory on that host. Use your image-reading tool on the path when
you are on the same machine. If the browser host differs, fetch the image to
local temporary storage first (substitute the returned path and host ID):
bb file read '<image-path>' --host '<host-id>' --json | node -e '
const fs = require("node:fs"), os = require("node:os"), path = require("node:path");
const file = JSON.parse(fs.readFileSync(0, "utf8"));
if (file.contentEncoding !== "base64") throw new Error("Expected binary image");
const destination = path.join(fs.mkdtempSync(path.join(os.tmpdir(), "browser-image-")), "capture.jpg");
fs.writeFileSync(destination, Buffer.from(file.content, "base64"), {mode: 0o600});
console.log(destination);
'
Read the printed local path with your image-reading tool. Do not print base64 image bytes into the conversation. Read or copy captures before closing the session: cleanup removes its temporary directory. Remove local copies when finished.
A local headless open returns a previewDirective, for example
::browser-preview{session="<session-id>"}. Copy it into your next message
exactly once as a standalone line, before you continue working. Do not wrap it
in backticks or a code fence, and do not invent or edit the session ID. BB
renders it as a live view of that browser in the chat, which the user can
expand, so they can watch while you work. Desktop
sessions return no directive; that browser is already visible in the side
panel. bb browser-automation preview <session-id> --json reports the live
frame's url, title, size, and sequence without image bytes; it is not a
substitute for screenshot when you need to see the page.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 9d ago Changed · +4 lines ea30c934542f
- 11d ago Changed · +2 lines 61aec47df514
- 27d ago Changed · +1 lines 395839b2bbb4
- 1mo ago Changed · +2 lines 4f02a5e469a4
- 1mo ago Changed · +3 lines 755fdb4d8b0d
- 1mo ago Changed · +11 lines 0cc71617e141
- 1mo ago Changed · +11 lines d05b53a95d84
- 1mo ago Changed · +3 lines 9ca91b008311
- 1mo ago First seen · 83 lines · 42 tokens per session scan A 01e53c0c8771
browser-automation is a skill published in the GitHub repository get-bb/bb (4,656 stars, last pushed today), licensed MIT. It adds 42 tokens to every session and 1,627 once invoked, about $0.0002 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-07.
Other skills, from other repositories
cradle-plugin-browser-use
Control Cradle's in-app browser via MCP tools. Use when the Claude Agent needs to navigate websites, click elements, type text, take screenshots, read page content, or inspect DOM structure within the Cradle desktop app's embedded browser panel. Triggers on "open URL", "navigate to", "click the button", "fill the…
d3k
Run and debug a local web app with a managed browser and a shared server/browser evidence timeline. Use when asked to develop, test, or reproduce a browser issue with d3k.
surf
Drive the user's logged-in Chrome from the shell. Use for browser automation (open, read, click, fill, upload, screenshot), reading a site's feed or API, or asking ChatGPT, Gemini, Perplexity or Grok through the browser.
devtools-webmcp
Register WebMCP tools with registerDevtoolsTools from @tanstack/devtools-webmcp. Name rules, cleanup, replace behavior, root import, and the /production import.
javascript-sandbox
Best practices for using the stagewise built-in JavaScript sandbox. Explains how to access APIs for browser debugging/interaction, use external dependencies, file system access, running mini-apps, etc.
aif-chrome-profile
Drive a real Google Chrome profile via Chrome DevTools MCP with the chrome-profile CLI, deterministic profile discovery and URL-anchor tab selection.