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.
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