Chappie plays realistic Blue Switch mechanical keyboard sounds while Claude Code generates and runs tools — then a gentle alert ding the moment it pauses for your approval.
$ claude --plugin-url https://github.com/Mic-360/chappie
A complete tactile audio layer for Claude Code — engineered to feel like a real keyboard, not a metronome.
A flow-state typing model — sprint / cruise / deliberate bursts, fast finger-rolls, in-word acceleration, and sentence-length cadence.
A gentle notification ding when Claude halts for your approval. Typing pauses instantly so the ding cuts through clean.
Six WAV assets download on first run via curl/wget and cache in ~/.claude/sounds/. Nothing is embedded or shipped.
A cross-platform audio engine on rodio (WASAPI / CoreAudio / ALSA). Just two crates: rodio and rand.
The daemon opts into Windows efficiency mode and below-normal priority to stay light on battery and CPU.
Driven entirely by Claude Code lifecycle hooks — UserPromptSubmit, PreToolUse, Notification, Stop and more.
Built-in /chappie:setup to repair or reinstall the daemon, and /chappie:status to check its health.
Rhythm constants live at the top of main.rs — typo chance, pitch range, word length, idle shutdown. Tweak and rebuild.
On first session a prebuilt daemon downloads itself for your OS — Windows, macOS or Linux, Intel or ARM. No Rust toolchain, no build step.
Claude Code hooks fire a one-shot binary that writes a nonce-tagged signal file. A long-running Rust daemon polls it and reacts to every signal exactly once.
| Claude Code Event | Signal | Daemon Behavior |
|---|---|---|
| UserPromptSubmit | start | Begin playing typing sounds |
| PreToolUse | typing | Continue / resume typing sounds |
| PostToolUse | typing | Continue / resume typing sounds |
| Notification | alert | Pause typing → play alert ding → idle |
| Stop | stop | Return to idle, silence |
| SessionEnd | quit | Shut the daemon down immediately |
Each write carries a unique nonce, so concurrent hook invocations can never clobber an alert or stop — the daemon reacts to every signal exactly once.
The daemon models a fast, fluent typist. It drifts between three flow states — re-rolled every 10–30 words and weighted heavily toward speed.
Peak velocity. Fingers fly — short bursts of pure momentum.
The comfortable default — steady, fluent, sustainable pace.
Slower, considered keystrokes — the rhythm of thinking it through.
Edit the constants at the top of src/main.rs and rebuild.
| Constant | Default | Description |
|---|---|---|
| ROLL_CHANCE | 0.22 | Chance a word opens with a finger-roll |
| TYPO_CHANCE | 0.06 | Chance of a typo + correction per word |
| WORD_LEN_MIN / MAX | 2 / 9 | Word-length range (skewed short) |
| MIN_PITCH / MAX_PITCH | 0.92 / 1.08 | Pitch randomization range |
| MIN_VOLUME / MAX_VOLUME | 0.62 / 1.0 | Volume randomization range |
| IDLE_SHUTDOWN_MS | 15000 | Idle time before the daemon self-exits |
Add the plugin — the Rust audio daemon downloads itself as a prebuilt binary on your next session. No build step, no Rust toolchain required.
Install straight from GitHub, or from this repository's marketplace.
On the next session, Chappie's SessionStart hook downloads the prebuilt daemon for your platform and caches it. No build, no Rust.
Inspect the daemon any time — or force a fresh reinstall if it ever stays silent.
Six WAV assets, downloaded once and cached locally. Each is used under its respective license.
Free, live-recorded mechanical key tones. · CC BY-NC 4.0
Nigh/OpenClickSound ↗Open-source, MIT-licensed, and lighter than a single browser tab. Your terminal has never sounded this good.