My hands hurt and my couch was warm, which is the origin story of every bad decision in computing. So I did the thing 2026 keeps daring me to do: closed the laptop lid most of the way, ran /voice, and tried to ship a feature with my mouth and nothing else. No keyboard. No dignity. Just me, a mic, and an LLM doing its level best to turn mumbling into camelCase.
Reader, it mostly worked. "Mostly" is doing the kind of structural load-bearing you'd normally want a beam for.
The pipeline is a game of telephone with extra steps
Here's the stack, because the jokes don't land unless you know where the bodies are buried: mic → speech-to-text → optional LLM "cleanup" pass → prompt → agent → tool calls. Every arrow is a coin toss that entropy gets to call. The STT mishears a word, and then — this is the cursed part — a second model "helpfully" rewrites the wrong word into something confidently grammatical and completely insane.
Two layers of guessing stacked like a sandwich nobody ordered. The transcriber gambles on the phonemes; the cleanup model gambles on the intent; and somewhere downstream an agent takes the output as gospel and starts writing files.
Claude Code's voice mode does try to defend you, to be fair. Per the docs it's tuned for coding vocabulary — it nails regex, OAuth, JSON, and localhost, and it auto-injects your project name and current git branch as recognition hints. Genuinely smart. The catch is the implied threat model: everything on the hint list is safe, which tells you precisely what happens to everything off it. Your business-logic variables are unhinted and out in the cold, one radiator clank away from being renamed.
It also makes you hold Space to talk, push-to-talk style, and won't auto-submit a prompt under three words — a small mercy that stops a stray "uh, yeah" from launching an agent. The first keypress after a pause sometimes eats itself to a warmup quirk, so your opening syllable goes missing and the transcript starts mid-thought, like a podcast you joined late.
The couch is the adversary
There's a number that haunted me. Real-world dictation runs about 97% accurate with a wired mic in a quiet room. It slides to 93–95% on a laptop's built-in mic, ~92% on a phone with earbuds, and ~88% in a noisy room.
So let's do the comedy math. Built-in mic, reclined, fan running — call it a generous 92%. At 92% word accuracy, a 200-word prompt ships with roughly sixteen wrong words. Sixteen rolls of the dice per prompt. Sixteen chances to name a variable after a noise my radiator made.
Whisper Large V3 Turbo can hit 97–98% fully on-device in good conditions, sure. But "good conditions" and "horizontal on a couch metabolizing a burrito" are different conditions, and no model has solved the burrito.
Then I summoned a second AI by accident
I need you to believe this one really happened, because it's the most on-brand failure mode in the whole field.
I was killing a dead helper and said, out loud, to no one: "okay, let me clean up this code, ex the dead function."
"Code, ex."
That, it turns out, is a documented voice trigger for OpenAI's Codex CLI — it answers to the spoken homophones "code x" and "code ex." I reached for a delete and instead conjured a second coding agent, fully armed, ready for an opinion nobody requested. One mic, one offhand sentence, two AIs now in the room — and the homophone is also a real product name, so this isn't even a fluke. I didn't fat-finger a command. I mouth-fingered it. There's no keybinding to take it back. The phonemes already left the building.
This isn't a bug. It's what happens when your command surface is the English language — a thing optimized over millennia for ordering food and gossiping, not for unambiguous tool dispatch.
The homophone that became a variable
Josh Comeau, who actually codes hands-free full-time with Talon, has written about the canonical trap: "site" vs "sight" vs "cite." I hit it inside four minutes.
I said "update the site config." What landed in the prompt was sightConfig. The agent — bless it, no eyes and no shame — took sightConfig at face value, decided that was the established name, and built on it. Consistently. Threaded it through three files. By the time I noticed, my codebase had a coherent, well-factored, fully-wired concept of sightConfig: a thing that does not exist and never should.
This is the pipeline's signature dish. STT emits natural-language English, and then a model has to guess that into an identifier. "User I D" is a three-way coin flip between userID, userId, and user_id. "Fetch the user's data" can smuggle the apostrophe-s straight into a method name, and now you've got getUsersData, where the user is plural for no reason and the linter is the only one who cares.
Tools literally advertise "Variable Recognition" as a paid feature — Wispr Flow charges $15/month for, among other things, code-syntax understanding. Advertising that is the confession. It's the product equivalent of a restaurant putting "we wash our hands" on the menu. You can pay fifteen dollars a month for the privilege of not naming a variable sight — which, going by their 2.7-star Trustpilot, is apparently still a coin flip.
The part that genuinely shipped (and it's the boring part)
Here's the twist that isn't a cop-out, because it's just true: the stuff that shipped clean was the prose-shaped stuff.
The feature description? Flawless. Dictating a paragraph of "here's what I want, here's the constraint, here's the edge case" is exactly what STT was built for — that's natural language on home turf. The plan was great. The commit message was honestly the best one I'd written in a month, because I was talking, and talking makes you explain yourself. The test descriptions — it('returns 404 when the project is archived') — came out perfect, because they're sentences wearing a function's coat.
What needed hands was the syntax-shaped stuff. The actual logic. The off-by-one. The exact bracket. The moment you need } and the model hands you the word "brace" rendered thoughtfully into a comment. Voice got me 80% of a feature and 100% of the scaffolding; the last mile was a keyboard and a sigh.
Which lands you on the 2026 consensus, the unsexy one nobody puts in a launch tweet: nobody ships production code entirely by voice. The winning pattern is hybrid — voice for thinking, planning, prompting, and prose; keyboard for the final syntax. Comeau, a full Talon user, clocks himself at roughly half his normal speed, and reports the real enemy after eight hours isn't even misrecognition. It's voice strain. Your throat is not load-bearing infrastructure. Mine found out.
One sincere line, because I'm not a monster
The couch bit is a luxury, and I want to be careful with it, because voice coding didn't start as a gag for tired developers. Talon Voice exists because engineer Ryan Hileman lost the use of both hands to RSI in 2016 and built the thing he needed to keep working. Cursorless layers a spoken grammar over an actual AST, so you can edit code structurally by voice — genuinely clever, not a party trick.
For a lot of people, this is the only way in. So when I say it "mostly worked," understand that "mostly" is carrying weight that someone else's whole career rests on — and that's the part that should make you root for the 92% to keep climbing.
The verdict
Would I dictate a feature from my couch again? Yes, immediately, because I have learned nothing.
But the honest review: voice coding is a phenomenal front-end for an agent and a terrible finger. Use it to describe, to plan, to narrate the why. Then sit up, put your hands back on the keys for the part where precision is the whole point, and — for the love of all that compiles — keep git diff open, because somewhere in there is a sightConfig: watching, waiting, fully wired, ready to ship.
