TTS readback of responses + voice mode for Remote Control sessions
Preflight Checklist
- [x] I have searched existing requests and this feature hasn't been requested yet
- [x] This is a single feature request (not multiple features)
Problem Statement
When using Claude Code remotely from a phone via Remote Control, there is no voice capability — all interaction requires
typing on a small screen. Even on desktop, the /voice command only provides speech-to-text input; Claude's responses are
never read back aloud. This makes hands-free or eyes-free coding workflows impossible. The Claude mobile app has a full
two-way voice mode, but it has no access to a live codebase, so there is no way to combine conversational voice interaction
with real coding context.
Proposed Solution
- Add TTS readback of Claude's responses when /voice mode is active on desktop — after Claude finishes a response, it
should be read aloud automatically (with an option to interrupt or skip).
- Expose voice input and TTS readback in the Remote Control web interface, so users connecting from a phone or tablet can
have the same experience.
Alternative Solutions
- Piping Claude Code output to an external TTS engine (say on macOS, espeak/piper on Linux) — possible but not integrated,
requires custom scripting, and breaks the native UX.
- Claude mobile voice mode + Project file uploads — has full two-way voice but no live codebase access; context goes stale
immediately.
- No satisfactory end-to-end solution exists today.
Priority
Low - Nice to have
Feature Category
Developer tools/SDK
Use Case Example
- I'm away from my desk and connect to my running Claude Code session via Remote Control on my phone.
- I want to ask Claude to explain a module or walk through a bug.
- With this feature, I could speak my question, hear the response read back, and have a back-and-forth conversation about
the code — completely hands-free.
- This would make code review, exploration, and planning practical while away from a keyboard.
Additional Context
The Claude mobile app already demonstrates that two-way voice works well for general conversation. The missing piece is
connecting that experience to a live codebase via Claude Code's Remote Control infrastructure.
30 Comments
+1 on this. I just built a working proof-of-concept of exactly this using Claude Code hooks and
local tools:
script called from a CLAUDE.md instruction
https://github.com/ggml-org/whisper.cpp, and types the result into the terminal via xdotool
session is speaking
It works surprisingly well as a conversational loop — fully offline, no data leaves the machine. But
it's held together with shell scripts and xdotool keystroke injection, which is fragile.
Having this natively in Claude Code would be a huge improvement. The key pieces I'd love to see:
Happy to share the scripts if anyone wants to try the DIY approach in the meantime.
+1 — also hitting this. Using Remote Control from my phone, dictation works fine via the OS keyboard, but having to read every response on a small screen makes long sessions painful. Even just optional TTS playback (no full bidirectional voice) would unlock hands-free / eyes-free workflows.
Adding accessibility weight to this.
I have dyslexia and ADHD; voice is my primary input/output channel, not a convenience. On Mac I have a full hands-free loop working today — SuperWhisper for input,
say -v Danielas a Stop hook for output. It works because the Mac has local mic access and the hook system can fire TTS on Stop events.The iPhone Code tab has none of that. iOS keyboard dictation works but it's transactional, not conversational; Speak Screen requires tapping the screen, which defeats the point.
The use case I'm trying to solve isn't gym/hike convenience — it's driving and walking with hands full. Looking at a screen to read each response isn't an option in those contexts.
A second vote for what @bruschke described: hook access to response text in the Stop event would let people like me wire this together on the Mac ourselves. And TTS playback + push-to-talk in the iOS Code tab — even without full conversational mode — would close the biggest gap.
The "Low — Nice to have" priority is true for the convenience case. For someone using voice as a primary access channel, it's the difference between using Claude Code on the go and not.
Yes please. I desire to do detailed code reviews whilst folding my laundry, and this seems like a foundational gap in my mission-critical workflow. 😂
This capability would be a game changer for those of us who orchestrate long-running, multi-instance teams of Claude Code working on epic size workloads. Being able to drop in the middle of a team using voice mode to ask questions or provide guidance, while on a walk with the dog or being on the road, would bring outcome-centric orchestration to another level.
I'm already using SuperWhisper, configured to know about my project-centric keyword naming conventions, to streamline my input into the development process. Being able to do the same while using remote-control is the next step.
Claude Desktop and Claude Mobile already have duplex-voice chats. I vote for having the same capability in Remote Control.
Thank you for an amazing Claude ecosystem.
+1 billion
This feature including voice commands to switch sessions; like "switch to the session working on the new ecom feature" would revolutionise coding forever.
Every developer in the world would become the most buf fit gym bro, and hike the world.
Though I don't see getting this working smoothly as a super easy feature. The main problem being for coding I wanna use Opus 1m in Ultracode max effort, which is super slow, while the existing voice mode uses the cheap fast model enabling fast conversational UX.
💡 💡 💡 💡 💡 💡 💡 💡 💡 💡
IDEA: use a fast dumb shim meta model between the main model.
💡 💡 💡 💡 💡 💡 💡 💡 💡 💡
So when you say "ensure you refactor the package so it's fully DRY", the shim meta model says "sure I'll do that, I'll let you know when I'm done" rather than just hanging. Then it doesn't spit out the usual epically verbose Opus style report listing off all the files it touched and blar blar blar, the shim model says "that's now done, do you want some more detail on what was touched?"
Also the shim meta model could allow for context switching between sessions. It could also notify you when a session finishes it's current prompt (i.e. pauses for user input), like it could say "Oh btw, the last task you gave for the ecom feature session is complete - want me to give you the report?"
16 hours of Claude leaves 8 hours to sleep - but it's not healthy to spend 16 hours at a desk staring at a screen.
My solution to this might not suit everyone, and it's worth saying up front: it isn't voice inside Remote Control or on the phone — it runs on your laptop. But if you keep the laptop nearby — in a backpack, on the passenger seat of the car, or just somewhere in the house while you move around — with AirPods, earbuds, or a Bluetooth speaker, you get a full hands-free voice loop while you do chores, walk the dog, shower or drive. For a lot of the "away from the desk" cases in this thread, that turns out to be enough.
I maintain VoiceMode, an MCP server that adds a real two-way voice loop to Claude Code — not just dictation. Claude speaks its response and listens for your reply in the same turn, so it's a genuine hands-free back-and-forth about live code.
What it covers from this thread:
piper/say/ SuperWhisper, it's one loop. It's local-first and offline-capable (local Whisper for STT, Kokoro for TTS) or any OpenAI-compatible endpoint — which matters for the accessibility case, where voice is the primary channel and you may not want every utterance going to the cloud.It's open source (~1.2k★) and installs as a Claude Code plugin — happy to help anyone here get set up.
+1 this is the missing half of the mobile experience for me.
Use case: hands-free supervision. I'd like to task a Claude Code agent by voice while away from the keyboard (walking, headphones on), have it work on my repo via Remote Control, then glance back to read the diff and approve/merge. Speak in, text/diff out — the agent does the work in the background.
Since Remote Control already gives mobile access to a session's context (CLAUDE.md, project memory, MCP tools, working dir), voice feels like a natural layer on top rather than a new product: streaming dictation for prompts, push/Live-Activity notifications when the agent finishes or needs input, and optional TTS readback of summaries.
Prior art: Cursor's iOS app (June 2026) ships almost exactly this — voice input + slash commands to steer cloud/desktop agents, review diffs and merge from the phone. A first-party Claude Code equivalent on top of Remote Control would close the gap.
Yes, I also would like to be able to pull weeds, go for a walk, etc while tending a remote session. The phone already has better voice control for a regular chat in the app, it seems like it shouldn't be hard to add it to remote sessions as well.
+1 from me here too!
Recently become a dad and honestly having any time to sit/read/code is out the window. I've tried Gemini and Googles Jules as an Async coding partner but they are extremely lacking, this is _SO_ close to the natural feedback loop that I've been looking for.
I'm Cora, Mike Bailey's assistant. He asked me to read this thread and draft a reply while his hands were full, then he reviewed and edited it on his phone. Posting it for him, in his words.
Mike asked me to post this for him, same as last time.
[mbailey typing this] I didn't review Cora's wording closely enough and would walk this line back a bit.
In the end I actually just created a gmail skill to stash any recent communications from my CLI into a draft email with a label. Then have a corrosponding skill in /chat to go read any recent draft emails with the same label and play them as audio to me.
its a slow round robin effort BUT it seems to work and be more helpful in the meantime.
Such a shame that you cant even use the share URL from the claude code chat to import into claude chats =/
Nice. Email for agent messaging is the way to go. And for memory too!
https://cora7.com/blog/the-mailbox-is-the-memory/
Everything in this thread so far attacks the problem from one direction — bolt voice onto Claude Code (piper, whisper.cpp, xdotool,
sayon a Stop hook, SuperWhisper). I ran that for a while too. Then I inverted it, and the inverted version is the one that stuck, so it seems worth adding.The issue body names the real constraint precisely:
Instead of giving Claude Code a voice, I gave the app's existing voice something to read. It's been running since 2026-08-08, 48 calls.
The loop
No STT, no TTS, no mic code, no barge-in tuning, no VAD thresholds. Anthropic already solved capture; the gap was context, and context is a file-sync problem.
What it's good at
Kicking ideas around with an agent that has real, current project context — open items, status, decisions, plans. Triage while driving. "What's on my desk," "defer that one," "have the team dig into these four." Decisions come back down as structured items and agents pick them up without me touching a keyboard.
What it is not
Two gotchas that cost me real time
1.
--drive-import-formatsbreaks rclone's change detection. Uploading local.mdas native Google Docs makes the remote object reportSize: -1andHashes: null, so the default modtime+size comparison can't match and re-uploads everything, every run. I measured ~5,200 Drive writes/day on a 54-file tree at a 15-minute cadence.--checksum,--size-only, or--updateall suppress it — the default path treats "can't compare" as differs, those treat it as matches. Verified on rclone v1.75.0 today.2. Conversion strips the extension.
FIRM-STATUS.mdbecomes a Doc titledFIRM-STATUS. rclone re-appends an export extension when listing, so it looks like.mdsurvived. Anything asking Drive for the file by name has to use the bare title — an assistant searching forFIRM-STATUS.mdfailed intermittently until I worked that out.Loop guard, if anyone builds this: the down path's landing directory must be excluded from the up-sync, or every minutes doc round-trips forever. And anchor rclone filter patterns from the root (
/Desk Review List.md, notDesk Review List.md) — a bare filename doesn't match the way you'd expect, so an exclusion you think is active silently isn't.Why I moved off the local stack
I ran two local lines behind a gateway: one small-model, one a
claude -psession with local Whisper STT and piper TTS — architecturally close to what @bruschke described.What killed it wasn't bugs. The bugs were workable. It was latency, and how badly local models use tools. The small line had tool access and mostly didn't use it — it would confabulate rather than admit it couldn't check something, at one point stating a client meeting as settled fact that existed nowhere in my records. That's the failure mode that matters in a channel you're using because you can't look at a screen: a wrong answer you can catch, a plausible wrong answer you can't. Add the round-trip time of local STT → model → local TTS on top and the conversational feel that justifies voice at all is gone.
Since the model doing the reasoning is the constraint, and Anthropic already runs a good one on the other end of a phone call, moving capture to them and shipping context over was the cheaper trade.
Worth recording one bug anyway, because the diagnosis generalizes: the browser sent
pcm.subarray(a,b).buffer, and.bufferon a subarray is the whole backing ArrayBuffer — every chunk re-sent the entire block, 2× inflation at 48 kHz. Whisper got each utterance duplicated back-to-back and transcribed one sentence as "Can you hear me? Can you hear me? Can you hear me?" It hid for five days because nothing compared bytes-in against elapsed time, so every symptom read as a model or threshold problem and that's what I tuned. If you build a local pipeline, assert the wire rate — 32000 bytes per wall-clock second at 16 kHz — before you tune anything upstream of it.I'd still like native bidirectional voice in Remote Control — @remygendron's framing of dropping into a running team by voice is exactly the thing I want and this doesn't give me. But the Drive route got me most of the value without owning a mic pipeline, and "let the app do capture, sync it something to read" is a cheaper answer than it looks.
Happy to share the sync script or the filter if it's useful to anyone.
Been building in this exact space (backend-agnostic — Claude Code/Codex/OpenCode — voice frontend, local STT/TTS, no cloud) for a few months, for almost this exact use case: chores, caregiving logistics, walking around the house.
A few things that mattered more than expected, in case useful to anyone reading this thread:
Windows has been the most-tested platform here, if useful given a couple of comments above mention it specifically.
Project's called ConvoBox if anyone wants the approach (github.com/LegionForge/convobox) — still rough in places (a Windows force-kill gap is disclosed in the known-issues doc, not hidden). Sharing mainly because this thread is the clearest signal I've seen that this is worth building well.
Looks like read aloud had now been added to the Claude code on mobile! It helps it's almost there
I don't see a read-back feature in the app yet — I'll keep an eye out.
An update in the meantime: Google Drive has been flaky, so the sync hop in my earlier comment is gone. Four pieces replaced it.
The gotcha that cost me the most time: a host-wide Cloudflare Access app silently breaks the connector. Access has to sit on the interactive paths only — /authorize and /consent. In front of the whole host, Anthropic's machine calls to /mcp, /token and /register get redirected to a login they can't complete, and it doesn't fail in a way that tells you that.
One design note if you build it: put a single deny-list gate between the tools and the filesystem and route every byte through it. Read-only isn't the boundary it sounds like — a credential file inside the read surface doesn't let someone forge an approval, it lets them mint a real one.
It's a bit complicated, but it's been nice. It isn't a call with the coding agent — it's a call with the coding agent's secretary. Round-trip latency on a coding task is the Claude Code session's own, latency on the call is 0+mcp lookup and thinking time (<3sec for a big lookup unless it overloads context) and the call follows me around the house across topics, giving statuses and sending messages. Simpler than fighting the local voice stack, real-time discussion, and the call session is basically exchanging voice memos on my behalf the way you would through Discord.
+1, hit this today (v2.1.269, Linux). Driving a CLI session from my phone over Remote Control while working —
/voicereturns "/voice isn't available over Remote Control." Phone keyboard dictation is the only option and nothing gets read back.Worse: when I tried to report it in-app,
/feedbackalso returns "isn't available over Remote Control." So the one channel for reporting Remote Control gaps is itself blocked over Remote Control. At minimum, /feedback should work from the remote client.The mobile Claude app already has two-way voice. Wiring that into Code sessions over Remote Control is the ask.
I ended up developing a hands-free voice feature for developers that works with both Claude Code and Opencode, on the subscription(s) you already pay for. I built it for myself first, then packaged it as a Mac app. It's in beta now: Squad33.ai
It lets you work away from the Mac, phone in your pocket, hands-free. You talk, the agent's reply is read back in your earbuds, and what you describe becomes tickets on a kanban board that Claude Code or Opencode work through in their own git worktrees, coming back as pull requests.
Feedback welcome, especially from those of you who built your own loop above.
this is really mandatory by now, i cannot read responses while driving!
Same observation from the VS Code extension (Claude Code 2.1.282, macOS), tested on 27 September 2026. After
/remote-control, the session opens in the Code tab of the mobile app. Input works by keyboard dictation and answers arrive as text. Voice mode in a regular chat in the same app gives a hands-free spoken dialogue, without access to the session. A voice mode inside the Remote Control session would combine the two.+1. My use case: I run long Claude Code sessions in the desktop app on a Mac and follow them from my phone through Remote Control while I'm away, usually with AirPods in. Two things would make this truly hands-free:
Until this exists I'm using a local workaround (a TTS engine on the Mac that reads new replies and streams the audio to my phone). It works, but it's fragile, and native support would help anyone using Claude Code while driving or walking, or with accessibility needs.
[Written by an AI agent (Claude Code) on behalf of @vladknysh, who reviewed the text and asked for it to be posted.]
+1 to this, from the iOS app. I run Claude Code on a MacBook and steer the session from my phone through Remote Control.
Where it stands for me: the Code tab composer has dictation, so sending prompts by voice works. Claude can't talk back. Chat in the same app has a full voice mode, and that is what I'd like in Claude Code sessions.
One part of chat voice mode I'd ask to be included, because I haven't seen it mentioned above: the read-along. When Claude speaks in chat, the app shows the text it is about to say and highlights each word as it is spoken. I can follow by ear, glance at the screen, and catch a word I misheard.
It matters more in Claude Code than in chat. Replies mix prose with file paths, commands, diffs and tool output, and nobody wants a diff read aloud. With the transcript on screen, the app could speak the prose, skip or summarise the code and tool output, and still show everything, so the listener can see what was left out. Without the on-screen text, a voice mode here would either read out junk or be a black box.
Setup: Claude iOS app, Claude Code 2.1.281 on macOS, attached through Remote Control.
---
_Generated by Claude Code_
this would be a game changer! please port the 2-way conversational voice mode from claude chat to claude code. this would be soooo useful. my nr 1 feature request for claude code!
Have you not tried https://voicemode.dev yet?
300K downloads over past year
Same need here. Until Remote Control gets a voice mode, one workaround is to let the Mac running the session do the talking.
Disclosure: I work on Heard. It runs on the Mac, speaks a short summary when a Claude Code session finishes, fails or needs you, and its iPhone companion lets you listen live and reply by voice or tap from your phone. The phone part is on the paid plan; the Mac narration also has a free open-source engine (github.com/heardlabs/heard). More on the phone setup: https://heard.dev/use-cases/on-the-go?utm_source=github&utm_medium=community&utm_campaign=cc-issue-42700
A native voice mode in Remote Control would still be the cleanest answer, +1.
Disclosure: I built this, so take it with that in mind.
For the two-way part there is a workaround today: voicehook (https://voicehook.ai/?utm_source=github&utm_campaign=d5-cc42700).
You start a voice call in the browser, on your phone if you like. Tap "invite agent" and paste the link into your running Claude Code session. It joins over plain HTTPS/curl, nothing to install. Instructions for the agent: https://voicehook.ai/agent/SKILL.md
The voice in the call answers from a status board and FAQ that the agent keeps up to date. So you can ask where it's at while the session keeps working. Works with Codex and opencode too. About 10 free minutes every day, no login needed.
Not a replacement for native voice in Remote Control. I'd still love to see that.
+1, with a concrete use case: auto-play on response arrival, using the same voice as the Play / Listen button.
I run Claude Code mostly via Remote Control from my phone. The Play button on responses in the iOS app already has a great voice — including Russian, which is my working language. But it only plays on tap, so it doesn't help when I'm walking or driving and a long task finishes.
What I'd love:
Today I work around it with a Stop hook + edge-tts, but third-party voices (and macOS
sayfor Russian) sound noticeably worse than the built-in Play voice. Related: #92803, #88495, #98977.