@ulpi/browse 2.3.4 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. package/README.md +8 -2
  2. package/dist/browse.cjs +2889 -1265
  3. package/dist/lib.mjs +29504 -0
  4. package/dist/types/a11y.d.ts +32 -0
  5. package/dist/types/a11y.d.ts.map +1 -0
  6. package/dist/types/app/android/bridge.d.ts +41 -0
  7. package/dist/types/app/android/bridge.d.ts.map +1 -0
  8. package/dist/types/app/android/emulator.d.ts +32 -0
  9. package/dist/types/app/android/emulator.d.ts.map +1 -0
  10. package/dist/types/app/android/manager.d.ts +62 -0
  11. package/dist/types/app/android/manager.d.ts.map +1 -0
  12. package/dist/types/app/android/protocol.d.ts +162 -0
  13. package/dist/types/app/android/protocol.d.ts.map +1 -0
  14. package/dist/types/app/android/sim-service.d.ts +33 -0
  15. package/dist/types/app/android/sim-service.d.ts.map +1 -0
  16. package/dist/types/app/index.d.ts +15 -0
  17. package/dist/types/app/index.d.ts.map +1 -0
  18. package/dist/types/app/ios/bridge.d.ts +53 -0
  19. package/dist/types/app/ios/bridge.d.ts.map +1 -0
  20. package/dist/types/app/ios/controller.d.ts +131 -0
  21. package/dist/types/app/ios/controller.d.ts.map +1 -0
  22. package/dist/types/app/ios/manager.d.ts +96 -0
  23. package/dist/types/app/ios/manager.d.ts.map +1 -0
  24. package/dist/types/app/ios/protocol.d.ts +122 -0
  25. package/dist/types/app/ios/protocol.d.ts.map +1 -0
  26. package/dist/types/app/ios/sim-service.d.ts +37 -0
  27. package/dist/types/app/ios/sim-service.d.ts.map +1 -0
  28. package/dist/types/app/macos/bridge.d.ts +22 -0
  29. package/dist/types/app/macos/bridge.d.ts.map +1 -0
  30. package/dist/types/app/manager.d.ts +50 -0
  31. package/dist/types/app/manager.d.ts.map +1 -0
  32. package/dist/types/app/normalize.d.ts +27 -0
  33. package/dist/types/app/normalize.d.ts.map +1 -0
  34. package/dist/types/app/resolve-app.d.ts +31 -0
  35. package/dist/types/app/resolve-app.d.ts.map +1 -0
  36. package/dist/types/app/types.d.ts +77 -0
  37. package/dist/types/app/types.d.ts.map +1 -0
  38. package/dist/types/automation/action-context.d.ts +110 -0
  39. package/dist/types/automation/action-context.d.ts.map +1 -0
  40. package/dist/types/automation/command.d.ts +138 -0
  41. package/dist/types/automation/command.d.ts.map +1 -0
  42. package/dist/types/automation/events.d.ts +72 -0
  43. package/dist/types/automation/events.d.ts.map +1 -0
  44. package/dist/types/automation/executor.d.ts +39 -0
  45. package/dist/types/automation/executor.d.ts.map +1 -0
  46. package/dist/types/automation/index.d.ts +11 -0
  47. package/dist/types/automation/index.d.ts.map +1 -0
  48. package/dist/types/automation/registry.d.ts +38 -0
  49. package/dist/types/automation/registry.d.ts.map +1 -0
  50. package/dist/types/automation/rules.d.ts +52 -0
  51. package/dist/types/automation/rules.d.ts.map +1 -0
  52. package/dist/types/automation/target.d.ts +76 -0
  53. package/dist/types/automation/target.d.ts.map +1 -0
  54. package/dist/types/browser/consent.d.ts +13 -0
  55. package/dist/types/browser/consent.d.ts.map +1 -0
  56. package/dist/types/browser/cookie-import.d.ts +94 -0
  57. package/dist/types/browser/cookie-import.d.ts.map +1 -0
  58. package/dist/types/browser/detection.d.ts +22 -0
  59. package/dist/types/browser/detection.d.ts.map +1 -0
  60. package/dist/types/browser/emulation.d.ts +30 -0
  61. package/dist/types/browser/emulation.d.ts.map +1 -0
  62. package/dist/types/browser/events.d.ts +19 -0
  63. package/dist/types/browser/events.d.ts.map +1 -0
  64. package/dist/types/browser/index.d.ts +17 -0
  65. package/dist/types/browser/index.d.ts.map +1 -0
  66. package/dist/types/browser/macros.d.ts +9 -0
  67. package/dist/types/browser/macros.d.ts.map +1 -0
  68. package/dist/types/browser/manager.d.ts +272 -0
  69. package/dist/types/browser/manager.d.ts.map +1 -0
  70. package/dist/types/browser/png-compare.d.ts +36 -0
  71. package/dist/types/browser/png-compare.d.ts.map +1 -0
  72. package/dist/types/browser/profiles.d.ts +29 -0
  73. package/dist/types/browser/profiles.d.ts.map +1 -0
  74. package/dist/types/browser/react-devtools.d.ts +75 -0
  75. package/dist/types/browser/react-devtools.d.ts.map +1 -0
  76. package/dist/types/browser/readiness.d.ts +19 -0
  77. package/dist/types/browser/readiness.d.ts.map +1 -0
  78. package/dist/types/browser/refs.d.ts +70 -0
  79. package/dist/types/browser/refs.d.ts.map +1 -0
  80. package/dist/types/browser/serp.d.ts +16 -0
  81. package/dist/types/browser/serp.d.ts.map +1 -0
  82. package/dist/types/browser/snapshot-window.d.ts +31 -0
  83. package/dist/types/browser/snapshot-window.d.ts.map +1 -0
  84. package/dist/types/browser/snapshot.d.ts +41 -0
  85. package/dist/types/browser/snapshot.d.ts.map +1 -0
  86. package/dist/types/browser/tabs.d.ts +67 -0
  87. package/dist/types/browser/tabs.d.ts.map +1 -0
  88. package/dist/types/browser/target.d.ts +106 -0
  89. package/dist/types/browser/target.d.ts.map +1 -0
  90. package/dist/types/browser/youtube.d.ts +26 -0
  91. package/dist/types/browser/youtube.d.ts.map +1 -0
  92. package/dist/types/cli.d.ts +14 -0
  93. package/dist/types/cli.d.ts.map +1 -0
  94. package/dist/types/cloud/auth.d.ts +80 -0
  95. package/dist/types/cloud/auth.d.ts.map +1 -0
  96. package/dist/types/cloud/docker.d.ts +76 -0
  97. package/dist/types/cloud/docker.d.ts.map +1 -0
  98. package/dist/types/cloud/firecracker.d.ts +142 -0
  99. package/dist/types/cloud/firecracker.d.ts.map +1 -0
  100. package/dist/types/cloud/golden-snapshot.d.ts +122 -0
  101. package/dist/types/cloud/golden-snapshot.d.ts.map +1 -0
  102. package/dist/types/cloud/index.d.ts +26 -0
  103. package/dist/types/cloud/index.d.ts.map +1 -0
  104. package/dist/types/cloud/orchestrator-interface.d.ts +63 -0
  105. package/dist/types/cloud/orchestrator-interface.d.ts.map +1 -0
  106. package/dist/types/cloud/orchestrator.d.ts +58 -0
  107. package/dist/types/cloud/orchestrator.d.ts.map +1 -0
  108. package/dist/types/cloud/proxy.d.ts +34 -0
  109. package/dist/types/cloud/proxy.d.ts.map +1 -0
  110. package/dist/types/cloud/reaper.d.ts +49 -0
  111. package/dist/types/cloud/reaper.d.ts.map +1 -0
  112. package/dist/types/cloud/server.d.ts +19 -0
  113. package/dist/types/cloud/server.d.ts.map +1 -0
  114. package/dist/types/cloud/sessions.d.ts +85 -0
  115. package/dist/types/cloud/sessions.d.ts.map +1 -0
  116. package/dist/types/cloud/vm-orchestrator.d.ts +133 -0
  117. package/dist/types/cloud/vm-orchestrator.d.ts.map +1 -0
  118. package/dist/types/cloud/vm-warm-pool.d.ts +104 -0
  119. package/dist/types/cloud/vm-warm-pool.d.ts.map +1 -0
  120. package/dist/types/cloud/warm-pool.d.ts +85 -0
  121. package/dist/types/cloud/warm-pool.d.ts.map +1 -0
  122. package/dist/types/cloud/ws.d.ts +61 -0
  123. package/dist/types/cloud/ws.d.ts.map +1 -0
  124. package/dist/types/commands/meta/auth.d.ts +6 -0
  125. package/dist/types/commands/meta/auth.d.ts.map +1 -0
  126. package/dist/types/commands/meta/flows.d.ts +15 -0
  127. package/dist/types/commands/meta/flows.d.ts.map +1 -0
  128. package/dist/types/commands/meta/index.d.ts +14 -0
  129. package/dist/types/commands/meta/index.d.ts.map +1 -0
  130. package/dist/types/commands/meta/inspection.d.ts +7 -0
  131. package/dist/types/commands/meta/inspection.d.ts.map +1 -0
  132. package/dist/types/commands/meta/profile.d.ts +11 -0
  133. package/dist/types/commands/meta/profile.d.ts.map +1 -0
  134. package/dist/types/commands/meta/recording.d.ts +7 -0
  135. package/dist/types/commands/meta/recording.d.ts.map +1 -0
  136. package/dist/types/commands/meta/screenshots.d.ts +7 -0
  137. package/dist/types/commands/meta/screenshots.d.ts.map +1 -0
  138. package/dist/types/commands/meta/sessions.d.ts +7 -0
  139. package/dist/types/commands/meta/sessions.d.ts.map +1 -0
  140. package/dist/types/commands/meta/sim.d.ts +10 -0
  141. package/dist/types/commands/meta/sim.d.ts.map +1 -0
  142. package/dist/types/commands/meta/system.d.ts +8 -0
  143. package/dist/types/commands/meta/system.d.ts.map +1 -0
  144. package/dist/types/commands/meta/tabs.d.ts +6 -0
  145. package/dist/types/commands/meta/tabs.d.ts.map +1 -0
  146. package/dist/types/commands/meta/youtube.d.ts +7 -0
  147. package/dist/types/commands/meta/youtube.d.ts.map +1 -0
  148. package/dist/types/commands/read.d.ts +16 -0
  149. package/dist/types/commands/read.d.ts.map +1 -0
  150. package/dist/types/commands/write.d.ts +17 -0
  151. package/dist/types/commands/write.d.ts.map +1 -0
  152. package/dist/types/config.d.ts +101 -0
  153. package/dist/types/config.d.ts.map +1 -0
  154. package/dist/types/constants.d.ts +36 -0
  155. package/dist/types/constants.d.ts.map +1 -0
  156. package/dist/types/detection/frameworks.d.ts +27 -0
  157. package/dist/types/detection/frameworks.d.ts.map +1 -0
  158. package/dist/types/detection/index.d.ts +64 -0
  159. package/dist/types/detection/index.d.ts.map +1 -0
  160. package/dist/types/detection/infrastructure.d.ts +82 -0
  161. package/dist/types/detection/infrastructure.d.ts.map +1 -0
  162. package/dist/types/detection/saas.d.ts +39 -0
  163. package/dist/types/detection/saas.d.ts.map +1 -0
  164. package/dist/types/enable.d.ts +10 -0
  165. package/dist/types/enable.d.ts.map +1 -0
  166. package/dist/types/engine/chrome.d.ts +45 -0
  167. package/dist/types/engine/chrome.d.ts.map +1 -0
  168. package/dist/types/engine/index.d.ts +9 -0
  169. package/dist/types/engine/index.d.ts.map +1 -0
  170. package/dist/types/engine/providers.d.ts +36 -0
  171. package/dist/types/engine/providers.d.ts.map +1 -0
  172. package/dist/types/engine/resolver.d.ts +36 -0
  173. package/dist/types/engine/resolver.d.ts.map +1 -0
  174. package/dist/types/expect.d.ts +68 -0
  175. package/dist/types/expect.d.ts.map +1 -0
  176. package/dist/types/export/index.d.ts +8 -0
  177. package/dist/types/export/index.d.ts.map +1 -0
  178. package/dist/types/export/record.d.ts +28 -0
  179. package/dist/types/export/record.d.ts.map +1 -0
  180. package/dist/types/export/replay.d.ts +9 -0
  181. package/dist/types/export/replay.d.ts.map +1 -0
  182. package/dist/types/flow-parser.d.ts +32 -0
  183. package/dist/types/flow-parser.d.ts.map +1 -0
  184. package/dist/types/install-skill.d.ts +8 -0
  185. package/dist/types/install-skill.d.ts.map +1 -0
  186. package/dist/types/lib.d.ts +27 -0
  187. package/dist/types/lib.d.ts.map +1 -0
  188. package/dist/types/mcp/index.d.ts +10 -0
  189. package/dist/types/mcp/index.d.ts.map +1 -0
  190. package/dist/types/mcp/server.d.ts +9 -0
  191. package/dist/types/mcp/server.d.ts.map +1 -0
  192. package/dist/types/mcp/tools/index.d.ts +36 -0
  193. package/dist/types/mcp/tools/index.d.ts.map +1 -0
  194. package/dist/types/network/buffers.d.ts +53 -0
  195. package/dist/types/network/buffers.d.ts.map +1 -0
  196. package/dist/types/network/har.d.ts +10 -0
  197. package/dist/types/network/har.d.ts.map +1 -0
  198. package/dist/types/network/index.d.ts +6 -0
  199. package/dist/types/network/index.d.ts.map +1 -0
  200. package/dist/types/perf-audit/diff.d.ts +43 -0
  201. package/dist/types/perf-audit/diff.d.ts.map +1 -0
  202. package/dist/types/perf-audit/dom-analysis.d.ts +74 -0
  203. package/dist/types/perf-audit/dom-analysis.d.ts.map +1 -0
  204. package/dist/types/perf-audit/formatter.d.ts +34 -0
  205. package/dist/types/perf-audit/formatter.d.ts.map +1 -0
  206. package/dist/types/perf-audit/index.d.ts +128 -0
  207. package/dist/types/perf-audit/index.d.ts.map +1 -0
  208. package/dist/types/perf-audit/persist.d.ts +40 -0
  209. package/dist/types/perf-audit/persist.d.ts.map +1 -0
  210. package/dist/types/perf-audit/recommendations.d.ts +18 -0
  211. package/dist/types/perf-audit/recommendations.d.ts.map +1 -0
  212. package/dist/types/perf-audit/resource-analyzer.d.ts +46 -0
  213. package/dist/types/perf-audit/resource-analyzer.d.ts.map +1 -0
  214. package/dist/types/perf-audit/web-vitals.d.ts +73 -0
  215. package/dist/types/perf-audit/web-vitals.d.ts.map +1 -0
  216. package/dist/types/proxy/index.d.ts +6 -0
  217. package/dist/types/proxy/index.d.ts.map +1 -0
  218. package/dist/types/proxy/pool.d.ts +44 -0
  219. package/dist/types/proxy/pool.d.ts.map +1 -0
  220. package/dist/types/proxy/providers.d.ts +32 -0
  221. package/dist/types/proxy/providers.d.ts.map +1 -0
  222. package/dist/types/sdk/client.d.ts +37 -0
  223. package/dist/types/sdk/client.d.ts.map +1 -0
  224. package/dist/types/sdk/index.d.ts +17 -0
  225. package/dist/types/sdk/index.d.ts.map +1 -0
  226. package/dist/types/sdk/session.d.ts +95 -0
  227. package/dist/types/sdk/session.d.ts.map +1 -0
  228. package/dist/types/sdk/transports/cloud.d.ts +89 -0
  229. package/dist/types/sdk/transports/cloud.d.ts.map +1 -0
  230. package/dist/types/sdk/transports/index.d.ts +3 -0
  231. package/dist/types/sdk/transports/index.d.ts.map +1 -0
  232. package/dist/types/sdk/transports/local.d.ts +56 -0
  233. package/dist/types/sdk/transports/local.d.ts.map +1 -0
  234. package/dist/types/sdk.d.ts +35 -0
  235. package/dist/types/sdk.d.ts.map +1 -0
  236. package/dist/types/security/auth-vault.d.ts +32 -0
  237. package/dist/types/security/auth-vault.d.ts.map +1 -0
  238. package/dist/types/security/domain-filter.d.ts +31 -0
  239. package/dist/types/security/domain-filter.d.ts.map +1 -0
  240. package/dist/types/security/index.d.ts +10 -0
  241. package/dist/types/security/index.d.ts.map +1 -0
  242. package/dist/types/security/policy.d.ts +20 -0
  243. package/dist/types/security/policy.d.ts.map +1 -0
  244. package/dist/types/security/sanitize.d.ts +6 -0
  245. package/dist/types/security/sanitize.d.ts.map +1 -0
  246. package/dist/types/server.d.ts +13 -0
  247. package/dist/types/server.d.ts.map +1 -0
  248. package/dist/types/session/concurrency.d.ts +28 -0
  249. package/dist/types/session/concurrency.d.ts.map +1 -0
  250. package/dist/types/session/encryption.d.ts +8 -0
  251. package/dist/types/session/encryption.d.ts.map +1 -0
  252. package/dist/types/session/index.d.ts +7 -0
  253. package/dist/types/session/index.d.ts.map +1 -0
  254. package/dist/types/session/manager.d.ts +110 -0
  255. package/dist/types/session/manager.d.ts.map +1 -0
  256. package/dist/types/session/persist.d.ts +87 -0
  257. package/dist/types/session/persist.d.ts.map +1 -0
  258. package/dist/types/session/tab-lock.d.ts +26 -0
  259. package/dist/types/session/tab-lock.d.ts.map +1 -0
  260. package/dist/types/session/target-factory.d.ts +88 -0
  261. package/dist/types/session/target-factory.d.ts.map +1 -0
  262. package/dist/types/sim-cli.d.ts +8 -0
  263. package/dist/types/sim-cli.d.ts.map +1 -0
  264. package/dist/types/types.d.ts +45 -0
  265. package/dist/types/types.d.ts.map +1 -0
  266. package/dist/types/visual.d.ts +79 -0
  267. package/dist/types/visual.d.ts.map +1 -0
  268. package/package.json +22 -3
  269. package/skill/browse/SKILL.md +192 -481
  270. package/skill/browse/references/commands.md +203 -18
  271. package/skill/browse-aeo/SKILL.md +148 -0
  272. package/skill/browse-config/SKILL.md +200 -0
  273. package/skill/browse-geo/SKILL.md +225 -0
  274. package/skill/browse-qa/SKILL.md +134 -290
  275. package/skill/browse-seo/SKILL.md +188 -0
  276. package/skill/browse-stealth/SKILL.md +246 -0
