356 lines
6.7 KiB
Markdown
356 lines
6.7 KiB
Markdown
# Desktop Notifications Guide [Claude Code only]
|
|
|
|
Never miss important Claude Code events with native desktop notifications on all platforms.
|
|
|
|
## 🔔 Overview
|
|
|
|
The notification system keeps you in flow by alerting you when:
|
|
|
|
- Claude Code needs permission to proceed
|
|
- Tasks complete successfully
|
|
- Errors require your attention
|
|
- Long-running operations finish
|
|
- Custom events you define occur
|
|
|
|
## 🖥️ Platform Support
|
|
|
|
### macOS
|
|
|
|
- Native Notification Center
|
|
- Supports title, subtitle, and message
|
|
- Respects Do Not Disturb settings
|
|
- Sound alerts optional
|
|
|
|
### Linux
|
|
|
|
- Uses `notify-send` (libnotify)
|
|
- Full desktop environment support
|
|
- Works with GNOME, KDE, XFCE, etc.
|
|
- Custom icons supported
|
|
|
|
### Windows
|
|
|
|
- Native Windows toast notifications
|
|
- Action Center integration
|
|
- Works in PowerShell/WSL
|
|
- Supports notification grouping
|
|
|
|
### WSL (Windows Subsystem for Linux)
|
|
|
|
- Automatically detects WSL environment
|
|
- Routes to Windows notifications
|
|
- Full feature support
|
|
- No additional setup needed
|
|
|
|
## 🚀 Quick Start
|
|
|
|
Notifications work out of the box! The system automatically:
|
|
|
|
1. Detects your platform
|
|
2. Uses the best notification method
|
|
3. Falls back to console output if needed
|
|
|
|
## 🛠️ How It Works
|
|
|
|
### Notification Flow
|
|
|
|
```
|
|
Claude Code Event
|
|
↓
|
|
Notification Hook Triggered
|
|
↓
|
|
notify.sh Receives JSON
|
|
↓
|
|
Platform Detection
|
|
↓
|
|
Native Notification Sent
|
|
↓
|
|
You Stay In Flow ✨
|
|
```
|
|
|
|
### JSON Input Format
|
|
|
|
The notification script receives:
|
|
|
|
```json
|
|
{
|
|
"session_id": "abc123",
|
|
"transcript_path": "/path/to/transcript.jsonl",
|
|
"cwd": "/path/to/project",
|
|
"hook_event_name": "Notification",
|
|
"message": "Task completed successfully"
|
|
}
|
|
```
|
|
|
|
### Smart Context Detection
|
|
|
|
Notifications include:
|
|
|
|
- **Project Name**: From git repo or directory name
|
|
- **Session ID**: Last 6 characters for multi-window users
|
|
- **Message**: The actual notification content
|
|
|
|
Example: `MyProject (abc123): Build completed successfully`
|
|
|
|
## 🎨 Customization
|
|
|
|
### Custom Messages
|
|
|
|
Edit `.claude/settings.json` to customize when notifications appear:
|
|
|
|
```json
|
|
{
|
|
"hooks": {
|
|
"Notification": [
|
|
{
|
|
"matcher": ".*error.*",
|
|
"hooks": [
|
|
{
|
|
"type": "command",
|
|
"command": ".claude/tools/notify-error.sh"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
### Adding Sounds
|
|
|
|
**macOS** - Add to `notify.sh`:
|
|
|
|
```bash
|
|
# Play sound with notification
|
|
osascript -e 'display notification "..." sound name "Glass"'
|
|
```
|
|
|
|
**Linux** - Add to `notify.sh`:
|
|
|
|
```bash
|
|
# Play sound after notification
|
|
paplay /usr/share/sounds/freedesktop/stereo/complete.oga &
|
|
```
|
|
|
|
**Windows/WSL** - Add to PowerShell section:
|
|
|
|
```powershell
|
|
# System sounds
|
|
[System.Media.SystemSounds]::Exclamation.Play()
|
|
```
|
|
|
|
### Custom Icons
|
|
|
|
**Linux**:
|
|
|
|
```bash
|
|
notify-send -i "/path/to/icon.png" "Title" "Message"
|
|
```
|
|
|
|
**macOS** (using terminal-notifier):
|
|
|
|
```bash
|
|
terminal-notifier -title "Claude Code" -message "Done!" -appIcon "/path/to/icon.png"
|
|
```
|
|
|
|
### Notification Categories
|
|
|
|
Add urgency levels:
|
|
|
|
```bash
|
|
# In notify.sh
|
|
case "$MESSAGE" in
|
|
*"error"*|*"failed"*)
|
|
URGENCY="critical"
|
|
TIMEOUT=0 # Don't auto-dismiss
|
|
;;
|
|
*"warning"*)
|
|
URGENCY="normal"
|
|
TIMEOUT=10000
|
|
;;
|
|
*)
|
|
URGENCY="low"
|
|
TIMEOUT=5000
|
|
;;
|
|
esac
|
|
|
|
# Linux
|
|
notify-send -u "$URGENCY" -t "$TIMEOUT" "$TITLE" "$MESSAGE"
|
|
```
|
|
|
|
## 🔧 Troubleshooting
|
|
|
|
### No Notifications Appearing
|
|
|
|
1. **Check permissions**:
|
|
|
|
```bash
|
|
# Make script executable
|
|
chmod +x .claude/tools/notify.sh
|
|
```
|
|
|
|
2. **Test manually**:
|
|
|
|
```bash
|
|
echo '{"message": "Test notification", "cwd": "'$(pwd)'"}' | .claude/tools/notify.sh
|
|
```
|
|
|
|
3. **Enable debug mode**:
|
|
```bash
|
|
echo '{"message": "Test"}' | .claude/tools/notify.sh --debug
|
|
# Check /tmp/claude-code-notify-*.log
|
|
```
|
|
|
|
### Platform-Specific Issues
|
|
|
|
**macOS**:
|
|
|
|
- Check System Preferences → Notifications → Terminal/Claude Code
|
|
- Ensure notifications are allowed
|
|
- Try: `osascript -e 'display notification "Test"'`
|
|
|
|
**Linux**:
|
|
|
|
- Install libnotify: `sudo apt install libnotify-bin`
|
|
- Test: `notify-send "Test"`
|
|
- Check if notification daemon is running
|
|
|
|
**Windows/WSL**:
|
|
|
|
- Ensure Windows notifications are enabled
|
|
- Check Focus Assist settings
|
|
- Test PowerShell directly
|
|
|
|
### Silent Failures
|
|
|
|
Enable verbose logging:
|
|
|
|
```bash
|
|
# Add to notify.sh
|
|
set -x # Enable command printing
|
|
exec 2>/tmp/notify-debug.log # Redirect errors
|
|
```
|
|
|
|
## 📊 Advanced Usage
|
|
|
|
### Notification History
|
|
|
|
Track all notifications:
|
|
|
|
```bash
|
|
# Add to notify.sh
|
|
echo "$(date): $MESSAGE" >> ~/.claude-notifications.log
|
|
```
|
|
|
|
### Conditional Notifications
|
|
|
|
Only notify for important events:
|
|
|
|
```bash
|
|
# Skip trivial notifications
|
|
if [[ "$MESSAGE" =~ ^(Saved|Loaded|Reading) ]]; then
|
|
exit 0
|
|
fi
|
|
```
|
|
|
|
### Remote Notifications
|
|
|
|
Send to your phone via Pushover/Pushbullet:
|
|
|
|
```bash
|
|
# Add to notify.sh for critical errors
|
|
if [[ "$MESSAGE" =~ "critical error" ]]; then
|
|
curl -s -F "token=YOUR_APP_TOKEN" \
|
|
-F "user=YOUR_USER_KEY" \
|
|
-F "message=$MESSAGE" \
|
|
https://api.pushover.net/1/messages.json
|
|
fi
|
|
```
|
|
|
|
### Notification Groups
|
|
|
|
Group related notifications:
|
|
|
|
```bash
|
|
# macOS - Group by project
|
|
osascript -e "display notification \"$MESSAGE\" with title \"$PROJECT\" group \"$PROJECT\""
|
|
```
|
|
|
|
## 🎯 Best Practices
|
|
|
|
1. **Be Selective**: Too many notifications reduce their value
|
|
2. **Add Context**: Include project and session info
|
|
3. **Use Urgency**: Critical errors should stand out
|
|
4. **Test Regularly**: Ensure notifications work after updates
|
|
5. **Provide Fallbacks**: Always output to console too
|
|
|
|
## 🔌 Integration Examples
|
|
|
|
### Build Status
|
|
|
|
```json
|
|
{
|
|
"hooks": {
|
|
"PostToolUse": [
|
|
{
|
|
"matcher": "Bash.*make.*build",
|
|
"hooks": [
|
|
{
|
|
"type": "command",
|
|
"command": ".claude/tools/notify-build.sh"
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
### Test Results
|
|
|
|
```bash
|
|
# In notify-build.sh
|
|
if grep -q "FAILED" <<< "$TOOL_OUTPUT"; then
|
|
MESSAGE="❌ Build failed! Check errors."
|
|
else
|
|
MESSAGE="✅ Build successful!"
|
|
fi
|
|
```
|
|
|
|
### Long Task Completion
|
|
|
|
```bash
|
|
# Track task duration
|
|
START_TIME=$(date +%s)
|
|
# ... task runs ...
|
|
DURATION=$(($(date +%s) - START_TIME))
|
|
MESSAGE="Task completed in ${DURATION}s"
|
|
```
|
|
|
|
## 🌟 Tips & Tricks
|
|
|
|
1. **Use Emojis**: They make notifications scannable
|
|
|
|
- ✅ Success
|
|
- ❌ Error
|
|
- ⚠️ Warning
|
|
- 🔄 In Progress
|
|
- 🎉 Major Success
|
|
|
|
2. **Keep It Short**: Notifications should be glanceable
|
|
|
|
3. **Action Words**: Start with verbs
|
|
|
|
- "Completed build"
|
|
- "Fixed 3 errors"
|
|
- "Need input for..."
|
|
|
|
4. **Session Context**: Include session ID for multiple windows
|
|
|
|
5. **Project Context**: Always show which project
|
|
|
|
## 🔗 Related Documentation
|
|
|
|
- [Automation Guide](automation.md) - Hook system
|
|
- [Command Reference](commands.md) - Triggering notifications
|