See it. Hear it.
15–45 seconds of silence is exactly long enough to be annoying.
Agents think
Reasoning, reading files, writing code — a real turn takes 15 to 45 seconds. Long enough that a blank cursor feels broken.
Tabbing away means polling
Switch tasks and you're back checking every few seconds anyway — which defeats the point of switching at all.
VibeAudio fills it
Music while it thinks, a chime when it's done. You keep reading, writing, or just breathing — and know the instant it's your turn.
When the music stops, it's done.
A playlist plays the whole time, so you tune it out — and it can't tell you anything. VibeAudio plays only while your agent is working. The silence is the signal.
Starts when you prompt
No play button. The moment you hit enter, the music comes in — and builds the longer the agent digs.
Stops when it's done
A chime says how it went — success, failure, or "your turn" when it needs your permission. You can look away without checking back.
Never the same playlist
Every note is generated from your project, so there's nothing to skip, no ads, and no track that pulls your attention.
Designed to be ignored, until it matters.
VibeAudio follows the idea Mark Weiser and John Seely Brown called calm technology (Xerox PARC, 1995): information that stays at the edge of your attention and comes to the front only when it should. You stop hearing the music, and you notice the moment it changes.
Background by default
The music doesn't react to every file read or command. Steady sound fades from attention, and that's the point.
Front only when it counts
Done, failed, needs you: three chimes, three meanings. A heartbeat joins only when an agent keeps failing, in under 1% of turns.
Calm, not alarming
"Needs you" is a soft rising interval, not an alarm. A mute lifts on its own, so you can't forget it's on.
Ten genres, all synthesized.
Click a genre to hear a full simulated turn — gentle intro, main groove, deep focus, then the success chime. Only one plays at a time.
Heard one you like? It's one line.
npm i -g vibeaudio && vibe --install-hooksThree chimes, three meanings.
Ctrl+C is silent on purpose — an aborted run is never reported as done.
Your repo, your sound.
Your working directory seeds the arrangement — the seed picks among hand-written, in-key progressions, it never invents harmony. Same repo, same sound, every time you come back.
Each piece is three bars that rotate through your project's own progressions, so a long turn moves through a phrase rather than replaying one bar for half an hour.
Want one project to sound different on purpose? vibe --genre zen --here saves a genre for that directory and everything under it, leaving your default alone. And vibe --render writes your repo's own session to a .wav — a whole run, every tier, ending on the chime.
Hooks, wrapper, or MCP.
Agent hooks
Music starts the moment you submit a prompt, stops the moment the agent finishes. No grace-window guessing. For Claude Code, Codex, Cursor, Grok, Gemini CLI, Copilot CLI, Qwen Code, Windsurf, Antigravity.
The wrapper
vibe <command> times the process itself. Right for anything that exits when its work is done — vibe npm test, one-shot agent calls, CI.
MCP
For clients with no hook system — Claude Desktop, VS Code and the like. The assistant decides to call vibe_play, so it's a suggestion, not a guarantee.
Drop into what you already use.
Not affiliated with or endorsed by the tools named.
The band and the pane.
The optional /vibeaudio mod puts your music above the prompt in Claude Code: switch genre, change the volume or mute in one click, even mid-turn, with no model turn and no tokens.
The details that keep it out of the way.
Stays out of your way
Grace window
Fast commands stay silent — music starts only past 1.5s.
Escalating tiers
Layers build as the agent digs deeper into a turn.
Several sessions
Music plays while any terminal is working and builds as more join; each gets its own chime.
Title-bar HUD
A live waveform in the terminal title — never corrupts a full-screen TUI.
Which session?
vibe --notify adds a desktop banner naming the project that finished, failed or needs you. macOS and Linux, off by default.
Say it out loud
vibe --speak adds a spoken line after the chime — "api: done." — when two or more sessions are going. System voice, fixed words, off by default.
Signals only
vibe --music off keeps the chimes, banners and events and drops the music. Your genre is waiting when you turn it back on.
Mute for calls
vibe --mute — expires in an hour so you never forget it's on.
Hears when it's stuck
When 4 of an agent's last 8 tool calls fail, a soft heartbeat joins the music — the loop that goes nowhere, made audible. With music off it plays once on its own.
Status line
vibe --statusline — one plain line for tmux or your prompt: working ×2, waiting: api. Empty when idle, about 40 ms, no jq.
Live dashboard
vibe --dashboard — a read-only page of every agent: waiting first, then stuck, then working. Local only, no dependencies.
Beyond agents
vibe --announce "deploy" --exit-code $? — the same chimes for CI runs, deploys and scripts. Always exits 0, repeats are dropped.
Build on it
vibe --state and vibe --events — every agent's state as JSON, for lights, menu bars and status lines.
Chime in key
The done chime is the tonic chord of the music you were hearing, so it lands as the resolution.
Where the time went
vibe --report — how long you waited on agents this week, on which projects, and how fast you got back to a finished turn. Add --card for a shareable image. Stays on your machine.
Self-check
vibe --doctor — every problem comes with the command that fixes it.
Zero deps, light footprint
Pure Node.js synthesis, rendered once to a cache and played by your OS's own audio player. No native bindings, no audio assets, no install scripts, nothing left running between turns.
Tells you what happened
Pauses for permission
A rising "your turn" chime when the agent is stuck on you.
Errors sound different
An API error or rate limit plays the failure chime, not success.
Esc stops it
Interrupt the agent, or have a hook block the prompt, and the music goes quiet — an abort is never "done".
It fades, not cuts
On macOS the music eases in and out, and a new volume reaches what is already playing within a second.
Honest exit codes
vibe claude && deploy behaves exactly like without the wrapper.
Easy to control
/vibe in Claude Code
Installing the hooks adds a slash command — /vibe mute 30, /vibe genre jazz — so you never leave the session to change the music. The optional /vibeaudio mod does it instantly, with a pane (mute, stop, genre with a preview, volume, speech, banners and announcements), a setup check (/vibeaudio doctor), per-project settings and an optional logo band above the prompt (/vibeaudio band on) with moving level bars, your week's totals and one-click mute, genre, volume and share card, an optional context and plan-limit readout (/vibeaudio usage on), and shows when you are muted.
A menu, if you'd rather not
Run vibe with no command: pick your agent, genre and volume from a list, and press p to hear a genre before choosing it.
Reactive mode
The music tracks the tool the agent is using, not just the clock: reading stays calm, editing builds, shell commands and sub-agents peak. vibe --reactive --install-hooks
Safe install
--dry-run previews the change; your other hooks are never touched.
Terminal Title HUD
A live frequency wave in your window title — keeps full-screen TUIs, tmux panes, and terminal scrollback 100% clean without extra screen clutter.
set -g status-right '#(vibe --statusline)'
set -g status-interval 5
[custom.vibe]
command = "vibe --statusline"
when = "command -v vibe >/dev/null"
format = "([🎧 $output ]($style))"
vibe --events | jq --unbuffered -r 'select(.event=="waiting") | .project' | while read p; do say "$(basename "$p") needs you"; done
vibe --events | jq --unbuffered -c 'select(.event=="waiting" or .event=="stuck") | {event, project}' | while read -r l; do curl -s -X POST -d "$l" $URL; done
vibe --events | jq --unbuffered -c 'select(.event != "state") | {status, event, project}' | while read -r l; do curl -s -X POST -H 'Content-Type: application/json' -d "$l" http://homeassistant.local:8123/api/webhook/vibeaudio; done
Six commands.
Install globally.
npm i -g vibeaudioFixes land on main before they reach the registry — npm i -g github:kiril6/vibeaudio installs straight from there, no clone and no build step.
Wire it into your agent or install as a native plugin.
vibe --install-hooksAuto-detects Claude Code, Codex, Cursor, Grok, Gemini CLI, Windsurf, Copilot, Qwen or Antigravity. Rather be walked through it? Run vibe on its own for an interactive configuration menu.
/plugin marketplace add kiril6/vibeaudio/plugin install vibeaudio@vibeaudioType each one inside a Claude Code session. No npm install; the hooks need Node 18+ on your PATH.
Optional, for instant controls and a pane: /plugin install vibeaudio-mod@vibeaudio. It is a Claude Code mod, which runs inside Claude Code with your permissions, so read it first; it needs Claude Code 2.1.287+ and the vibe command. Update it with claude plugin update vibeaudio-mod@vibeaudio.
codex plugin marketplace add kiril6/vibeaudio && codex plugin add vibeaudio@vibeaudioRun in your shell. Codex asks you to approve the plugin's hooks once, as it does for any hook.
Make it react. The music follows what the agent is doing: quiet while it reads, fuller while it edits, busiest when it runs commands or spawns sub-agents. Off by default because some people prefer music that never shifts.
vibe --reactive --install-hooksAudition a genre before committing.
vibe --preview jazzKeep the one you liked. Installed hooks pick it up on your next prompt — nothing to reinstall.
vibe --genre jazz --volume 25Nothing playing? The first line says why, with the command that changes it. vibe --doctor checks the rest of the setup.
vibe --statusEvery flag, every troubleshooting note, every hook dialect: the full README. The package lives on npm.