[ notifications for AI coding agents ]

Know the moment your Claude Code, Codex, Cursor or Gemini CLI agent needs you.

Desktop toasts, phone push, and webhooks for Claude Code, Codex, Cursor, and Gemini CLI. One tool, one config — stop staring at your terminal.

$npx anotifier@latest setup
Star on GitHub
wires itself intoClaude CodeCodex CLICursorGemini CLIVS Code
v1.7.1  ·  zero dependencies  ·  node ≥ 18
agent finishes → desktop toast → phone push
macOSWindowsLinux · WSLAndroidiPhone
[01] demo

Watch it work. Sound on.

The full flow on a real machine — agent runs, toast fires, phone buzzes. Playing muted; unmute for the terminal bell.

demo.mp4 — anotifier live
[02] supported tools

One config. Every agent.

The setup wizard detects what you have installed and wires each tool's native hook system — in the CLI and inside VS Code, no extension required.

Claude Code
Claude Code
CLI + VS Code
Codex CLI
Codex CLI
CLI + VS Code
Cursor
Cursor
VS Code native
Gemini CLI
Gemini CLI
CLI
VS Code
VS Code
agent mode
toolvs codeclitask completeneeds input
Claude Code✓✓StopNotification
Codex CLI✓✓StopPermissionRequest
Cursor✓—stop—
Gemini CLI—✓AfterAgentNotification
[03] features

Every channel you'd actually use.

desktop toasts
BurntToast on Windows, Notification Center on macOS, libnotify on Linux. WSL routes to real Windows toasts — no Linux daemon needed.
phone push
Android & iOS via ntfy — free, no account. All your agents' notifications in one stream, wherever you wandered off to.
webhooks
Slack, Discord, Telegram, or any HTTP endpoint — with an optional auth header. Payload shaped per format.
terminal bell
An audible ding in the terminal that launched the agent. Works over SSH, in tmux, and in GNU screen.
rich content
Toasts show what Claude actually said or asked — read from the transcript — not a generic "task complete" line.
approval alerts
Get pinged the instant Codex asks permission to run a command — not twenty minutes later when you check back.
click-to-focus
Click the toast to jump straight back to the terminal or VS Code window that fired it (Windows).
zero dependencies
Pure Node.js built-ins, no npm production packages. One shared config at ~/.anotifier/config.json.
[04] how it works

A hook fires. You find out.

$ agent finished → Stop hook fires (stdin JSON · --source claude)
  → parse-input  ok  normalized: task_complete
  → router       ok  channels: toast · ntfy · webhook · bell
  → transcript   ok  "refactored auth module — 14 tests passing"
  ✓ delivered    toast 34ms · ntfy 210ms · webhook 180ms · bell 2ms
fan-out ⇒
desktop toast
Win · mac · Linux · WSL
ntfy push
Android · iOS
webhook
Slack · Discord · TG
terminal bell
SSH · tmux · screen
task_complete sound: IM · priority: defaultneeds_input sound: Reminder · priority: urgentsession_start priority: low · off by default
# atomic dedup — Cursor's duplicate hook fires once, you get pinged once
[05] install

Thirty seconds, any platform.

Run it, restart your AI tools, done. Uninstall removes only the hooks anotifier manages, restores your statusline (1.5.0 and later), and leaves your own hooks untouched.

npmnpx anotifier@latest setup
plugin 1/2/plugin marketplace add DevinoSolutions/anotifier-for-claude-codex-cursor
plugin 2/2/plugin install anotifier@anotifier
curl -fsSL https://raw.githubusercontent.com/DevinoSolutions/anotifier-for-claude-codex-cursor/main/setup/install.sh | bash
standalone install — platform auto-detected, switch via the dropdown
[06] try it

Fire a test through every channel.

This is anotifier test — the exact command that proves your setup works. Toggle the channels you've enabled in config.json, then run it.

$anotifier test
[x] desktop toast
Notification Center · sound: IM
[x] ntfy push
Android · iOS · tag: white_check_mark
[x] webhook
POST · Slack / Discord / Telegram
[x] terminal bell
SSH · tmux · GNU screen
tap a channel to toggle it · atomic dedup means one event = one ping, even when a tool double-fires
anotifier doctor --deep goes further — it fires a real notification and reads it back out of the OS: Notification Center's database on macOS, the dunst daemon's history on Linux. On Windows it probes the toast backend (PowerShell + BurntToast) instead; there is no delivery read-back there.
[07] proof

Tested against the real thing.

No mocks, no stubs. CI drives the real agent CLIs and reads notifications back out of the OS's own notification store — a silently-dropped toast turns CI red, not green.

[✓]Real ntfy.sh round-trip — push sent, then read back off the server
[✓]Linux — dunst history read-back, plus OCR of the banner's actual on-screen pixels
[✓]macOS — delivery read back out of Notification Center's own SQLite database
[✓]Windows — the fired toast read back out of the OS notification store (wpndatabase.db), test nonce matched in title and body
[✓]Real Claude, Codex & Gemini CLIs installed from npm and driven end to end
[✓]Codex approval loop proven in a live tmux TUI session — modal up, alert fired, approved, ran
every job is required and hard-fails · live status on main →
[08] faq

The questions you'd ask.

still have a question? ask in our Discord

Go make coffee. It'll ping you.

Your agent runs for four minutes; you check the terminal forty times. Fix the second number.