Peon Ping — AI Agent Sound Notifications (peon-ping)
Installs peon-ping and the Peon Pet VS Code extension for game character voice notifications when your AI coding agent finishes or needs permission.
Supports Claude Code, GitHub Copilot, Cursor, OpenAI Codex, and many more IDEs.
Features
Section titled “Features”- Sound notifications: Warcraft, StarCraft, Portal, Zelda and 165+ sound packs
- Multi-IDE hooks: Claude Code (built-in), Copilot, Cursor, Codex via adapters
- Peon Pet extension: Animated orc sidebar companion reacting to agent events
- Devcontainer-aware: Routes audio to host via relay (
host.docker.internal:19998) — needs arunArgsaddition on native Linux Docker, see “Audio in Devcontainers” below - Non-interactive: Fully automated, idempotent installation
Basic Usage
Section titled “Basic Usage”This installs peon-ping with the default 5 packs (peon, peasant, sc_kerrigan, sc_battlecruiser, glados), registers Claude Code hooks, and installs the Peon Pet VS Code extension.
With All Packs
Section titled “With All Packs”Copilot Only + Specific Packs
Section titled “Copilot Only + Specific Packs”Options
Section titled “Options”| Option | Type | Default | Description |
|---|---|---|---|
packs |
string | default |
Sound packs: default (5 curated), all (165+), or CSV (e.g. peon,glados,murloc) |
packsLang |
string | "" |
Restrict pack selection to language(s), e.g. fr or en,fr — see “Choosing a pack” below |
noRc |
boolean | true |
Skip .bashrc/.zshrc modifications (recommended for devcontainers) |
ideSetup |
string | vscode |
IDEs to configure: all (vscode + cursor + codex), none, or CSV (e.g. vscode,cursor) |
volume |
string | 0.5 |
Default volume level (0.0–1.0) |
Choosing a pack
Section titled “Choosing a pack”packs already takes a single value ("glados", "zelda", a CSV list, default, or all), so there’s no extra option needed to pick one. The actual friction is finding a name among the ~165 packs in the registry (Warcraft, StarCraft, Red Alert, Portal, Zelda, Dota 2, Helldivers 2, Elder Scrolls, and more) — a static list here would just go stale. Use the tools built for that instead:
Or browse with audio previews at openpeon.com/packs.
Prefer a language over a specific franchise? Set packsLang instead of hunting for names:
This matches by each pack’s own language metadata (e.g. peon_fr, peasant_fr), not by
guessing at name patterns — the installer’s own --lang flag does the filtering. Leaving
packs at its default while setting packsLang searches the full registry instead of just
the 5 franchise picks below, since those 5 don’t all have a matching-language variant.
The default bundle is 5 packs:
| Pack | Franchise |
|---|---|
peon |
Warcraft (Orc Peon) |
peasant |
Warcraft (Human Peasant) |
sc_kerrigan |
StarCraft (Sarah Kerrigan) |
sc_battlecruiser |
StarCraft (Battlecruiser) |
glados |
Portal (GLaDOS) |
Audio in Devcontainers
Section titled “Audio in Devcontainers”peon-ping auto-detects devcontainer environments and routes audio to your host machine via a lightweight relay. You must start the relay on your host:
The container sends audio requests to host.docker.internal:19998.
On native Linux Docker (not Docker Desktop), this needs one more line — host.docker.internal doesn’t resolve out of the box there. Docker Desktop (macOS/Windows) injects that DNS entry automatically; plain Linux Docker doesn’t, so getent hosts host.docker.internal comes back empty without it. Add to your devcontainer.json:
A Feature can’t add this itself — runArgs is only read from the consumer’s top-level devcontainer.json. It’s safe to add unconditionally; on Docker Desktop it’s just a redundant, harmless duplicate of the entry that’s already there.
Testing the audio path
Section titled “Testing the audio path”- On the host:
peon relay --daemon, thenpeon relay --statusto confirm it’s listening. - Add the
runArgsline above todevcontainer.jsonand rebuild the container. - Inside the container:
getent hosts host.docker.internalshould now print an IP (previously empty on native Linux Docker). - Inside the container: check the relay port is actually reachable, not just the hostname resolving — e.g.
(echo > /dev/tcp/host.docker.internal/19998) 2>&1 && echo reachable || echo unreachable. If this saysunreachableeven after step 3 resolves, the relay on the host is likely bound to127.0.0.1only (not visible from the container’s network) rather than a devcontainer/Feature-side problem — checkpeon relay --statusoutput on the host for its bind address. - Trigger a real notification (finish an agent turn) and confirm you hear it.
If step 4 fails, that’s outside what this feature (or any devcontainer Feature) can fix — it’s the host-side relay’s own bind address, controlled by the peon CLI itself, not this repo.
Relay Commands
Section titled “Relay Commands”Note: Install peon-ping on your host machine first:
brew install PeonPing/tap/peon-ping(macOS) orcurl -fsSL https://peonping.com/install | bash
IDE-Specific Setup
Section titled “IDE-Specific Setup”Claude Code
Section titled “Claude Code”Hooks are registered automatically by the peon-ping installer in ~/.claude/settings.json. No extra configuration needed.
GitHub Copilot
Section titled “GitHub Copilot”The feature installs a helper script. Run it from your workspace root to generate .github/hooks/hooks.json:
Or add it to your devcontainer.json:
This creates hooks for SessionStart, UserPromptSubmit, PostToolUse, and Stop events using the Copilot adapter.
Cursor
Section titled “Cursor”When setupCursorHooks is true, hooks are written to ~/.cursor/hooks.json automatically. Events: afterAgentResponse, stop.
OpenAI Codex
Section titled “OpenAI Codex”When setupCodexHooks is true, the notify config is added to ~/.codex/config.toml automatically.
Other IDEs
Section titled “Other IDEs”peon-ping provides adapters for 15+ IDEs including Amp, Gemini CLI, Windsurf, Kiro, OpenCode, and more. After installation, adapters are available at ~/.claude/hooks/peon-ping/adapters/.
Peon Pet Extension
Section titled “Peon Pet Extension”The Peon Pet VS Code extension adds an animated orc to your sidebar that reacts to peon-ping events. It polls ~/.claude/hooks/peon-ping/.state.json every 200ms — no daemon needed.
Settings:
peon-pet.size:small,medium(default), orlargepeon-pet.character:orc(default)
Quick Controls (Inside Container)
Section titled “Quick Controls (Inside Container)”Version History
Section titled “Version History”- v1.0.5: Added
packsLang— restrict pack selection to language(s) instead of naming packs directly, e.g.packsLang: "fr". Passed straight through to the upstream installer’s own--langflag, which already understood per-pack language metadata; this just exposes it as a feature option. - v1.0.4: Fixed a Python syntax error in
install.sh’s Copilot hooks merge path (peon-ping-copilot-setup) — it crashed every time it ran against an existing.github/hooks/hooks.json. That helper now shares its merge logic with the samemerge_hooks_jsonused for Claude Code/Cursor instead of re-deriving it, and an existinghooks.jsonthat isn’t valid JSON gets backed up to.bakinstead of silently discarded. Corrected the “Audio in Devcontainers” docs:host.docker.internaldoesn’t resolve on native Linux Docker withoutrunArgs: ["--add-host=host.docker.internal:host-gateway"]in the consumer’sdevcontainer.json, which a Feature can’t add on its own. Added a “Choosing a pack” section pointing atpeon packs searchandopenpeon.com/packsinstead of adding a preset option —packswas already simple enough.
