Smart audio and visual notifications for Claude Code and other coding agents - never miss when your agent needs attention.
- macOS 13+
- Bash 4.0+
- jq (JSON processing)
- Claude Code with hooks support
- Optional: terminal-notifier (for visual notifications)
- Optional: Swift compiler (for building the menu bar app from source)
- Permission Requests - Get notified when Claude needs permission to run commands
- Response Complete - Hear when Claude finishes responding
- Tool Descriptions - See exactly what Claude wants to do (not just "needs permission for Bash")
- Beautiful native Swift app that lives in your menu bar
- Custom bell icon with "C" for Claude
- One-click toggle for enabling/disabling sounds
- GUI controls for selecting sounds for each event type
- Sound preview before selecting
- Quick access to config file and debug logs
- Per-event sound selection (Permission, Response Complete)
- Per-project sound mappings
- Random sound mode (different sound per project)
- Support for system sounds and custom audio files
- Anti-spam protection - Configurable cooldown between notifications
- Hook-based - Uses Claude Code's official notification hooks (reliable)
- Transcript parsing - Extracts detailed context from Claude's session
- Debug logging - Full transparency for troubleshooting
cd /tmp
git clone https://github.com/cwveysey/coding-agent-notifications.git
cd coding-agent-notifications
./install.sh-
Clone the repository
git clone https://github.com/cwveysey/coding-agent-notifications.git cd coding-agent-notifications -
Copy scripts to ~/.claude/
cp -r scripts/* ~/.claude/scripts/ chmod +x ~/.claude/scripts/*.sh
-
Copy and configure audio-notifier.yaml
cp config/audio-notifier.yaml.example ~/.claude/audio-notifier.yaml # Edit ~/.claude/audio-notifier.yaml to customize settings
-
Set up Claude Code hooks
Edit your
~/.config/claude/settings.json(or wherever your Claude Code settings are) and add:{ "hooks": { "Notification": [ { "type": "command", "command": "bash ~/.claude/scripts/smart-notify.sh notification" } ], "Stop": [ { "type": "command", "command": "bash ~/.claude/scripts/smart-notify.sh stop" } ] } } -
Enable sounds
touch ~/.claude/.sounds-enabled -
Build and run the menu bar app (optional but recommended)
cd menu-bar-app ./build.sh # Then run: ./ClaudeSoundsMenuBar & # Or add to Login Items in System Settings
Once the menu bar app is running, click the bell icon to:
- Toggle sounds on/off - Click "Enabled" to toggle (shows checkmark when on)
- Select event sounds - Choose sounds for Permission and Response Complete
- Preview sounds - Click any sound to hear it before selecting
- Open config file - Quick access to advanced settings
- View debug log - Troubleshoot notification issues
# Enable sounds
touch ~/.claude/.sounds-enabled
# Disable sounds
rm ~/.claude/.sounds-enabled
# Check status
ls ~/.claude/.sounds-enabled && echo "Enabled" || echo "Disabled"Or if you've set up the zsh aliases:
claude-sounds-on # Enable sounds
claude-sounds-off # Disable sounds
claude-sounds-status # Check current statusEdit ~/.claude/audio-notifier.yaml to customize:
- Event sounds - Different sounds for permission and response complete
- Project sounds - Per-project sound mappings
- Random mode - Auto-assign sounds based on project
- Anti-spam settings - Minimum interval between notifications
- Custom messages - Notification text per event type
- Debug logging - Enable verbose output
See config/audio-notifier.yaml.example for full documentation.
Edit ~/.claude/project-sounds.conf to map project names to sounds:
github-activity-summary-tool=/System/Library/Sounds/Hero.aiff
my-portfolio=/System/Library/Sounds/Glass.aiffcoding-agent-notifications/
├── scripts/ # Bash scripts for notifications
│ ├── smart-notify.sh # Main notification handler (for hooks)
│ ├── select-sound.sh # Sound selection logic
│ ├── toggle-sounds.sh # Enable/disable sounds
│ └── ...
├── menu-bar-app/ # macOS menu bar application
│ ├── ClaudeSoundsMenuBar.swift
│ ├── build.sh
│ └── README.md
├── config-editor-app/ # Tauri-based GUI config editor
│ ├── src/ # Frontend (HTML/CSS/JS)
│ ├── src-tauri/ # Rust backend
│ └── package.json
├── config/ # Configuration files
│ └── audio-notifier.yaml.example
├── docs/ # Additional documentation
├── install.sh # Installation script
└── README.md # This file
To develop the config editor app with live preview (hot reload):
cd config-editor-app
npm run tauri:devThis provides the same fast iteration as web development:
- Frontend changes (HTML/CSS/JS): Hot reload automatically in the app window
- Rust backend changes (src-tauri/src): Auto-rebuild and restart the app when saved
No need for full rebuilds during development. Changes appear instantly just like a web dev server.
- Hook Triggered - Claude Code fires
NotificationorStophook - smart-notify.sh - Receives hook data (message, transcript path, etc.)
- Transcript Parsing - Extracts tool description and message preview
- Sound Selection - Chooses sound based on event type and project
- Notification - Plays audio + shows visual notification (if terminal-notifier installed)
-
Notification Hook - Fires when:
- Claude needs permission to use a tool
- Claude has been idle for 60+ seconds
-
Stop Hook - Fires when:
- Claude finishes a response
-
Check if sounds are enabled:
ls ~/.claude/.sounds-enabled -
Check debug log:
tail -f ~/.claude/smart-notify-debug.log -
Enable debug mode:
DEBUG=true bash ~/.claude/scripts/smart-notify.sh notification
If you experience duplicate notifications, check your Claude Code hooks configuration to ensure the scripts are only registered once in ~/.config/claude/settings.json.
Make sure it's running:
ps aux | grep ClaudeSoundsMenuBar | grep -v grepRebuild if needed:
cd menu-bar-app && ./build.shThe config editor app includes optional, anonymous usage analytics (PostHog) to help improve the product. Analytics are disabled by default in development builds and can be fully opted out in the app settings. No personal data or notification content is ever collected.
Contributions welcome! See CONTRIBUTING.md for guidelines.
For security concerns, see SECURITY.md. Please report vulnerabilities via email, not public issues.
MIT License - see LICENSE for details.
Built by @cwveysey