@@ -197,11 +197,42 @@ browse --runtime rebrowser goto https://example.com
197
197
  # State list / show
198
198
  browse state list
199
199
  browse state show mysite
200
+
201
+ # Native app automation (Android, iOS, macOS)
202
+ browse sim start --platform android --app com.android.settings --visible
203
+ browse sim start --platform ios --app com.apple.Preferences --visible
204
+ browse --platform android --app com.android.settings snapshot -i
205
+ browse --platform ios --app com.apple.Preferences snapshot -i
206
+ browse --app "System Settings" snapshot -i # macOS
207
+ browse --platform android --app com.android.settings tap @e3
208
+ browse --platform android --app com.android.settings swipe up
209
+ browse --platform android --app com.android.settings press back
210
+ browse --platform ios --app com.apple.mobilesafari type "example.com"
211
+ browse --app TextEdit press "cmd+n" # macOS modifier combos
212
+ browse sim stop --platform android
213
+ browse sim stop --platform ios
214
+
215
+ # Install and test your own app from a file
216
+ browse sim start --platform ios --app ./build/MyApp.app --visible # .app bundle
217
+ browse sim start --platform ios --app ./MyApp.ipa --visible # .ipa archive
218
+ browse sim start --platform android --app ./app-debug.apk --visible # .apk file
219
+
220
+ # Cloud providers (encrypted API keys, never visible to agents)
221
+ browse provider save browserbase <api-key>
222
+ browse --provider browserbase goto https://example.com
223
+
224
+ # Performance audit
225
+ browse perf-audit https://example.com
226
+ browse perf-audit save baseline
227
+ browse perf-audit compare baseline
200
228
  ```
201
229
 
202
230
  ## Navigation
203
231
  ```
