Hi everyone! I’m the developer of murmur, an open-source companion radio that runs in your terminal. I wanted something to listen to while coding that could choose music, talk between songs, and respond when I felt like joining in.
The host picks topics and keeps the program going without waiting for another prompt. You can type a reply or ask for music; the music lowers under its voice and comes back up afterward. Its personality and music preferences are editable in Markdown files.
How it works
- Claude, through the Claude Agent SDK, generates the host’s speech and makes music choices.
- A TypeScript engine handles scheduling, playback, and audio mixing.
- Speech is synthesized through a fish-speech endpoint, with upcoming segments prepared ahead of playback.
The most interesting engineering challenge has been continuity: an individual response can sound good while the overall listening experience still feels awkward. Timing the next segment, balancing speech with music, and handling interruptions have required actual listening alongside automated tests.
Demo — sound on: the video includes a narrated introduction and real app audio, including the host introducing and playing music.
Code and setup: wine-fall/murmur on GitHub
The code is MIT-licensed. The engine, memory, and mixer run locally, but Claude, hosted speech synthesis, and streamed music need network access. Setup currently requires Node.js 24+, a Claude Code subscription login, and a fish-speech endpoint; external services may have their own costs.
I’d love feedback from people building voice agents: how would you evaluate whether an always-on host is engaging without becoming distracting? If you try murmur, I’d also be interested in where the pacing feels unnatural.