licenseMIT node≥18 depszero platformmacOS · Linux · Windows
procedural · zero dependencies

Focus music
while your AI codes.

Every note synthesized on the spot — no MP3s, no audio assets. Your project gets its own arrangement, tiers escalate as the agent digs in, and a chime tells you when it's your turn again.

Browse all 10 genres
npm i -g vibeaudio && vibe --install-hooks
❯ claude "refactor the auth module"
◌ waiting for a prompt
♫ genre · lofi
tier 1 — gentle intro
20 seconds

See it. Hear it.

the gap this fills

15–45 seconds of silence is exactly long enough to be annoying.

01

Agents think

Reasoning, reading files, writing code — a real turn takes 15 to 45 seconds. Long enough that a blank cursor feels broken.

02

Tabbing away means polling

Switch tasks and you're back checking every few seconds anyway — which defeats the point of switching at all.

03

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.

why not just a playlist

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.

calm technology

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.

listen

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-hooks
outcome-aware

Three chimes, three meanings.

Ctrl+C is silent on purpose — an aborted run is never reported as done.

seeded, not random

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.

pick your integration

Hooks, wrapper, or MCP.

Recommended

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.

works with

Drop into what you already use.

Claude Code · hooks Codex · hooks Cursor · hooks Grok · hooks Gemini CLI · hooks Copilot CLI · hooks Qwen Code · hooks Windsurf · hooks Antigravity · hooks Claude Desktop · MCP any command · wrapper

Not affiliated with or endorsed by the tools named.

new in v0.25.1 · claude code

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.

features

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.

[ ♫ ▃▅▆▇█▇▆▃ lofi (0:24) ] Terminal — zsh

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.

tmux status bar set -g status-right '#(vibe --statusline)'
set -g status-interval 5
Starship prompt · starship.toml [custom.vibe]
command = "vibe --statusline"
when = "command -v vibe >/dev/null"
format = "([🎧 $output ]($style))"
macOS Voice alert vibe --events | jq --unbuffered -r 'select(.event=="waiting") | .project' | while read p; do say "$(basename "$p") needs you"; done
Webhook · waiting and stuck 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
Home Assistant · smart light 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
get started

Six commands.

1

Install globally.

npm i -g vibeaudio

Fixes land on main before they reach the registry — npm i -g github:kiril6/vibeaudio installs straight from there, no clone and no build step.

2

Wire it into your agent or install as a native plugin.

vibe --install-hooks

Auto-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.

3

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-hooks
4

Audition a genre before committing.

vibe --preview jazz
5

Keep the one you liked. Installed hooks pick it up on your next prompt — nothing to reinstall.

vibe --genre jazz --volume 25
6

Nothing playing? The first line says why, with the command that changes it. vibe --doctor checks the rest of the setup.

vibe --status

Every flag, every troubleshooting note, every hook dialect: the full README. The package lives on npm.