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.
Running the control server on the browser machine
Run a standalone browser control server (recommended when your Gateway is remote):Security
This section covers the browser control server (browser.controlUrl) used for agent browser automation.
Key ideas:
- Treat the browser control server like an admin API: private network only.
- Use token auth always when the server is reachable off-machine.
- Prefer Tailnet-only connectivity over LAN exposure.
Tokens (what is shared with what?)
browser.controlToken/CLAWDBOT_BROWSER_CONTROL_TOKENis only for authenticating browser control HTTP requests tobrowser.controlUrl.- It is not the Gateway token (
gateway.auth.token) and not a node pairing token. - You can reuse the same string value, but it’s better to keep them separate to reduce blast radius.
Binding (don’t expose to your LAN by accident)
Recommended:- Keep
clawdbot browser servebound to loopback (127.0.0.1) and publish it via Tailscale. - Or bind to a Tailnet IP only (never
0.0.0.0) and require a token.
--bind 0.0.0.0(LAN-visible). Even with token auth, traffic is plain HTTP unless you also add TLS.
TLS / HTTPS (recommended approach: terminate in front)
Best practice here: keepclawdbot browser serve on HTTP and terminate TLS in front.
If you’re already using Tailscale, you have two good options:
- Tailnet-only, still HTTP (transport is encrypted by Tailscale):
- Keep
controlUrlashttp://…but ensure it’s only reachable over your tailnet.
- Serve HTTPS via Tailscale (nice UX:
https://…URL):
browser.controlUrl to the HTTPS URL (MagicDNS/ts.net) and keep using the same token.
Notes:
- Do not use Tailscale Funnel for this unless you explicitly want to make the endpoint public.
- For Tailnet setup/background, see Gateway web surfaces and the Gateway CLI.
Profiles (multi-browser)
Clawdbot supports multiple named profiles (routing configs). Profiles can be:- clawd-managed: a dedicated Chrome instance with its own user data directory + CDP port
- remote: an explicit CDP URL (Chrome running elsewhere)
- extension relay: your existing Chrome tab(s) via the local relay + Chrome extension
- The
clawdprofile is auto-created if missing. - The
chromeprofile is built-in for the Chrome extension relay (points athttp://127.0.0.1:18792by default). - 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.
Chrome extension relay (use your existing Chrome)
Clawdbot can also drive your existing Chrome tabs (no separate “clawd” Chrome instance) via a local CDP relay + a Chrome extension. Full guide: Chrome extension Flow:- You run a browser control server (Gateway on the same machine, or
clawdbot browser serve). - A local relay server listens at a loopback
cdpUrl(default:http://127.0.0.1:18792). - You click the Clawdbot Browser Relay extension icon on a tab to attach (it does not auto-attach).
- The agent controls that tab via the normal
browsertool, by selecting the right profile.
clawdbot browser serve.
Use browser serve only when the Gateway runs elsewhere (remote mode).
Sandboxed sessions
If the agent session is sandboxed, thebrowser tool may default to target="sandbox" (sandbox browser).
Chrome extension relay takeover requires host browser control, so either:
- run the session unsandboxed, or
- set
agents.defaults.sandbox.browser.allowHostControl: trueand usetarget="host"when calling the tool.
Setup
- Load the extension (dev/unpacked):
- Chrome →
chrome://extensions→ enable “Developer mode” - “Load unpacked” → select the directory printed by
clawdbot browser extension path - Pin the extension, then click it on the tab you want to control (badge shows
ON).
- Use it:
- CLI:
clawdbot browser --browser-profile chrome tabs - Agent tool:
browserwithprofile="chrome"
- This mode relies on Playwright-on-CDP for most operations (screenshots/snapshots/actions).
- Detach by clicking the extension icon again.
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 for clawd-managed Chrome. For the Chrome extension relay driver, ARIA snapshots and screenshots require Playwright.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 --efficientclawdbot browser snapshot --labelsclawdbot 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).--efficient(or--mode efficient): compact role snapshot preset (interactive + compact + depth + lower maxChars).- 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).--labelsadds a viewport-only screenshot with overlayed ref labels (printsMEDIA:<path>).
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). - Add
--labelsto include a viewport screenshot with overlayede12labels.
- 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.