204
232
  browse goto <url> Navigate current tab
233
+ browse goto <url> --ready Wait for hydration/readiness after navigation
234
+ browse goto @google "query" Search macro — expands to Google search URL
235
+ browse goto @youtube "query" Search macro — YouTube, Amazon, Reddit, Wikipedia, etc.
205
236
  browse back Go back
206
237
  browse forward Go forward
207
238
  browse reload Reload page
@@ -215,6 +246,13 @@ browse html [selector] innerHTML of element, or full page HTML
215
246
  browse links All links as "text -> href"
216
247
  browse forms All forms + fields as JSON
217
248
  browse accessibility Accessibility tree snapshot (ARIA)
249
+ browse images List page images (src, alt, dimensions)
250
+ browse images [selector] Images within a specific element
251
+ browse images --limit 20 Limit number of images returned
252
+ browse images --inline Include base64-encoded image data
253
+ browse schema Extract JSON-LD, Microdata, RDFa structured data (parsed JSON)
254
+ browse meta Extract page meta tags (title, description, canonical, OG, Twitter, hreflang, robots, viewport)
255
+ browse headings Extract H1-H6 heading hierarchy with counts and indented tree
218
256
  ```
219
257
 
220
258
  ## Snapshot (ref-based element selection)
@@ -227,6 +265,9 @@ browse snapshot -c Compact (no empty structural elements)
227
265
  browse snapshot -C Cursor-interactive (detect divs with cursor:pointer/onclick/tabindex)
228
266
  browse snapshot -d <N> Limit depth to N levels
229
267
  browse snapshot -s <sel> Scope to CSS selector
268
+ browse snapshot --offset <N> Start output from line N (windowing for large snapshots)
269
+ browse snapshot --max-chars <N> Limit snapshot output to N characters
270
+ browse snapshot --serp Google SERP fast extraction (structured results, no refs)
230
271
  browse snapshot-diff Compare current vs previous snapshot
231
272
  ```
