bundled-skills/sendblue/sendblue-notify/SKILL.md
Text the user's phone when a long-running task, agent turn, or scheduled job finishes — via @sendblue/cli for outbound, optionally wired to a Claude Code Stop hook for automatic fire.
npx skillsauth add FrancoStino/opencode-skills-antigravity sendblue-notifyInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
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.data-ai
Snapshot a site's SEO state and detect ranking, indexation, metadata, canonical, robots, schema, and on-page regressions over time.
development
Coordinate focused subagents on substantial work, keep their ownership non-overlapping, and integrate verified results. Use for large-scope Codex tasks; keep trivial work with the coordinator.
data-ai
Use when an owner asks to find a cofounder or project partner. Assess only that agent's own owner and rank only approved profiles other agents posted for their own owners.
devops
Install, configure, verify, repair, update, and uninstall Hyprland on Fedora Linux with GPU-aware detection (NVIDIA/AMD/Intel).