Push notification via ntfy when Claude Code is ready for user input. Top-level agent only (subagent stops are filtered out).
A Claude Code plugin that sends a push notification via ntfy.sh when the top-level agent is ready for your input — i.e., it has stopped, hit a permission prompt, or gone idle waiting for you.
Use it to step away from a long-running session and get pinged on your phone or desktop the moment Claude actually needs you.
The plugin installs two hooks:
Stop — fires when the main agent finishes responding.Notification (matcher permission_prompt|idle_prompt) — fires when Claude
is blocking on a tool-permission prompt or idle waiting for input.Each hook posts a one-line message to your ntfy topic with the event name, truncated last assistant message (or transcript path), and current working directory.
Subagent / Task-tool / background-agent stops are filtered out. The script
skips any payload that carries agent_id or agent_type, or whose event name
is SubagentStop. You'll get one notification per top-level turn, not one per
spawned subagent.
jq and curl on PATH (standard on Debian/Ubuntu/macOS; install via
apt-get install jq or brew install jq if needed).claude-ready- plus a few
random characters. Anyone who knows your topic can read your notifications,
so don't share it.https://ntfy.sh/<your-topic>, subscribed to that topic.In Claude Code:
/plugin marketplace add thewoolleyman/claude-code-ntfy
/plugin install ntfy-notify@claude-code-ntfy
The script reads its config from environment variables. Set them in your
global Claude Code settings at ~/.claude/settings.json:
{
"env": {
"CLAUDE_NTFY_TOPIC": "your-unguessable-topic-here"
}
}
Or export them in your shell before launching claude:
export CLAUDE_NTFY_TOPIC="your-unguessable-topic-here"
If CLAUDE_NTFY_TOPIC is unset, the hook exits silently — nothing is sent.
Open the ntfy app, tap Subscribe to topic, and paste the same topic name.
| Variable | Required | Default | Description |
|---|---|---|---|
CLAUDE_NTFY_TOPIC | yes | (none) | ntfy topic to publish to. |
CLAUDE_NTFY_SERVER | no | https://ntfy.sh | ntfy server. Override for self-hosted instances. |
Point CLAUDE_NTFY_SERVER at your instance:
{
"env": {
"CLAUDE_NTFY_TOPIC": "claude-ready",
"CLAUDE_NTFY_SERVER": "https://ntfy.your-domain.tld"
}
}
If your server requires auth, that isn't supported out of the box — fork the
script in plugins/ntfy-notify/hooks-handlers/notify-ready.sh and add an
Authorization header to the curl call.
After installing and setting your topic, you can fire the script manually:
echo '{"hook_event_name":"Test","message":"hello from claude-code-ntfy"}' \
| "$(claude config get pluginRoot 2>/dev/null || echo ~/.claude/plugins)/marketplaces/claude-code-ntfy/plugins/ntfy-notify/hooks-handlers/notify-ready.sh"
Or just let it fire naturally — start a Claude Code session, ask for something, walk away, and wait for the ping when it stops.
If you'd rather not use the plugin system, you can install the script
directly. See the original gist-style instructions in the project
issues or copy plugins/ntfy-notify/hooks-handlers/notify-ready.sh
into ~/.claude/hooks/ and wire it up in ~/.claude/settings.json under
hooks.Stop and hooks.Notification exactly as in
plugins/ntfy-notify/hooks/hooks.json.
Claude Code event ──► hook command ──► notify-ready.sh
│
├─ skip if subagent context
├─ format title + body from JSON payload
└─ POST to https://<server>/<topic>
│
└─► your phone
The plugin sets ${CLAUDE_PLUGIN_ROOT} to its install path, so the script
location is portable across machines.
MIT — see LICENSE.
Own this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimOwn this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimBased on adoption, maintenance, documentation, and repository signals. Not a security audit or endorsement.
npx claudepluginhub thewoolleyman/claude-code-ntfy --plugin ntfy-notifyClaude Code Driver for livespec: thin SKILL.md bindings exposing /livespec:seed, /livespec:propose-change, /livespec:critique, /livespec:revise, /livespec:doctor, /livespec:prune-history, /livespec:next, and /livespec:help. The harness-neutral prose and the reference spec-side CLIs ship with livespec core (install livespec@livespec alongside this Driver).
Beads/Dolt-backed implementation plugin for livespec. Exposes /livespec-impl-beads:capture-impl-gaps, /livespec-impl-beads:capture-memo, /livespec-impl-beads:capture-spec-drift, /livespec-impl-beads:capture-work-item, /livespec-impl-beads:detect-impl-gaps, /livespec-impl-beads:implement, /livespec-impl-beads:list-memos, /livespec-impl-beads:list-work-items, /livespec-impl-beads:next, /livespec-impl-beads:process-memos.
Ultra-compressed communication mode. Cuts ~75% of tokens while keeping full technical accuracy by speaking like a caveman.
Memory compression system for Claude Code - persist context across sessions
Multi-model consensus engine integrating OpenAI Codex CLI, Gemini CLI, and Claude CLI for collaborative code review and problem-solving.
Curate auto-memory, promote learnings to CLAUDE.md and rules, extract proven patterns into reusable skills.