Skip to content

v0.1.0 - first public release

Choose a tag to compare

@Quigleybits Quigleybits released this 18 May 10:11

cctts v0.1.0

First public release. Speak assistant responses through your speakers, per terminal, with Microsoft edge-tts under the hood.


cctts is a Claude Code plugin that turns the assistant's responses into spoken audio. It exists because reading Claude's output while you're driving the keyboard with two other tools open is a tax on attention, and because hearing the assistant talk back lets you stay in flow on long planning sessions without your eyes locked to the terminal. The synthesis layer is Microsoft edge-tts, accessed over its public WebSocket endpoint with no API key required, so the cost of running the plugin is zero ongoing dollars and the audio quality is comparable to commercial neural TTS.

The first principle to know about cctts is that it is per-terminal by convention. Every flag that changes how speech behaves — picking a voice, changing rate or volume, pausing, resuming, toggling the Notification readback or the tool-call chime — defaults to scoping that change to the terminal you ran it in. If you have three Claude Code sessions open and you change the voice in one of them, only that session changes. The other two keep whatever voice they were using. This sounds obvious in description but it is genuinely the design decision that makes the plugin pleasant to live with. Use dash-g to broadcast a change globally, dash-p to write it as a per-project override, or omit both to scope to the current terminal alone. Precedence is fixed and easy to keep in your head: per-terminal beats project beats auto-voice beats global default.

Auto-voice is the feature that takes per-terminal scope and makes it concrete. On first contact, each terminal gets assigned a distinct slot from a curated pool of nine English voices spanning US and UK accents. The pool is deliberately small so that you can tell at a glance which terminal is speaking just by the voice, and the assignment hands out the lowest free slot — terminal one hears Aria, terminal two hears Ava, terminal three hears Jenny, and so on, cycling back to slot one only once all nine are in use. If you want to pin a specific terminal to a specific voice, the slash command cctts colon voice lets you browse and choose; the magic phrase cctts dash N (with N from one to nine) does the same in one keystroke. The voices themselves are edge-tts neural voices and they pronounce technical jargon, file paths, and command flags surprisingly well.

The control surface in the running terminal is built around a small vocabulary of magic phrases you type as a raw prompt — no slash, no LLM round-trip. Bare cctts on its own toggles speech on or off for this terminal. cctts dash pause pauses playback; cctts dash resume picks it back up from where it stopped; cctts dash skip jumps past the currently-playing block and continues the queue; cctts dash stop kills the current block and any queued blocks for this terminal only; cctts dash reset clears this terminal's voice, rate, volume and toggle overrides (add dash-g to clear every terminal). cctts dash notify toggles spoken readback of Notification events — both permission prompts and the idle "Claude is waiting for your input" nudge — and cctts dash chime toggles the PreToolUse tool-call chime and matching Stop chime — both are independent of prose, which always speaks when cctts is on. Rate and volume have their own sigils: cctts percent-N sets speech rate as a percent of original speed (percent-100 is one-times, percent-115 is the default, percent-200 is two-times), and cctts bang-N does the same for volume between bang-1 and bang-200. You can chain them — cctts dash 3 percent-150 bang-80 sets voice, rate, and volume for this terminal in one shot. In daily use the workhorse trio is pause, resume, and skip — they're the commands that respect your actual attention, letting you bring the audio back when you tune in and silence it when you tune out. cctts dash replay re-speaks the most recent block when you missed something, and cctts dash status prints the resolved configuration for the current terminal stacked against project and global so you can see exactly which setting is winning where.

Project overrides exist for the case where one repo benefits from different defaults than the rest of your work. A noisy build pipeline on a particular project might want the chime off; an audio-heavy app might want the assistant to default to faster speech. The dash-p form of any flag scopes the change to the project root and writes it to dot-claude slash cctts dot json, so opening Claude Code in that directory uses the project settings automatically and your other projects are unaffected. It's the same flag grammar as global, just narrower in reach. Project overrides also include a paused field — cctts dash p dash pause silences every terminal whose working directory is inside this repo, which is the right tool for projects whose output you'd rather not have read aloud at all.

Two underlying capabilities shape what the plugin can do and deserve a callout. The first is the F3 prewarm cache. Run cctts dash prewarm once after install and the plugin synthesizes the canned acknowledgments and chimes for every voice in the pool and stashes the resulting audio on disk. When the assistant says one of those phrases later, playback starts effectively instantly because the audio is already on disk. The prewarm takes about forty-five seconds, the footprint is a few megabytes, and it's safe to re-run — it skips entries that are already cached. The full speech cache builds up the same way during normal use, keyed on text, voice, rate, and volume, evicting LRU at one hundred megabytes or two hundred files. The second capability is the five-thousand-character page cap. When an assistant response exceeds five thousand characters, cctts speaks the first page, chimes, and announces "five thousand character limit reached, say cctts minus more to continue." Type cctts dash more and the next page resumes from the last clean sentence boundary before the cap — the cut is sentence-aware so you never get clipped mid-thought, and the pending continuation is per-terminal so two parallel sessions can each have their own tail waiting.

A few smaller things round out the picture. The slash commands are a discoverable companion to the magic phrases for when you don't remember the flag — cctts colon settings opens an interactive picker for voice, rate, toggle, and test; cctts colon voice opens the voice picker on its own; cctts colon test with no argument also opens the voice picker, while cctts colon test followed by a number plays a fixed test phrase in that voice, and cctts colon test followed by free text speaks that text at the current voice. cctts colon help is the reference card. One privacy note worth saying out loud: every spoken block leaves your machine to be synthesized by Microsoft's edge-tts endpoint, so don't enable cctts in sessions handling secrets or anything sensitive — the environment variable CLAUDE underscore TTS underscore DISABLED equals one is a hard kill switch for such sessions.

cctts ships under the MIT licence. Platform support is honest: Windows is first-class and tested across the release-prep cycle, while macOS and Linux code paths exist in the source but are flagged experimental until somebody runs the manual smoke tests on real hardware. If you're on Windows, install through the Claude Code marketplace, fully restart Claude Code so the UserPromptSubmit hook registers, let the assistant speak its first response, and you should be off to the races. If you're on macOS or Linux, the plugin will probably work, but please file issues with anything that misbehaves around audio paths or pause-resume timing — those reports are the bottleneck on flipping the platform notice to first-class for everyone.

Install via slash plugin marketplace add Quigleybits slash cctts followed by slash plugin install cctts at quigleybits, fully restart Claude Code (a soft reload won't pick up the hook), run cctts dash help for the command reference, and try cctts dash test quote hello quote to confirm audio is flowing. From there the assistant should start talking on the next response.