Claude Code, out loud.
A desktop app that runs Claude Code and reads its answers aloud. The explanation goes to your ears, your eyes stay on the code — and the voice never leaves your machine.
Sessions are dropping a few days after every deploy. Can you find out why?
Found it — and it isn’t the deploy. revokeSession() clears the cookie, but it never touches the token store, so auth/refreshToken.ts goes on serving the old refresh token until it expires by itself.
That’s up to fourteen days, which is why it reads as a deploy problem: the deploy is only what rotates the pods and drops the in-memory cache that was hiding it.
I’ve moved the revocation into revokeSession() itself and made it idempotent, so a double logout can’t throw.
export async function revokeSession(sid: string): Promise<void> {
await cookies.clear(sid)
// The half that was missing: the token store outlives the cookie,
// so the family has to die here or it does not die at all.
await tokens.revokeFamily(sid)
}One caveat: this only helps sessions minted after it ships. The ones already out there, like a3f9c1e8-7b42-4d15-9e33-0c8f7a2b6d41, still have to age out.
Press / to type
Real audio — the Kokoro voice that ships inside the app, reading this answer. In Codeio it starts by itself; a browser wants the click first.
- Click a sentence to hear it from there
- ←→ step a sentence
- Space play or pause
- Esc stop
Your eyes were
already busy.
An agent answers with two things at once — an explanation and a diff — and hands you both down the same narrow channel: reading. Codeio moves one of them to your ears, and the two stop taking turns.
-
While it works
A turn runs for a minute, or four. You can sit and watch a pane scroll, or you can open the file it just touched — either way the reasoning arrives in your ears, sentence by sentence, as it is written.
-
While you read the diff
The explanation of a change and the change itself stop competing for the same eyes. It talks you through the edit while you are looking at the edit, which is the one arrangement a terminal cannot give you.
-
When you get up
Stand up, make coffee, leave the window behind you. You come back knowing what it found instead of scrolling up to reconstruct it.
What you hear is not
what it wrote.
Agent output is written to be read. Spoken verbatim it would be a machine reciting file paths, brackets and hashes at you. Two deterministic passes fix that before a single syllable is synthesized — no model in the loop, nothing to wait for.
- Prose Spoken
Sentence by sentence, synthesized as it streams, so sentence one is playing while sentence two is still being written.
- Tool calls and results Shown, never spoken
The reads, the greps, the edits and their output stay on the page. This is the layer that guarantees you never hear a diff.
- Code blocks Announced
A fence is summarized upstream — “7 lines of TypeScript code” — and the body is left on screen for your eyes.
Then every sentence is made sayable — in place.
The Verbalizer is an ordered pipeline of pure rules with one contract: verbalize, don’t interpret. It never says what a token is, only how to say it — so its worst case is stilted, and never wrong. Every row below is its real output.
| Written | Heard | Why |
|---|---|---|
getUserToken() | get User Token | A symbol is said as its words. The empty parens are silent. |
auth/refreshToken.ts | auth slash refresh Token dot T S | A path is read as a path — never described as “the file”. |
9f2c1ab | this hash | Character soup becomes a fixed aside instead of seven letters. |
a3f9c1e8-7b42-4d15-… | this ID | Same rule, longer soup. |
~250ms | about 250 milliseconds | Units and tildes are spoken, not spelled. |
#482 | number 482 | A hash mark in front of digits is an issue, and issues have numbers. |
Synthesis outruns playback at about 0.6× realtime, so the voice never stalls mid-answer. First audio lands around 800 ms after Claude starts writing — paid once per turn, against the seconds it spends thinking first.
The voice never leaves
your machine.
Both models ship inside the app. There is no voice API, no key to paste, no account to make, and nothing to install after the download — you open it and talk, offline, on first launch.
| Kokoro 82M | q4 | Voice | ~90 MB |
|---|---|---|---|
| Whisper base.en | q8 | Transcription | ~76 MB |
The weights sit in the app bundle, outside the read-only archive, where native code can actually reach them. The app is forbidden from fetching a model at runtime: if a weight is missing that is a broken build, not something to paper over with a download.
-
No API key
Codeio drives the claude you already have, signed in the way you already signed in. It never asks for a key and never touches model billing.
-
No cloud voice
Speech-to-text and text-to-speech both run in-process. Your microphone audio and the synthesized reply exist only on your disk and in your speakers.
-
Your transcripts stay put
Conversations, cues and playback timings are rows in a SQLite file in your app-data directory. There is no server to sync them to.
It is a whole desktop app,
not a speaker bolted on.
The voice is the reason it exists. Everything under it is the working surface you would have wanted anyway.
- Projects
- Point it at folders on your machine. Each keeps its own conversations, files and git state.
- Concurrency
- Several conversations run at once — three turns in flight, the rest queue behind them.
- Resumable
- A conversation is a session id, not a live process. Idle costs nothing; resuming keeps the full context.
- Editor
- Syntax highlighting from the same engine VS Code uses, plus blame, a change gutter and inline diffs.
- Workbench
- File tree, search, source control and a real terminal, on the right where you left them.
- Push to talk
- ⌘T opens the mic, Esc closes it. Nothing is listening the rest of the time.
- The transcript
- Click a sentence to hear it. ← and → step a sentence at a time; ⇧, and ⇧. change the speed.
- Local storage
- Conversations, cues and audio timings live in a SQLite file on your disk.
Put it on and get back to work.
Codeio is in beta. The macOS build goes out first; Windows and Linux are packaging, not a rewrite.
Get CodeioFree while it is in beta · You bring your own Claude Code login