Loading...
Loading...
Fast web browsing and web app testing for AI coding agents via persistent headless Chromium daemon. Browse any URL, read page content, click elements, fill forms, run JavaScript, take screenshots, inspect CSS/DOM, capture console/network logs, and more. Ideal for verifying local dev servers, testing UI changes, and validating web app behavior end-to-end. ~100ms per command after first call. Works with Claude Code, Cursor, Cline, Windsurf, and any agent that can run Bash. No MCP, no Chrome extension — just fast CLI.
npx skill4agent add ulpi-io/skills browsebrowse --versionCLI is not installed. Install it with:browsebashbun install -g @ulpi/browseIf you don't have bun, install it first from https://bun.sh then run the command above.
.claude/settings.jsonpermissions.allow"Bash(browse:*)",
"Bash(browse goto:*)", "Bash(browse back:*)", "Bash(browse forward:*)",
"Bash(browse reload:*)", "Bash(browse url:*)", "Bash(browse text:*)",
"Bash(browse html:*)", "Bash(browse links:*)", "Bash(browse forms:*)",
"Bash(browse accessibility:*)", "Bash(browse snapshot:*)",
"Bash(browse snapshot-diff:*)", "Bash(browse click:*)",
"Bash(browse dblclick:*)", "Bash(browse fill:*)", "Bash(browse select:*)",
"Bash(browse hover:*)", "Bash(browse focus:*)",
"Bash(browse check:*)", "Bash(browse uncheck:*)",
"Bash(browse type:*)", "Bash(browse press:*)",
"Bash(browse keydown:*)", "Bash(browse keyup:*)",
"Bash(browse scroll:*)", "Bash(browse wait:*)",
"Bash(browse viewport:*)", "Bash(browse upload:*)",
"Bash(browse drag:*)", "Bash(browse highlight:*)", "Bash(browse download:*)",
"Bash(browse dialog-accept:*)", "Bash(browse dialog-dismiss:*)",
"Bash(browse js:*)", "Bash(browse eval:*)", "Bash(browse css:*)",
"Bash(browse attrs:*)", "Bash(browse element-state:*)", "Bash(browse dialog:*)",
"Bash(browse console:*)", "Bash(browse network:*)",
"Bash(browse cookies:*)", "Bash(browse storage:*)", "Bash(browse perf:*)",
"Bash(browse value:*)", "Bash(browse count:*)",
"Bash(browse devices:*)", "Bash(browse emulate:*)",
"Bash(browse screenshot:*)", "Bash(browse pdf:*)",
"Bash(browse responsive:*)", "Bash(browse diff:*)",
"Bash(browse chain:*)", "Bash(browse tabs:*)", "Bash(browse tab:*)",
"Bash(browse newtab:*)", "Bash(browse closetab:*)",
"Bash(browse frame:*)",
"Bash(browse sessions:*)", "Bash(browse session-close:*)",
"Bash(browse state:*)", "Bash(browse auth:*)", "Bash(browse har:*)", "Bash(browse video:*)",
"Bash(browse route:*)", "Bash(browse offline:*)",
"Bash(browse status:*)", "Bash(browse stop:*)", "Bash(browse restart:*)",
"Bash(browse cookie:*)", "Bash(browse header:*)",
"Bash(browse useragent:*)",
"Bash(browse clipboard:*)", "Bash(browse screenshot-diff:*)",
"Bash(browse find:*)", "Bash(browse inspect:*)",
"Bash(browse instances:*)", "Bash(browse --headed:*)"browseB=...#[id=foo]#foo#gotobrowse wait --network-idle.browse/sessions/default/.browse/sessions/<session-id>/--sessionbrowse screenshot .browse/sessions/default/homepage.png/tmp--session <id>--json{success, data, command}--content-boundaries--allowed-domains domain1,domain2# Navigate to a page
browse goto https://example.com
# Read cleaned page text
browse text
# Take a screenshot (then Read the image — saved to .browse/sessions/default/screenshot.png)
browse screenshot
# Snapshot: accessibility tree with refs
browse snapshot -i
# Click by ref (after snapshot)
browse click @e3
# Fill by ref
browse fill @e4 "test@test.com"
# Double-click, focus, check/uncheck
browse dblclick @e3
browse focus @e5
browse check @e7
browse uncheck @e7
# Drag and drop
browse drag @e1 @e2
# Run JavaScript
browse js "document.title"
# Get all links
browse links
# Get input value / count elements
browse value "[id=email]"
browse count ".search-result"
# Click by CSS selector
browse click "button.submit"
# Fill a form by CSS selector (use [id=...] instead of # to avoid shell issues)
browse fill "[id=email]" "test@test.com"
browse fill "[id=password]" "abc123"
browse click "button[type=submit]"
# Scroll
browse scroll up
browse scroll down
browse scroll "[id=target]"
# Wait for navigation or network
browse wait ".loaded"
browse wait --url "**/dashboard"
browse wait --network-idle
# iframe targeting
browse frame "[id=my-iframe]"
browse text # reads from inside the iframe
browse click @e3 # clicks inside the iframe
browse frame main # back to main page
# Highlight an element (visual debugging)
browse highlight @e5
# Download a file
browse download @e3 ./file.pdf
# Network mocking
browse route "**/*.png" block
browse route "**/api/data" fulfill 200 '{"mock":true}'
browse route clear
# Offline mode
browse offline on
browse offline off
# JSON output mode
browse --json goto https://example.com
# Security: content boundaries
browse --content-boundaries text
# Security: domain restriction
browse --allowed-domains example.com,*.cdn.example.com goto https://example.com
# State persistence
browse state save mysite
browse state load mysite
# Auth vault (credentials never visible to LLM)
browse auth save github https://github.com/login user pass123
browse auth login github
# HAR recording
browse har start
browse goto https://example.com
browse har stop ./recording.har
# Video recording
browse video start ./videos
browse goto https://example.com
browse click @e3
browse video stop
# Device emulation
browse emulate iphone
browse emulate reset
# Parallel sessions
browse --session agent-a goto https://site1.com
browse --session agent-b goto https://site2.com
# Clipboard
browse clipboard
browse clipboard write "copied text"
# Find elements semantically
browse find role button
browse find text "Submit"
browse find testid "login-btn"
# Screenshot diff (visual regression)
browse screenshot-diff baseline.png current.png
# Headed mode (visible browser)
browse --headed goto https://example.com
# Stealth mode (bypasses bot detection)
# Requires: bun add rebrowser-playwright && npx rebrowser-playwright install chromium
browse --runtime rebrowser goto https://example.com
# State list / show
browse state list
browse state show mysitebrowse goto <url> Navigate current tab
browse back Go back
browse forward Go forward
browse reload Reload page
browse url Print current URL
browse version Print CLI versionbrowse text Cleaned page text (no scripts/styles)
browse html [selector] innerHTML of element, or full page HTML
browse links All links as "text → href"
browse forms All forms + fields as JSON
browse accessibility Accessibility tree snapshot (ARIA)browse snapshot Full accessibility tree with @refs
browse snapshot -i Interactive elements only — terse flat list (minimal tokens)
browse snapshot -i -f Interactive elements — full indented tree with props
browse snapshot -i -V Interactive elements — viewport only (skip below-fold)
browse snapshot -c Compact (no empty structural elements)
browse snapshot -C Cursor-interactive (detect divs with cursor:pointer/onclick/tabindex)
browse snapshot -d <N> Limit depth to N levels
browse snapshot -s <sel> Scope to CSS selector
browse snapshot-diff Compare current vs previous snapshotbrowse click @e3 Click the element assigned ref @e3
browse fill @e4 "value" Fill the input assigned ref @e4
browse hover @e1 Hover the element assigned ref @e1
browse html @e2 Get innerHTML of ref @e2
browse css @e5 "color" Get computed CSS of ref @e5
browse attrs @e6 Get attributes of ref @e6snapshotgotobrowse click <selector> Click element (CSS selector or @ref)
browse click <x>,<y> Click at page coordinates (e.g. 590,461)
browse dblclick <selector> Double-click element
browse fill <selector> <value> Fill input field
browse select <selector> <val> Select dropdown value
browse hover <selector> Hover over element
browse focus <selector> Focus element
browse check <selector> Check checkbox
browse uncheck <selector> Uncheck checkbox
browse drag <src> <tgt> Drag source to target
browse type <text> Type into focused element
browse press <key> Press key (Enter, Tab, Escape, etc.)
browse keydown <key> Hold key down
browse keyup <key> Release key
browse scroll [sel|up|down] Scroll element/viewport/bottom
browse wait <sel|--url|--network-idle> Wait for element, URL, or network
browse viewport <WxH> Set viewport size (e.g. 375x812)
browse upload <sel> <files> Upload file(s) to a file input
browse highlight <selector> Highlight element (visual debugging)
browse download <sel> [path] Download file triggered by click
browse dialog-accept [value] Set dialogs to auto-accept
browse dialog-dismiss Set dialogs to auto-dismiss (default)
browse emulate <device> Emulate device (iphone, pixel, etc.)
browse emulate reset Reset to desktop (1920x1080)
browse offline [on|off] Toggle offline modebrowse route <pattern> block Block matching requests
browse route <pattern> fulfill <s> [b] Mock with status + body
browse route clear Remove all routesbrowse js <expression> Run JS, print result
browse eval <js-file> Run JS file against page
browse css <selector> <prop> Get computed CSS property
browse attrs <selector> Get element attributes as JSON
browse element-state <selector> Element state (visible/enabled/checked/focused)
browse value <selector> Get input field value
browse count <selector> Count matching elements
browse dialog Last dialog info or "(no dialog detected)"
browse console [--clear] View/clear console messages
browse network [--clear] View/clear network requests
browse cookies Dump all cookies as JSON
browse storage [set <k> <v>] View/set localStorage
browse perf Page load performance timings
browse devices [filter] List available device names
browse clipboard Read system clipboard text
browse clipboard write <text> Write text to system clipboardbrowse screenshot [path] Viewport screenshot (default: .browse/sessions/{id}/screenshot.png)
browse screenshot --full [path] Full-page screenshot (entire scrollable page)
browse screenshot --annotate [path] Screenshot with numbered badges + legend
browse pdf [path] Save as PDF
browse responsive [prefix] Screenshots at mobile/tablet/desktopbrowse frame <selector> Target an iframe (subsequent commands run inside it)
browse frame main Return to main pagebrowse find role <query> Find elements by ARIA role
browse find text <query> Find elements by text content
browse find label <query> Find elements by label
browse find placeholder <query> Find elements by placeholder
browse find testid <query> Find elements by test IDbrowse diff <url1> <url2> Text diff between two pages
browse screenshot-diff <base> [curr] Pixel-diff two PNG screenshotsecho '[["goto","https://example.com"],["snapshot","-i"],["click","@e1"]]' | browse chainbrowse tabs List tabs (id, url, title)
browse tab <id> Switch to tab
browse newtab [url] Open new tab
browse closetab [id] Close tabbrowse --session <id> <cmd> Run command in named session
browse sessions List active sessions
browse session-close <id> Close a sessionbrowse state save [name] Save cookies + localStorage (all origins)
browse state load [name] Restore saved state
browse state list List saved states
browse state show [name] Show contents of saved statebrowse auth save <name> <url> <user> <pass> Save credentials (encrypted)
browse auth login <name> Auto-login using saved credentials
browse auth list List saved credentials
browse auth delete <name> Delete credentialsbrowse har start Start recording network traffic
browse har stop [path] Stop and save HAR filebrowse video start [dir] Start recording video (WebM, compositor-level)
browse video stop Stop recording and save video files
browse video status Check if recording is activebrowse status Server health, uptime, session count
browse instances List all running browse servers (instance, PID, port, status)
browse stop Shutdown server
browse restart Kill + restart server
browse inspect Open DevTools (requires BROWSE_DEBUG_PORT)| Flag | Description |
|---|---|
| Named session (isolates tabs, refs, cookies) |
| Wrap output as |
| Wrap page content in nonce-delimited markers (prompt injection defense) |
| Block navigation/resources outside allowlist |
| Run browser in headed (visible) mode |
| Browser engine: playwright (default), rebrowser (stealth) |
gototextjscssscreenshotsnapshot -isnapshot -Cjsjs "document.querySelector('.price').textContent"linkstextchainresponsive--sessionvaluecountjsjs "document.querySelector(...).value"frameframe [id=x]| Task | Commands |
|---|---|
| Read a page | |
| Interact with elements | |
| Find hidden clickables | |
| Check if element exists | |
| Get input value | |
| Extract specific data | |
| Visual check | |
| Fill and submit form | |
| Check/uncheck boxes | |
| Check CSS | |
| Inspect DOM | |
| Debug console errors | |
| Check network requests | |
| Mock API responses | |
| Block ads/trackers | |
| Test offline behavior | |
| Interact in iframe | |
| Check local dev | |
| Compare two pages | |
| Mobile layout check | |
| Test on mobile device | |
| Save/restore session | |
| Auto-login | |
| Record network | |
| Record video | |
| Parallel agents | |
| Multi-step flow | |
| Secure browsing | |
| Scroll through results | |
| Drag and drop | |
| Read/write clipboard | |
| Find by accessibility | |
| Visual regression | |
| Debug with DevTools | |
| See the browser | |
| Bypass bot detection | |
--sessionBROWSE_INSTANCEbrowse instances.browse/sessions/{id}/states/{name}.jsonbrowse-server.jsonBROWSE_CDP_URLbrowse-policy.json