From claude-notifications
Build a custom notification channel handler — Telegram, Microsoft Teams, Pushbullet, SMS via a non-Twilio provider, internal company chat, anything. Use when the user wants notifications somewhere the built-in channels don't support, or wants to fork an existing channel for a different API shape.
How this skill is triggered — by the user, by Claude, or both
Slash command
/claude-notifications:notify-channelThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
The dispatcher (`scripts/notify.sh`) auto-discovers channels in two locations:
The dispatcher (scripts/notify.sh) auto-discovers channels in two locations:
${CLAUDE_PLUGIN_ROOT}/scripts/channels/<name>.sh — shipped with the plugin~/.claude-notifications/channels/<name>.sh — user-installed custom channelsDrop a script in #2 and it works. No registration step.
#!/usr/bin/env bash
# ~/.claude-notifications/channels/<name>.sh
set -uo pipefail
. "${CLAUDE_PLUGIN_ROOT}/scripts/lib/config.sh"
# 1. Read credentials. cn_get takes a jq path and an optional env-var override.
token=$(cn_get '.channels.<name>.token' CN_<NAME>_TOKEN)
[ -z "$token" ] && { cn_log "<name>: missing token"; exit 0; }
# 2. Build the payload. CN_TITLE / CN_BODY / CN_LEVEL / CN_EVENT / CN_PROJECT
# are exported by the dispatcher.
payload=$(jq -n \
--arg title "$CN_TITLE" \
--arg body "$CN_BODY" \
'{title: $title, message: $body}')
# 3. Send. ALWAYS time-bound (≤5s) and ALWAYS swallow errors via cn_log.
curl -sS -m 5 -X POST -H 'Content-Type: application/json' \
-H "Authorization: Bearer $token" \
-d "$payload" "https://api.example.com/notify" >/dev/null 2>&1 \
|| cn_log "<name>: send failed"
cn_log "..." writes to ~/.claude-notifications/logs/notify.log. Stdout/stderr go to the same log file via the dispatcher.level. CN_LEVEL is info|warn|error|success. Map it to whatever color/severity the target API uses.enabled: false an automatic skip. The dispatcher already does this — the channel won't be invoked unless channels.<name>.enabled is true.| Service | Endpoint | Auth |
|---|---|---|
| Telegram | https://api.telegram.org/bot<TOKEN>/sendMessage | bot token in URL |
| MS Teams | Incoming Webhook URL from connector | none (URL is secret) |
| Pushbullet | https://api.pushbullet.com/v2/pushes | Access-Token header |
| Mattermost | Incoming Webhook URL | none |
| ntfy.sh (self) | https://your-ntfy/<topic> | optional bearer |
| Twitter/X DM | OAuth 1.0a — use a small Python helper, not bash | OAuth tokens |
chmod +x ~/.claude-notifications/channels/<name>.shjq '.channels.<name> = {enabled:true, token:"...", events:["notification","stop"]}' \
~/.claude-notifications/config.json
bash "$CLAUDE_PLUGIN_ROOT/scripts/notify.sh" manual <<< '{"title":"custom","body":"hi"}'
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub fadymondy/claude-notifications --plugin claude-notifications