HookTap turns HTTP POST requests into instant iPhone push notifications, lock screen widgets, and Live Activities. hooktap is the official command-line client: a single, dependency-free binary that follows Unix conventions — it reads from stdin, plays nicely with pipes, and exits with meaningful codes.
echo "Staging deploy is live" | hooktap send --title "Deploy"macOS / Linux — curl installer:
curl -fsSL https://hooktap.me/install.sh | shmacOS / Linux — Homebrew:
brew install HookTap/tap/hooktapWindows — Scoop:
scoop bucket add hooktap https://github.com/HookTap/scoop-bucket
scoop install hooktapOther methods
# With Go
go install github.com/hooktap/hooktap-cli@latest
# Or download a prebuilt binary from the releases page:
# https://github.com/HookTap/hooktap-cli/releasesInstall HookTap on the App Store, open the CLI pairing screen, and run the command shown in the app:
hooktap setup --code 123456You can also copy your webhook id manually (the YOUR_HOOK_ID part of https://hooks.hooktap.me/webhook/YOUR_HOOK_ID) and save it:
hooktap setup
# or:
hooktap config set hook_id YOUR_HOOK_ID
hooktap ping # ok — hooktap (2026-06-22T07:14:55.993Z)hooktap setup creates a profile, stores it in the config file, and sends a test notification unless you pass --no-test.
# Simplest form — the title is the argument
hooktap send "Build finished"
# Open the terminal UI
hooktap
hooktap tui
# Notify when a command finishes
hooktap watch -- npm run build
hooktap watch --title "Deploy" -- make deploy
# Add a body and pick the event type
hooktap send "CI failed" --body "main branch" --type push
# Pipe text from stdin — it becomes the body
echo "Prod is up" | hooktap send --title "Deploy"
cat report.txt | hooktap send "Nightly report"
# Pipe a complete JSON body verbatim (for field-mapping webhooks)
generate-payload.sh | hooktap send --raw
# Machine-readable output for scripts
hooktap send "Order #123" --json | jq .eventIdRun hooktap or hooktap tui to open the interactive terminal interface:
| Screen | Purpose |
|---|---|
| Send | Compose and send a push/feed/widget event |
| Profiles | Inspect configured profiles and the active default |
| Snippets | Copy-ready examples for scripts and raw JSON |
| Doctor | Config path, profile count, and basic diagnostics |
Keyboard shortcuts: 1-4 switch screens, Tab moves between inputs, Ctrl+T cycles event types, Ctrl+S sends, q quits.
Use watch to run any command and receive a notification when it exits:
hooktap watch -- npm run build
hooktap watch --title "Production deploy" -- make deployThe command output streams normally, and hooktap watch exits with the watched command's exit code.
| Type | Behaviour |
|---|---|
push (default) |
Stores the event and sends an instant push notification |
feed |
Stores the event in the in-app feed only (no notification) |
widget |
Updates the lock screen / home screen widget |
| Flag | Short | Description |
|---|---|---|
--title |
Event title (alternative to the positional argument) | |
--body |
-b |
Event body text (overrides stdin) |
--type |
-t |
push · feed · widget (default push) |
--raw |
Send a complete JSON body read from stdin, verbatim | |
--hook |
Webhook id or full URL (overrides config/env) | |
--profile |
-p |
Config profile to use |
--url |
Base URL override (staging / self-hosting) | |
--json |
Print the raw JSON response to stdout |
hooktap resolves each setting in this order: command-line flag → environment variable → config file.
Stored at ~/.config/hooktap/config.toml (honours XDG_CONFIG_HOME). Use named profiles to keep several webhooks side by side:
hooktap config set hook_id abc123 # writes the default profile
hooktap config set url https://… --profile ci # a named profile
hooktap config set type feed --profile ci
hooktap config use ci # change the default
hooktap config list # * marks the default
hooktap config path # print the file locationdefault = "ci"
[profiles.default]
hook_id = "abc123"
[profiles.ci]
url = "https://hooks.hooktap.me/webhook/xyz"
type = "feed"The file is written
0600— your webhook id acts as a bearer token, so keep it private.
| Variable | Description |
|---|---|
HOOKTAP_HOOK_ID |
Webhook id |
HOOKTAP_WEBHOOK_URL |
Full webhook URL (id is parsed out) |
HOOKTAP_BASE_URL |
Base URL override |
| Code | Meaning |
|---|---|
0 |
Success |
1 |
Network or server error |
2 |
Usage error (missing title, unknown type, no webhook configured) |
4 |
Rate limited (HTTP 429 — max 1 request/second; safe to retry) |
Long-running command finished:
make build && echo "build ok" | hooktap send "🏗️ $(basename $PWD)" \
|| echo "build failed" | hooktap send "💥 $(basename $PWD)" --type pushCron / monitoring:
# /etc/cron.d/disk-check
0 * * * * df -h / | tail -1 | hooktap send "Disk usage" --profile opsPipe a server's JSON straight to your phone:
curl -s https://api.example.com/status | hooktap send --raw# zsh
hooktap completion zsh > "${fpath[1]}/_hooktap"
# bash
hooktap completion bash > /usr/local/etc/bash_completion.d/hooktap
# fish
hooktap completion fish > ~/.config/fish/completions/hooktap.fishCompletions are context-aware: --type suggests the valid event types and --profile suggests your configured profiles.
- HookTap Integrations — recipes for cURL, CI, Python, Node, and more
- HookTap Notify Action — GitHub Action wrapper
This repository is maintained by github.com/HookTap.
MIT — see LICENSE.