Bridge not running — let's wake it up
Chrome's native messaging is alive but the local host process exited. The bridge launches on demand via Chrome's connectNative — you don't start it manually; the popup's Retry button does that. If retries fail, the host is crashing on startup.
which tap
- Run
which tap— if it prints nothing, the CLI isn't on your PATH. Re-install with the command at the top of this page. - If it prints a path, open
host.login that same directory — the last few lines say what's crashing on startup. - Common causes: stale extension ID in the native-messaging manifest (run
tap bridge setupto rewrite it), Chrome anti-DoS lockout after repeated crashes (fully quit + re-open Chrome to clear). - Then return to the Tap popup and click Retry connection.
Chrome is refusing to launch the bridge
Either (a) the native-messaging manifest is missing or points at the wrong extension ID, or (b) Chrome's anti-DoS blocklist kicked in after the host crashed several times in a row.
tap bridge setup
- Run the command above — it re-writes the native-messaging manifest with the right extension ID.
- Fully quit Chrome (⌘Q on macOS) and re-open it. This clears any anti-DoS blocklist entry.
- Click the Tap toolbar icon → Retry connection.
- If it still fails, run
tap bridge statusin a terminal — it prints exactly which side is misconfigured.
Bridge connection error — let's diagnose
The popup got a connection error that doesn't match any known failure mode. The diagnostic command below prints which side is unhappy.
tap bridge status
- Run the command above and read the output. It checks the CLI install, the daemon socket, and the native-messaging manifest in one pass.
- If the manifest is missing:
tap bridge setup. - If the daemon isn't running:
tap bridge start. - Still stuck? Open an issue with the
tap bridge status --jsonoutput — that's the diagnostic the maintainer needs.
You're three commands away from
a connected extension.
The Taprun extension talks to a CLI on your machine through Chrome Native Messaging — an OS-supervised channel, no network port. After a one-time setup, Chrome launches the bridge on demand whenever you trigger a tap. Pick up the commands from the Tap popup, or copy them from here.
Install the CLI and register the bridge
Two commands, one time. The extension ID is pinned via the manifest "key" field, so tap bridge setup takes no flag — no copy-pasting from the popup.
# Install the CLI $ brew install LeonTing1010/tap/taprun # or $ curl -fsSL https://taprun.dev/install.sh | sh # Register the Chrome Native Messaging manifest (no daemon, no port) $ tap bridge setup
Then open Chrome and click the Taprun toolbar icon — the bridge launches automatically when this extension's service worker activates. The popup should say Connected to local bridge. The bridge lives only as long as the extension is active; closing all Chrome windows shuts it down, and re-opening Chrome wakes it back up.
Optional · Wire your AI agent
Auto-edit your MCP host's config so it can call Tap as an MCP tool. Independent from Step 1 — these are two separate channels.
$ tap mcp connect # auto-detects host, edits config
Then quit and reopen your AI agent (it only re-reads MCP config on launch). After that you can ask it "run the github-stars tap" and it dispatches via MCP.
Optional · Run taps from the terminal
Saved taps run directly from the shell. The extension is only invoked when a tap needs your authenticated browser session.
$ tap ls # list saved taps $ tap run github/stars # execute one
Windows users: the Chrome-extension bridge is honest-warning until verified — use the headless / Playwright path via npx -y @taprun/cli. +1 demand for native bridge support here.
Verify it worked
- Click the Taprun icon in your Chrome toolbar.
- Connected: Connected to local bridge
- Still red? The popup tells you which failure mode you hit:
- Setup required → Step 1 second command (
tap bridge setup) hasn't run yet. - Bridge not running → the extension's service worker isn't active. Make sure a Chrome window is open and click the Taprun toolbar icon. If it persists, check
host.lognext to thetapbinary for a host crash. - Chrome blocked the host → Restart Chrome to clear the crash lockout.
- Bridge down → See troubleshooting below.
- Setup required → Step 1 second command (
Still disconnected? Four things to check
- Native-messaging host not registered — The extension talks to the CLI through Chrome's Native Messaging transport, not a network port. The host manifest must exist at
~/Library/Application Support/Google/Chrome/NativeMessagingHosts/dev.taprun.daemon.json(macOS) or~/.config/google-chrome/NativeMessagingHosts/dev.taprun.daemon.json(Linux). Runtap bridge setup(no flag — the extension ID is pinned in the manifest) to (re)register it. (The filename still says ".daemon" for historical reasons; post-2026-05-14 the NM host IS the dispatch core — there's no separate daemon process. Renaming the file would force a coordinated CLI+extension release, which is impractical, so we kept the legacy name and guard it with a static cross-repo test instead.) - Chrome blocked the host (crash lockout) — If the host has crashed ≥5 times in ~3 minutes, Chrome refuses to launch it again for ~10 minutes. The popup will say "Chrome blocked the host". Restart Chrome to clear the lockout. Then check
host.lognext to thetapbinary for the underlying crash reason. - MCP host not restarted — Claude Code / Cursor only re-read MCP config on launch. Quit fully (not just close the window) and reopen.
- Service worker asleep — Chrome MV3 puts background workers to sleep after ~30s idle. Click the Taprun extension icon once to wake it; it reconnects within a second.
Once connected, try these
Login-required taps that the Taprun extension makes possible. Click any to see the tap definition and how to invoke it.
Compose and publish a post to your LinkedIn feed using your real session — no API key, no OAuth dance.
Pull Weibo's logged-in trending list. Public API blocks unauthenticated reads; the extension uses your cookies.
Read the Instagram explore feed in your authenticated session — what your account actually sees, not a public proxy.