From web-tools
Browse any web app in a real browser using Playwright CLI. Use when asked to "check the app", "open the site", "look at the UI", "verify this page", "browse", or diagnose frontend behavior. General-purpose — not tied to any specific app.
How this skill is triggered — by the user, by Claude, or both
Slash command
/web-tools:browseThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Open any web app in a real browser using `playwright-cli` to diagnose issues, verify features, or explore UI behavior.
Open any web app in a real browser using playwright-cli to diagnose issues, verify features, or explore UI behavior.
$ARGUMENTS: URL or description of what to investigate (optional — will ask if not provided)
REQUIRED: Set these env vars before every bunx @playwright/cli command. The nix-shell $TMPDIR path is too long for Unix domain sockets (macOS limit: 104 bytes), causing EINVAL errors.
export TMPDIR=/tmp
export PLAYWRIGHT_DAEMON_SOCKETS_DIR=/tmp/pw-cli
export TMPDIR=/tmp PLAYWRIGHT_DAEMON_SOCKETS_DIR=/tmp/pw-cli
bunx @playwright/cli open
bunx @playwright/cli goto <url>
Check if the page loaded as expected or if you hit a login wall:
bunx @playwright/cli snapshot
If you see a login page or auth wall:
click/fill to interact with the login form interactivelybunx @playwright/cli state-save /tmp/browse-auth-<domain>.json
If you have a saved auth state:
bunx @playwright/cli state-load /tmp/browse-auth-<domain>.json
bunx @playwright/cli goto <url>
bunx @playwright/cli snapshot
If the saved state is stale (login page appears again), tell the user and redo interactive login.
Use snapshot to see the current page state as an accessibility tree:
bunx @playwright/cli snapshot
The snapshot returns element references (e.g., e15, e42) that you can use in subsequent commands:
bunx @playwright/cli click e15
bunx @playwright/cli fill e42 "search text"
bunx @playwright/cli snapshot
bunx @playwright/cli close
| Command | Description |
|---|---|
goto <url> | Navigate to URL |
go-back | Browser back |
reload | Reload page |
snapshot | Get page accessibility tree with element refs |
screenshot | Save screenshot of current page |
| Command | Description |
|---|---|
click <ref> | Click an element |
fill <ref> <text> | Fill a text input |
select <ref> <val> | Select dropdown option |
hover <ref> | Hover over element |
press <key> | Press keyboard key (e.g., Escape, Enter) |
| Command | Description |
|---|---|
console | View browser console messages |
network | List network requests since page load |
eval <js> | Evaluate JavaScript in page context |
localstorage-list | List all localStorage entries |
cookie-list | List all cookies |
| Command | Description |
|---|---|
state-load <file> | Load auth state from file |
state-save <file> | Save current state to file |
tab-list | List open tabs |
tab-new <url> | Open new tab |
close | Close browser |
All bunx @playwright/cli commands share state within a session. If your session dies or you open a new terminal, just re-run open and state-load.
When you need to drive the user's already-open browser (inheriting their existing login, no focus-steal),
or when Playwright CLI can't reach the app (Electron, native shells, OAuth popups that break headed
Playwright), reach for cua-driver instead. It snapshots the accessibility tree of any running GUI app
and clicks/types by element_index or pixel coords.
cua-driver skill (~/.claude/skills/cua-driver) for the
snapshot→act→verify loop — that's the source of truth for driving it.Default to Playwright CLI for general web browsing; switch to cua-driver only when you need one of the properties above.
When something doesn't work as described in this skill, fix the skill.
After resolving any issue not already covered in Troubleshooting, append the problem and solution to the Troubleshooting section below. This keeps the skill accurate over time.
Similarly, if you discover a working auth flow for a specific app (OAuth redirect, SSO, API token injection, etc.), add it to the App-Specific Auth section below so future sessions can reuse it.
No app-specific auth flows documented yet. When you successfully authenticate to a new app, add the steps here.
The nix-shell $TMPDIR path is too long for Unix domain sockets (macOS limit: 104 bytes). Override both env vars:
export TMPDIR=/tmp
export PLAYWRIGHT_DAEMON_SOCKETS_DIR=/tmp/pw-cli
Run bunx @playwright/cli install-browser to ensure Chromium is installed.
The MCP tools (mcp__playwright__browser_*) open a separate browser context that doesn't share state with the CLI session. Always use bunx @playwright/cli commands.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub cheapsteak/cheapsteak-agent-plugins --plugin web-tools