export async function revoke(sid) { await cookies.clear(sid) } export async function revoke(sid) { await cookies.clear(sid) // The cookie outlives the token, await tokens.revoke(sid) } A full IDE for Claude Code. It reads the answer out loud and walks you through the changes one diff at a time.
Sessions are dropping a few days after every deploy. Can you find out why?
One change at a time, in the right order, with the right reasons. It is the difference between reading a wall of code and watching a YouTube tutorial of the work that just happened.
Spot something wrong when the AI was explaining the code? Drop a comment and claude will take it from there. Your comments sits on the diff itself, not three scrolls up the chat.
Reading every answer is exhausting. With Codeio, the answers go to your ears, not eyes. Give it one afternoon and scrolling a wall of text feels like something you used to do.
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)
}The refresh path was the accomplice, so auth/refreshToken.ts now refuses a revoked family instead of quietly minting from it.
And there’s a test pinning it down: log out, replay the old refresh token, expect a refusal.
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.
Highlight the line that is wrong, say what you want instead, press Refine — and the code you were dreading never gets written at all.
Claude can take minutes to finish. If you have walked away from the screen, sound is the only way it can reach you.
Codeio has the whole workspace built into it, so you never miss your code.
1
function apply(): void {
2
hold(forWork, working && getSettings().keepAwake, 'prevent-display-sleep')
3
// No setting consulted, deliberately. See the note above.
4
hold(forVoice, announcing, 'prevent-app-suspension')
5
}
6
/** The first turn started, or the last one ended. */
7
export function setWorking(next: boolean): void {
8
working = next
9
apply()
You, just now · uncommitted
1098
}
11109
/** The voice took the floor, or the queue drained. */
121110
export function setAnnouncing(next: boolean): void {
131211
announcing = next
141312
apply()
151413
}
161514
/** Shutting down. Drop both holds; nothing here outlives the app. */
171615
export function dispose(): void {
181716
working = false
191817
announcing = false
201918
apply()
212019
}
~/codeio $ npm test ✓ holds the display only while a turn runs ✓ holds the system for as long as the voice speaks 28 passing (412ms) ~/codeio $
The editor keeps VS Code’s bindings rather than inventing a dialect, and the voice is driven the same way. There is nothing new to learn to move over.
The editor
The voice
These are the ten you will use most. There are plenty more available.
Both models come inside the app. There is no voice service to sign up for and nothing to download later. The voice works the first time you open it, even with no internet.
your computer
Both models are in the download. The app is not allowed to fetch one while it runs.
Anthropic
Codeio runs on the Claude Code you already pay for. Nothing else to buy, paste, or set up.
A working claude command If that runs in your terminal, you are ready. How to check
Codeio is in beta. macOS first, then Windows and Linux.
Get CodeioFree while it is in beta · Uses the Claude Code login you already have