{"_id":"@daik0z/claude-notify","_rev":"4-c2f713884341b168118a8a3dfe36aa47","name":"@daik0z/claude-notify","dist-tags":{"latest":"1.1.0"},"versions":{"1.0.0":{"name":"@daik0z/claude-notify","version":"1.0.0","keywords":["claude","claude-code","notifications","ntfy","productivity"],"license":"MIT","_id":"@daik0z/claude-notify@1.0.0","maintainers":[{"name":"daik0z","email":"marcosramosdam@gmail.com"}],"homepage":"https://github.com/daik0z/claude-notify","bugs":{"url":"https://github.com/daik0z/claude-notify/issues"},"bin":{"claude-notify":"dist/cli.js"},"dist":{"shasum":"3d2f5ee1c4632648d7407414dcec7a79a19c1473","tarball":"https://registry.npmjs.org/@daik0z/claude-notify/-/claude-notify-1.0.0.tgz","fileCount":23,"integrity":"sha512-bT2JugNH3p6l1SZxHyxBh/fmUqMmEyktzcdAxgtMj59wdCIBo2xjGBydiaHokSSilIb/Ie1I8dOvSVYSOWrIFQ==","signatures":[{"sig":"MEYCIQC+GiDcMlumfm7wYsT8mLsuwINX5Uxdos/k/Q7NN7KrrgIhANZ1NPBlqEv5SGbsAHlWaCqMXTy0ErdDw4OimWwgd4tK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":27969},"main":"./dist/cli.js","type":"module","types":"./dist/cli.d.ts","engines":{"node":">=18"},"gitHead":"ce39057f98a5f294f64adbf56f6799cf235bf6e4","scripts":{"dev":"tsc --watch","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"daik0z","email":"marcosramosdam@gmail.com"},"repository":{"url":"git+https://github.com/daik0z/claude-notify.git","type":"git"},"_npmVersion":"10.9.4","description":"Push notifications when Claude Code finishes working — desktop, mobile (ntfy), and webhooks.","directories":{},"_nodeVersion":"22.22.0","dependencies":{"commander":"^12.1.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.5","@types/node":"^20.14.0"},"_npmOperationalInternal":{"tmp":"tmp/claude-notify_1.0.0_1775428721312_0.04635283808292989","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@daik0z/claude-notify","version":"1.0.1","keywords":["claude","claude-code","notifications","ntfy","productivity"],"license":"MIT","_id":"@daik0z/claude-notify@1.0.1","maintainers":[{"name":"daik0z","email":"marcosramosdam@gmail.com"}],"homepage":"https://github.com/daik0z/claude-notify","bugs":{"url":"https://github.com/daik0z/claude-notify/issues"},"bin":{"claude-notify":"dist/cli.js"},"dist":{"shasum":"f8798c9a0d0732d84450f3eea56875d0b0004453","tarball":"https://registry.npmjs.org/@daik0z/claude-notify/-/claude-notify-1.0.1.tgz","fileCount":23,"integrity":"sha512-ydD0J34gWHuDYW6w17mPp6a7iQ03uhqUxgE/VFxHM7749f5JWuxWFO3c/50Wyzl2G+veEsHUbBP/XF3jJAj0lQ==","signatures":[{"sig":"MEYCIQDd0KYkXcEGUVCaemhmMcy7ZL8reGFNcV2Q+xdhL2Lc8QIhAJtHj1DJdR4R6q/QHO/9+5GGRTYNiI/Jm+zycZmdOGMY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29364},"main":"./dist/cli.js","type":"module","types":"./dist/cli.d.ts","engines":{"node":">=18"},"gitHead":"ddbf1712f3f3ca845137db8d478984af0f3be1ac","scripts":{"dev":"tsc --watch","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"daik0z","email":"marcosramosdam@gmail.com"},"repository":{"url":"git+https://github.com/daik0z/claude-notify.git","type":"git"},"_npmVersion":"10.9.4","description":"Push notifications when Claude Code finishes working — desktop, mobile (ntfy), and webhooks.","directories":{},"_nodeVersion":"22.22.0","dependencies":{"commander":"^12.1.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.5","@types/node":"^20.14.0"},"_npmOperationalInternal":{"tmp":"tmp/claude-notify_1.0.1_1775559440397_0.3171813370970131","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@daik0z/claude-notify","version":"1.0.2","keywords":["claude","claude-code","notifications","ntfy","productivity"],"license":"MIT","_id":"@daik0z/claude-notify@1.0.2","maintainers":[{"name":"daik0z","email":"marcosramosdam@gmail.com"}],"homepage":"https://github.com/ddaikodaiko/claude-notify","bugs":{"url":"https://github.com/ddaikodaiko/claude-notify/issues"},"bin":{"claude-notify":"dist/cli.js"},"dist":{"shasum":"37612cbd281dc493f3c0638a73dea1f4b3261b25","tarball":"https://registry.npmjs.org/@daik0z/claude-notify/-/claude-notify-1.0.2.tgz","fileCount":23,"integrity":"sha512-/m7JRyBRu8wTgyLe9bTMKu32IUExNDK+jPrCg163Cl4QkRedbCw/mz9581XLqQNXzqYNpKrYzuHTWVVfnJ4qMQ==","signatures":[{"sig":"MEUCIQDUsBLcFiPugzE3rBN5VwY4u9YCOwwUF7G+w8eh/na2BAIgcZe6hK26qqOhOPLKvD6/aeF6fcQMcPzmequM7KpwJmg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29428},"main":"./dist/cli.js","type":"module","types":"./dist/cli.d.ts","engines":{"node":">=18"},"gitHead":"e0e439c45776fe21622f66015b79adc3041e19ac","scripts":{"dev":"tsc --watch","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"daik0z","email":"marcosramosdam@gmail.com"},"repository":{"url":"git+https://github.com/ddaikodaiko/claude-notify.git","type":"git"},"_npmVersion":"10.9.4","description":"Push notifications when Claude Code finishes working — desktop, mobile (ntfy), and webhooks.","directories":{},"_nodeVersion":"22.22.0","dependencies":{"commander":"^12.1.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.5","@types/node":"^20.14.0"},"_npmOperationalInternal":{"tmp":"tmp/claude-notify_1.0.2_1775723477896_0.4468297915316586","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@daik0z/claude-notify","version":"1.1.0","description":"Push notifications when Claude Code finishes working — desktop, mobile (ntfy), and webhooks.","keywords":["claude","claude-code","notifications","ntfy","productivity"],"homepage":"https://github.com/ddaikodaiko/claude-notify","repository":{"type":"git","url":"git+https://github.com/ddaikodaiko/claude-notify.git"},"license":"MIT","type":"module","main":"./dist/cli.js","bin":{"claude-notify":"dist/cli.js"},"scripts":{"build":"tsc","dev":"tsc --watch","test":"npm run build && node --test test/*.test.js","prepublishOnly":"npm run test"},"dependencies":{"commander":"^12.1.0"},"devDependencies":{"typescript":"^5.4.5","@types/node":"^20.14.0"},"engines":{"node":">=18"},"_id":"@daik0z/claude-notify@1.1.0","gitHead":"cec52994518bf23ef7c20e704f186ef5d651e4d4","types":"./dist/cli.d.ts","bugs":{"url":"https://github.com/ddaikodaiko/claude-notify/issues"},"_nodeVersion":"22.22.0","_npmVersion":"10.9.4","dist":{"integrity":"sha512-PPLUUIpDgCP+9is7G6xKHJFVMlqQA9BkScZS921dd0zcj2zKiJFWBMDJzX0ZYgUVYcMaPO0aE/BdzmM2rVVKqg==","shasum":"1133723098cc3c97048533f18a1a9f69cd712f36","tarball":"https://registry.npmjs.org/@daik0z/claude-notify/-/claude-notify-1.1.0.tgz","fileCount":26,"unpackedSize":34941,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDKJzT3ActBEkwXjEy5bICThOhcpFTZ+HMwFsoeX40boAiAXuYV36v4PFAKZjaEAS6/LENoMgZXh+IzHWuJopFNMLw=="}]},"_npmUser":{"name":"daik0z","email":"marcosramosdam@gmail.com"},"directories":{},"maintainers":[{"name":"daik0z","email":"marcosramosdam@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/claude-notify_1.1.0_1775900847196_0.09890726972185893"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-05T22:38:41.238Z","modified":"2026-04-11T09:47:27.432Z","1.0.0":"2026-04-05T22:38:41.459Z","1.0.1":"2026-04-07T10:57:20.542Z","1.0.2":"2026-04-09T08:31:18.096Z","1.1.0":"2026-04-11T09:47:27.339Z"},"bugs":{"url":"https://github.com/ddaikodaiko/claude-notify/issues"},"license":"MIT","homepage":"https://github.com/ddaikodaiko/claude-notify","keywords":["claude","claude-code","notifications","ntfy","productivity"],"repository":{"type":"git","url":"git+https://github.com/ddaikodaiko/claude-notify.git"},"description":"Push notifications when Claude Code finishes working — desktop, mobile (ntfy), and webhooks.","maintainers":[{"name":"daik0z","email":"marcosramosdam@gmail.com"}],"readme":"# claude-notify\n\nGet notified when Claude Code finishes working. Supports desktop (macOS, Linux, Windows), mobile via [ntfy](https://ntfy.sh), and custom webhooks.\n\nAlso gives each git worktree its own stable loopback IP — so parallel Claude sessions don't fight over dev server ports.\n\n---\n\n## Install\n\n```bash\nnpm install -g @daik0z/claude-notify\nclaude-notify setup\n```\n\nThat's it. Claude Code will notify you from now on.\n\n## How it works\n\nAdds a `Stop` hook to `~/.claude/settings.json`. When a Claude Code session ends, it runs `claude-notify send`, reads the session transcript, and sends a summary to your configured channels.\n\n```\nClaude Code finishes → hook fires → claude-notify send → desktop + phone\n```\n\nExample notification body: `3 files edited · 2 commands`\n\n---\n\n## Channels\n\n### Desktop (default, zero config)\n\nWorks out of the box on macOS, Linux, and Windows. Uses native OS notifications.\n\n### Mobile — ntfy.sh (free, no account needed)\n\n1. Install the [ntfy app](https://ntfy.sh) on your phone\n2. Pick a topic — make it unguessable, it's your auth\n\n```bash\nclaude-notify config set channels.ntfy.enabled true\nclaude-notify config set channels.ntfy.topic your-secret-topic-xyz\n```\n\n3. Subscribe to `ntfy.sh/your-secret-topic-xyz` in the app\n\nSelf-hosted ntfy also works:\n\n```bash\nclaude-notify config set channels.ntfy.server https://ntfy.yourdomain.com\n```\n\n### Webhooks (Slack, Discord, custom)\n\n```bash\nclaude-notify config set channels.webhook.enabled true\nclaude-notify config set channels.webhook.url https://hooks.slack.com/services/...\n```\n\nDefault body template: `{\"text\": \"{{title}}: {{body}}\"}` — change with `channels.webhook.bodyTemplate`.\n\n---\n\n## Worktree IP isolation\n\nWhen running multiple Claude Code sessions in parallel, each session spins up its own dev server — and they all try to use the same ports.\n\n`claude-notify ip` prints a stable loopback IP derived from the current git worktree path. Same worktree always gets the same IP. Different worktrees get different IPs. Bind your servers to it and they'll never conflict.\n\n```bash\n# print the IP for the current worktree\nclaude-notify ip\n# → 127.19.222.162\n\n# use it directly\nvite --host $(claude-notify ip)\nnpm start -- --host $(claude-notify ip)\n```\n\nOr export it once at the start of the session:\n\n```bash\nexport HOST=$(claude-notify ip)\n# now $HOST is available to any command in this shell\n```\n\n**Linux:** no setup needed — the kernel routes the entire `127.0.0.0/8` block to loopback automatically.\n\n**macOS:** run once per system boot to register the alias:\n\n```bash\nclaude-notify ip --setup   # runs: sudo ifconfig lo0 alias <ip> up\n```\n\n---\n\n## Commands\n\n| Command | Description |\n|---|---|\n| `claude-notify setup` | Add hook to `~/.claude/settings.json` |\n| `claude-notify uninstall` | Remove hook |\n| `claude-notify status` | Show install + channel status |\n| `claude-notify test` | Fire a test notification on all channels |\n| `claude-notify config show` | Print current config |\n| `claude-notify config set <key> <value>` | Set a config value |\n| `claude-notify ip` | Print stable loopback IP for current worktree |\n| `claude-notify ip --setup` | Register loopback alias (macOS only) |\n\n---\n\n## Config reference\n\nConfig lives at `~/.config/claude-notify/config.json` (mode 600).\n\n| Key | Default | Description |\n|---|---|---|\n| `channels.desktop` | `true` | Native OS notification |\n| `channels.ntfy.enabled` | `false` | ntfy push |\n| `channels.ntfy.topic` | `\"\"` | Topic name (treat like a password) |\n| `channels.ntfy.server` | `https://ntfy.sh` | ntfy server URL |\n| `channels.webhook.enabled` | `false` | HTTP webhook |\n| `channels.webhook.url` | `\"\"` | Webhook URL (http/https only) |\n| `channels.webhook.method` | `POST` | HTTP method |\n| `channels.webhook.headers` | `{\"Content-Type\": \"application/json\"}` | Request headers |\n| `channels.webhook.bodyTemplate` | `{\"text\": \"{{title}}: {{body}}\"}` | Body template (`{{title}}`, `{{body}}`) |\n| `message.title` | `\"Claude Code\"` | Notification title |\n| `message.includeStats` | `true` | Include tool stats in body |\n\n---\n\n## License\n\nMIT\n","readmeFilename":"README.md"}