232
273
 
@@ -245,15 +286,26 @@ Refs are invalidated on navigation -- run `snapshot` again after `goto`.
245
286
  ## Interaction
246
287
  ```
247
288
  browse click <selector> Click element (CSS selector or @ref)
289
+ browse click <sel> --force Force-click through overlay interception (bypasses actionability checks)
290
+ browse click <sel> --if-exists Click only if element exists (no error if missing)
291
+ browse click <sel> --if-visible Click only if element is visible
248
292
  browse click <x>,<y> Click at page coordinates (e.g. 590,461)
249
293
  browse rightclick <selector> Right-click element (context menu)
250
294
  browse dblclick <selector> Double-click element
251
295
  browse fill <selector> <value> Fill input field
296
+ browse fill <sel> <val> --if-empty Fill only if field is empty
252
297
  browse select <selector> <val> Select dropdown value
253
298
  browse hover <selector> Hover over element
299
+ browse hover <sel> --if-exists Hover only if element exists
300
+ browse hover <sel> --if-visible Hover only if visible
254
301
  browse focus <selector> Focus element
302
+ browse focus <sel> --if-exists Focus only if element exists
303
+ browse focus <sel> --if-visible Focus only if visible
255
304
  browse tap <selector> Tap element (requires touch context via emulate)
305
+ browse tap <sel> --if-exists Tap only if element exists
306
+ browse tap <sel> --if-visible Tap only if visible
256
307
  browse check <selector> Check checkbox
308
+ browse check <sel> --if-unchecked Check only if not already checked
257
309
  browse uncheck <selector> Uncheck checkbox
258
310
  browse drag <src> <tgt> Drag source to target
259
311
  browse type <text> Type into focused element
@@ -277,6 +329,7 @@ browse wait --fn "expr" Wait for JavaScript condition
277
329
  browse wait --load <state> Wait for load state
278
330
  browse wait --url <pattern> Wait for URL match
279
331
  browse wait --network-idle Wait for network idle
332
+ browse wait --request <pattern> Wait for a matching network request
280
333
  browse wait --download Wait for download, return temp path
281
334
  browse wait --download ./report.pdf Wait and save to path
282
335
  browse wait --download 60000 Custom timeout (ms)
@@ -289,6 +342,7 @@ browse viewport <WxH> Set viewport size (e.g. 375x812)
289
342
  browse upload <sel> <files> Upload file(s) to a file input
290
343
  browse highlight <selector> Highlight element (visual debugging)
291
344
  browse download <sel> [path] Download file triggered by click
345
+ browse download <sel> --inline Return file content as base64 (no disk write)
292
346
  browse dialog-accept [value] Set dialogs to auto-accept
293
347
  browse dialog-dismiss Set dialogs to auto-dismiss (default)
294
348
  browse emulate <device> Emulate device (iphone, pixel, etc.)
@@ -322,6 +376,8 @@ browse element-state <selector> Element state (visible/enabled/checked/focused)
322
376
  browse value <selector> Get input field value
323
377
  browse count <selector> Count matching elements
324
378
  browse box <selector> Get bounding box as JSON {x, y, width, height}
379
+ browse layout <selector> Get element layout details
380
+ browse request <index|url> Inspect a captured network request by index or URL pattern
325
381
  browse dialog Last dialog info or "(no dialog detected)"
326
382
  browse console [--clear] View/clear console messages
327
383
  browse errors [--clear] View/clear page errors (filtered from console)
@@ -397,6 +453,7 @@ browse --profile <name> <cmd> Use persistent browser profile
397
453
  browse profile list List profiles with disk size
398
454
  browse profile delete <name> Delete a profile
399
455
  browse profile clean [--older-than <d>] Remove old profiles (default: 7 days)
456
+ browse profiles List available camoufox profiles from .browse/camoufox-profiles/
400
457
  ```
401
458
 
402
459
  ## State persistence
@@ -444,6 +501,123 @@ browse record stop Stop recording, keep steps for export
444
501
  browse record status Recording state and step count
445
502
  browse record export browse [path] Export as chain-compatible JSON (replay with browse chain)
446
503
  browse record export replay [path] Export as Chrome DevTools Recorder (Playwright/Puppeteer)
