Mirror AI-agent notifications from your PC to your phone and Apple Watch
A tiny Windows tray app watches the Windows notification stream, filters to an allowlist of apps (VSCode, Cursor, Claude desktop, Copilot, Cowork, …), and forwards each one to ntfy.sh — whose iOS app delivers to your phone and mirrors to your Apple Watch automatically. No mobile app, push server, or Apple Developer account to build.
Windows toasts ─┐
Claude Code hook ├─► NotifAI ─► https://ntfy.sh/<your-topic> ─► iPhone / Apple Watch
Codex hook ──────┘
- Reads every app's toasts via the Windows
UserNotificationListener. - Forwards only apps on your allowlist; matched case-insensitively by name.
- Classifies text into ntfy priority + tags (error → high, needs-input → question).
- Dedupes by notification id so the same toast never double-sends.
- Apps ▸ tray submenu lists every app seen this session — one click to toggle.
- Claude Code and Codex run in a terminal and don't reliably raise a toast, so
they call
NotifAI.exe --senddirectly — same ntfy topic, no dependency on the mirror. - Set up CLI agents… writes the hooks into their own config files for you, idempotently, backing up any existing file first.
- On first run each PC auto-assigns a unique topic (
NotifAI-<machine>-<random>) so different machines never collide. - Show QR to subscribe renders the
ntfy://deep-link — scan it in the ntfy app to subscribe your phone, no typing.
Build from source with the .NET 8 SDK:
dotnet buildThe exe lands in bin/Debug/net8.0-windows10.0.19041.0/win-x64/NotifAI.exe, with
a config.json seeded next to it from config.example.json.
For a portable single-file release (packs to 7z):
./make-release.sh 1.0.0 # bash
powershell -File make-release.ps1 1.0.0 # PowerShellThis build is framework-dependent — it needs the
.NET 8 Desktop Runtime installed
(~1 MB exe instead of ~180 MB). If it's missing, Windows shows a prompt with a link to
install it — accept and relaunch. Building from source with dotnet build works either
way since it uses your local SDK.
NotifAI.exeOn first launch it auto-assigns this machine a topic and asks Windows for notification access — click Yes. A tray icon appears.
- Install ntfy on your iPhone (App Store).
- Tray → Show QR to subscribe (phone)….
- In ntfy tap subscribe and scan the QR. Apple Watch mirrors automatically.
- Repeat per machine (each has its own topic).
- Trigger a notification from the app once so it appears under Apps ▸.
- Check it. Saved to
config.jsonlive — no restart. - Apps that haven't notified yet: Add app manually… and type the name.
- Tray → Set up CLI agents (Claude Code, Codex)… → confirm.
- It writes hooks into
~/.claude/settings.jsonand~/.codex/config.toml(backing up to*.bakfirst), then restart the agent.
To wire them by hand instead, replace <PATH-TO>\NotifAI.exe with your exe path:
Claude Code — ~/.claude/settings.json:
{
"hooks": {
"Notification": [
{ "hooks": [ { "type": "command",
"command": "\"<PATH-TO>\\NotifAI.exe\" --send \"Claude Code\" \"Needs your input\"" } ] }
],
"Stop": [
{ "hooks": [ { "type": "command",
"command": "\"<PATH-TO>\\NotifAI.exe\" --send \"Claude Code\" \"Task complete\"" } ] }
]
}
}Codex — ~/.codex/config.toml:
notify = ["<PATH-TO>\\NotifAI.exe", "--send", "Codex", "Turn complete"]GitHub Copilot — no hook needed; it notifies through VSCode, which the mirror
already forwards. Just check Visual Studio Code under Apps ▸.
Drop a shortcut to NotifAI.exe in the Startup folder: press Win+R, type
shell:startup, and put a shortcut there.
- Public ntfy.sh topics are world-readable. Anyone who knows the topic can read your notifications — keep the auto-generated random topic, add an ntfy access token, or self-host.
- Notification text can contain code, paths, and errors and transits ntfy.sh.
Self-host (
ntfy.serverinconfig.json) if that content must not leave your network.
| File | Role |
|---|---|
Ntfy.cs |
One HTTP POST to your ntfy topic — the entire "push server". |
Watcher.cs |
Polls UserNotificationListener, dedupes by id, classifies text → priority/tags. |
TrayApp.cs |
Tray icon, Apps submenu, QR, agent setup, pause/test/config controls. |
Config.cs |
Loads/saves config.json; auto-assigns a per-machine topic; builds the subscribe URL. |
AgentSetup.cs |
Writes NotifAI hooks into Claude Code / Codex config files (idempotent, backs up first). |
Program.cs |
Entry point; --send CLI path for hooks. |
Polls every pollSeconds (default 2). Deliberately simple — see the
ponytail: comments for the known ceilings and upgrade paths.
MIT. Delivery via ntfy — Apache-2.0 / GPLv2. QR codes via QRCoder — MIT.