A tiny notifier for AI coding agents.
Get a banner + sound when your agent finishes a task or pauses for your approval — step away without missing a beat.
| Agent | Status |
|---|---|
| Claude Code | ✅ |
| Cursor | ✅ |
| Gemini CLI | ✅ (experimental) |
| Codex | ✅ (experimental) |
| Any hooks-capable agent | ✅ — point it at notify.sh |
Platforms: macOS (native banners + click-to-focus) · Linux (PulseAudio / ALSA / libnotify) · Windows (Git Bash / WSL)
brew install hiskuDN/tap/tinynudge
tinynudge-setupbrew install gets you the native app. tinynudge-setup auto-detects your agents (~/.claude, ~/.cursor) and wires their hooks.
git clone https://github.com/hiskuDN/tinynudge.git
cd tinynudge
./install.shThe installer auto-detects agents and wires hooks. On macOS it will also prompt you to install the native binary via Homebrew if you haven't already.
Each supported agent has a hooks system. tinynudge registers these hooks:
| Agent | Event | What happens |
|---|---|---|
| Claude Code | Stop |
Banner when the turn ends |
| Claude Code | PermissionRequest |
Banner when Claude pauses for approval |
| Cursor | stop |
Banner when agent turn ends |
| Gemini CLI | session end | Banner when agent finishes |
The hook calls notify.sh <agent> <event>, which plays a sound and shows a banner via:
- macOS — the native
tinynudge.app(click-to-focus routes back to your editor) - Linux —
paplay/aplay/notify-send - Windows —
powershell [console]::beep
When you click the banner, tinynudge.app uses System Events to raise the exact window that triggered the notification — even if you have multiple Cursor or terminal windows open. Supported apps:
- Cursor, VS Code
- iTerm2, Warp, Ghostty, Terminal.app
If the target app is already in focus when the notification fires, the banner is suppressed and only the sound plays.
If you'd rather have your editor focus automatically — no click needed:
export TINYNUDGE_ACTIVATE_IMMEDIATELY=trueAdd that to your shell profile.
tinynudge can speak notifications aloud using StackVox, an offline TTS library with ~13 ms latency.
Setup:
pip install stackvox
stackvox serve # start the daemon (add to login items or a launch agent)Enable in your config (~/.tinynudge/config):
TINYNUDGE_VOICE=trueVoice fires only when the banner shows — it's suppressed along with the banner when your editor is already in focus. For permission events, voice says "Bash command needs approval" or "Edit: filename" rather than reading the raw command aloud.
Optional tuning (also in ~/.tinynudge/config):
TINYNUDGE_VOICE_NAME=af_heart # StackVox voice ID
TINYNUDGE_VOICE_SPEED=1.1 # playback speed (1.0 = normal)| Event | macOS | Linux | Windows |
|---|---|---|---|
| Agent done | Glass.aiff |
freedesktop bell | 800 Hz beep |
| Waiting for approval | Ping.aiff |
freedesktop bell | 1200 Hz beep |
Any file from /System/Library/Sounds/ works on macOS: Basso, Blow, Bottle, Frog, Funk, Glass, Hero, Morse, Ping, Pop, Purr, Sosumi, Submarine, Tink.
./uninstall.shRemoves hooks from each agent's config and deletes ~/.tinynudge/. To also remove the binary: brew uninstall tinynudge.
Every supported agent just needs a hook that runs notify.sh <agent-name> <event>. Example for Codex (or any other hooks-capable agent):
{
"hooks": {
"stop": [
{
"type": "command",
"command": "$HOME/.tinynudge/notify.sh codex stop"
}
]
}
}./build.sh # builds tinynudge.app into build/The Swift source lives in notifier/ — ~200 lines, compiled with swiftc. No Xcode, no SPM, no dependencies.
Click-routing architecture (process exits after delivery, macOS re-launches on click) is adapted from terminal-notifier by Eloy Durán and Julien Blanchard.
MIT