Changelog
Release history for @ulpi/browse
v2.4.0 — Camoufox Runtime, SEO/AEO/GEO Skills (2026-04-13)
A major release adding a full anti-detection browser runtime, a configuration system to control it, three SEO-focused read commands, and five end-to-end skills for search engine optimization, answer engine optimization, and generative engine optimization.
Camoufox — a new anti-detection browser runtime
Bypasses Cloudflare Turnstile, DataDome, PerimeterX, and fingerprint-based bot detection that standard Chromium can't get past. Unlike user-agent spoofing, Camoufox is a patched Firefox that spoofs navigator, canvas, WebGL, WebRTC, audio context, fonts, screen, and timezone at the C++ level — where detection scripts actually look.
npm install camoufox-js
browse --runtime camoufox goto https://protected-site.comVerified working: navigator.platform returns Win32 on a macOS host when the profile sets os: "windows". The spoofing happens below the JavaScript surface, so detection scripts can't unmask it.
Full configuration system — 26 camoufox options
Every camoufox-js launch option is now configurable through browse.json or named profiles. No more hardcoded defaults — tune OS fingerprint, GeoIP, humanize delays, proxy, font list, screen size, WebRTC/WebGL blocking, Firefox prefs, addons, and more:
// browse.json
{
"camoufox": {
"geoip": true,
"humanize": true,
"os": ["windows", "macos", "linux"],
"blockWebrtc": true,
"proxy": { "server": "http://proxy:8080" }
}
}Named profiles — save per-scenario presets in .browse/camoufox-profiles/<name>.json and switch with one flag:
browse --camoufox-profile stealth-google goto https://google.com
browse --camoufox-profile fast-scrape goto https://ecom-site.combrowse profiles — lists all available camoufox profiles with their configured options. Profile names are sanitized against path traversal. Malformed JSON falls back gracefully; missing profiles throw with the list of available names.
Three new SEO commands (Content Extraction)
Built specifically for agents auditing websites — fast, structured, LLM-friendly output:
browse schema— extract JSON-LD, Microdata, and RDFa structured data. Returns parsed JSON. Covers Article, Product, Organization, FAQ, HowTo, and any schema.org type present.browse meta— extract every meta tag that matters for SEO/AEO: title, description, canonical, Open Graph, Twitter Card, robots, viewport, plus full hreflang table (20+ locales on international sites).browse headings— extract H1-H6 hierarchy with count summary ([h1:1 h2:7 h3:28]) and indented tree. Shows heading structure at a glance — critical for SEO and AEO readiness scoring.
All three are exposed via MCP, so Cursor/Claude Desktop/Windsurf can call them as browse_schema, browse_meta, browse_headings.
Five new skills for search optimization workflows
End-to-end workflows that use the new commands + existing browse capabilities (snapshot, detect, perf, perf-audit) to deliver complete audits:
/browse-seo— full SEO audit workflow: meta tags, headings, structured data, performance, links, mobile rendering, image alt audit, custom JS checks, final scored report with prioritized recommendations./browse-aeo— Answer Engine Optimization: page-audit mode (FAQ schema, answer readiness, authority signals) plus SERP-analysis mode (Google AI Overviews, Perplexity citations). Scores across 5 weighted dimensions./browse-geo— Generative Engine Optimization: multi-engine brand visibility monitoring across Google AI Overviews, Perplexity, and ChatGPT Search. Produces a cross-engine visibility matrix with citation positions, competing domains, and gap queries./browse-config— guided camoufox configuration generator. AskUserQuestion walks through presets (stealth, fast-scrape, google-safe, custom) and writes a validbrowse.jsonor named profile. Shows the exact CLI command to use it./browse-stealth(v2 rewrite) — full rewrite against the new profile system. Covers Turnstile bypass, Google anti-bot evasion, authenticated sessions, and proxy rotation. Every step includes exactbrowsecommands.
Runtime registry
Five browser engines now available via --runtime:
| Runtime | Purpose |
|---|---|
playwright (default) | Full compatibility, all features |
rebrowser | Stealth patched Chromium |
camoufox (new) | Anti-detection Firefox with C++ fingerprint spoofing |
lightpanda | Lightweight Zig engine for static pages |
chrome | System Chrome with real user profile |
Under the hood
loadCamoufoxConfig()respectsBROWSE_LOCAL_DIR, then project root.browse/, matching the rest of the system's path resolution- Config errors (missing profile, bad JSON) propagate immediately instead of silently falling back to defaults — no more silent wrong-config launches
listCamoufoxProfiles()extracted as a pure function for testability- 19 new tests covering read commands, config mapping (with a key-list assertion pinning the 26-key contract), profile load/merge, malformed-JSON fallback, and the profiles command path
- All five engines listed in
--runtimehelp text and CLI error messages
v2.3.3 — Enable Command & Pre-built Binaries (2026-03-29)
browse enable android|ios|macos|all— one command to set up native drivers for any platform- Pre-built binaries (browse-ax, Android APKs, iOS runner) ship with
npm install— no build step for most users - Fixed path resolution so native binaries work correctly when installed globally via npm
v2.3.0 — Simulator Lifecycle & Zero-Setup Native Automation (2026-03-29)
The headline feature: boot an Android emulator or iOS Simulator, launch any app, and interact with it — all from the CLI. On Android, everything installs automatically from a blank machine.
Simulator/Emulator management:
browse sim start --platform ios|android --app <id> [--visible]— boot, launch app, start automation driverbrowse sim stop/browse sim status— clean lifecycle management--visibleopens the simulator/emulator window (default: headless background)- Switch apps on-the-fly: iOS reconfigures instantly, Android restarts the driver while keeping the emulator
Android zero-setup:
- First
sim starton a blank machine installs everything via Homebrew: adb, JDK 21, Android SDK, emulator, system image (API 35), and creates a default AVD - Driver APK builds automatically from source
- No manual setup. No Android Studio required.
iOS improvements:
- Runner no longer crashes when switching target apps (
.activate()fix) - WebView scrolling works reliably (coordinate-based swipe instead of XCUITest
swipeUp()) - Swipe auto-targets the first scrollable element (webView, scrollView, table)
macOS improvements:
- Click works on elements without AXPress (sidebar items, static text) via coordinate-based fallback
- Modifier key combos:
cmd+n,cmd+shift+s,ctrl+c - System Settings sidebar shows real labels ("Wi-Fi", "Bluetooth") instead of generic "text"
Android driver fixes:
- Server socket works (added INTERNET permission to manifest)
- WebView content visible in tree (reflection-based window roots + invisible-node workaround)
- Scroll finds the right element (deepest scrollable, not toolbar)
- Friendly messages when hitting scroll boundaries
Unified command surface:
- All three platforms:
snapshot,text,tap,fill,type,press,swipe,screenshot - Same
@refworkflow everywhere
v2.2.1 — Unified Flows & Recording (2026-03-29)
- Flows and chains route through the same execution pipeline with lifecycle hooks
- Recording captures individual sub-steps, not wrapper commands
record export flow— new YAML export that round-trips withflow <file>- Flows work on all targets: browser, Android, iOS, macOS
v2.2.0 — Project-Local Extensibility (2026-03-29)
- Custom audit rules — JSON rules in
.browse/rules/for perf-audit and a11y-audit thresholds - Custom detections — JSON signatures in
.browse/detections/for tech stack fingerprinting - Saved flows —
flow save <name>/flow run <name>/flow listfrom.browse/flows/ - All configurable via
browse.json:rulePaths,detectionPaths,flowPaths,startupFlows
v2.1.0 — Workflow Commands & SDK (2026-03-29)
flow <file.yaml>— YAML automation scripts with steps, variables, and conditionalsretry— retry last failed command with exponential backoffwatch— watch DOM element for changes, trigger callback- SDK mode —
createBrowser()returns direct Playwright access for embedding in Node.js apps
v2.0.0 — Native App Automation (2026-03-29)
Automate Android, iOS, and macOS apps through the same CLI:
- Android — on-device instrumentation driver (Kotlin + NanoHTTPD), accessibility tree via UiAutomation, full HTTP protocol
- iOS — Simulator bridge via XCUITest runner app, simctl lifecycle management
- macOS — Swift bridge binary (
browse-ax) using the Accessibility API - Unified CLI —
--platform android|ios|macos --app <name> --device <serial> - Same
@refworkflow across all platforms —snapshot -iassigns refs,tap @e1clicks - Capability gating — browser-only commands blocked with clear errors on app targets
- 24 Android contract tests, doctor diagnostics for all platforms
v1.7.0 — Visual Analysis & Accessibility Audit (2026-03-29)
visual— inspect layout spacing, alignment, and overflowa11y-audit— WCAG violation detection (missing labels, contrast, heading hierarchy)layout— computed layout with contrast ratio for any element
v1.6.0 — Assertions & Performance Budgets (2026-03-28)
expect <expression>— assert on text, elements, attributes, counts, URL, titleperf-audit --budget <file>— pass/fail against performance budgetswait --request <pattern>— wait for a specific network request- Playwright export format for recorded sessions
v1.5.2 — Network Body Capture & API Discovery (2026-03-28)
--network-bodies— capture request/response bodies (256KB limit per entry)request <url-pattern>— inspect captured request/response for a URLapi— list discovered API endpoints from network traffic- Write commands now wait for network + DOM to settle before returning
v1.5.1 — Domain Architecture (2026-03-28)
Major structural refactor — 9 domain directories, AutomationTarget interface, unified execution pipeline. CLI help and MCP tools auto-generated from registry. 530 tests.
v1.5.0 — Snapshot Context (2026-03-28)
--context delta— ARIA diff with refs after write commands (+2 -1 =12)--context full— complete snapshot with fresh refs after writes- Eliminates snapshot → action → snapshot round-trips
v1.4.5 — Action Context (2026-03-28)
--context— write commands append state delta (URL, title, dialog, tabs, errors)- Always-on in MCP mode — agents always see what changed
- O(1) capture via running counters
v1.4.4 — Audit Persistence (2026-03-27)
perf-audit save [name]/perf-audit compare <baseline>— save and compare audits over time- Regression thresholds aligned with Web Vitals boundaries
v1.4.0 — Performance Audit System (2026-03-26)
perf-audit [url]— full performance audit: Core Web Vitals, LCP critical path, layout shift attribution, long task analysis, resource breakdown, image/font audit, DOM complexity, JS/CSS coverage. Platform-aware recommendations.detect— 162 technology fingerprints: 108 frameworks (React, Vue, Next.js, Laravel, WordPress, Shopify...), 55 SaaS platforms, CDN/protocol/compression analysis, third-party inventorycoverage start/stop— JS/CSS code coverage via Playwright Coverage APIinitscript set/clear/show— inject JS before every page load
v1.3.1 — Chrome Runtime & Replay Export (2026-03-23)
--chrome— launch system Chrome with real profile (cookies, extensions, sessions)handoffdefaults to Chrome for bot detection bypass- Replay export resolves
@refto real selectors (ARIA, CSS, XPath, text)
v1.2.0 — Cloud Providers (2026-03-22)
provider save/list/delete— encrypted API key vault (AES-256-GCM)--provider browserless/--provider browserbase— cloud browser connections- API keys encrypted at rest — never visible to agents
v1.1.2 — MCP Server Mode (2026-03-22)
--mcp— run browse as a Model Context Protocol server over stdio- Works with Cursor, Windsurf, Cline, Claude Desktop
- All browse commands exposed as MCP tools
v1.1.0 — React DevTools (2026-03-22)
11 subcommands for React app inspection:
tree— component hierarchy with Suspense statusprops <sel>— inspect props, state, and hookssuspense/errors— find pending boundaries and caught errorsprofiler/hydration— render timing, Next.js hydration timingrenders/owners/context— re-renders, parent chain, context values
v1.0.5 — Handoff (Human Takeover) (2026-03-22)
handoff [reason]— swap to visible browser for user to solve CAPTCHA/MFA/OAuthresume— swap back to headless, returns fresh snapshot- Auto-suggested after 3 consecutive failures
v1.0.0 — Node.js Port (2026-03-21)
Ported from Bun to Node.js — zero Bun dependency, runs on Node 18+. Fixed WebSocket upgrade bug that blocked all CDP features. Unblocked --connect, --cdp, --runtime lightpanda.
v0.10.0 — Feature Parity (2026-03-21)
12 new commands: rightclick, tap, swipe, mouse move/down/up/wheel, keyboard inserttext, scrollinto, set geo, set media, box, errors, doctor, upgrade. Extended wait with --text, --fn, --load, --state hidden. Cookie management: clear, set with options, export, import.
v0.9.0 — Auth Persistence (2026-03-20)
- Named sessions auto-save/restore cookies + localStorage
cookie-import chrome— import cookies from Chrome, Arc, Brave, Edge on macOS- Encrypted state at rest (AES-256-GCM)
--state <path>flag for loading saved state
v0.8.0 — Command Recording (2026-03-19)
record start/stop/status— record browse commands as you go- Export as chain JSON (replay with
browse chain) or Chrome DevTools Recorder format
v0.7.5 — Token Optimization (2026-03-18)
snapshot -ioutputs terse flat list (2.4-2.8x fewer tokens than competitors)-Vviewport-only filter (~85% element reduction)-fflag for full indented tree when needed
v0.3.0–v0.5.0 — Headed Mode, Video, Runtime Abstraction (2026-03-17)
--headed— visible browser for debuggingvideo start/stop— WebM video recordingclipboardread/write,inspectDevTools,screenshot --annotate- Browser runtime registry:
--runtime rebrowser(stealth),--runtime lightpanda
v0.2.0 — Security & Interactions (2026-03-16)
- Security:
--allowed-domains,browse-policy.json, encrypted credential vault,--content-boundaries - Commands:
dblclick,focus,check/uncheck,drag,frame,route block/fulfill,offline,har,state save/load,screenshot-diff,findlocators - DX:
--jsonoutput,browse.jsonconfig, AI-friendly error messages, per-session output folders
v0.1.0 — Foundation (2026-03-15)
Persistent headless Chromium daemon. snapshot with @ref system. Session multiplexing. Device emulation (100+ devices). ~100ms per command after first call.