Realbrowser is an agent skill and small local CLI for fast target-first browser automation against Chrome/Chromium. It is built for the cases where the useful state is in the browser the developer is already using: signed-in profiles, cookies, local storage, active tabs, console logs, network traffic, downloads, and local app state.
The current CLI is grouped and target-first:
realbrowser [global flags] <group> <command> [args] [flags]Acquire or create one tab target first, then pass -t <label> or --handle to
reads, actions, screenshots, console, network, state, dialogs, performance,
downloads, and exports.
- An agent skill named
realbrowser(works with Claude Code, Codex, and other agent platforms). - A zero-dependency Node CLI at
skills/realbrowser/scripts/realbrowser.mjs. - Portable wrappers:
skills/realbrowser/scripts/realbrowserfor macOS/Linux shells.skills/realbrowser/scripts/realbrowser.ps1for PowerShell.skills/realbrowser/scripts/realbrowser.cmdfor Windowscmd.exe.
- Signed-in profile attach through Chrome/Chromium DevTools endpoints.
- Anonymous managed sessions for clean browser state.
- Stable labeled tab targets, scoped per owner/session.
- Target leases for mutating commands so parallel sessions do not accidentally navigate, close, or click each other's tabs.
- Compact page reads, structured item extraction, screenshots, console logs, network request/response capture, uploads, guarded submits, downloads, and PDF export.
- Node.js 22 or newer.
- Chrome or a Chromium-family browser.
- A local machine where Chrome DevTools access is acceptable for the requested profile/session.
Add the marketplace, then install the plugin:
/plugin marketplace add darkamenosa/realbrowser
/plugin install realbrowser@realbrowser
To update later:
/plugin marketplace update realbrowser
/plugin update realbrowser@realbrowser
Local development install:
/plugin marketplace add /path/to/realbrowser
/plugin install realbrowser@realbrowser
The skill auto-activates when tasks involve browser interaction, screenshots, console logs, network debugging, or form automation.
Place the repo under $HOME/.codex/skills/realbrowser and use the
agents/openai.yaml configuration.
node skills/realbrowser/scripts/realbrowser.mjs helpRun the built-in checks:
skills/realbrowser/scripts/realbrowser self-testParallel sessions:
export REALBROWSER_OWNER=my-project
realbrowser session use profile:chrome:Default
realbrowser tab ensure http://localhost:3000 --profile chrome:Default --label app --background
realbrowser read observe -t appREALBROWSER_OWNER or --owner <id> scopes labels and default context. Without
an explicit owner, Realbrowser uses the current agent/terminal session when one is
available, falling back to the project path. Mutating commands claim a target
lease; if another owner already owns that tab, rerun with --take-lease only when
you intentionally want to take it over. tab ensure creates a fresh tab instead
of reusing another owner's URL match.
Anonymous page:
realbrowser tab ensure https://example.com --anonymous --session check --label page --background
realbrowser read observe -t page --anonymous --session checkVisible Chrome Incognito window:
realbrowser tab ensure https://example.com --anonymous --session private --label page --front --incognito
realbrowser read observe -t page --anonymous --session privateSigned-in profile:
realbrowser profile list --active
realbrowser tab list "localhost" --profile chrome:Default
realbrowser tab ensure http://localhost:3000 --profile chrome:Default --label app --background
realbrowser read observe -t app --profile chrome:DefaultConsole and network evidence:
realbrowser console list -t app --errors --limit 50
realbrowser console capture -t app --reload --duration 3000 --out tmp/console.json
realbrowser network capture -t app --reload --duration 5000 --out tmp/network.json
realbrowser network body -t app req_12 --response --out tmp/req_12-response.json --fullActions and uploads:
realbrowser action state -t app --root active --compact --screenshot --annotate-refs
realbrowser action fill -t app e1 "caption text"
realbrowser action upload -t app --root active --input-ref e2 ~/Downloads/media.png
realbrowser action submit -t app --root active --text "Submit"Screenshots and exports:
realbrowser screenshot capture -t app tmp/app.png
realbrowser screenshot full -t app tmp/app-full.png
realbrowser screenshot device -t page --anonymous --session responsive --devices desktop:1440x900,tablet:768x1024,mobile:390x844 tmp/page
realbrowser export pdf -t app tmp/page.pdf --print-backgroundUse the smallest command that answers the question:
profile list --activeto discover usable signed-in profile endpoints.tab list,tab select,tab ensure, andtab newto acquire a target.read observe,read size,read query,read items,read item, andread snapshotfor compact page state and structured content.action statebefore mutating the page, then act on current refs.consoleandnetworkfor debugging evidence.screenshotandexport pdffor visual artifacts.
Do not start from broad HTML or whole-page dumps. Use --out for large reads,
network bodies, HAR files, screenshots, and traces so they can be inspected with
local tools instead of sent through model context.
With --profile, existing browser tabs may be diagnostic only when CDP is
browser-scoped and the tab was not created by Realbrowser through that profile.
If a named-profile open needs a proven target, create a new tab through the
profile with tab ensure <url> --profile <profile> --label <label>.
--anonymous creates isolated temporary browser state. It is not network
anonymity and is not the same as Chrome's visible Incognito UI. Add
--incognito or --private only when a visible private window is explicitly
needed.
Realbrowser should keep signed-in profile work in the background when possible.
Use --front only for explicit visual handoff. tab ensure --background
performs verified browserContextId discovery when possible.
--best-effort-background is only for stopped-profile launch risk and must not
OS-launch an already-running browser-scoped profile.
Chrome approval prompts are controlled by Chrome, not the skill. Realbrowser
reduces repeated prompts by reusing the same direct DevToolsActivePort
WebSocket and daemon per browser endpoint. After a browser/computer restart, a
signed-in real Chrome profile can still require Chrome's approval once; managed
anonymous sessions avoid signed-in-profile approval but do not contain the user's
logged-in state.
realbrowser/
├── .claude-plugin/
│ └── plugin.json # Claude Code plugin manifest
├── skills/
│ └── realbrowser/
│ ├── SKILL.md # Skill instructions
│ ├── scripts/ # CLI and wrappers
│ │ ├── realbrowser # macOS/Linux shell wrapper
│ │ ├── realbrowser.cmd # Windows cmd wrapper
│ │ ├── realbrowser.ps1 # PowerShell wrapper
│ │ └── realbrowser.mjs # Node CLI implementation
│ └── references/ # Detailed documentation
│ ├── commands.md
│ ├── workflows.md
│ └── design-notes.md
├── agents/
│ └── openai.yaml # Codex agent configuration
├── README.md
├── CHANGELOG.md
└── LICENSE
Realbrowser is intentionally thin and portable:
- Keep workflow guidance in
skills/realbrowser/SKILL.md. - Keep command details in
skills/realbrowser/references/commands.mdandskills/realbrowser/references/workflows.md. - Keep the implementation in
skills/realbrowser/scripts/realbrowser.mjsunless a boundary becomes stable enough to justify another file. - Add or update
self-testcoverage for parser, help, state, and CLI behavior regressions.
Useful checks:
skills/realbrowser/scripts/realbrowser --version
skills/realbrowser/scripts/realbrowser help
skills/realbrowser/scripts/realbrowser self-test