By chendrizzy
Speak Claude Code progress aloud — local TTS daemon with smart content routing, hooks, and graceful degradation.
Diagnose claude-tts — disk, daemon, socket, Python deps, and backend reachability, with PASS/WARN and remediations. Idempotent.
First-run setup for claude-tts — bootstraps the engine, LLM backend, OS service, and config so Claude can speak.
Report claude-tts health — daemon socket, active engine and LLM model, and a recent log tail.
Stop and remove the claude-tts OS service and daemon, and optionally remove its config. Confirms before deleting.
Choose the speech engine and voice for claude-tts, then restart the daemon to apply.
Executes bash commands
Hook triggers when Bash tool is used
Modifies files
Hook triggers on file write and edit operations
Own this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimOwn this plugin?
Verify ownership to unlock analytics, metadata editing, and a verified badge. GitHub access is read-only (username + org membership).
Sign in to claimBased on adoption, maintenance, documentation, and repository signals. Not a security audit or endorsement.
Hear your coding agent. claude-tts speaks a curated, filtered stream of a Claude Code agent's work — the status pivots, the errors, the final answers — and stays quiet through the noise. A local LLM judges what's worth saying and summarizes the long bits; a TTS engine synthesizes it; Claude Code hooks drive the whole thing. Local-first and token-free by default.
Status: this repository is the sanitized core (daemon + filter brain + test gate). The one-command Claude Code plugin installer (
/tts:setup) is the next milestone; for now see Manual setup.
Claude Code hooks ──▶ unix socket ──▶ daemon
│
ContentRouter (classify · judge · summarize) ← the filter brain
│
QueueManager ▶ Orchestrator ▶ Generate ▶ Playback
(LLM provider seam) (TTS engine) (OS audio)
The filter brain is the value: it decides what to surface and how to phrase it. Synthesis and playback are swappable behind seams.
daemon/providers/) — judge(text) → speak? and
summarize(text) → str. Ships ollama (local default), openai_compat
(any OpenAI-compatible base_url: LM Studio, llama.cpp, vLLM, Groq, …), and
null (a deterministic, no-LLM floor — see below).daemon/pipeline/) — kokoro (local MLX), voicebox
(local app via REST), and edge-tts (cross-platform Azure voices).afplay; Linux auto-detects ffplay/mpv/pw-play/paplay/aplay (decoders first); Windows ffplay.With llm_provider.type = "null", the system still works using deterministic
rules: it speaks structured signals (test counts, errors, status) and drops
noise, summarizing by truncation. The LLM is an intelligence upgrade, not a
hard dependency.
uv.afplay + launchd) or Linux (auto-detected audio player +
systemd --user). On Windows, run the daemon manually or use WSL2/Docker.ollama pull qwen2.5-coder:1.5b. Or point at any
OpenAI-compatible server. Or run with no LLM at all.edge-tts (the edge extra, needs internet) or — on
Apple Silicon — kokoro via a separate mlx-audio interpreter (see below).git clone https://github.com/chendrizzy/claude-tts
cd claude-tts
uv sync --extra edge # base deps + the edge-tts engine
cp config.example.json config.json # edit to taste
Wire the hooks in hooks/ into your Claude Code settings (the registry is
hooks/hooks.json), then start the daemon (the SessionStart hook launches it
automatically). Verify it's alive: the daemon binds the socket in
advanced.socket_path and a test utterance plays.
edge-tts needs no extra setup. The kokoro engine runs
daemon/kokoro_worker.py under an interpreter that has mlx-audio installed
(Apple-Silicon wheels) — set MLX_PYTHON (see .env.example) or
voice.mlx_python to that interpreter. voicebox offloads synthesis to the
local Voicebox app via its REST API.
Copy config.example.json and edit. Every block is optional (the daemon embeds
safe defaults). Key knobs: voice.engine, llm_provider.type,
summarizer.model, filtering.max_response_length.
make verify is the binding quality gate — a deterministic, all-sync suite
(no live daemon, Ollama, or pytest-asyncio needed) that fails on markdown
leaking to speech, classification regressions, and path-humanization bugs.
uv run make verify
See CONTRIBUTING.md for the full test layout and how to add a provider or engine.
MIT © chendrizzy
npx claudepluginhub chendrizzy/claude-ttsAgent-agnostic Repo Church skills and CLI for Bible-grounded lifecycle gates, moat definition, ledgers, context loading, and phase handoffs.
Multi-model consensus engine integrating OpenAI Codex CLI, Gemini CLI, and Claude CLI for collaborative code review and problem-solving.
Memory compression system for Claude Code - persist context across sessions
Ultra-compressed communication mode. Cuts ~75% of tokens while keeping full technical accuracy by speaking like a caveman.
Comprehensive UI/UX design plugin for mobile (iOS, Android, React Native) and web applications with design systems, accessibility, and modern patterns
Standalone image generation plugin using Nano Banana MCP server. Generates and edits images, icons, diagrams, patterns, and visual assets via Gemini image models. No Gemini CLI dependency required.
Write feature specs, plan roadmaps, and synthesize user research faster. Keep stakeholders updated and stay ahead of the competitive landscape.