Guides
Notifications
Get Claude Code and Codex permission notifications through Web Push, ntfy with Allow/Deny buttons, Slack and Discord webhooks, or desktop notifications.
When a request needs you and you’re away, Pilothouse notifies every channel you’ve set up at once. The first answer wins, whichever device it comes from.
| Channel | Can you answer from it? | Setup |
|---|---|---|
| Web Push to the paired web app | Yes — open it and tap Allow / Deny | Phone setup |
| ntfy | Yes — signed Allow / Deny buttons | notify.ntfy in config |
| Slack / Discord (incoming webhooks) | No — the message links to the web app | notify.webhooks in config |
| Desktop | No — it brings you to the terminal | On by default |
At your desk you only get a desktop notification, and only if the agent’s dialog has been waiting longer than presence.notify_after (default 45 s).
Web Push
Set up automatically when you pair a phone and allow notifications. Pilothouse generates its own VAPID keys on first run; pushes go from your machine to your phone’s push service (Apple, Google or Mozilla) and contain only what’s needed to show the notification.
ntfy
ntfy delivers push notifications to its Android and iOS apps, with action buttons.
# ~/.pilothouse/config.yaml
notify:
ntfy:
server: https://ntfy.sh # or your own ntfy server
topic: pilothouse-7f3k9q2m # pick something unguessable
token: "" # access token, if your server needs one
On ntfy.sh, a topic name works like a password: anyone who knows it can read the messages. Use a long random topic, or a self-hosted server with access control.
Pilothouse attaches Allow and Deny buttons. Each button carries a random, single-use token that is valid only for that request and only until it expires; Pilothouse stores only a hash of it. The buttons call back to your machine through web.public_url, so they need the Tailscale setup to be in place and your phone on the tailnet.
Slack and Discord
Any incoming-webhook URL that accepts Slack- or Discord-style JSON:
notify:
webhooks:
- https://hooks.slack.com/services/T000/B000/XXXX
- https://discord.com/api/webhooks/123/abc
Webhook messages include the agent, the repo and a one-line summary of the request, plus a link to the web app. They don’t have buttons.
Desktop
On by default (notify.desktop: true). Uses the native notification center on macOS and the desktop notification service on Linux.
Test
pilothouse notify test
sends a test message to every configured channel.
What leaves your machine
Only the notification itself, sent to the channels you configured. Keep in mind that third-party services (Slack, Discord, ntfy.sh) see the text of what you send them; Web Push payloads go through your phone vendor’s push service.
Found a mistake? Open an issue.