Cross-platform desktop notifications from Claude Code. Use when: a long task completes, you need to alert the user, asking a choice via toast buttons, showing progress, or any time a desktop notification would be helpful. Works on WSL (Windows BurntToast), native Linux (notify-send), and macOS (osascript).
Cross-platform desktop notifications from Claude Code.
/notify "Title" "Message" - Simple notification
/notify "Title" "Message" --alarm - Notification with sound
/notify "Question?" --choices "Yes" "No" "Maybe" - Interactive with buttons
/notify "Building..." --progress 0.75 - Progress bar notification
NOTIFY sends real desktop notifications from your Claude Code session. When a long build finishes, when a test suite completes, when Claude needs your attention — a toast pops up on your desktop instead of sitting silently in the terminal.
| Platform | Method | Interactive Buttons | Progress Bar |
|---|---|---|---|
| WSL |
| BurntToast (PowerShell) |
| Yes (up to 5) |
| Yes |
| Linux | notify-send | Yes (if supported) | Text-based |
| macOS | osascript | No | No |
python3 scripts/toast.py "Build Complete" "All 47 tests passed"
python3 scripts/toast.py "ALERT" "Deployment failed" --alarm
python3 scripts/toast.py "Deploy?" --choices "Production" "Staging" "Cancel"
Returns the selected option number (1-indexed) or None on timeout.
python3 scripts/toast.py "Installing" --progress 0.6 --status "60% complete"
Add --json flag for machine-readable output:
python3 scripts/toast.py "Choose" --choices "A" "B" --json
# {"choice": 1, "label": "A"}
from toast import send_toast, ask_choice, send_progress
# Simple notification
send_toast("Title", "Message")
# With icon/image
send_toast("Title", "Message", hero=True)
# Interactive choice (returns 1-indexed int or None)
choice = ask_choice("Deploy where?", ["Production", "Staging", "Cancel"])
# Progress bar (call repeatedly to update)
send_progress("Building", "Compiling...", 0.3)
send_progress("Building", "Linking...", 0.7)
send_progress("Building", "Done!", 1.0)
When this skill is invoked:
Run this check the first time NOTIFY is used in a session:
# Detect platform
grep -qiE "(microsoft|wsl)" /proc/version 2>/dev/null && echo "PLATFORM=wsl" || \
([ "$(uname)" = "Darwin" ] && echo "PLATFORM=macos" || echo "PLATFORM=linux")
Then verify dependencies:
powershell.exe -Command "Get-Module -ListAvailable BurntToast" — if not found, tell user: "NOTIFY requires BurntToast. Install it in PowerShell: Install-Module -Name BurntToast -Force"which notify-send — if not found, tell user: "NOTIFY requires libnotify. Install it: sudo apt install libnotify-bin"If prerequisites are missing, tell the user exactly what to install and how. Do not silently fail.
Proactive use: When a long-running task completes (build, test suite, deployment), send a notification automatically so the user knows to come back.
Install-Module -Name BurntToast -ForceYGet-Module -ListAvailable BurntToast (should show version)scripts/toast.py and scripts/notify.sh to your skill directoryTroubleshooting WSL:
powershell.exe is not found, check /mnt/c/Windows/System32/WindowsPowerShell/v1.0/appendWindowsPath=false in /etc/wsl.conf, add the PowerShell path to your $PATHsudo apt install libnotify-bin
sudo dnf install libnotify
sudo pacman -S libnotify
No additional setup — uses built-in osascript. Interactive buttons are not supported on macOS; notifications are display-only.
# Quick test — should show a desktop notification
python3 scripts/toast.py "Test" "NOTIFY is working"
libnotify-bin / libnotify package| Feature | WSL + BurntToast | Linux + notify-send | macOS |
|---|---|---|---|
| Basic notification | Yes | Yes | Yes |
| Custom sound | Yes (multiple) | No | Default only |
| Alarm/urgent | Yes | Yes (critical urgency) | No |
| Interactive buttons | Yes (up to 5) | Yes (if DE supports) | No |
| Progress bar | Yes (native) | Yes (text-based) | No |
| App icon | Yes | Yes | No |
| Notification replacement | No | Yes | No |
Don't make them watch the terminal. Tap them on the shoulder.