You're on hold. The agent is working. Might as well lean into it.
Hold the Vibe plays looping elevator music the moment your AI agent starts grinding — because watching tokens scroll is dull, and you're just sitting there anyway. When the agent wraps up, the music stops and you get a little ding. That's the cherry on top, not the point.
Install from Marketplace · How it works · Contributing · Report a bug · Discussions
✨ Why this exists
You kicked off an agent. Now you're watching it think, edit, run commands — and there's nothing for you to do but wait. It's boring.
Hold the Vibe leans into that dead time with a joke: classic elevator hold music while the agent works. You're not really "on hold" with a call center — you're on hold with a language model — but the vibe fits. Sit back, let the muzak play, twiddle your thumbs, glance away from the screen.
The ding when it's done? A small bonus so you know the turn finished. The extension isn't a reminder app for people who forgot they sent a prompt. The music is the whole bit.
| Moment | What you hear | Role |
|---|---|---|
| Agent starts working | Looping elevator hold music | The main event |
| Agent finishes | A short completion ding | Nice extra |
Less silent staring. More please-hold energy.
🎬 How it works
By default the extension runs in Advanced Mode. Here's what happens during a single agent turn:
sequenceDiagram
participant You
participant Agent as AI Agent
participant Hook as Editor Hook
participant Bridge as Local Bridge
participant Vibe as Hold the Vibe
You->>Agent: Submit prompt
Agent->>Hook: beforeSubmitPrompt / UserPromptSubmit
Hook->>Bridge: POST /activity/start
Bridge->>Vibe: ▶ Start hold music
Note over Vibe: 🎵 elevator muzak — the whole joke
Agent->>Hook: stop / Stop
Hook->>Bridge: POST /activity/stop
Bridge->>Vibe: ⏹ Stop music + ding
Vibe-->>You: 🔔 Music stops, little ding (bonus)
In plain terms:
- You send a prompt to your AI agent.
- Your editor (VS Code or Cursor) fires a lifecycle "hook" the instant the agent starts working.
- A small script forwards that as a message to a tiny local server the extension runs on your own machine — nothing ever leaves your computer.
- The extension starts the hold music — that's the experience you're here for.
- When the agent finishes, the music stops and you hear a ding. Helpful, but secondary.
The Hook, the Bridge, and the music player are all just parts of this one extension — the diagram splits them into separate boxes only to make the order of events clearer.
Advanced Mode (shown above, and on by default) hooks directly into your editor's agent events, so the music and ding fire reliably on every turn. There's a small, real startup delay the first time audio plays each turn — spinning up the player takes a moment — but it never blocks or slows down the agent itself.
Notify Mode is a zero-install fallback for editors or setups where hooks aren't available. Instead of hooks, the AI can call a small "let the user know" tool built into the extension, and a backup check listens for terminal commands wrapping up. No files get written and nothing needs installing — but since it relies on the AI remembering to call that tool, it can occasionally miss a turn, which Advanced Mode doesn't.
⚡ Install
Option A — Marketplace (easiest)
Search Elevator Music in the Extensions panel, or install directly:
marketplace.visualstudio.com/items?itemName=joenberg.elevator-music
Or from the command line:
code --install-extension joenberg.elevator-music
# Cursor:
cursor --install-extension joenberg.elevator-music
Cursor users: if it's not in Cursor's built-in search yet, use the command above or grab the
.vsixfrom Releases and Command Palette → Extensions: Install from VSIX…
Option B — Download a release
Grab the latest .vsix from GitHub Releases, then Command Palette → Extensions: Install from VSIX… → select the file. Reload once.
Option C — Build from source
git clone https://github.com/joenb33/hold-the-vibe.git
cd hold-the-vibe
npm install
npm run compile
npm run package
Install the generated .vsix as above.
Option D — Hack on it
git clone https://github.com/joenb33/hold-the-vibe.git
cd hold-the-vibe
npm install && npm run compile
Open the folder, press F5, and use the Extension Development Host window that opens.
Heads up: While developing, run agent tasks in the new window — not your main editor.
🚀 Try it right now
- Look at the status bar (bottom-right) → Advanced (Cursor) or Advanced Mode
- Click it → Test hold music (3s) 🎵 then Test ding 🔔
- Ask your agent to do something real — refactor a file, run tests, whatever
- Enjoy the hold music while it runs; the ding is just the outro
If the muzak starts when the agent starts, it's working.
🎛 Two modes
| Advanced Mode | Notify Mode | |
|---|---|---|
| Setup | One-time hook install (automatic) | None |
| Hold music | ✅ Guaranteed | Best effort |
| Completion ding | ✅ Guaranteed | Best effort |
| Writes hook files | Yes (~/.cursor or ~/.copilot) |
No |
Advanced Mode is on by default — reliable hold music on every agent turn. Toggle via the status bar menu or elevatorMusic.advancedMode in settings.
🖥 Works where you code
| Editor | Hook support | Status |
|---|---|---|
| Cursor | beforeSubmitPrompt, stop, subagent events |
✅ Fully supported |
| VS Code + Copilot Chat | UserPromptSubmit, Stop, subagent events |
✅ Requires 1.109+ |
Both editors on one machine? Set elevatorMusic.installHooksForAllEditors to true when enabling Advanced Mode.
🔧 Settings worth knowing
| Setting | Default | What it does |
|---|---|---|
elevatorMusic.enabled |
true |
Master on/off |
elevatorMusic.advancedMode |
true |
Hooks + bridge vs Notify Mode |
elevatorMusic.volume |
80 |
Playback volume (%) |
elevatorMusic.dingCooldownMs |
2500 |
Anti-spam between dings |
Search elevatorMusic in Settings for the full list.
🎶 Sounds
Royalty-free audio, included:
| File | Source | License |
|---|---|---|
| Hold music | Short Elevator Music Loop by BlondPanda | CC0 |
| Ding | CHIMES - 4 by SamuelGremaud | CC0 |
Full credits: media/ATTRIBUTION.md. Swap in your own WAVs anytime via elevatorMusic.dingPath / holdMusicPath.
🛟 Troubleshooting
Works in Cursor but not VS CodeAdvanced Mode needs VS Code 1.109+ with GitHub Copilot Chat agent hooks. The extension registers ~/.copilot/hooks in your user chat.hookFilesLocations setting automatically — reload once after first install.
Check the status bar: Advanced Mode (not Advanced (no hooks) or Bridge unreachable). Run Elevator Music: Show Diagnostics and confirm VS Code hooks: installed and Bridge: owner or running.
Still stuck? Try Test hold music (3s) from the status bar menu — if that works but agent turns don't, hooks aren't firing (upgrade VS Code or re-enable Advanced Mode).
If diagnostics show hook activity but you hear nothing on Windows, check Output → Elevator Music for playback errors. Earlier versions spawned audio in a detached process that exited immediately on Windows.
Ding works but no hold musicLarge WAV files can take a moment to start on Windows. Check Output → Log (Extension Host) for [Elevator Music] Starting hold loop. Try Test hold music (3s) from the status bar menu.
The extension loads in the Extension Development Host window (the second window), not the one where you pressed F5.
Agent stops responding mid-turnUnrelated VS Code bug — see microsoft/vscode#301795. Try disabling Advanced Mode temporarily to compare.
Multiple editor windows openOne window owns the localhost bridge; others connect passively. Disabling Advanced Mode sends a clean shutdown to all windows.
More help? Open an issue, start a Discussion, or use Marketplace Q&A — we actually read them.
🤝 Contributing
Ideas, sounds, platform fixes, docs — all welcome. See CONTRIBUTING.md. Release process: RELEASE.md.
Good first PRs: alternative hold loops (CC0), macOS/Linux playback polish, README improvements.
📄 License
Hold the Vibe · Elevator music while your agent works. The ding is just the outro.
⭐ Star the repo if the joke landed · github.com/joenb33/hold-the-vibe