504
+ browse record export replay --selectors css,aria [path] Filter selector types in export
505
+ ```
506
+
507
+ ## Native App Automation
508
+ ```
509
+ browse sim start --platform ios|android --app <id-or-path> [--visible] [--device <name>] Start + install/launch app
510
+ browse sim stop --platform ios|android Stop simulator/emulator
511
+ browse sim status --platform ios|android Check runner status
512
+ browse --platform ios --app <bundleId> <command> Target iOS app
513
+ browse --platform android --app <package> <command> Target Android app
514
+ browse --app <name> <command> Target macOS app
515
+ ```
516
+
517
+ The `--app` flag accepts a bundle ID, package name, **or file path** (.app/.ipa/.apk). File paths auto-install the app into the simulator/emulator.
518
+
519
+ Supported commands on all app platforms: `snapshot`, `text`, `tap`, `fill`, `type`, `press`, `swipe`, `screenshot`.
520
+ macOS also supports modifier combos: `browse --app TextEdit press "cmd+n"`.
521
+ Android auto-installs adb, Java, SDK, and emulator on first use (macOS via Homebrew).
522
+
523
+ ### Common iOS Bundle IDs
524
+ | App | Bundle ID |
525
+ |-----|-----------|
526
+ | Settings | `com.apple.Preferences` |
527
+ | Safari | `com.apple.mobilesafari` |
528
+ | Maps | `com.apple.Maps` |
529
+ | Photos | `com.apple.mobileslideshow` |
530
+ | Calendar | `com.apple.mobilecal` |
531
+
532
+ ### Common Android Package Names
533
+ | App | Package Name |
534
+ |-----|-------------|
535
+ | Settings | `com.android.settings` |
536
+ | Chrome | `com.android.chrome` |
537
+ | Dialer | `com.google.android.dialer` |
538
+ | Messages | `com.google.android.apps.messaging` |
539
+ | Calculator | `com.google.android.calculator` |
540
+
541
+ ### Platform enablement (run once)
542
+ ```
543
+ browse enable android # Auto-installs adb, JDK, SDK, emulator, driver
544
+ browse enable ios # Builds iOS runner (needs Xcode)
545
+ browse enable macos # Builds browse-ax bridge
546
+ browse enable all # All platforms
547
+ ```
548
+
549
+ ## Performance audit
550
+ ```
551
+ browse perf-audit [url] Full performance audit (Web Vitals, resources, images, fonts, DOM, render-blocking, third-party, stack detection, correlations, recommendations)
552
+ browse perf-audit [url] --no-coverage Skip JS/CSS coverage collection (faster)
553
+ browse perf-audit [url] --no-detect Skip framework/SaaS/infrastructure detection
554
+ browse perf-audit [url] --json Output as structured JSON (for programmatic use)
555
+ browse perf-audit [url] --budget lcp:2500,cls:0.1,tbt:300 Set performance budgets (fail if exceeded)
556
+ browse perf-audit save [name] Save audit report to .browse/audits/ (auto-names from URL + date if omitted)
557
+ browse perf-audit compare <base> [curr] Compare saved baseline vs current page or another saved audit (regression detection)
558
+ browse perf-audit list List saved audit reports (name, size, date)
559
+ browse perf-audit delete <name> Delete a saved audit report
560
+ browse detect Detect tech stack: frameworks, SaaS platforms, CDN, protocol, compression, caching, DOM complexity, third-party inventory
561
+ browse coverage start Start JS/CSS code coverage collection
562
+ browse coverage stop Stop collection and report per-file used/unused bytes
563
+ browse initscript set <code> Inject JS that runs before every page load (pre-navigation observers, mocks, polyfills)
564
+ browse initscript show Show current init script
565
+ browse initscript clear Remove init script
566
+ ```
567
+
568
+ ## YouTube transcript
569
+ ```
570
+ browse youtube-transcript <url> Extract captions from YouTube video
571
+ browse youtube-transcript <url> --lang en Specify caption language
572
+ ```
573
+
574
+ ## API requests
575
+ ```
576
+ browse api <method> <url> Make HTTP request (GET, POST, PUT, DELETE, etc.)
577
+ browse api <method> <url> --body '{"key":"val"}' With JSON body
578
+ browse api <method> <url> --header "Auth:Bearer x" With custom header
579
+ ```
580
+
581
+ ## Assertions (expect)
582
+ ```
583
+ browse expect --url <pattern> Assert current URL matches
584
+ browse expect --text <text> Assert text exists on page
585
+ browse expect --visible <selector> Assert element is visible
586
+ browse expect --hidden <selector> Assert element is hidden
587
+ browse expect --count <selector> <n> Assert element count
588
+ browse expect --request <pattern> Assert a network request was made
589
+ browse expect --timeout 5000 Custom timeout for assertions (ms)
590
+ ```
591
+
592
+ ## Visual & Accessibility audit
593
+ ```
594
+ browse visual Visual snapshot of the page
595
+ browse a11y-audit Accessibility audit (WCAG violations, warnings, passes)
596
+ ```
597
+
598
+ ## Flows (reusable test sequences)
599
+ ```
600
+ browse flow <file.yaml> Run a flow from a YAML file
601
+ browse flow save <name> Save recorded commands as a named flow
602
+ browse flow run <name> Run a saved flow by name
603
+ browse flow list List saved flows
604
+ ```
605
+
606
+ ## Retry & Watch
607
+ ```
608
+ browse retry "<cmd>" --until <condition> Retry a command until condition is met
609
+ browse retry "<cmd>" --until <cond> --max 5 Max retry attempts (default: 10)
610
+ browse retry "<cmd>" --until <cond> --backoff Exponential backoff between retries
611
+ browse watch "<selector>" Watch an element for changes
612
+ browse watch "<sel>" --on-change "<cmd>" Run command when element changes
613
+ browse watch "<sel>" --timeout 30000 Custom watch timeout (ms)
614
+ ```
615
+
616
+ ## Cloud Providers
617
+ ```
618
+ browse provider save <name> <key> Save provider API key (encrypted)
619
+ browse provider list List saved providers
620
+ browse provider delete <name> Delete provider key
447
621
  ```
448
622
 
449
623
  ## React DevTools
@@ -461,24 +635,6 @@ browse react-devtools owners <sel> Parent component chain
461
635
  browse react-devtools context <sel> Context values consumed by component
462
636
  ```
463
637
 
