The desktop
A real X11 desktop with Chromium on it, driven by pixel through
compute_computer. Signing in and signing
up.agent-browser
A CLI in the sandbox that drives a browser by accessibility snapshot.
Everything else, including work inside a session the desktop signed in.
agent-browser
The CLI carries its own manual and it always matches the installed version:ref you act on: agent-browser click @e2,
fill "#q" "ripgrep", press Enter.
AGENT_BROWSER_SESSION already names one browser per agent, so nothing you open
can be navigated away by another agent. A browser you stop using is closed after
ten minutes idle and its screen is handed on after fifteen; both come back on
your next command, the page does not. A snapshot that answers about:blank means
the browser restarted — open the page again and carry on.
Three things that will bite you
Refs go stale. Aref belongs to the snapshot that issued it, and anything
that re-renders the page — a cookie banner is enough — invalidates it. The CLI
answers ✗ Unknown ref: e33. Snapshot again and take the ref from the new one.
click on a checkbox lies. It reports ✓ Done and leaves the box
checked=false. Use agent-browser check @e34 and verify with a fresh snapshot.
open returns before the page renders. Grep the snapshot for something you
expect and retry for a few seconds before concluding an element is absent. When
matching a label, match part of it — labels carry icon glyphs inside the quotes,
so button .*PHONE NUMBER matches where the full quoted string never does.
Reading what a form actually answered
Sites reply to an AJAX submit with a toast that is gone before your screenshot, so a blank-looking page is not a failed submit. Ask the endpoint yourself:eval short: a long one against a busy page returns
CDP command timed out: Runtime.evaluate and leaves the tab wedged.
Bot protection
A protected page answersJust a moment.... Cloudflare’s interstitial puts the
challenge in a cross-origin iframe that the snapshot still pierces:
click e9 reports success and does nothing — the challenge only accepts a real
pointer. Click the iframe by coordinates:
cf_clearance is set on failed attempts too, and it is bound to the browser that
earned it:
The flag and headed mode are already in the environment. The residential exit is
only there if
AGENT_BROWSER_PROXY is set — check it before spending attempts,
because a datacentre IP does not pass. Roughly one attempt in six still fails:
retry once, and only with a fresh proxy session. If the second fails, the page
is not worth more attempts. Say so, and offer the person the live desktop with
compute_computer(action="vnc_url").
Captchas
A captcha solver extension ships with the agent-browser skill and the browser loads it on its own — nothing to install or configure. It handles reCAPTCHA, hCaptcha, Turnstile, FunCAPTCHA, GeeTest and AWS WAF, and it watches for a rendered widget. When it applies, the correct behaviour is to do nothing clever:#g-recaptcha-response is often empty even on success.
A widget that sits untouched for a minute is the solver’s service refusing the
request, not a slow page.
Signing in
On the desktop, by pixel:compute_computer(action="vnc_url") returns a signed link to the live
screen that they can watch or drive.
