From claude-notifications
Configure Claude Code notification channels — enable Slack/Discord/email/WhatsApp/desktop voice/web push, set credentials, route specific events to specific channels. Use when the user wants to "set up notifications", "add a Slack webhook", "turn on voice", "stop notifications for X event", or otherwise manage `~/.claude-notifications/config.json`.
How this skill is triggered — by the user, by Claude, or both
Slash command
/claude-notifications:notify-configThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
This skill edits the user's notification config at `~/.claude-notifications/config.json` (or the project-local override at `<project>/.claude-notifications.json`).
This skill edits the user's notification config at ~/.claude-notifications/config.json (or the project-local override at <project>/.claude-notifications.json).
Read current config first. Always:
cat ~/.claude-notifications/config.json 2>/dev/null || echo '{}'
Never overwrite without seeing what's there.
Merge new channel block into existing JSON. Use jq so you don't lose other channels:
mkdir -p ~/.claude-notifications
tmp=$(mktemp)
jq '.channels.slack = {
enabled: true,
webhook_url: "https://hooks.slack.com/services/...",
channel: "#claude",
events: ["notification","stop"]
}' ~/.claude-notifications/config.json > "$tmp" \
&& mv "$tmp" ~/.claude-notifications/config.json
Set enabled: false to disable instead of removing the block — preserves credentials for re-enabling.
Test immediately after a change:
bash "$CLAUDE_PLUGIN_ROOT/scripts/notify.sh" manual <<< '{"title":"config test","body":"new channel works"}'
tail -3 ~/.claude-notifications/logs/notify.log
| Channel | Required fields |
|---|---|
slack | webhook_url (Incoming Webhook from api.slack.com) |
discord | webhook_url (Server Settings → Integrations → Webhooks) |
email | smtp_url, smtp_user, smtp_password, from, to[] — Gmail needs an app password |
whatsapp | provider: callmebot → phone + apikey (text "I allow callmebot" to +34 644 51 95 23 to get one) |
provider: twilio → account_sid, auth_token, from, to[] | |
desktop | nothing required — works out of the box. voice.enabled for spoken alerts. |
webpush | provider: ntfy → just a unique topic. Install ntfy app on phone, subscribe to topic. |
provider: pushover → user_key + app_token | |
webhook | urls[] — your own endpoint |
A channel sees an event when either:
events array contains that event name (or "*"), orevents.<name> array names the channel.Default to ["notification", "stop"] — never ["*"] unless the user explicitly asks. pre-tool and post-tool fire many times per turn.
Events: notification, stop, subagent-stop, session-start, session-end, user-prompt, pre-tool, post-tool, manual.
<project>/.claude-notifications.json) is fine for routing rules but never put secrets there — it can be committed.~/.claude-notifications/config.json (chmod 600) or CN_* env vars.Confirm with one line: which channels are now enabled and which events fire them. No long recap.
npx claudepluginhub fadymondy/claude-notifications --plugin claude-notificationsCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.