The fastest, cheapest browser automation for Claude.
> /plugin marketplace add Lulzx/ubrowser> /plugin install ubrowser@ubrowser-marketplace
FAQ
ubrowser is a Claude Code plugin with 1 hand-picked skill for automation work, indexed on Flowy. Install it with the command on its page. It includes ubrowser. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.
Repo: Lulzx/ubrowser
The fastest, cheapest browser automation for Claude.
ΞΌBrowser ββββββ 51s $0.18
Dev Browser ββββββββββββββββββββββββββββββββββββββββ 3m 53s $0.88
Playwright ββββββββββββββββββββββββββββββββββββββββββββββββ 4m 31s $1.45
Tested on dev-browser-eval game-tracker task with Claude Opus 4.5 (benchmark setup cloned from SawyerHood, eval tasks created independently):
| Method | Time | Cost | Turns |
|---|---|---|---|
| ΞΌBrowser | 51s | $0.18 | 7 |
| Dev Browser | 3m 53s | $0.88 | 29 |
| Playwright MCP | 4m 31s | $1.45 | 51 |
Results:
Latest local run (dev-browser-eval simulation, HN proxy):
| Method | Time | Cost | Turns | Tokens |
|---|---|---|---|---|
| Traditional (6 calls) | 17.36s | $0.1439 | 6 | 2177 |
| ΞΌBrowser (batch) | 6.87s | $0.0052 | 1 | 204 |
Combine 25+ browser actions into a single API call:
{"steps": [
{"tool": "navigate", "args": {"url": "/login"}},
{"tool": "type", "args": {"selector": "#email", "text": "user@test.com"}},
{"tool": "type", "args": {"selector": "#pass", "text": "secret"}},
{"tool": "click", "args": {"selector": "button[type=submit]"}}
], "snapshot": {"when": "final", "maxElements": 40}}
Others make 4 separate calls. We make 1. 75% fewer API calls.
Standard HTML (~180 tokens):
<button id="e1" role="button">Submit</button>
<input id="e2" type="email" placeholder="Email" required>
<input id="e3" type="password" placeholder="Password">
ΞΌBrowser (~50 tokens):
btn#e1"Submit"
inp#e2@e~"Email"!r
inp#e3@p~"Password"
70% smaller snapshots. Output tokens cost 5Γ more than input.
{"ok":true}
{"ok":true,"snap":"btn#e1\"Submit\"\ninp#e2@e~\"Email\""}
Only return DOM when explicitly requested.
Environment variables:
UBROWSER_BLOCK_STYLESHEETS=1 blocks CSS for faster loads (may affect layout-dependent pages).UBROWSER_MAX_ELEMENTS=40 caps snapshots by default when maxElements is not provided.UBROWSER_PROFILE_DIR=~/.ubrowser/profile browser profile directory for session persistence.UBROWSER_CONSOLE_LIMIT=100 max console messages to retain in buffer.UBROWSER_NETWORK_LIMIT=100 max network requests to retain in buffer.Snapshot options (per-call overrides):
snapshot.maxElements limits returned elements for browser_snapshot, per-tool snapshots, and browser_batch.Browser state (cookies, localStorage, IndexedDB) persists to disk between MCP server restarts. This enables:
Profile stored at ~/.ubrowser/profile by default (customize with UBROWSER_PROFILE_DIR).
Pre-injected extraction script β Script is injected once and JIT-cached in browser, eliminating recompilation overhead. Subsequent snapshots complete in <1ms.
Batched visibility checks β All getBoundingClientRect() calls happen in a single pass, avoiding layout thrashing that occurs with per-element checks.
MutationObserver caching β DOM changes are tracked via MutationObserver. If nothing changed, cached snapshot returns instantly (0.5ms vs 50ms).
CDP fast operations β Click and type use Chrome DevTools Protocol directly when element positions are known, bypassing Playwright's actionability checks.
Resource blocking β Images, fonts, media blocked at network level via Playwright route interception. Stylesheets preserved for layout accuracy.
Parallel snapshot β Promise.all fetches URL, title, and DOM elements concurrently during batch finalization.
Single-op type β Uses fill() for instant text input when no delay/enter needed, bypassing character-by-character simulation.
/plugin marketplace add lulzx/claude-code
/plugin install ubrowser@claude-code
Restart Claude Code and the ubrowser MCP tools are ready.
git clone https://github.com/lulzx/ubrowser && cd ubrowser
npm install && npx playwright install chromium && npm run build
claude mcp add ubrowser -- node "$PWD/build/index.js"
| Tool | Purpose |
|---|---|
browser_batch | Execute multiple actions in one call |
browser_navigate | Go to URL |
browser_click | Click element by ref or selector |
browser_type | Type into input field |
browser_select | Select dropdown option |
browser_scroll | Scroll page or element |
browser_snapshot | Get interactive elements |
browser_pages | Manage multiple tabs |
browser_inspect | Deep inspect specific element |
browser_console | Access browser console logs |
browser_network | Inspect network requests |
tag#ref@type~"placeholder"/href"content"!flags
btn#e1"Submit" β <button>Submit</button>
inp#e2@e~"Email"!r β <input type="email" placeholder="Email" required>
a#e3/login"Sign in" β <a href="/login">Sign in</a>
sel#e4"Country" β <select>Country</select>
Types: @e=email @p=password @t=text @n=number @c=checkbox @r=radio
Flags: !d=disabled !c=checked !r=required
| Playwright MCP | Dev Browser | ΞΌBrowser | |
|---|---|---|---|
| Navigate, click, type | β | β | β |
| Element refs | β | β | β |
| Multi-tab support | β | β | β |
| Session persistence | β | β | β |
| Console/network inspect | β | β | β |
| Batch execution | β | β | β |
| Compact snapshot format | β | β | β |
| Scoped snapshots | β | partial | β |
| Diff snapshots | β | β | β |
| Configurable responses | β | β | β |
| Pre-injected scripts | β | β | β |
| MutationObserver cache | β | β | β |
| CDP fast operations | β | β | β |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Claude β
βββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββ
β 1 batch call (25+ steps)
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ΞΌBrowser β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Batch Executor (sequential) β β
β β navigate β type β type β click β navigate β ... β β
β ββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββ β
β β β
β ββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββ β
β β Snapshot Engine (optimized) β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β Pre-injected script (JIT cached) β β β
β β β MutationObserver (change detection) β β β
β β β Batched getBoundingClientRect (no thrashing) β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β βΌ β β
β β Ultra-compact formatter β β
β β btn#e1"Submit"\ninp#e2@e~"Email" β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββ
β 1 response (~50 tokens)
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Claude β
β (continues with minimal context) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
MCP server-side benchmarks (not including LLM response time):
| Operation | Time |
|---|---|
| First snapshot (cold) | 4ms |
| Cached snapshot | 0.5ms |
| 4-step batch | 34ms |
| Type operation | 12-16ms |
DOM-heavy snapshot cap (data page with 500+ interactive elements):
| Mode | Elements | Snapshot Size (body) |
|---|---|---|
| baseline | 100 | 1881 chars |
| maxElements=40 | 40 | 740 chars |
Run locally:
node bench-game-tracker.cjs
node bench-dom-heavy.cjs
MIT
.claude-plugin/
marketplace.json
plugin.json
.gitignore
bench-dom-heavy.cjs
bench-fast.cjs
bench-game-tracker.cjs
bench-ubrowser.cjs
benchmark-opus.cjs
benchmark-vs-devbrowser.cjs
benchmark.cjs
build/
browser/
fast-actions.d.ts
fast-actions.d.ts.map
fast-actions.js
fast-actions.js.map
manager.d.ts
manager.d.ts.map
manager.js
manager.js.map
index.d.ts
index.d.ts.map
index.js
index.js.map
refs/
manager.d.ts
manager.d.ts.map
manager.js
manager.js.map
snapshot/
differ.d.ts
differ.d.ts.map
differ.js
differ.js.map
extractor.d.ts
extractor.d.ts.map
extractor.js
extractor.js.map
fast-extractor.d.ts
fast-extractor.d.ts.map
fast-extractor.js
fast-extractor.js.map
formatter.d.ts
formatter.d.ts.map
formatter.js
formatter.js.map
limits.d.ts
limits.d.ts.map
limits.js
limits.js.map
pruner.d.ts
pruner.d.ts.map
pruner.js
pruner.js.map
tools/
batch.d.ts
batch.d.ts.map
batch.js
batch.js.map
click.d.ts
click.d.ts.map
click.js
click.js.map
console.d.ts
console.d.ts.map
console.js
console.js.map
fast-batch.d.ts
fast-batch.d.ts.map
fast-batch.js
fast-batch.js.map
index.d.ts
index.d.ts.map
index.js
index.js.map
inspect.d.ts
inspect.d.ts.map
inspect.js
inspect.js.map
navigate.d.ts
navigate.d.ts.map
navigate.js
navigate.js.map
network.d.ts
network.d.ts.map
network.js
network.js.map
pages.d.ts
pages.d.ts.map
pages.js
pages.js.map
scroll.d.ts
scroll.d.ts.map
scroll.js
scroll.js.map
select.d.ts
select.d.ts.map
select.js
select.js.map
snapshot.d.ts
snapshot.d.ts.map
snapshot.js
snapshot.js.map
type.d.ts
type.d.ts.map
type.js
type.js.map
types.d.ts
types.d.ts.map
types.js
types.js.map
COMPARISON.md
dev-browser-eval/
.claude/
commands/
update-success-rate.md
.gitignore
.mcp.json
benchmark-comparison.md
benchmark-results/
game-tracker-dev-browser-run1.jsonl
game-tracker-dev-browser-run2.jsonl
game-tracker-dev-browser-run3.jsonl
game-tracker-playwright-mcp-run1.jsonl
game-tracker-playwright-mcp-run2.jsonl
game-tracker-playwright-mcp-run3.jsonl
game-tracker-playwright-skill-run1.jsonl
game-tracker-playwright-skill-run2.jsonl
game-tracker-playwright-skill-run3.jsonl
game-tracker-ubrowser-run1.jsonl
game-tracker-ubrowser-run2.jsonl
game-tracker-ubrowser-run3.jsonl
bun.lock
LICENSE
package-lock.json
package.json
README.md
scripts/
benchmark.ts
generate-benchmark.ts
reset.ts
setup.sh
tsconfig.json
package-lock.json
package.json
README.md
skills/
ubrowser/
server.sh
SKILL.md
src/
browser/
fast-actions.ts
manager.ts
index.ts
refs/
manager.ts
snapshot/
differ.ts
extractor.ts
fast-extractor.ts
formatter.ts
limits.ts
pruner.ts
tools/
batch.ts
click.ts
console.ts
fast-batch.ts
index.ts
inspect.ts
navigate.ts
network.ts
pages.ts
scroll.ts
select.ts
snapshot.ts
type.ts
types.ts
tsconfig.jsonΒ© 2026 Flowy Β· Free and open source
Built for Claude Code Β· Not affiliated with Anthropic