Inspiration

Coding agents have become really capable now, they can do actual work. But we are still driving them the old way, typing long paragraphs into a chat box. Hands stay on keyboard, eyes stay on prompt. I wanted to just say the change I want, keep thinking about next thing, and hear back what happened. There is accessibility side also, for developers with RSI or low vision, coding by voice is not some fancy gimmick, it can be the only comfortable way to code.

What it does

Murmur is a VS Code extension for hands free pair programming. You just talk, like ChatGPT voice mode. Speak a task, realtime voice model picks up your editor context (active file, selection, git branch), makes a complete instruction from it and starts a background job with Codex CLI installed locally. Codex edits the workspace while you keep talking. Once job finishes, Murmur reads git diff and tells you out loud what changed. One job at a time, you can cancel it by voice also, and everything streams to output channel so you always see what agent actually did.

How we built it

First I wrote full spec, architecture, the four tool schemas (get_context, run_codex, read_diff, stop_codex), async job pattern for long running CLI work, and five milestones in strict order, each one with a manual test checkpoint. Then gave whole spec to Codex in one single thread and it built milestone by milestone. My role was product decisions and verifying each checkpoint, Codex wrote the code.

Architecture is two halves. Extension host (TypeScript) owns the OpenAI API key, mints short lived Realtime client secrets, spawns codex exec --full-auto as child process and runs tool calls. Webview (plain JS, no framework) captures mic, connects to Realtime API over WebRTC using only ephemeral secret, and bridges function calls back to host. Raw API key never enters webview.

Codex was fastest in exactly those parts where I am usually slowest, WebRTC session setup, VS Code webview messaging, esbuild and vsce packaging. What I brought was the constraints: always-on listening with server side VAD and one tap mute, one Codex job at a time, and rule that a realtime function call must return within a second.

Challenges we ran into

Realtime voice and minutes long jobs don't mix. A function call can't block till Codex finishes. So run_codex returns {status: "started"} immediately, model acknowledges verbally, and when process exits the extension injects a job finished message into live session and triggers fresh response, so assistant speaks up on its own and summarizes the diff.

GA event names of Realtime API are different from beta ones, transcript rendering silently broke while audio was working fine. Debugging something you can hear but cannot see is special kind of fun.

Also one supply chain scare at night. My Codex CLI started failing with missing binary error, same time when news of a malicious "Codex UI" npm package was going around. Before reinstalling I hash verified installed binary against official registry tarball. Turned out an interrupted install had truncated the binary, every byte present matched official build. Verify, don't assume, applies to toolchain also.

Accomplishments that we're proud of

  • Complete voice to working code loop, spoken request in, diff narrated back out, no keyboard in between.
  • Async job pattern keeps voice session responsive while agent works for minutes in background.
  • API key never leaves extension host, webview holds only a ten minute credential, confirmation dialog guards every workspace edit, and stop escalates SIGTERM to SIGKILL on whole process group.
  • Shipped everything in one day, spec to installable .vsix.

What we learned

Spec first prompting changes what an agent can do. Giving Codex full architecture, exact tool schemas and ordered milestones with human checkpoints gave far better results than iterating on vibes. Also learned a lot about WebRTC inside Electron webviews, ephemeral credential flows, and designing tool interfaces for a voice model where every response has to survive being read aloud.

What's next for Murmur

Wake word support, multi job queueing, voice driven review ("read me the diff hunk by hunk"), Windows and Linux polish. And I want to take the accessibility direction seriously, with feedback from developers who need it most.

Built With

Share this project:

Updates