Help us improve
Share bugs, ideas, or general feedback.
From antigravity-awesome-skills
Sends fire-and-forget iMessage/SMS notifications to the user's phone when long-running tasks, agent turns, or scheduled jobs finish via Sendblue CLI.
npx claudepluginhub sickn33/antigravity-awesome-skills --plugin antigravity-bundle-aas-python-api-builderHow this skill is triggered — by the user, by Claude, or both
Slash command
/antigravity-awesome-skills:sendblue-notifyThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Outbound, fire-and-forget notifications from a local Claude Code session, script, or scheduled job to the user's phone via Sendblue. This is the "walk away from the terminal" pattern: kick off something long, get an iMessage when it lands. This skill owns **when to notify and what to say**. Actual sending goes through [[sendblue-cli]]. Hook wiring (so notifications fire automatically) goes thro...
Sends iMessage and SMS from the shell via @sendblue/cli npm package. Sets up account, provisions number, manages contacts. Use for scripts, hooks, or one-shot notifications.
Sends iMessages for real-time user input and status notifications during Claude Code sessions. Use ask_user to wait for responses on decisions or clarifications; notify_user for non-blocking updates.
Configures Bark push, WeChat, and system notifications for Claude Code via .claude/claude-notification.local.md. Provides bash scripts for proactive task alerts.
Share bugs, ideas, or general feedback.
Outbound, fire-and-forget notifications from a local Claude Code session, script, or scheduled job to the user's phone via Sendblue. This is the "walk away from the terminal" pattern: kick off something long, get an iMessage when it lands. This skill owns when to notify and what to say. Actual sending goes through [[sendblue-cli]]. Hook wiring (so notifications fire automatically) goes through [[update-config]].
/loop iteration, or /schedule completion.The CLI must be installed and authenticated:
npx @sendblue/cli whoami # confirms creds
# or, if first run:
npx @sendblue/cli setup
The user's phone number must be a verified contact on the account. On the free plan, the contact has to text the Sendblue number once before outbound sends work — confirm with sendblue contacts before relying on notify in an unattended workflow.
Cache the destination number once per project rather than re-asking. A NOTIFY_NUMBER env var or a one-line .notify-number file is fine; defer storage strategy to whatever the surrounding project already does.
Notify is for long, unattended work — not chatter. Good triggers:
/loop and /schedule jobs that produce a discrete result.Bad triggers (do not silently wire these):
Stop event, regardless of duration — produces spam, trains the user to ignore.If the user asks for "notify me when done" on a short task, do the obvious one-shot inline send (Example 1) and do not install a global hook.
Stop hook — opt-in, project-scoped, for sessions the user explicitly wants on automatic notify. Always gate by duration./loop or /schedule ping — append the send to the routine's body.For a single task, append the send to the command. This is the default — no config changes, no surprise behavior later.
Branch on the task's exit status with an if/else. Do not use a task && send-success || send-failure chain: if the task succeeds but the success-send itself returns non-zero, the || fires the failure message — so the user sees ❌ even though the task completed. The if/else keeps the outcome tied solely to the task.
if long_running_thing; then
npx @sendblue/cli send +15551234567 "✅ done: $(date +%H:%M)"
else
npx @sendblue/cli send +15551234567 "❌ failed: $(date +%H:%M)"
fi
Or, when the result is interesting, include a one-line summary:
RESULT=$(run-migration 2>&1 | tail -1)
npx @sendblue/cli send +15551234567 "migration done — $RESULT"
Stop hook (opt-in, scoped)Register a Stop hook in .claude/settings.json (project-scoped) — never in global settings unless asked. Defer the actual file edit to [[update-config]]. The hook command itself should:
Stop).|| true so a notify error doesn't surface as a hook failure.[ "$CLAUDE_TURN_DURATION_SECONDS" -ge 90 ] && \
npx @sendblue/cli send "$NOTIFY_NUMBER" "turn done in ${CLAUDE_TURN_DURATION_SECONDS}s" || true
(Adjust the env var names to whatever the hook contract actually provides — verify against the current Claude Code hooks reference before writing the config; the harness owns those names, not this skill.)
Show the proposed hook config to the user and get confirmation before invoking [[update-config]]. Automated outbound messages are a footgun if the threshold is wrong.
/loop or /schedule ping/loop 10m "check deploy; npx @sendblue/cli send +15551234567 \"deploy: \$(deploy-status)\""
For /schedule, the routine itself can shell out at the end. Same copy rules apply.
If the user has @textme installed (njerschow/textme — daemon that lets you text Claude from your phone), notify is still useful and not redundant. They run in opposite directions:
You can install both: textme on a server for inbound, notify as a local Stop-hook for outbound. Different problems, same Sendblue account.
|| true.@textme skill instead.sendblue contacts before relying on notify in an unattended workflow.sendblue send or editing hook config.Stop hook can fire dozens of messages a minute. Always gate by duration and prove the threshold in a dry run before committing.Stop hooks. Always gate by duration. A user who gets pinged every 4 seconds will rip the hook out within an hour.|| true in hooks; surface the failure in logs, not by aborting the agent turn.sendblue contacts before wiring an unattended hook. Or sendblue upgrade to the AI Agent plan.@sendblue-cli — Owns the actual send mechanism. This skill calls into it.@sendblue-api — HTTP alternative for app code where notify lives inside a long-running service.@update-config — Wires the Stop hook into .claude/settings.json. This skill owns the what and when; update-config owns the where.@textme — Inbound counterpart (phone → Claude). Composes well with notify.