browse: Browser & Native App Automation for AI Agents
Target Decision — ALWAYS check this first
Before running any browse command, decide the correct target:
| User wants to... |
Target |
Command pattern |
| Open a URL, test a website, scrape web content |
Browser (default) |
browse goto <url> |
Test a local dev server (localhost) |
Browser |
browse goto http://localhost:3000 |
| Browse a site that blocks bots (Cloudflare, Turnstile) |
Camoufox |
browse --runtime camoufox --headed goto <url> |
| Browse with a specific camoufox fingerprint profile |
Camoufox |
browse --runtime camoufox --camoufox-profile <name> --headed goto <url> |
| Search Google, YouTube, Amazon, etc. |
Browser |
browse goto @google "query" |
| Interact with an iOS app (Settings, Safari, custom app) |
iOS Simulator |
browse --platform ios --app <bundleId> <cmd> |
| Interact with an Android app (Settings, Chrome, custom app) |
Android Emulator |
browse --platform android --app <package> <cmd> |
| Interact with a macOS desktop app (System Settings, TextEdit) |
macOS App |
browse --app <name> <cmd> |
| Install and test an iOS .app or .ipa file |
iOS Simulator |
browse sim start --platform ios --app ./MyApp.app --visible |
| Install and test an Android .apk file |
Android Emulator |
browse sim start --platform android --app ./app.apk --visible |
Key rules:
- No
--platform or --app flag → browser target (Chromium). Use goto to navigate.
--runtime camoufox --headed → anti-detection Firefox. Use when site blocks normal browsing. See /browse-stealth skill for Turnstile/CAPTCHA bypass patterns.
@macro in goto URL → search macro expansion. browse goto @google "query" expands to Google search URL. 14 macros: @google, @youtube, @amazon, @reddit, @wikipedia, @twitter, @yelp, @spotify, @netflix, @linkedin, @instagram, @tiktok, @twitch, @reddit_subreddit.
--app without --platform → macOS app automation. App must be running.
--platform ios --app → iOS Simulator. Use browse sim start first if not running.
--platform android --app → Android Emulator. Use browse sim start first if not running.
- Native app targets do NOT support:
goto, js, eval, tabs, cookies, route, har. These are browser-only.
- All targets support:
snapshot, text, tap, fill, type, press, swipe, screenshot.
- If a site blocks you, switch to
--runtime camoufox --headed. If still blocked, use /browse-stealth for the full Turnstile bypass pattern.
- If unsure which target to use, ASK the user. Don't guess — wrong target = wasted work.
Goal
Use the persistent browse CLI to:
- navigate real pages
- inspect rendered content and state
- interact with UI elements
- capture screenshots, console logs, and network activity
- automate native apps (iOS, Android, macOS) via accessibility APIs
- verify browser or app behavior end-to-end without re-launching every step
Step 0: Verify availability and choose the browsing mode
Start by checking:
browse --version
If browse is not installed:
- stop
- tell the user it is required
- point them to the install path in
references/commands.md
Then decide what kind of session you need:
- default session for normal single-agent work
--session <id> for parallel agent isolation
--profile <name> for persistent browser identity
For native app targets, start the simulator/emulator first:
browse sim start --platform ios --app com.apple.Preferences --visible
browse sim start --platform android --app com.android.settings --visible
browse enable android # first-time only: auto-installs adb, JDK, SDK, emulator
browse enable ios # first-time only: builds iOS runner (needs Xcode)
browse enable macos # first-time only: builds browse-ax bridge
Success criteria: browse is available, the target (browser or native app) is decided, and the session/profile choice fits the task.
Step 1: Navigate safely and stabilize the page
Use browse goto <url> to navigate.
After navigation, always stabilize before reading or interacting:
browse wait --network-idle for typical pages and SPAs
- or a more specific
browse wait condition when the page has a known signal
Important rules:
- call
browse as a bare command on PATH
- do not use shell variables for browse command prefixes
- avoid
#id CSS selectors; prefer [id=foo]
- if the page is untrusted, consider
--content-boundaries and --allowed-domains
Success criteria: The page is loaded enough that content and interactive state are reliable.
Step 2: Choose the cheapest effective inspection method
Use the lightest command that answers the question:
text for cleaned page content
links for navigation structure
js for precise targeted extraction
console, errors, and network for runtime debugging
snapshot -i for interactive elements and stable refs
Prefer snapshot -i before guessing selectors for interaction-heavy tasks.
Load:
references/commands.md for exact command syntax
references/guides.md for command selection guidance and speed rules
Success criteria: You have the information needed without spending unnecessary tokens or using brittle selectors.
Step 3: Interact using refs first, selectors second
For clicks, fills, checks, selects, and similar actions:
- prefer
browse snapshot -i
- interact using
@eN refs
- fall back to CSS selectors only when refs are unavailable or impractical
After navigation or DOM refresh:
- assume refs may be invalid
- take a fresh snapshot before continuing
Rules:
- use descriptive screenshots saved under
.browse/sessions/<id>/
- keep stateful flows in the same session unless isolation is intentional
- use
frame before interacting with iframe content
Success criteria: Interactions are stable and tied to the current rendered page state.
Step 4: Debug blockers and special cases
When things go wrong:
- use
console and errors for page/runtime issues
- use
network for request visibility
- use
route or offline only when the task requires mock or failure-mode testing
- use headed/browser handoff only for real blockers like CAPTCHA, MFA, or OAuth walls
If you hit a blocker after a couple of failed attempts:
- load
references/guides.md
- follow the handoff protocol exactly
- use
AskUserQuestion before any human takeover flow
Success criteria: Blockers are either resolved or escalated with the correct handoff protocol.
Step 5: Capture evidence and report clearly
When the task involves verification, capture the minimum evidence needed:
- relevant page text or structured extraction
- screenshot path when visuals matter
- console/network findings when debugging
- the exact step or selector/ref that failed when reporting issues
Report:
- what you navigated to
- what actions you performed
- what the page actually did
- any artifacts created such as screenshots, HAR, or video
Success criteria: Another engineer can understand the observed browser behavior without rerunning the whole flow blindly.
Important Rules
- The browser persists between commands; cookies, tabs, and session state carry over.
- After
goto, wait before reading content or acting.
snapshot -i is the default interaction surface.
- Save screenshots under
.browse/sessions/<session-id>/ or .browse/sessions/default/.
- Use
--context delta for ARIA diff with refs, --context full for complete snapshot with refs after write commands.
- Do not install anything automatically.
- Do not modify Claude settings automatically; if the user wants pre-allowed browse permissions, point them to
references/permissions.md.
When To Load References
references/commands.md
Use for exact command syntax, flags, and extended examples.
references/guides.md
Use for speed rules, command-choice guidance, architecture notes, and the mandatory CAPTCHA/MFA handoff protocol.
references/permissions.md
Use when the user wants to pre-allow browse commands in Claude settings.
Guardrails
- Do not add
disable-model-invocation; this is a general-purpose browser verification skill.
- Do not add
context: fork; browser results are usually needed in the current flow.
- Do not add
paths:; this is a generic workflow skill.
- Do not keep the full CLI manual inline in
SKILL.md.
- Do not run
browse handoff without explicit user confirmation.
- Do not save screenshots outside the browse session directories.
Runtime Selection
By default, browse uses Chromium via Playwright. Alternative runtimes:
| Runtime |
Engine |
Use case |
Install |
playwright (default) |
Chromium |
General browsing, testing |
Included |
camoufox |
Firefox (anti-detection) |
Sites with bot detection |
npm install camoufox-js && npx camoufox-js fetch |
rebrowser |
Chromium (stealth) |
Alternative stealth approach |
npm install rebrowser-playwright |
lightpanda |
Lightpanda |
Fast headless rendering |
See lightpanda.io |
chrome |
System Chrome |
Use real Chrome with extensions |
Chrome must be installed |
browse --runtime camoufox --headed goto https://protected-site.com
BROWSE_RUNTIME=camoufox browse goto https://example.com
New Features
Search Macros
browse goto @google "best coffee beans" # Google search
browse goto @youtube "tutorial" # YouTube search
browse goto @amazon "laptop" # Amazon search
browse goto @reddit "programming" # Reddit search
All macros: @google, @youtube, @amazon, @reddit, @reddit_subreddit, @wikipedia, @twitter, @yelp, @spotify, @netflix, @linkedin, @instagram, @tiktok, @twitch
Safety Flags (opt-in features)
| Flag |
Default |
What it does |
BROWSE_CONSENT_DISMISS=1 |
OFF |
Auto-dismiss cookie banners after navigation |
BROWSE_CLICK_FORCE=1 or --force |
OFF |
Force-click through overlay interception |
BROWSE_READINESS=1 or --ready |
OFF |
Wait for hydration after goto |
BROWSE_SERP_FASTPATH=1 or --serp |
OFF |
Google SERP DOM extraction (fast, no refs) |
BROWSE_COMMAND_LOCK=0 |
ON |
Disable per-session command serialization |
BROWSE_CAMOUFOX_PROFILE=<name> |
OFF |
Use a named camoufox profile (.browse/camoufox-profiles/<name>.json) |
New Commands
| Command |
Description |
images [sel] [--limit N] [--inline] |
List page images with src/alt/dimensions |
youtube-transcript <url> [--lang en] |
Extract YouTube captions via yt-dlp or browser |
schema |
Extract JSON-LD, Microdata, RDFa structured data (parsed JSON) |
meta |
Extract page meta tags (title, description, canonical, OG, Twitter, hreflang, robots, viewport) |
headings |
Extract H1-H6 heading hierarchy with counts and indented tree |
profiles |
List available camoufox profiles from .browse/camoufox-profiles/ |
Snapshot Windowing
Large snapshots (>80K chars) are automatically paginated:
browse snapshot -i # first page
browse snapshot -i --offset 500 # next page (line offset from previous output)
Output Contract
Report:
- the page or flow tested
- the session/profile mode used if relevant
- the key commands or interactions performed
- the observed result
- any artifacts or blockers such as screenshots, console errors, network failures, or handoff state
1---2name: browse3description: Drive a REAL browser and native apps the way a user would — not fetch raw HTML — through the persistent `browse` CLI: one long-lived headless Chromium (plus iOS, Android, and macOS apps via accessibility APIs) where goto, snapshot, click, fill, JavaScript, and screenshot share session state at ~100ms/command and interaction rides stable @eN refs, not brittle selectors. Use when verifying, navigating, or automating live web or app behavior beyond what code-reading or a raw fetch reveals.4---5
6# browse: Browser & Native App Automation for AI Agents
7
8## Target Decision — ALWAYS check this first
9
10Before running any browse command, decide the correct target:
11
12| User wants to... | Target | Command pattern |
13|---|---|---|
14| Open a URL, test a website, scrape web content | **Browser** (default) | `browse goto <url>` |
15| Test a local dev server (`localhost`) | **Browser** | `browse goto http://localhost:3000` |
16| Browse a site that blocks bots (Cloudflare, Turnstile) | **Camoufox** | `browse --runtime camoufox --headed goto <url>` |
17| Browse with a specific camoufox fingerprint profile | **Camoufox** | `browse --runtime camoufox --camoufox-profile <name> --headed goto <url>` |
18| Search Google, YouTube, Amazon, etc. | **Browser** | `browse goto @google "query"` |
19| Interact with an iOS app (Settings, Safari, custom app) | **iOS Simulator** | `browse --platform ios --app <bundleId> <cmd>` |
20| Interact with an Android app (Settings, Chrome, custom app) | **Android Emulator** | `browse --platform android --app <package> <cmd>` |
21| Interact with a macOS desktop app (System Settings, TextEdit) | **macOS App** | `browse --app <name> <cmd>` |
22| Install and test an iOS .app or .ipa file | **iOS Simulator** | `browse sim start --platform ios --app ./MyApp.app --visible` |
23| Install and test an Android .apk file | **Android Emulator** | `browse sim start --platform android --app ./app.apk --visible` |
24
25**Key rules:**
26- **No `--platform` or `--app` flag** → browser target (Chromium). Use `goto` to navigate.
27- **`--runtime camoufox --headed`** → anti-detection Firefox. Use when site blocks normal browsing. See `/browse-stealth` skill for Turnstile/CAPTCHA bypass patterns.
28- **`@macro` in goto URL** → search macro expansion. `browse goto @google "query"` expands to Google search URL. 14 macros: @google, @youtube, @amazon, @reddit, @wikipedia, @twitter, @yelp, @spotify, @netflix, @linkedin, @instagram, @tiktok, @twitch, @reddit_subreddit.
29- **`--app` without `--platform`** → macOS app automation. App must be running.
30- **`--platform ios --app`** → iOS Simulator. Use `browse sim start` first if not running.
31- **`--platform android --app`** → Android Emulator. Use `browse sim start` first if not running.
32- **Native app targets do NOT support**: `goto`, `js`, `eval`, `tabs`, `cookies`, `route`, `har`. These are browser-only.
33- **All targets support**: `snapshot`, `text`, `tap`, `fill`, `type`, `press`, `swipe`, `screenshot`.
34- **If a site blocks you**, switch to `--runtime camoufox --headed`. If still blocked, use `/browse-stealth` for the full Turnstile bypass pattern.
35- **If unsure which target to use, ASK the user.** Don't guess — wrong target = wasted work.
36
37## Goal
38
39Use the persistent `browse` CLI to:
40
41- navigate real pages
42- inspect rendered content and state
43- interact with UI elements
44- capture screenshots, console logs, and network activity
45- automate native apps (iOS, Android, macOS) via accessibility APIs
46- verify browser or app behavior end-to-end without re-launching every step
47
48## Step 0: Verify availability and choose the browsing mode
49
50Start by checking:
51
52```bash
53browse --version
54```
55
56If `browse` is not installed:
57
58- stop
59- tell the user it is required
60- point them to the install path in `references/commands.md`
61
62Then decide what kind of session you need:
63
64- default session for normal single-agent work
65- `--session <id>` for parallel agent isolation
66- `--profile <name>` for persistent browser identity
67
68For native app targets, start the simulator/emulator first:
69
70```bash
71browse sim start --platform ios --app com.apple.Preferences --visible
72browse sim start --platform android --app com.android.settings --visible
73browse enable android # first-time only: auto-installs adb, JDK, SDK, emulator
74browse enable ios # first-time only: builds iOS runner (needs Xcode)
75browse enable macos # first-time only: builds browse-ax bridge
76```
77
78**Success criteria**: `browse` is available, the target (browser or native app) is decided, and the session/profile choice fits the task.
79
80## Step 1: Navigate safely and stabilize the page
81
82Use `browse goto <url>` to navigate.
83
84After navigation, always stabilize before reading or interacting:
85
86- `browse wait --network-idle` for typical pages and SPAs
87- or a more specific `browse wait` condition when the page has a known signal
88
89Important rules:
90
91- call `browse` as a bare command on PATH
92- do not use shell variables for browse command prefixes
93- avoid `#id` CSS selectors; prefer `[id=foo]`
94- if the page is untrusted, consider `--content-boundaries` and `--allowed-domains`
95
96**Success criteria**: The page is loaded enough that content and interactive state are reliable.
97
98## Step 2: Choose the cheapest effective inspection method
99
100Use the lightest command that answers the question:
101
102- `text` for cleaned page content
103- `links` for navigation structure
104- `js` for precise targeted extraction
105- `console`, `errors`, and `network` for runtime debugging
106- `snapshot -i` for interactive elements and stable refs
107
108Prefer `snapshot -i` before guessing selectors for interaction-heavy tasks.
109
110Load:
111
112- `references/commands.md` for exact command syntax
113- `references/guides.md` for command selection guidance and speed rules
114
115**Success criteria**: You have the information needed without spending unnecessary tokens or using brittle selectors.
116
117## Step 3: Interact using refs first, selectors second
118
119For clicks, fills, checks, selects, and similar actions:
120
1211. prefer `browse snapshot -i`
1222. interact using `@eN` refs
1233. fall back to CSS selectors only when refs are unavailable or impractical
124
125After navigation or DOM refresh:
126
127- assume refs may be invalid
128- take a fresh snapshot before continuing
129
130Rules:
131
132- use descriptive screenshots saved under `.browse/sessions/<id>/`
133- keep stateful flows in the same session unless isolation is intentional
134- use `frame` before interacting with iframe content
135
136**Success criteria**: Interactions are stable and tied to the current rendered page state.
137
138## Step 4: Debug blockers and special cases
139
140When things go wrong:
141
142- use `console` and `errors` for page/runtime issues
143- use `network` for request visibility
144- use `route` or `offline` only when the task requires mock or failure-mode testing
145- use headed/browser handoff only for real blockers like CAPTCHA, MFA, or OAuth walls
146
147If you hit a blocker after a couple of failed attempts:
148
149- load `references/guides.md`
150- follow the handoff protocol exactly
151- use `AskUserQuestion` before any human takeover flow
152
153**Success criteria**: Blockers are either resolved or escalated with the correct handoff protocol.
154
155## Step 5: Capture evidence and report clearly
156
157When the task involves verification, capture the minimum evidence needed:
158
159- relevant page text or structured extraction
160- screenshot path when visuals matter
161- console/network findings when debugging
162- the exact step or selector/ref that failed when reporting issues
163
164Report:
165
166- what you navigated to
167- what actions you performed
168- what the page actually did
169- any artifacts created such as screenshots, HAR, or video
170
171**Success criteria**: Another engineer can understand the observed browser behavior without rerunning the whole flow blindly.
172
173## Important Rules
174
175- The browser persists between commands; cookies, tabs, and session state carry over.
176- After `goto`, wait before reading content or acting.
177- `snapshot -i` is the default interaction surface.
178- Save screenshots under `.browse/sessions/<session-id>/` or `.browse/sessions/default/`.
179- Use `--context delta` for ARIA diff with refs, `--context full` for complete snapshot with refs after write commands.
180- Do not install anything automatically.
181- Do not modify Claude settings automatically; if the user wants pre-allowed browse permissions, point them to `references/permissions.md`.
182
183## When To Load References
184
185- `references/commands.md`
186 Use for exact command syntax, flags, and extended examples.
187
188- `references/guides.md`
189 Use for speed rules, command-choice guidance, architecture notes, and the mandatory CAPTCHA/MFA handoff protocol.
190
191- `references/permissions.md`
192 Use when the user wants to pre-allow browse commands in Claude settings.
193
194## Guardrails
195
196- Do not add `disable-model-invocation`; this is a general-purpose browser verification skill.
197- Do not add `context: fork`; browser results are usually needed in the current flow.
198- Do not add `paths:`; this is a generic workflow skill.
199- Do not keep the full CLI manual inline in `SKILL.md`.
200- Do not run `browse handoff` without explicit user confirmation.
201- Do not save screenshots outside the browse session directories.
202
203## Runtime Selection
204
205By default, browse uses Chromium via Playwright. Alternative runtimes:
206
207| Runtime | Engine | Use case | Install |
208|---------|--------|----------|---------|
209| `playwright` (default) | Chromium | General browsing, testing | Included |
210| `camoufox` | Firefox (anti-detection) | Sites with bot detection | `npm install camoufox-js && npx camoufox-js fetch` |
211| `rebrowser` | Chromium (stealth) | Alternative stealth approach | `npm install rebrowser-playwright` |
212| `lightpanda` | Lightpanda | Fast headless rendering | See lightpanda.io |
213| `chrome` | System Chrome | Use real Chrome with extensions | Chrome must be installed |
214
215```bash
216browse --runtime camoufox --headed goto https://protected-site.com
217BROWSE_RUNTIME=camoufox browse goto https://example.com
218```
219
220## New Features
221
222### Search Macros
223```bash
224browse goto @google "best coffee beans" # Google search
225browse goto @youtube "tutorial" # YouTube search
226browse goto @amazon "laptop" # Amazon search
227browse goto @reddit "programming" # Reddit search
228```
229
230All macros: @google, @youtube, @amazon, @reddit, @reddit_subreddit, @wikipedia, @twitter, @yelp, @spotify, @netflix, @linkedin, @instagram, @tiktok, @twitch
231
232### Safety Flags (opt-in features)
233| Flag | Default | What it does |
234|------|---------|-------------|
235| `BROWSE_CONSENT_DISMISS=1` | OFF | Auto-dismiss cookie banners after navigation |
236| `BROWSE_CLICK_FORCE=1` or `--force` | OFF | Force-click through overlay interception |
237| `BROWSE_READINESS=1` or `--ready` | OFF | Wait for hydration after goto |
238| `BROWSE_SERP_FASTPATH=1` or `--serp` | OFF | Google SERP DOM extraction (fast, no refs) |
239| `BROWSE_COMMAND_LOCK=0` | ON | Disable per-session command serialization |
240| `BROWSE_CAMOUFOX_PROFILE=<name>` | OFF | Use a named camoufox profile (`.browse/camoufox-profiles/<name>.json`) |
241
242### New Commands
243| Command | Description |
244|---------|------------|
245| `images [sel] [--limit N] [--inline]` | List page images with src/alt/dimensions |
246| `youtube-transcript <url> [--lang en]` | Extract YouTube captions via yt-dlp or browser |
247| `schema` | Extract JSON-LD, Microdata, RDFa structured data (parsed JSON) |
248| `meta` | Extract page meta tags (title, description, canonical, OG, Twitter, hreflang, robots, viewport) |
249| `headings` | Extract H1-H6 heading hierarchy with counts and indented tree |
250| `profiles` | List available camoufox profiles from `.browse/camoufox-profiles/` |
251
252### Snapshot Windowing
253Large snapshots (>80K chars) are automatically paginated:
254```bash
255browse snapshot -i # first page
256browse snapshot -i --offset 500 # next page (line offset from previous output)
257```
258
259## Output Contract
260
261Report:
262
2631. the page or flow tested
2642. the session/profile mode used if relevant
2653. the key commands or interactions performed
2664. the observed result
2675. any artifacts or blockers such as screenshots, console errors, network failures, or handoff state