Browser (clawd-managed)
Clawdbot can run a dedicated Chrome/Chromium profile that the agent controls. It is isolated from your personal browser and is managed through a small local control server. Beginner view:- Think of it as a separate, agent-only browser.
- It does not touch your personal Chrome profile.
- The agent can open tabs, read pages, click, and type in a safe lane.
What you get
- A separate browser profile named clawd (orange accent by default).
- Deterministic tab control (list/open/focus/close).
- Agent actions (click/type/drag/select), snapshots, screenshots, PDFs.
- Optional multi-profile support (
clawd,work,remote, …).
Quick start
Configuration
Browser settings live in~/.clawdbot/clawdbot.json.
controlUrldefaults tohttp://127.0.0.1:18791.- If you override the Gateway port (
gateway.portorCLAWDBOT_GATEWAY_PORT), the default browser ports shift to stay in the same “family” (control = gateway + 2). cdpUrldefaults tocontrolUrl + 1when unset.attachOnly: truemeans “never launch Chrome; only attach if it is already running.”color+ per-profilecolortint the browser UI so you can see which profile is active.
Local vs remote control
- Local control (default):
controlUrlis loopback (127.0.0.1/localhost). The Gateway starts the control server and can launch Chrome. - Remote control:
controlUrlis non-loopback. The Gateway does not start a local server; it assumes you are pointing at an existing server elsewhere. - Remote CDP: set
browser.profiles.<name>.cdpUrl(orbrowser.cdpUrl) to attach to a remote Chrome. In this case, Clawdbot will not launch a local browser.
Remote browser (control server)
You can run the browser control server on another machine and point your Gateway at it with a remotecontrolUrl. This lets the agent drive a browser
outside the host (lab box, VM, remote desktop, etc.).
Key points:
- The control server speaks to Chrome/Chromium via CDP.
- The Gateway only needs the HTTP control URL.
- Profiles are resolved on the control server side.
profiles.<name>.cdpUrl for remote CDP if you want the Gateway to talk
directly to a Chrome instance without a remote control server.
Profiles (multi-browser)
Clawdbot supports multiple named profiles. Each profile has its own:- user data directory
- CDP port (local) or CDP URL (remote)
- accent color
- The
clawdprofile is auto-created if missing. - Local CDP ports allocate from 18800–18899 by default.
- Deleting a profile moves its local data directory to Trash.
?profile=<name>; the CLI uses --browser-profile.
Isolation guarantees
- Dedicated user data dir: never touches your personal Chrome profile.
- Dedicated ports: avoids
9222to prevent collisions with dev workflows. - Deterministic tab control: target tabs by
targetId, not “last tab”.
Browser selection
When launching locally, Clawdbot picks the first available:- Chrome Canary
- Chromium
- Chrome
browser.executablePath.
Platforms:
- macOS: checks
/Applicationsand~/Applications. - Linux: looks for
google-chrome,chromium, etc. - Windows: checks common install locations.
Control API (optional)
If you want to integrate directly, the browser control server exposes a small HTTP API:- Status/start/stop:
GET /,POST /start,POST /stop - Tabs:
GET /tabs,POST /tabs/open,POST /tabs/focus,DELETE /tabs/:targetId - Snapshot/screenshot:
GET /snapshot,POST /screenshot - Actions:
POST /navigate,POST /act - Hooks:
POST /hooks/file-chooser,POST /hooks/dialog - Downloads:
POST /download,POST /wait/download - Debugging:
GET /console,POST /pdf - Debugging:
GET /errors,GET /requests,POST /trace/start,POST /trace/stop,POST /highlight - Network:
POST /response/body - State:
GET /cookies,POST /cookies/set,POST /cookies/clear - State:
GET /storage/:kind,POST /storage/:kind/set,POST /storage/:kind/clear - Settings:
POST /set/offline,POST /set/headers,POST /set/credentials,POST /set/geolocation,POST /set/media,POST /set/timezone,POST /set/locale,POST /set/device
?profile=<name>.
Playwright requirement
Some features (navigate/act/AI snapshot/role snapshot, element screenshots, PDF) require Playwright. If Playwright isn’t installed, those endpoints return a clear 501 error. ARIA snapshots and basic screenshots still work.How it works (internal)
High-level flow:- A small control server accepts HTTP requests.
- It connects to Chrome/Chromium via CDP.
- For advanced actions (click/type/snapshot/PDF), it uses Playwright on top of CDP.
- When Playwright is missing, only non-Playwright operations are available.
CLI quick reference
All commands accept--browser-profile <name> to target a specific profile.
All commands also accept --json for machine-readable output (stable payloads).
Basics:
clawdbot browser statusclawdbot browser startclawdbot browser stopclawdbot browser tabsclawdbot browser tabclawdbot browser tab newclawdbot browser tab select 2clawdbot browser tab close 2clawdbot browser open https://example.comclawdbot browser focus abcd1234clawdbot browser close abcd1234
clawdbot browser screenshotclawdbot browser screenshot --full-pageclawdbot browser screenshot --ref 12clawdbot browser screenshot --ref e12clawdbot browser snapshotclawdbot browser snapshot --format aria --limit 200clawdbot browser snapshot --interactive --compact --depth 6clawdbot browser snapshot --selector "#main" --interactiveclawdbot browser snapshot --frame "iframe#main" --interactiveclawdbot browser console --level errorclawdbot browser errors --clearclawdbot browser requests --filter api --clearclawdbot browser pdfclawdbot browser responsebody "**/api" --max-chars 5000
clawdbot browser navigate https://example.comclawdbot browser resize 1280 720clawdbot browser click 12 --doubleclawdbot browser click e12 --doubleclawdbot browser type 23 "hello" --submitclawdbot browser press Enterclawdbot browser hover 44clawdbot browser scrollintoview e12clawdbot browser drag 10 11clawdbot browser select 9 OptionA OptionBclawdbot browser download e12 /tmp/report.pdfclawdbot browser waitfordownload /tmp/report.pdfclawdbot browser upload /tmp/file.pdfclawdbot browser fill --fields '[{"ref":"1","type":"text","value":"Ada"}]'clawdbot browser dialog --acceptclawdbot browser wait --text "Done"clawdbot browser wait "#main" --url "**/dash" --load networkidle --fn "window.ready===true"clawdbot browser evaluate --fn '(el) => el.textContent' --ref 7clawdbot browser highlight e12clawdbot browser trace startclawdbot browser trace stop
clawdbot browser cookiesclawdbot browser cookies set session abc123 --url "https://example.com"clawdbot browser cookies clearclawdbot browser storage local getclawdbot browser storage local set theme darkclawdbot browser storage session clearclawdbot browser set offline onclawdbot browser set headers --json '{"X-Debug":"1"}'clawdbot browser set credentials user passclawdbot browser set credentials --clearclawdbot browser set geo 37.7749 -122.4194 --origin "https://example.com"clawdbot browser set geo --clearclawdbot browser set media darkclawdbot browser set timezone America/New_Yorkclawdbot browser set locale en-USclawdbot browser set device "iPhone 14"
uploadanddialogare arming calls; run them before the click/press that triggers the chooser/dialog.uploadcan also set file inputs directly via--input-refor--element.snapshot:--format ai(default when Playwright is installed): returns an AI snapshot with numeric refs (aria-ref="<n>").--format aria: returns the accessibility tree (no refs; inspection only).- Role snapshot options (
--interactive,--compact,--depth,--selector) force a role-based snapshot with refs likeref=e12. --frame "<iframe selector>"scopes role snapshots to an iframe (pairs with role refs likee12).--interactiveoutputs a flat, easy-to-pick list of interactive elements (best for driving actions).
click/type/etc require areffromsnapshot(either numeric12or role refe12). CSS selectors are intentionally not supported for actions.
Snapshots and refs
Clawdbot supports two “snapshot” styles:-
AI snapshot (numeric refs):
clawdbot browser snapshot(default;--format ai)- Output: a text snapshot that includes numeric refs.
- Actions:
clawdbot browser click 12,clawdbot browser type 23 "hello". - Internally, the ref is resolved via Playwright’s
aria-ref.
-
Role snapshot (role refs like
e12):clawdbot browser snapshot --interactive(or--compact,--depth,--selector,--frame)- Output: a role-based list/tree with
[ref=e12](and optional[nth=1]). - Actions:
clawdbot browser click e12,clawdbot browser highlight e12. - Internally, the ref is resolved via
getByRole(...)(plusnth()for duplicates).
- Output: a role-based list/tree with
- Refs are not stable across navigations; if something fails, re-run
snapshotand use a fresh ref. - If the role snapshot was taken with
--frame, role refs are scoped to that iframe until the next role snapshot.
Wait power-ups
You can wait on more than just time/text:- Wait for URL (globs supported by Playwright):
clawdbot browser wait --url "**/dash"
- Wait for load state:
clawdbot browser wait --load networkidle
- Wait for a JS predicate:
clawdbot browser wait --fn "window.ready===true"
- Wait for a selector to become visible:
clawdbot browser wait "#main"
Debug workflows
When an action fails (e.g. “not visible”, “strict mode violation”, “covered”):clawdbot browser snapshot --interactive- Use
click <ref>/type <ref>(prefer role refs in interactive mode) - If it still fails:
clawdbot browser highlight <ref>to see what Playwright is targeting - If the page behaves oddly:
clawdbot browser errors --clearclawdbot browser requests --filter api --clear
- For deep debugging: record a trace:
clawdbot browser trace start- reproduce the issue
clawdbot browser trace stop(printsTRACE:<path>)
JSON output
--json is for scripting and structured tooling.
Examples:
refs plus a small stats block (lines/chars/refs/interactive) so tools can reason about payload size and density.
State and environment knobs
These are useful for “make the site behave like X” workflows:- Cookies:
cookies,cookies set,cookies clear - Storage:
storage local|session get|set|clear - Offline:
set offline on|off - Headers:
set headers --json '{"X-Debug":"1"}'(or--clear) - HTTP basic auth:
set credentials user pass(or--clear) - Geolocation:
set geo <lat> <lon> --origin "https://example.com"(or--clear) - Media:
set media dark|light|no-preference|none - Timezone / locale:
set timezone ...,set locale ... - Device / viewport:
set device "iPhone 14"(Playwright device presets)set viewport 1280 720
Security & privacy
- The clawd browser profile may contain logged-in sessions; treat it as sensitive.
- For logins and anti-bot notes (X/Twitter, etc.), see Browser login + X/Twitter posting.
- Keep control URLs loopback-only unless you intentionally expose the server.
- Remote CDP endpoints are powerful; tunnel and protect them.
Troubleshooting
For Linux-specific issues (especially snap Chromium), see Browser troubleshooting.Agent tools + how control works
The agent gets one tool for browser automation:browser— status/start/stop/tabs/open/focus/close/snapshot/screenshot/navigate/act
browser snapshotreturns a stable UI tree (AI or ARIA).browser actuses the snapshotrefIDs to click/type/drag/select.browser screenshotcaptures pixels (full page or element).browseraccepts:profileto choose a named browser profile (host or remote control server).target(sandbox|host|custom) to select where the browser lives.controlUrlsetstarget: "custom"implicitly (remote control server).- In sandboxed sessions,
target: "host"requiresagents.defaults.sandbox.browser.allowHostControl=true. - If
targetis omitted: sandboxed sessions default tosandbox, non-sandbox sessions default tohost. - Sandbox allowlists can restrict
target: "custom"to specific URLs/hosts/ports. - Defaults: allowlists unset (no restriction), and sandbox host control is disabled.