Important
Only tested on macOS. Not sure yet how it behaves on Linux or Windows.
I'm an engineer, but these days I solve the boring problems entirely by vibe coding. Somewhere along the way I felt I had lost the creativity and curiosity I used to have when writing code myself.
So I started thinking about how to make vibe coding fun again. miod is the first try: while the agent does the work, you get to hear it think, read, edit, fail and fix, with a little piece of music no one has heard before.
Feel free to add more moods, flavours and styles. Each mood is one row in hooks/moods.ts, each flavour one row in hooks/flavours.ts, each sound style one entry in hooks/styles.ts, and each wave look one file in hooks/waves/.
Feeling it's a bit too noisy? 🙉 No hard feelings. Just turn it off with /miod off.
A Claude Code mod (MIDI + mod) that writes music on the spot while Claude works. No music files, no library, no AI model.
-
Every task picks its own flavour (lo-fi, chiptune, ambient, jazzy and 8 more), key, scale (16 of them), chord progression, tempo, sound and theme.
-
The mood follows what the agent is doing. Every mood has 10 variants, and a new one is picked as the task goes: whenever the activity changes, and every 4 phrases. The task's flavour bends it too, so editing in a lo-fi task sounds nothing like editing in a chiptune one.
-
The faster it spends tokens, the busier the music.
-
Above the prompt, one line shows the mood, flavour, key, tempo and energy, with a wave under it that scrolls with the music, coloured by mood:
-
Tasks flow into each other: the next task fades in, in a related key. If no new task comes, a closing chord fades out at the end of the phrase.
Needs Claude Code 2.1.290 or newer, on macOS.
claude plugin marketplace add delexw/miod
claude plugin install miod@miod
Then start a new session.
/miod is it on or off?
/miod off stop the music
/miod on play again from the next task
/miod wave list the wave looks: bars, line, mirror, dots, pulse
/miod wave dots switch the wave to the dots look
Each row below is the mood's first variant. All 10 are in MOODS in hooks/moods.ts.
| The agent is… | When it uses… | Sounds |
|---|---|---|
| thinking | no tool | calm |
| reading | Read, Grep, Glob, MCP tools | airy |
| exploring | WebSearch, WebFetch | curious (lydian) |
| planning | TodoWrite, plan mode | hopeful (major pentatonic) |
| asking | AskUserQuestion | waiting, almost silent |
| editing | Edit, Write | bright (major) |
| running | Bash | driving beat |
| installing | npm, bun, pip, brew… install | patient (minor pentatonic) |
| testing | test, check, lint, tsc | focused (dorian), busy beat |
| shipping | git commit, push, merge, gh pr | triumphant (mixolydian) |
| deleting | rm -r, git reset --hard, git clean | ominous (phrygian), low drone |
| delegating | Agent | one harmony voice per subagent |
| failing | a Bash command that failed | tense (minor), until a command passes |
When several happen in one 8-beat phrase, the one higher in STRONGEST_FIRST (hooks/activity.ts) wins. A filling context window lifts the melody and, past 80%, adds a low drone.
The scales follow how musicians describe each mode (musical-u, Jiang et al. 2024).
- Mood variant: add a row to that mood's list in
MOODSinhooks/moods.ts. - New mood: add the name to
ActivityandSTRONGEST_FIRSTinhooks/activity.ts, map tools or commands to it there, and give it a list of at least 10 variants inMOODS. - Flavour: add a row to
FLAVOURSinhooks/flavours.ts. Each field nudges every mood: brighter or darker scale, busier or calmer, drums up or down, swing, bass line. - Scale or chords: add to
SCALESorPROGRESSIONSinhooks/theory.ts. - Wave look: add a file to
hooks/waves/that exports aWaveLook(how many rows, and adrawfunction), then list it inWAVESinhooks/waves/index.ts. - Style: add a wave function to
STYLESinhooks/styles.ts. It must return values between -1 and 1.
Then check it:
claude plugin validate .
claude plugin test .
Run a checkout without installing it with claude --plugin-dir <path to this repo>.
- Only tested on macOS, where Claude Code plays the audio through
afplay. - The sound is simple chiptune-style tones.
- miod only hears the session it's loaded in.