Turn your Cursor AI agent's work and your own typing into live, generative music.
While the agent reads files, runs commands, edits code, hits an error, and finally streams its answer, Agent Vibes builds tension and releases it like a film score. Pick a scene, hit play, and let the work compose the soundtrack. It's a free, open-source Cursor / VS Code extension built on Strudel, so every note is synthesized live in the browser: no samples, no streaming, no accounts, works offline.
Status: early V1. Cinematic is the most developed scene; techno, lo-fi, chiptune, piano, and jazz are functional and being tuned. The "react to your chat draft" feature is experimental and macOS-oriented (see Privacy & permissions).
Working with an AI agent is oddly passive: you fire a prompt, then watch a wall of text scroll by. Agent Vibes reframes that wait as a performance. The dramatic arc of an agent run maps onto a piece of music:
idle β prompting β thinking β working β (tension on failure) β the drop (response) β resolve
The music literally breathes with the work: failures create suspense, and the final answer is the drop.
Cursor agent βββ
ββ transcript JSONL (prompt, thoughts, tool calls)
ββ hooks (failures, response, stop, subagents) βββΊ Conductor βββΊ Strudel webview
your typing ββββ (state machine) (audio)
- Conductor (
src/conductor.ts): a small state machine holding three continuous parameters,intensity,tension, andcps(tempo), that ease toward per-event targets so the music breathes instead of jerking. - Signals
src/signals/transcript.tstails the newest Cursor agent transcript for the prompt, the agent's thoughts, and the live stream of tool calls (Read,Shell,Write, β¦). Each tool category colors the music differently.src/signals/hooksServer.tslistens on127.0.0.1:7777for Cursor hook events the transcript can't provide, most importantlypostToolUseFailure(the tension cue), plusafterAgentResponse(the drop) andstop(resolve).src/signals/typing.tsturns typing in open editors into gentle pulses.src/signals/draftWatcher.ts(experimental, macOS) reacts to the prompt you're composing in Cursor's chat box.
- Scenes (
src/scenes.ts): purestate β Strudel codebuilders. Each scene has a fixed identity plus a per-session randomized key/mode so every session sounds fresh. - Webview (
webview/main.ts): boots@strudel/web, receives state, and re-evaluates the pattern (throttled) so layers fade in and out smoothly.
| Scene | Vibe |
|---|---|
| Cinematic | Hans Zimmer-style build to a drop (the showcase scene) |
| Techno | Driving 4-on-the-floor build |
| Lo-fi | Warm, relaxed beats to code to |
| Chiptune | Bright 8-bit arpeggio energy |
| Piano | Einaudi-style neoclassical piano |
| Jazz | Smoky late-night swing |
Switch scenes live from the panel, or set a default with agentVibes.scene.
Agent Vibes installs straight from Cursor's extension marketplace (which is backed by Open VSX): open the Extensions panel, search Agent Vibes, and click Install. It's also available on the VS Code marketplace.
You can also install it directly from the Open VSX listing. See Publishing for maintainers.
git clone https://github.com/nafizb/agent-vibes-cursor.git
cd agent-vibes-cursor
npm install
npm run build # or: npm run watchThen press F5 in Cursor / VS Code to launch an Extension Development Host.
On first install, a Get started with Agent Vibes walkthrough opens to walk you through these steps.
- Open the player. It's a dockable panel you can reopen anytime from:
- the Agent Vibes item in the status bar (bottom right),
- the keyboard shortcut
Ctrl+Alt+V(Cmd+Alt+Von macOS), or - Agent Vibes: Start Jam / Open Player in the command palette.
- Click βΆ Enable audio (required once by the browser autoplay policy).
- (Optional) Run Agent Vibes: Install Cursor Hooks to wire failure/stop cues, then start a new agent chat so the hooks take effect.
- Give the agent a task and listen: ambient drone β bass + kick as it works β tension on failures β a lead at the drop when the response streams β resolution.
The player docks alongside the Terminal/Problems panel. Closing it just hides it β your jam keeps running and reopening is instant.
| Setting | Default | Description |
|---|---|---|
agentVibes.scene |
cinematic |
Active scene (also switchable live in the panel). |
agentVibes.hooksPort |
7777 |
Localhost port the extension listens on for hook events. |
agentVibes.enableDrumSamples |
false |
Reserved: load external drum samples (synth percussion is used by default). |
agentVibes.experimentalChatDraft |
true |
Experimental (macOS): react to your chat-box draft by polling Cursor's local SQLite store. See below. |
TL;DR: Agent Vibes is 100% local. No accounts, no telemetry, no network calls; your code and prompts never leave your machine. It's open source, so you can verify every line. To make the music react to your agent, it reads a few local Cursor signals; here's exactly what, and how to turn each off.
- Cursor hooks (how it hears failures/responses). To get cues the transcript
doesn't expose, Agent Vibes adds itself to Cursor's hook system: it writes a
tiny forwarder script to
~/.cursor/agent-vibes-cursor-hooks/send.shand merges entries into~/.cursor/hooks.json. That script does one thing: forward Cursor's hook payloads to a listener on your own machine (see below). It's installed automatically on first run for a zero-setup experience, and you can remove the entries fromhooks.jsonanytime to opt out. - Local HTTP listener on
127.0.0.1:7777(configurable) that receives those hook events. It's bound to localhost; nothing is exposed to your network. - Transcript reading. Tails the newest agent transcript under
~/.cursor/projects/**/agent-transcripts/to follow prompts, thoughts, and tool calls. Read-only; the music is generated from the shape of activity, not your content. - Experimental chat-draft watcher (
agentVibes.experimentalChatDraft, macOS). So the music can start mixing while you type a prompt, this reads Cursor's localstate.vscdb(read-only) to notice your draft changing. It uses undocumented Cursor internals, so it's clearly labeled experimental and may break on Cursor updates. Don't want it? SetagentVibes.experimentalChatDrafttofalseand it's fully disabled. (It also needs thesqlite3CLI on yourPATH.)
Everything above stays on localhost. Nothing is sent anywhere.
- Tuned for Cursor specifically: it relies on Cursor's transcript and hook behavior.
- All percussion is synthesized (a feature: offline, no asset loading), so don't expect large sample libraries.
- Tool failures aren't in the transcript, so failure-driven tension needs the hooks installed.
- Pattern aesthetics are early and meant to be tuned. PRs welcome.
Contributions are very welcome, especially new scenes and tuning of existing ones. See CONTRIBUTING.md for setup, architecture notes, and how to add a scene.
Maintainers can publish to the registry Cursor uses for extensions:
npm run package # produces a .vsix via vsce
npx ovsx create-namespace <publisher> -p <token> # one time
npm run publish:ovsx # or: npx ovsx publish -p <token>You'll need an Open VSX account, an access token, and a
namespace matching the publisher field in package.json. A GitHub Actions
workflow that publishes on tagged releases is included at
.github/workflows/release.yml.
MIT. Built with Strudel, a JavaScript live-coding music engine ported from TidalCycles. Thanks to the Strudel and TidalCycles communities.
