A Claude Code plugin that plays sounds on every hook event and sends Ghostty OSC 777 desktop notifications when Claude needs attention. Works on macOS, Linux, and WSL.
- Plays a distinct sound for each of the 33 Claude Code hook events
- Sends desktop notifications (via Ghostty OSC 777) when Claude finishes a task or needs input
- Configurable via
/beepboop:configskill - Auto-detects an available audio player on first run (macOS:
afplay, Linux:aplay/paplay/pw-play, WSL: Linux players orpowershell.exe)
From within Claude Code:
/plugin marketplace add /path/to/beepboop
/plugin install beepboop@beepboop
/plugin uninstall beepboop@beepboop
/plugin marketplace remove beepboop
Use the /beepboop:config skill in Claude Code:
/beepboop:config # show current config
/beepboop:config enable sounds # turn sounds on
/beepboop:config disable sounds # turn sounds off
/beepboop:config enable notifications # turn notifications on
/beepboop:config disable notifications # turn notifications off
/beepboop:config volume 0.5 # set playback volume (0.0–1.0, default 0.2)
/beepboop:config player /usr/bin/aplay # override audio player
/beepboop:config player "" # reset to auto-detect
Config file: ~/.claude/plugins/cache/<marketplace>/beepboop/<version>/settings.json
Notifications work across multiple terminals with automatic detection:
- Ghostty — OSC 777 (requires
desktop-notifications = truein~/.config/ghostty/config) - VSCode, iTerm2, WezTerm — OSC 9 escape sequence
- Other terminals on macOS —
osascriptsystem notification (clicking focuses your terminal app, not Script Editor)
On macOS, beepboop uses a persistent audio mixing daemon (beepboop-daemon.py) to prevent audio corruption when multiple hooks fire in quick succession. Instead of spawning multiple afplay processes, all sounds are mixed into a single stream.
- Socket:
/tmp/beepboop-<uid>.sock - PID file:
/tmp/beepboop-<uid>.pid - Auto-starts on the first hook event that plays a sound
- Automatically stopped on
SessionEnd
Check if running:
ps aux | grep beepboop-daemonStop manually:
kill $(cat /tmp/beepboop-$(id -u).pid)The daemon auto-starts on the next hook event.
- Bump the version in
plugin/.claude-plugin/plugin.jsonand bothmarketplace.jsonfiles (.claude-plugin/andplugin/.claude-plugin/). - Run
scripts/check-versions.shto confirm all four version fields agree. - Commit and push.
- In the claude-marketplace repo, run
./release.sh syncand push that.