
Cmux Browser
- 411 installs
- 23 repo stars
- Updated July 15, 2026
- manaflow-ai/cmux-skills
Helps with ai & agent building tasks.
About
cmux-browser is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted development.
- cmux-browser
- AI & Agent Building
- AI-coding skill
Cmux Browser by the numbers
- 411 all-time installs (skills.sh)
- +50 installs in the week ending Aug 2, 2026 (Skillselion tracking)
- Ranked #1,926 of 16,556 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 2, 2026 (Skillselion catalog sync)
npx skills add https://github.com/manaflow-ai/cmux-skills --skill cmux-browserAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 411 |
|---|---|
| repo stars | ★ 23 |
| Last updated | July 15, 2026 |
| Repository | manaflow-ai/cmux-skills ↗ |
What it does
Helps with ai & agent building tasks.
Files
cmux Browser
Use this skill for browser automation inside cmux webview surfaces. It is different from a standalone browser automation tool because every browser surface lives inside a cmux workspace, pane, and surface topology.
Default Rule
Open and control browser surfaces in the current caller workspace unless the user explicitly names another workspace or window.
Before mutating browser state, identify the caller:
printf 'workspace=%s\nsurface=%s\nsocket=%s\n' \
"${CMUX_WORKSPACE_ID:-}" \
"${CMUX_SURFACE_ID:-}" \
"${CMUX_SOCKET_PATH:-}"
cmux identify --jsonUse CMUX_WORKSPACE_ID for new browser splits and CMUX_SURFACE_ID to understand the terminal that invoked the automation. Do not open a browser in the visually focused workspace if it differs from the caller workspace.
Core Workflow
# Open in the caller workspace and capture the returned surface ref.
cmux --json browser open https://example.com --workspace "${CMUX_WORKSPACE_ID:-}"
# Use the returned surface, for example surface:7.
cmux browser surface:7 get url
cmux browser surface:7 wait --load-state complete --timeout-ms 15000
cmux browser surface:7 snapshot --interactive --compact
cmux browser surface:7 click e2 --snapshot-after
cmux browser surface:7 snapshot --interactive --compactLoop: navigate, verify URL, wait, snapshot, act, then re-snapshot. Snapshot refs are temporary. Re-snapshot after navigation, modal changes, tab changes, or DOM updates.
Targeting
Most subcommands require a browser surface:
cmux browser identify
cmux browser identify --surface surface:2
cmux browser surface:2 get url
cmux browser --surface surface:2 get titleOpen commands can create or reuse a browser split:
cmux browser open http://localhost:3000 --workspace "${CMUX_WORKSPACE_ID:-}" --json
cmux browser open-split https://example.com --workspace workspace:2 --json
cmux browser new https://example.com --window window:1 --jsonKeep one browser surface per task unless the user asks for multiple tabs or pages.
Command Groups
See references/commands.md for the full command list. Main groups:
- Navigation and targeting:
identify,open,open-split,new,navigate,goto,back,forward,reload,url,focus-webview,is-webview-focused. - Waiting:
wait --selector,--text,--url-contains,--load-state,--function. - DOM interaction:
click,dblclick,hover,focus,check,uncheck,scroll-into-view,type,fill,press,keydown,keyup,select,scroll. - Inspection:
snapshot,screenshot,get,is,find,highlight. - JavaScript and injection:
eval,addinitscript,addscript,addstyle. - Frames, dialogs, downloads:
frame,dialog,download. - State and session:
cookies,storage,state. - Tabs and diagnostics:
tab,console,errors. - Environment and lower-level APIs:
viewport,geolocation,offline,trace,network,screencast,input.
Common Patterns
Durable Captures
Save browser screenshots, traces, downloaded diagnostics, and reusable session state under /cmux-assets/<branch>/browser/..., not /tmp, before reporting them to the user.
BRANCH="$(git branch --show-current 2>/dev/null || true)"
BRANCH="${BRANCH:-$(basename "$PWD")}"
BRANCH="$(printf '%s' "$BRANCH" | tr -cs 'A-Za-z0-9._-' '-' | sed 's/^-//;s/-$//')"
ASSET_BASE="/cmux-assets"
if ! mkdir -p "$ASSET_BASE/$BRANCH" 2>/dev/null; then
ASSET_BASE="$(pwd)/cmux-assets"
mkdir -p "$ASSET_BASE/$BRANCH"
fi
BROWSER_ASSET_ROOT="$ASSET_BASE/$BRANCH/browser/$(date +%Y%m%d-%H%M%S)"
mkdir -p "$BROWSER_ASSET_ROOT"If /cmux-assets is unavailable because the root volume is read-only, use the fallback path and state it. Do not leave final screenshots or session files only in /tmp.
Navigate, Wait, Inspect
cmux --json browser open http://localhost:3000 --workspace "${CMUX_WORKSPACE_ID:-}"
cmux browser surface:7 get url
cmux browser surface:7 wait --load-state complete --timeout-ms 15000
cmux browser surface:7 snapshot --interactive --compact
cmux browser surface:7 get titleForm Fill
cmux browser surface:7 fill "#email" --text "ops@example.com"
cmux browser surface:7 fill "#password" --text "$PASSWORD"
cmux browser surface:7 click "button[type='submit']" --snapshot-after
cmux browser surface:7 wait --text "Welcome" --timeout-ms 15000
cmux browser surface:7 is visible "#dashboard"Debug Capture
cmux browser surface:7 console list
cmux browser surface:7 errors list
cmux browser surface:7 screenshot --out "$BROWSER_ASSET_ROOT/cmux-failure.png"
cmux browser surface:7 snapshot --interactive --compactSession Save and Restore
cmux browser surface:7 state save "$BROWSER_ASSET_ROOT/cmux-browser-session.json"
cmux browser surface:7 state load "$BROWSER_ASSET_ROOT/cmux-browser-session.json"
cmux browser surface:7 reload --snapshot-afterRemote Workspaces
In remote SSH workspaces, browser panes route HTTP and WebSocket traffic through the remote machine. localhost:3000 means the remote host's localhost, and browser storage is isolated per remote workspace context.
Rebuild and Reload
If browser automation is validating a cmux app/runtime change, first build a tagged app from the active worktree:
./scripts/reload.sh --tag <short-tag>
CMUX_SOCKET_PATH=/tmp/cmux-debug-<short-tag>.sock cmux browser open http://localhost:3000 --workspace "${CMUX_WORKSPACE_ID:-}"Never automate against an untagged debug socket for tests or dogfood builds.
Rules
- Scope browser opens and actions to the current caller workspace by default.
- Pass
--workspace "${CMUX_WORKSPACE_ID:-}"when creating a browser surface from a cmux terminal. - Use returned
surface:Nrefs, and re-snapshot after any state-changing action. - Verify
get urlbefore waiting or diagnosing page state. - Use
--snapshot-afteron mutating actions when you need immediate verification. - Prefer
get,is, andfindfor scripts. Use screenshots and snapshots for human review. - Do not close, move, or focus browser surfaces outside the caller workspace unless the user names that target.
- Do not use unsupported standalone-browser assumptions. cmux uses WKWebView-backed browser surfaces.
interface:
display_name: "cmux Browser"
short_description: "Automate cmux webview surfaces within the current caller workspace."
default_prompt: "Use this skill for browser automation through cmux CLI. Identify the caller workspace and surface, open or target browser surfaces in that workspace, use snapshot refs, act, wait, verify, and re-snapshot without interfering with other workspaces."
cmux Browser Command Reference
Use cmux browser against browser surfaces inside the current cmux workspace. Surface refs look like surface:7.
Current Context
cmux identify --json
cmux browser identify
cmux browser identify --surface surface:2Open and Navigate
cmux browser open <url> --workspace "$CMUX_WORKSPACE_ID"
cmux browser open-split <url> --workspace "$CMUX_WORKSPACE_ID"
cmux browser new <url> --workspace "$CMUX_WORKSPACE_ID"
cmux browser <surface> open <url>
cmux browser <surface> navigate <url>
cmux browser <surface> goto <url>
cmux browser <surface> navigate <url> --snapshot-after
cmux browser <surface> back
cmux browser <surface> forward
cmux browser <surface> reload --snapshot-after
cmux browser <surface> url
cmux browser <surface> get url
cmux browser <surface> get title
cmux browser <surface> focus-webview
cmux browser <surface> is-webview-focusedopen, open-split, and new accept --workspace <id|ref> and --window <id|ref>. Prefer --workspace "$CMUX_WORKSPACE_ID" unless the user explicitly names another target.
Wait
cmux browser <surface> wait --load-state complete --timeout-ms 15000
cmux browser <surface> wait --selector "#checkout" --timeout-ms 10000
cmux browser <surface> wait --text "Order confirmed"
cmux browser <surface> wait --url-contains "/dashboard"
cmux browser <surface> wait --function "window.__appReady === true"
cmux browser <surface> wait "#checkout"
cmux browser <surface> wait --timeout 15 --selector "#ready"Snapshot and Screenshot
cmux browser <surface> snapshot
cmux browser <surface> snapshot --interactive
cmux browser <surface> snapshot --interactive --compact
cmux browser <surface> snapshot --selector "main" --max-depth 5
cmux browser <surface> snapshot --cursor
cmux browser <surface> screenshot
cmux browser <surface> screenshot --out /tmp/cmux-page.png
cmux browser <surface> screenshot --jsonDOM Actions
cmux browser <surface> click <selector-or-ref> --snapshot-after
cmux browser <surface> dblclick <selector-or-ref>
cmux browser <surface> hover <selector-or-ref>
cmux browser <surface> focus <selector-or-ref>
cmux browser <surface> check <selector-or-ref>
cmux browser <surface> uncheck <selector-or-ref>
cmux browser <surface> scroll-into-view <selector-or-ref>
cmux browser <surface> scrollintoview <selector-or-ref>
cmux browser <surface> fill <selector-or-ref> --text "value"
cmux browser <surface> fill <selector-or-ref> --text ""
cmux browser <surface> type <selector-or-ref> "text"
cmux browser <surface> press Enter
cmux browser <surface> keydown Shift
cmux browser <surface> keyup Shift
cmux browser <surface> select <selector-or-ref> "us-east"
cmux browser <surface> scroll --dy 800 --snapshot-after
cmux browser <surface> scroll --selector "#log-view" --dx 0 --dy 400Getters
cmux browser <surface> get url
cmux browser <surface> get title
cmux browser <surface> get text "h1"
cmux browser <surface> get html "main"
cmux browser <surface> get value "#email"
cmux browser <surface> get attr "a.primary" --attr href
cmux browser <surface> get count ".row"
cmux browser <surface> get box "#checkout"
cmux browser <surface> get styles "#total"
cmux browser <surface> get styles "#total" --property colorState Checks
cmux browser <surface> is visible "#checkout"
cmux browser <surface> is enabled "button[type='submit']"
cmux browser <surface> is checked "#terms"Find Locators
cmux browser <surface> find role button --name "Continue"
cmux browser <surface> find role button --name "Continue" --exact
cmux browser <surface> find text "Order confirmed"
cmux browser <surface> find label "Email"
cmux browser <surface> find placeholder "Search"
cmux browser <surface> find alt "Product image"
cmux browser <surface> find title "Open settings"
cmux browser <surface> find testid "save-btn"
cmux browser <surface> find first ".row"
cmux browser <surface> find last ".row"
cmux browser <surface> find nth 2 ".row"
cmux browser <surface> highlight "#checkout"JavaScript and Injection
cmux browser <surface> eval "document.title"
cmux browser <surface> eval --script "window.location.href"
cmux browser <surface> addinitscript "window.__cmuxReady = true;"
cmux browser <surface> addscript "document.querySelector('#name')?.focus()"
cmux browser <surface> addstyle "#debug-banner { display: none !important; }"Frames
cmux browser <surface> frame "iframe[name='checkout']"
cmux browser <surface> frame --selector "iframe[name='checkout']"
cmux browser <surface> frame mainDialogs
cmux browser <surface> dialog accept
cmux browser <surface> dialog accept "Confirmed by automation"
cmux browser <surface> dialog dismissDownloads
cmux browser <surface> click "a#download-report"
cmux browser <surface> download --path /tmp/report.csv --timeout-ms 30000
cmux browser <surface> download wait --path /tmp/report.csv --timeout 30Cookies, Storage, State
cmux browser <surface> cookies get
cmux browser <surface> cookies get --name session_id
cmux browser <surface> cookies set session_id abc123 --domain example.com --path /
cmux browser <surface> cookies set --name session_id --value abc123 --url https://example.com
cmux browser <surface> cookies clear --name session_id
cmux browser <surface> cookies clear --all
cmux browser <surface> storage local get
cmux browser <surface> storage local get theme
cmux browser <surface> storage local set theme dark
cmux browser <surface> storage local clear
cmux browser <surface> storage session get flow
cmux browser <surface> storage session set flow onboarding
cmux browser <surface> storage session clear
cmux browser <surface> state save /tmp/cmux-browser-state.json
cmux browser <surface> state load /tmp/cmux-browser-state.jsonTabs
cmux browser <surface> tab list
cmux browser <surface> tab new https://example.com/pricing
cmux browser <surface> tab switch 1
cmux browser <surface> tab switch surface:7
cmux browser <surface> tab close
cmux browser <surface> tab close surface:7Console and Errors
cmux browser <surface> console list
cmux browser <surface> console clear
cmux browser <surface> errors list
cmux browser <surface> errors clearEnvironment and Lower-Level APIs
These commands exist in the CLI. Some may return not_supported on WKWebView depending on current app support.
cmux browser <surface> viewport 390 844
cmux browser <surface> geolocation 37.7749 -122.4194
cmux browser <surface> geo 37.7749 -122.4194
cmux browser <surface> offline true
cmux browser <surface> offline false
cmux browser <surface> trace start /tmp/cmux-trace.zip
cmux browser <surface> trace stop /tmp/cmux-trace.zip
cmux browser <surface> network route "**/api/*" --body '{}'
cmux browser <surface> network route "**/ads/*" --abort
cmux browser <surface> network unroute "**/api/*"
cmux browser <surface> network requests
cmux browser <surface> screencast start
cmux browser <surface> screencast stop
cmux browser <surface> input mouse move 100 200
cmux browser <surface> input keyboard press Enter
cmux browser <surface> input touch tap 100 200Output Options
cmux --json browser open https://example.com
cmux browser <surface> snapshot --interactive --json
cmux browser <surface> get text "h1" --json
cmux --json --id-format refs browser identify
cmux --json --id-format both browser identify
cmux --json --id-format uuids browser identify