--- # Empty frontmatter opts this file into Jekyll Liquid processing without # applying a layout. Required so {% include %} and {{ site.data.cli.* }} work. # Do not remove unless removing all Liquid references in this file. --- Taprun — Scrape behind login walls without sending credentials to the cloud {% include site-schema.html %}
Taprun / browser automation / local-first ● local · 0 tokens · v{{ site.data.cli.version }} Filed 2026-05-05

Your agent runs the browser task. You keep the audit trail.

Scrape behind login walls. Hit OTP-gated pages, Cloudflare Turnstile checkpoints, and logged-in dashboards — without renting a cloud browser or shipping cookies to a third party. Local-first browser MCP for Claude, Cursor, and Windsurf. Every task your agent runs in your real, already-logged-in Chrome compiles once into a deterministic .plan.json — a versioned, reviewable record of exactly what it did, replayable forever at zero tokens. Credentials never cross a trust boundary, because the work never leaves your machine. The audit trail and the keys both stay with you. The Chrome extension is the bridge — add it below.

0
credentials uploaded, ever
$0.003
cost per replay at run #2 onward
{{ site.data.cli.counts.community_taps }}+
community taps, MIT, ready to run
Sovereign in your hands Browser × Session × Plan
Compile Once, Replay Forever

One AI compile. Infinite replays. Zero tokens.

Watch Tap execute a pre-compiled plan. Same result every time, at $0 per run.

Tap CLI
11-op plan
Extension
Your Chrome
GitHub
Your Session
tap run github-star
$ tap run github-star --verbose
Loading plan from ~/.tap/taps/github/LeonTing1010/tap...
✓ GitHub opened in new tab — check it out!

Every other browser SDK ships your session to a stranger's server.

Browserbase. Apify. Stagehand. Playwright Cloud. They all drive a browser they own. That means your cookies, your auth tokens, your live session — sitting on infrastructure you don't control. It isn't a bug. It's the only way their architecture can work.

  • Browserbase your cookies, your auth headers, your active session → their cloud
  • Apify login state, residential proxy fingerprint, scraped output → their cloud
  • Stagehand page DOM + LLM context on every run → openai + browserbase
  • browser-use $0.04 of tokens per step, hallucinated clicks included → token meter
  • Taprun nothing leaves your machine — extension reuses your live cookies → stays on disk

Pay the AI to think once. Then never pay it again.

Taprun compiles your task into an 11-op deterministic plan — a small JSON program AI never re-reads. Your Chrome replays it. The bill stops at compile time.

01

Capture once.

Point AI at a URL with intent. It probes JSON-LD, OpenAPI, RSS, ARIA — stable structural addresses, not fragile CSS selectors. It writes a Plan.

$ {{ site.data.cli.verbs.capture.cli }} https://news.ycombinator.com hn/top # 12.4s · 1,840 tokens · saved to ~/.tap/plans/
02

Replay forever.

Your real Chrome — already logged in, already trusted — runs the plan locally. No tokens. No cloud round-trip. No "session expired" mid-flow.

$ {{ site.data.cli.binary }} run hn/top 30 stories · 0.41s · 0 tokens
03

Verify on drift.

When the site changes, snapshot-equivalence tells you before your pipeline notices. Re-capture heals it in seconds.

$ {{ site.data.cli.verbs.verify.cli }} hn/top ✓ equivalent — substrate matches baseline

100 reruns. Two bills. One crossover.

Same task, same outputs. We ran a 12-step authenticated checkout flow 100 times against both systems. Here's what your accounting team actually sees.

browser-use, inc.

Invoice · Run #1–#100
LLM step inference × 1,200$3.84
Vision context / DOM × 100$0.28
Browserbase compute × 100$0.08
Subtotal$4.20
Hallucinated clicks7
Mid-run session fail2
TOTAL$ 4.20
★★☆☆☆ — keep paying every run

Taprun (open source)

Invoice · Run #1–#100
Compile (run #1, AI)$0.003
Replay × 99 (deterministic)$0.000
Cloud session storage
Hallucinated clicks0
Mid-run session fail0
Cookies uploaded0
TOTAL$ 0.003
★★★★★ — paid once, owned forever

Cloud SDKs price browser automation like a subscription to a clicker. Taprun prices it like a compiler — pay at build time, ship a binary, run for free.

2
Crossover at run #2.
From there, the gap compounds.

And on run #50 — when the site changes — your cloud-SDK selectors silently rot. Taprun's verify arm flags it before your pipeline does.

Four verdicts. Zero ambiguity.

tap verify is read-only. It compares today's substrate to your baseline snapshot through a per-tap predicate you wrote. The verdict is one of four, always.

001 · Equivalent
Same substrate, same shape.
Predicate returned true. Today's snapshot matches your baseline. Replay is safe.
002 · Drifted
The site moved.
Predicate returned false in a way you said matters. Re-capture and the plan heals — same name, fresh baseline.
003 · First snapshot
Baseline laid.
No prior snapshot existed; today's becomes the reference. The next verify has something to compare against.
004 · Unreachable
The substrate fell down.
Network, auth, or page-load failed before the predicate ran. Not the plan's fault — and we say so.

A real run, no edits.

14:02:11.041[runtime] bridge=embedded · profile=persistent · session=reused14:02:11.042[tap] hn/top → run14:02:11.118[op:nav] https://news.ycombinator.com14:02:11.402[op:read] jsonld[].headline → 30 items stories[]14:02:11.412[op:project] stories | shape({title, url, by, score})14:02:11.418[done] 30 records · 0.41s · 0 tokens · 0 network round-trips after capture14:02:11.420[verdict] equivalent

Then it's yours.

No account. No API key handed to a vendor. No telemetry to opt out of. Install, connect your MCP host, run.

Install

One curl line, or your favourite package manager.Mac · Linux · Windows · all signed.

Connect MCP

Point Claude Code, Cursor, or any MCP host at taprun mcp stdio.Taprun appears as 12 tools across 3 namespaces.

Capture your first tap

tap capture a URL with intent — and you have a deterministic, replay-forever plan.70+ community-built taps live at /taps.

${{ site.data.cli.install.curl }} ${{ site.data.cli.mcp.stdio }} # point your MCP host at this command
${{ site.data.cli.install.brew }} ${{ site.data.cli.mcp.stdio }}
${{ site.data.cli.install.npx }} $npx -y {{ site.data.cli.binary_pkg }} mcp stdio
# ~/.claude/mcp.json (or your host's equivalent) {{ site.data.cli.install.mcp_config_json }}

Stop renting your sessions to someone else's cloud.

Taprun is MIT-licensed, written in TypeScript on Deno, ships as a single signed binary. The Chrome extension is open-source. No license server, no phone-home, no usage telemetry. Free during v0.x. Paid tiers deferred until a customer asks.

Opening GitHub...
Click the ★ Star button in the top right to support us!