--- # 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. ---
{% include site-schema.html %}
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!
The architectural lie

## 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

First principle

“To drive your authenticated browser from the cloud, your authentication has to be in the cloud. There is no technical way around it. Local-first isn't a feature — it's the only way to keep credentials home.”

Taprun design thesis— addendum-B, 2026-04-27
The mechanism

## 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
The math, printed

## 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 clicks 7
Mid-run session fail 2
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 clicks 0
Mid-run session fail 0
Cookies uploaded 0
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.

The drift contract

## 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.
What it looks like, live

## A real run, no edits.

14:02:11.041[runtime] bridge=embedded · profile=persistent · session=reused 14:02:11.042[tap] hn/top → run 14:02:11.118[op:nav] https://news.ycombinator.com 14: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 capture 14:02:11.420[verdict] equivalent
Two minutes, one terminal

## 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 }}
Filed

## Stop renting your sessions to someone else's cloud.

Install Taprun → Read the source ↗

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!