Tap into any website from your terminal.
curl -fsSL https://raw.githubusercontent.com/vaayne/tap/main/scripts/install.sh | shOr with Go:
go install github.com/vaayne/tap/cmd/tap@latestUpgrade later with:
tap upgradeBrowser features use Chrome by default. Check dependencies with tap doctor.
tap site list
tap site hackernews/top
tap site run github/repo repo=vaayne/tap
tap site search weatherScripts auto-sync from tap.vaayne.com into the local cache. Local overrides at ~/.config/tap/sites/{site}/{script}.js take precedence.
tap fetch https://example.com/article
tap fetch --json https://example.com/article
tap fetch -b https://example.com/app --wait-selector '.content'tap attach chrome
tap browser open https://github.com/login --show
tap site -b github/notifications
tap fetch -b https://github.com/notificationsChrome must already expose DevTools.
tap attach chrome
tap attach status
tap browser open https://example.com
tap browser snapshot --interactive
tap browser click '#submit'
tap browser click @e1
tap browser textYou can also attach explicitly:
tap attach chrome --browser-url http://127.0.0.1:9222
tap attach chrome --port-file ~/Library/Application\ Support/Google/Chrome/DevToolsActivePorttap browser open https://news.ycombinator.com
tap browser open https://github.com --new-tab
tap browser tabs
tap browser switch tab-2
tap browser screenshot --output github.png
tap browser statustap attach chrome
tap attach status --json
tap browser evaluate 'document.title'
tap browser screenshotIf the attached state becomes stale, rerun tap attach chrome.
tap
├── site structured extraction from known sites
├── fetch clean readable content from arbitrary URLs
├── browser open pages and automate the current browser context
├── attach connect tap to an existing Chrome browser
├── status show the active browser context and current tab
├── doctor dependency and environment checks
├── upgrade update tap
└── completion generate shell completion scripts
Tap can generate shell completion scripts for bash, zsh, fish, and pwsh.
# Bash
source <(tap completion bash)
# Zsh
source <(tap completion zsh)
# Fish
mkdir -p ~/.config/fish/completions
tap completion fish > ~/.config/fish/completions/tap.fish
# PowerShell / pwsh
tap completion pwsh > ~/.config/powershell/tap.ps1Persistent install paths commonly used by package managers and dotfiles:
# Bash
mkdir -p ~/.local/share/bash-completion/completions
tap completion bash > ~/.local/share/bash-completion/completions/tap
# Zsh
mkdir -p ~/.zfunc
tap completion zsh > ~/.zfunc/_tapThese show up on the relevant commands instead of only in global help:
| Flag | Description |
|---|---|
--browser, -b |
Force browser execution and reuse the resolved browser context |
--show |
Run the browser visibly |
--wait |
Wait a fixed duration after navigation |
--wait-selector |
Wait for a CSS selector |
--wait-js |
Wait for a JS expression |
--timeout |
Set execution timeout |
--browser-url |
One-shot DevTools override |
--profile-dir |
One-shot profile override |
--lightpanda, --lp |
Use Lightpanda instead of Chrome |
Compatibility aliases still work:
--ws-url->--browser-url--delay->--wait--no-headless->--show
The browser command still includes lower-level tools when needed:
tap browser evaluate ...
tap browser snapshot
tap browser forms
tap browser cookies ...
tap browser network ...| Backend | Platforms | Best for |
|---|---|---|
| Chrome | macOS, Linux, Windows | Full browser automation, auth, network interception |
| Lightpanda | macOS, Linux | Fast headless rendering without auth-heavy flows |
Install or update Lightpanda with:
tap doctor --install- docs/cli.md — full auto-generated command reference (
mise run docsto regenerate) - docs/browser.md — browser UX and reference
- docs/network.md — network interception reference
- web/README.md — web app docs
Tap ships with a built-in agent skill that gives coding agents web access, site scripts, and browser automation.
npx skills add vaayne/tapgo get github.com/vaayne/tapclient, _ := tap.New()
defer client.Close()
result, _ := client.RunScript(ctx, "hackernews/top", nil)
content, _ := client.Fetch(ctx, "https://example.com", &fetch.Options{Markdown: true})
fmt.Println(content.Markdown)MIT