Notifications
Fan out skill outputs to Telegram, Discord, Slack, Email, and Buzz, and trigger skills via Telegram commands.
./notify queues messages during a skill run and dispatches them post-run to every configured channel, silently skipping unconfigured ones.
Supported Channels
| Channel | Outbound Secrets | Inbound (Talk Back) Secrets |
|---|---|---|
| Telegram | TELEGRAM_BOT_TOKEN + TELEGRAM_CHAT_ID | Same (offset-based polling or webhook) |
| Discord | DISCORD_WEBHOOK_URL | DISCORD_BOT_TOKEN + DISCORD_CHANNEL_ID |
| Slack | SLACK_WEBHOOK_URL | SLACK_BOT_TOKEN + SLACK_CHANNEL_ID |
RESEND_API_KEY + NOTIFY_EMAIL_TO | - | |
| Buzz | BUZZ_PRIVATE_KEY + BUZZ_CHANNEL_ID | - |
Inbound Priority
When .github/workflows/messages.yml is enabled, pending inbound messages are processed in priority order (Telegram > Discord > Slack), with per-channel read state (Telegram update offset, Discord/Slack reaction acks) preventing duplicate runs.
Telegram Commands & Buttons
Structured Telegram interactions are handled by a router with no LLM in the loop, making commands and button taps instant and free:
- Slash commands: Every enabled skill registers as
/skill-name <var>(e.g./token-movers solana). - Inline buttons: Notifications include
Run againandSchedule weeklybuttons; alert skills addSnoozeandMute. - Deep links:
https://t.me/<bot>?start=<skill>__<arg>triggers a skill from any link. - Force-reply follow-ups: Skills can prompt a question and route your Telegram reply straight back into the next run.
Full reference: docs/telegram-commands.md.
Telegram Instant Mode
Default polling runs every 5 minutes. For ~1-second responses, deploy the Cloudflare Worker in apps/webhook/ or enable Instant replies under Settings -> Credentials -> Telegram in the dashboard.
json-render Feed
In local dashboard mode, skills emit structured specs into apps/dashboard/outputs/ for live rendering. In GitHub Actions, ./notify-jsonrender converts markdown output into the same spec via Haiku.