~/.claude/settings.json.
Installation
The installer handles everything:How It Works
Claude Code fires hook events at key points during agent sessions. PeonPing registerspeon.sh as a handler for:
SessionStart— Agent session beginsStop— Agent completes a taskPermissionRequest— Tool needs approvalPostToolUseFailure— Tool execution failsSubagentStart— Subagent (Task tool) spawnsPreCompact— Context compaction (token limit)
Hook Registration
The installer writes to~/.claude/settings.json:
Event Mapping
| Claude Code Event | CESP Category | Sound Examples |
|---|---|---|
SessionStart | session.start | ”Ready to work?”, “Yes?” |
Stop | task.complete | ”Work, work.”, “Job’s done!” |
PermissionRequest | input.required | ”Something need doing?”, “Hmm?” |
PostToolUseFailure | task.error | ”I can’t do that.”, “Son of a bitch!” |
PreCompact | resource.limit | ”Zug zug.” (pack dependent) |
| Rapid prompts (3+ in 10s) | user.spam | ”Me busy, leave me alone!” |
Slash Commands
PeonPing includes two slash commands for Claude Code:/peon-ping-toggle
/peon-ping-toggle
Mute/unmute sounds and notifications instantly. Persists across sessions.
/peon-ping-config
/peon-ping-config
Modify any setting (volume, packs, categories, etc.) without editing config files.Or just ask Claude to change settings:
- “Set volume to 0.3”
- “Enable round-robin pack rotation”
- “Add glados to my pack rotation”
Local vs Global Install
Global install (default) Hooks registered in~/.claude/settings.json, packs in ~/.claude/hooks/peon-ping/packs/. Works across all projects.
Local install
Packs and config in ./.claude/hooks/peon-ping/, but hooks are still global (with absolute paths). Useful for per-project pack bindings.
Configuration
Config location:- Global:
~/.claude/hooks/peon-ping/config.json - Local:
./.claude/hooks/peon-ping/config.json
Subagent Filtering
Claude Code’s Task tool spawns parallel subagents. By default, each subagent completion plays a sound. To only hear the parent session’s completion:config.json or use the /peon-ping-config slash command.