464
- ## Performance audit
465
- ```
466
- browse perf-audit [url] Full performance audit (Web Vitals, resources, images, fonts, DOM, coverage, stack detection, recommendations)
467
- browse perf-audit [url] --no-coverage Skip JS/CSS coverage (faster)
468
- browse perf-audit [url] --no-detect Skip framework/SaaS detection
469
- browse perf-audit [url] --json Structured JSON output
470
- browse perf-audit save [name] Save audit report to .browse/audits/ (auto-names from URL + date)
471
- browse perf-audit compare <base> [curr] Compare saved baseline vs current page or another saved audit
472
- browse perf-audit list List saved audit reports
473
- browse perf-audit delete <name> Delete a saved audit
474
- browse detect Tech stack fingerprint (frameworks, SaaS, CDN, infra)
475
- browse coverage start Start JS/CSS code coverage collection
476
- browse coverage stop Stop and report per-file used/unused bytes
477
- browse initscript set <code> Inject JS before every page load
478
- browse initscript show Show current init script
479
- browse initscript clear Remove init script
480
- ```
481
-
482
638
  ## Server management
483
639
  ```
484
640
  browse status Server health, uptime, session count
@@ -491,6 +647,35 @@ browse restart Kill + restart server
491
647
  browse inspect Open DevTools (requires BROWSE_DEBUG_PORT)
492
648
  ```
493
649
 
650
+ ## CLI Flags
651
+
652
+ | Flag | Description |
653
+ |------|-------------|
654
+ | `--session <id>` | Named session (isolates tabs, refs, cookies — auto-persists on close) |
655
+ | `--profile <name>` | Persistent browser profile (own Chromium, full state) |
656
+ | `--state <path>` | Load state file (cookies/storage) before first command |
657
+ | `--json` | Wrap output as `{success, data, command}` |
658
+ | `--content-boundaries` | Wrap page content in nonce-delimited markers (prompt injection defense) |
659
+ | `--allowed-domains <d,d>` | Block navigation/resources outside allowlist |
660
+ | `--max-output <n>` | Truncate output to N characters |
661
+ | `--headed` | Run browser in headed (visible) mode |
662
+ | `--chrome` | Shortcut for `--runtime chrome --headed` (uses real Chrome, bypasses bot detection) |
663
+ | `--cdp <port>` | Connect to Chrome on a specific debugging port |
664
+ | `--connect` | Auto-discover and connect to a running Chrome instance |
665
+ | `--provider <name>` | Cloud browser provider (browserless, browserbase) |
666
+ | `--runtime <name>` | Browser engine: playwright (default), camoufox (anti-detection Firefox), rebrowser (stealth), lightpanda, chrome |
667
+ | `--ready` | Wait for hydration/readiness after goto |
668
+ | `--force` | Force-click through overlay interception |
669
+ | `--serp` | Google SERP fast extraction mode |
670
+ | `--mcp` | Run as MCP server (for Cursor, Windsurf, Cline) |
671
+ | `--context` | Show state changes after commands |
672
+ | `--context delta` | ARIA diff with refs |
673
+ | `--context full` | Complete snapshot with refs after write commands |
674
+ | `--camoufox-profile <name>` | Use a named camoufox profile for browser launch (JSON in `.browse/camoufox-profiles/<name>.json`). Only applies when starting a new server. |
675
+ | `--platform <ios\|android>` | Target native app platform |
676
+ | `--app <id-or-path>` | Target app by bundle ID, package name, or file path (.app/.ipa/.apk) |
677
+ | `--device <name>` | Simulator/emulator device name (e.g. "iPhone 15", "Pixel 7") |
678
+
494
679
  ## Handoff (human takeover)
