| name | rodney |
| description | Drive headless Chrome from the CLI for web scraping, screenshots, form filling, PDF export, accessibility audits, and browser smoke tests. Use when the user wants to automate browser interactions, scrape dynamic pages (JS-rendered content), take page screenshots or element screenshots, fill and submit web forms, export pages as PDF, run accessibility checks, or assert page state in CI/CD pipelines. Triggers on mentions of: browser automation, headless Chrome, web scraping, page screenshots, form automation, accessibility testing, browser testing, rodney. |
Rodney — Chrome Automation
Rodney drives a persistent headless Chrome instance from the terminal. All commands share one long-running Chrome process — cookies, localStorage, and navigation state persist across invocations.
⚠️ Usage: CLI Only — NOT an MCP Tool
Rodney is a CLI tool, not an MCP server. Use it via the bash tool only. Never call mcp("rodney").
Every rodney session follows this pattern via bash:
rodney start
rodney open <url>
rodney waitstable
rodney stop
Important:
- Call each command as a separate bash invocation (e.g.
rodney start, then rodney open <url>, etc.)
- Always
rodney stop when finished — otherwise Chrome runs forever
- Combine start → open → waitstable → work → stop in every workflow
Install
uv tool install rodney
Requires Chrome or Chromium. Set ROD_CHROME_BIN if not at default location.
Project Setup
To add rodney to a project, add this to the project's AGENTS.md:
## Browser Automation
Use rodney for headless Chrome automation (scraping, screenshots, forms, PDFs, a11y, smoke tests).
### Setup
1. Install: `uv tool install rodney`
2. Verify: `rodney start && rodney stop`
3. Link skill: `ln -s /path/to/skale-skills/skills/rodney .pi/skills/rodney`
### Usage
```bash
rodney start
rodney open https://example.com
rodney waitstable
rodney screenshot page.png
rodney stop
## Quick Start
```bash
rodney start # Launch headless Chrome
rodney start --show # Launch visible Chrome (for debugging)
rodney open https://example.com # Navigate
rodney text "h1" # Extract text
rodney screenshot page.png # Screenshot
rodney stop # Shut down
Commands
Navigation & Waiting
rodney open <url>
rodney back
rodney forward
rodney reload [--hard]
rodney wait <selector>
rodney waitload
rodney waitstable
rodney waitidle
rodney sleep <seconds>
Content Extraction
rodney title
rodney url
rodney text <selector>
rodney html [selector]
rodney attr <selector> <name>
rodney js <expression>
Screenshots & PDFs
rodney screenshot [-w N -h N] [file]
rodney screenshot-el <selector> [file]
rodney pdf [file]
Interaction
rodney click <selector>
rodney input <selector> <text>
rodney clear <selector>
rodney select <selector> <value>
rodney submit <selector>
rodney hover <selector>
rodney file <selector> <path>
rodney download <selector> [file]
Tabs
rodney pages
rodney page <index>
rodney newpage [url]
rodney closepage [index]
Assertions (exit 1 on failure)
rodney exists <selector>
rodney visible <selector>
rodney count <selector>
rodney assert <expr> [expected] [-m msg]
Accessibility
rodney ax-tree [--depth N] [--json]
rodney ax-find [--name N] [--role R] [--json]
rodney ax-node <selector> [--json]
Sessions
| Type | State | Flag |
|---|
| Global | ~/.rodney/ | default |
| Local | ./.rodney/ | --local |
Use --local for per-project isolation. Auto-detects local if ./.rodney/state.json exists.
Environment
| Variable | Default | Purpose |
|---|
ROD_CHROME_BIN | auto | Chrome binary path |
ROD_TIMEOUT | 30 | Element query timeout (seconds) |
RODNEY_HOME | ~/.rodney | Data directory |
Gotchas
- Always
rodney stop when done — otherwise a Chrome process lingers indefinitely.
waitstable is preferred over waitload for SPAs and dynamic pages — waitload only fires on initial navigation, not on client-side renders.
js results are stringified — arrays and objects come back as JSON strings. Pipe through python3 -m json.tool or use --json flags where available.
js does NOT support multi-line expressions — it takes a single string argument. For complex logic, chain calls or use IIFEs on one line: rodney js "(function(){ var els = document.querySelectorAll('.item'); return els[0].innerText; })()"
- Selectors are CSS only — no XPath. Use
rodney js for complex queries.
- One Chrome process per session — calling
rodney start while already running is a no-op, not an error.
open auto-adds http:// — for https:// URLs, include the scheme explicitly.
- Exit codes: 0 = success, 1 = assertion failed, 2 = error (bad args, timeout, no browser).
- Heavy React apps (booking sites, SPAs with autocomplete dropdowns) may timeout on
click/input. Workaround: use the site's public API directly (most airlines, travel sites have one), or use rodney js to set values programmatically.
References
- references/commands.md — Full command reference with all flags and options. Read when you need details on a specific command.
- references/examples.md — Ready-to-use workflow scripts for scraping, form filling, smoke tests, and accessibility audits.
- references/debugging.md — Non-obvious debugging patterns: screenshot time-series, form validation checks, exit code chaining, and visible-mode debugging.
- references/dev-workflow.md — Dev loop: reload-assess-iterate, page inspection without screenshots, DOM structure, accessibility tree, layout queries.