495
680
  ```
496
681
  browse handoff [reason] Swap to visible browser for user to solve CAPTCHA/MFA
@@ -0,0 +1,148 @@
1
+ ---
2
+ name: browse-aeo
3
+ version: 1.0.0
4
+ description: |
5
+ Answer Engine Optimization (AEO) audit and SERP analysis for AI-generated answers.
6
+ Analyzes pages for AEO readiness (structured data, FAQ patterns, heading hierarchy,
7
+ meta quality) and checks how queries appear in AI-powered search results (Google AI
8
+ Overviews, Perplexity, ChatGPT Search). Uses the browse CLI for all page interaction.
9
+ allowed-tools:
10
+ - Bash
11
+ - Read
12
+ argument-hint: "[URL to audit or search query to analyze]"
13
+ arguments:
14
+ - request
15
+ when_to_use: |
16
+ Use when the user asks for AEO audit, answer engine optimization, AI search optimization,
17
+ AI Overview analysis, Perplexity citation check, or says /browse-aeo. Also use when the
18
+ user wants to understand how a page or domain appears in AI-generated answers.
19
+ effort: high
20
+ ---
21
+
22
+ # browse-aeo: Answer Engine Optimization
23
+
24
+ ## Goal
25
+
26
+ Audit a page for AEO readiness or analyze how a query surfaces in AI-powered search.
27
+ Two modes: **Page Audit** (analyze a URL) and **SERP Analysis** (analyze a search query).
28
+
29
+ ## Mode 1: Page Audit
30
+
31
+ Evaluate a single URL for AEO readiness. Run each step in order.
32
+
33
+ ### Step 1: Navigate and stabilize
34
+
35
+ ```bash
36
+ browse goto <url>
37
+ browse wait --network-idle
38
+ ```
39
+
40
+ ### Step 2: Extract structured data
41
+
42
+ ```bash
43
+ browse schema
44
+ ```
45
+
46
+ Analyze for: JSON-LD presence (critical for AEO), FAQPage schema (directly feeds AI answers), HowTo schema (surfaces in how-to answers), Article/NewsArticle/BlogPosting (attribution), Organization/Person (authority), Breadcrumb (hierarchy), QAPage (Q&A pairs). Empty or minimal structured data is a major AEO gap.
47
+
48
+ ### Step 3: Extract and evaluate meta tags
49
+
50
+ ```bash
51
+ browse meta
52
+ ```
53
+
54
+ Check: meta description (concise direct answer, under 160 chars -- AI uses this as candidate snippet), canonical URL (must be present), Open Graph tags (og:title, og:description), robots directives (`noindex` or `nosnippet` blocks AI citation entirely).
55
+
56
+ ### Step 4: Analyze heading hierarchy
57
+
58
+ ```bash
59
+ browse headings
60
+ ```
61
+
62
+ Evaluate: single H1 (clear topic statement), H2s as questions or clear topic labels (AI uses headings to find answer boundaries), question-format H2s ("What is X?", "How to Y?") are strongly preferred, logical nesting (no skipped levels).
63
+
64
+ ### Step 5: Analyze page content for answer patterns
65
+
66
+ ```bash
67
+ browse text
68
+ ```
69
+
70
+ Scan for: direct definitions in the first paragraph ("X is a..." -- AI favors concise leads), FAQ patterns (Q&A pairs even without schema), numbered/bulleted lists (AI prefers extractable structure), concise paragraphs (under 50 words are more likely cited), authority signals ("We tested...", "In our experience..." -- original research language).
71
+
72
+ ### Step 6: Produce the AEO audit report
73
+
74
+ Score the page on a 0-100 scale across these dimensions:
75
+
76
+ | Dimension | Weight | What to check |
77
+ |-----------|--------|---------------|
78
+ | Structured Data | 25% | JSON-LD presence, FAQ/HowTo/Article schema, completeness |
79
+ | Meta Quality | 15% | Description as answer snippet, canonical, no blocking robots |
80
+ | Heading Structure | 20% | Single H1, question-format H2s, logical nesting |
81
+ | Answer Readiness | 25% | Direct definitions, FAQ patterns, concise paragraphs, lists |
82
+ | Authority Signals | 15% | Organization schema, author markup, original research language |
83
+
84
+ Report: overall score out of 100, per-dimension score with findings and recommendations, then the top 3 highest-impact actions.
85
+
86
+ ## Mode 2: SERP Analysis
87
+
88
+ Check how a query appears in AI-powered search results.
89
+
90
+ ### Step 1: Google search with AI Overview detection
91
+
92
+ ```bash
93
+ browse goto "https://www.google.com/search?q=<url-encoded-query>"
94
+ browse wait --network-idle
95
+ browse snapshot -i
96
+ ```
97
+
98
+ Read the snapshot to identify: AI Overview (generative answer block, note cited domains), Featured Snippet (boxed answer, note source domain), People Also Ask (expandable questions -- these are AEO targets), organic position of target domain.
99
+
100
+ If Google blocks the request, retry with camoufox:
101
+
102
+ ```bash
103
+ browse --runtime camoufox --headed goto "https://www.google.com/search?q=<url-encoded-query>"
104
+ browse --runtime camoufox --headed snapshot -i
105
+ ```
106
+
107
+ ### Step 2: Perplexity analysis (camoufox recommended)
108
+
109
+ Perplexity has bot detection. Use camoufox:
110
+
111
+ ```bash
112
+ browse --runtime camoufox --headed goto "https://www.perplexity.ai/search?q=<url-encoded-query>"
113
+ browse --runtime camoufox --headed wait --network-idle
114
+ browse --runtime camoufox --headed snapshot -i
115
+ ```
116
+
117
+ Read the snapshot to identify: cited source domains (numbered citations), answer structure (paragraphs, lists, tables), citation density. If Perplexity blocks, note it in the report and skip.
118
+
119
+ ### Step 3: Produce the SERP analysis report
120
+
121
+ Report: for each engine (Google, Perplexity), list AI Overview presence, cited domains, featured snippet source, People Also Ask questions, and target domain position. End with observations on what content types are being cited and specific actions to improve citation likelihood.
122
+
123
+ ## Key Rules
124
+
125
+ 1. **Always wait after navigation** -- `browse wait --network-idle` before extracting content.
126
+ 2. **Use camoufox for search engines** -- Google and Perplexity actively block headless browsers. Fall back to `--runtime camoufox --headed` when blocked.
127
+ 3. **Agent interprets snapshots** -- there is no magic SERP parser. The agent reads `browse snapshot -i` output and identifies AI Overview elements, citations, and People Also Ask by reading the accessibility tree.
128
+ 4. **Structured data is the top signal** -- JSON-LD FAQ and HowTo schemas are the single most impactful AEO lever. Always check this first.
129
+ 5. **Do not fabricate scores** -- if a dimension cannot be evaluated (e.g., page is behind a login wall), mark it as "N/A" and explain why.
130
+ 6. **Keep recommendations actionable** -- "Add FAQ schema" is good. "Improve SEO" is not.
131
+
132
+ ## Guardrails
133
+
134
+ - Do not add `disable-model-invocation`; this is a general-purpose audit skill.
135
+ - Do not add `context: fork`; audit results are needed in the current flow.
136
+ - Do not run `browse handoff` without explicit user confirmation.
137
+ - Do not guess SERP structure -- always take a snapshot and read it.
138
+ - Do not claim a page "appears in AI Overviews" without actually checking via SERP analysis.
139
+
140
+ ## Output Contract
141
+
142
+ Report:
143
+
144
+ 1. the mode used (Page Audit or SERP Analysis)
145
+ 2. the URL audited or query analyzed
146
+ 3. findings per dimension with specific evidence
147
+ 4. actionable recommendations ranked by impact
148
+ 5. any blockers encountered (bot detection, login walls, empty results)
@@ -0,0 +1,200 @@
1
+ ---
2
+ name: browse-config
3
+ version: 1.0.0
4
+ description: |
5
+ Guided configuration generator for the browse CLI's camoufox integration.
6
+ Asks the user questions to build a browse.json camoufox section or a named
7
+ profile JSON file for stealth, fast-scraping, Google-safe, or custom setups.
8
+ allowed-tools:
9
+ - AskUserQuestion
10
+ - Bash
11
+ - Read
12
+ - Write
13
+ argument-hint: "[preset or 'custom']"
14
+ arguments:
15
+ - request
16
+ when_to_use: |
17
+ Use when the user asks to configure camoufox, set up stealth browsing, create a browse
18
+ profile, tune anti-detection settings, or says /browse-config. Do NOT use for general
19
+ browse CLI usage or non-camoufox configuration.
20
+ effort: medium
21
+ ---
22
+
23
+ # browse-config: Camoufox Configuration Generator
24
+
25
+ ## Step 0: Ask what the user needs
26
+
27
+ Use AskUserQuestion to determine the goal. Offer these presets:
28
+
29
+ | Preset | Description |
30
+ |--------|-------------|
31
+ | **Stealth browsing** | For scraping protected sites. Enables geoip, humanize, default OS fingerprint. |
32
+ | **Fast scraping** | Minimal footprint. Blocks images, WebRTC, WebGL. Enables disk cache. |
33
+ | **Google-safe** | For Google search without "unusual traffic" blocks. Enables geoip, humanize, random OS. |
34
+ | **Custom** | Walk through each option group interactively. |
35
+
36
+ ### Preset defaults
37
+
38
+ **Stealth browsing:**
39
+ ```json
40
+ {
41
+ "geoip": true,
42
+ "humanize": true
43
+ }
44
+ ```
45
+
46
+ **Fast scraping:**
47
+ ```json
48
+ {
49
+ "blockImages": true,
50
+ "blockWebrtc": true,
51
+ "blockWebgl": true,
52
+ "enableCache": true
53
+ }
54
+ ```
55
+
56
+ **Google-safe:**
57
+ ```json
58
+ {
59
+ "geoip": true,
60
+ "humanize": true,
61
+ "os": ["windows", "macos", "linux"]
62
+ }
63
+ ```
64
+
65
+ ## Step 1: Custom configuration (skip if preset chosen)
66
+
67
+ If the user chose "Custom", ask about each option group using AskUserQuestion. Present one group at a time.
68
+
69
+ ### Identity
70
+ - `os` (string or array) -- target OS fingerprint: "windows", "macos", "linux", or an array for random selection
71
+ - `locale` (string or array) -- browser locale, e.g. "en-US" or ["en-US", "en-GB"]
72
+ - `fingerprint` (object) -- advanced fingerprint overrides (most users skip this)
73
+
74
+ ### Privacy
75
+ - `blockWebrtc` (boolean) -- block WebRTC to prevent IP leaks
76
+ - `blockWebgl` (boolean) -- block WebGL fingerprinting
77
+ - `blockImages` (boolean) -- block image loading (also improves speed)
78
+
79
+ ### Performance
80
+ - `enableCache` (boolean) -- enable browser disk cache
81
+ - `blockImages` (boolean) -- already covered in Privacy, mention speed benefit here
82
+
83
+ ### Network
84
+ - `proxy` (string or object) -- proxy URL like "http://user:pass@host:port" or `{"server":"...","username":"...","password":"..."}`
85
+ - `geoip` (string or boolean) -- true to auto-derive from proxy IP, or a country code like "US"
86
+
87
+ ### Behavior
88
+ - `humanize` (boolean or number) -- true for default human-like delays, or a number (0.5-2.0) to control speed
89
+
90
+ ### Advanced (offer only if user asks)
91
+ - `addons` (string[]) -- Firefox addon paths to load
92
+ - `excludeAddons` (string[]) -- built-in addons to skip
93
+ - `firefoxUserPrefs` (Record) -- raw Firefox about:config preferences
94
+ - `args` (string[]) -- extra browser launch arguments
95
+ - `fonts` (string[]) -- custom font list
96
+ - `customFontsOnly` (boolean) -- use only custom fonts
97
+ - `screen` (object) -- `{minWidth, maxWidth, minHeight, maxHeight}`
98
+ - `window` ([width, height]) -- fixed window size
99
+ - `ffVersion` (number) -- target Firefox version
100
+ - `headless` (boolean or "virtual") -- headless mode (not recommended for anti-detection)
101
+ - `mainWorldEval` (boolean) -- enable main world JavaScript eval
102
+ - `executablePath` (string) -- custom camoufox binary path
103
+ - `env` (Record) -- environment variables for the browser process
104
+ - `virtualDisplay` (string) -- virtual display config (Linux only)
105
+ - `disableCoop` (boolean) -- disable Cross-Origin-Opener-Policy headers
106
+ - `debug` (boolean) -- enable debug logging
107
+
108
+ ## Step 2: Ask where to save
109
+
110
+ Use AskUserQuestion with two options:
111
+
112
+ 1. **browse.json** -- adds a `"camoufox"` section to the project's `browse.json`. Applied automatically whenever `--runtime camoufox` is used.
113
+ 2. **Named profile** -- saves to `.browse/camoufox-profiles/<name>.json`. Used with `--camoufox-profile <name>`. Good for per-scenario configs (e.g. "google", "scrape", "stealth").
114
+
115
+ If the user picks a named profile, ask for the profile name.
116
+
117
+ ## Step 3: Generate and write the file
118
+
119
+ ### If browse.json
120
+
121
+ Read the existing `browse.json` first (if it exists). Merge the new `camoufox` key into it. Write the result:
122
+
123
+ ```json
124
+ {
125
+ "camoufox": {
126
+ "geoip": true,
127
+ "humanize": true
128
+ }
129
+ }
130
+ ```
131
+
132
+ ### If named profile
133
+
134
+ Create the directory `.browse/camoufox-profiles/` if needed. Write just the config object:
135
+
136
+ ```json
137
+ {
138
+ "geoip": true,
139
+ "humanize": true,
140
+ "os": "windows"
141
+ }
142
+ ```
143
+
144
+ ## Step 4: Show usage
145
+
146
+ After writing the file, tell the user exactly how to use it.
147
+
148
+ **If browse.json:**
149
+ ```
150
+ Run: browse --runtime camoufox goto <url>
151
+ The camoufox section is applied automatically.
152
+ ```
153
+
154
+ **If named profile:**
155
+ ```
156
+ Run: browse --runtime camoufox --camoufox-profile <name> goto <url>
157
+ ```
158
+
159
+ Always note: "The `--camoufox-profile` flag only applies when starting a new server. If a server is already running, stop it first with `browse stop`."
160
+
161
+ ## All CamoufoxConfig options
162
+
163
+ All keys use camelCase in JSON. They are auto-mapped to snake_case for camoufox-js internally.
164
+
165
+ | Key | Type | Description |
166
+ |-----|------|-------------|
167
+ | `os` | string or string[] | Target OS fingerprint |
168
+ | `blockImages` | boolean | Block image loading |
169
+ | `blockWebrtc` | boolean | Block WebRTC |
170
+ | `blockWebgl` | boolean | Block WebGL |
171
+ | `disableCoop` | boolean | Disable COOP headers |
172
+ | `geoip` | string or boolean | GeoIP spoofing (true or country code) |
173
+ | `humanize` | boolean or number | Human-like delays (true or speed factor) |
174
+ | `locale` | string or string[] | Browser locale |
175
+ | `addons` | string[] | Firefox addon paths |
176
+ | `fonts` | string[] | Custom fonts |
177
+ | `customFontsOnly` | boolean | Only use custom fonts |
178
+ | `screen` | object | Screen size range ({minWidth, maxWidth, minHeight, maxHeight}) |
179
+ | `window` | [number, number] | Fixed window size |
180
+ | `fingerprint` | object | Fingerprint overrides |
181
+ | `ffVersion` | number | Firefox version |
182
+ | `headless` | boolean or "virtual" | Headless mode |
183
+ | `mainWorldEval` | boolean | Main world eval |
184
+ | `firefoxUserPrefs` | Record | Firefox about:config prefs |
185
+ | `proxy` | string or object | Proxy config |
186
+ | `enableCache` | boolean | Enable disk cache |
187
+ | `debug` | boolean | Debug logging |
188
+ | `excludeAddons` | string[] | Addons to exclude |
189
+ | `executablePath` | string | Custom browser path |
190
+ | `args` | string[] | Extra browser args |
191
+ | `env` | Record | Environment variables |
192
+ | `virtualDisplay` | string | Virtual display (Linux) |
193
+
194
+ ## Guardrails
195
+
196
+ - Always use AskUserQuestion before generating config. Do not assume preferences.
197
+ - Use camelCase keys in all generated JSON (the CLI handles snake_case mapping).
198
+ - Never overwrite existing browse.json fields outside the `camoufox` key.
199
+ - Never include proxy credentials in output shown to the user. Write them to the file only.
200
+ - Do not include options the user did not ask for or confirm, beyond the preset defaults.