{"id":49047029,"url":"https://github.com/sherifbutt/claude-image-tts-gen","last_synced_at":"2026-04-27T20:00:48.702Z","repository":{"id":352209201,"uuid":"1214174108","full_name":"sherifButt/claude-image-tts-gen","owner":"sherifButt","description":"Multi-provider AI image and text-to-speech generation, packaged as a Claude Code plugin and MCP server","archived":false,"fork":false,"pushed_at":"2026-04-18T11:26:39.000Z","size":122,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-18T13:22:42.140Z","etag":null,"topics":["claude-code","gemini","image-generation","mcp","mcp-server","openai","openrouter","tts"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sherifButt.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-18T08:03:50.000Z","updated_at":"2026-04-18T11:26:44.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/sherifButt/claude-image-tts-gen","commit_stats":null,"previous_names":["sherifbutt/claude-image-tts-gen"],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/sherifButt/claude-image-tts-gen","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sherifButt%2Fclaude-image-tts-gen","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sherifButt%2Fclaude-image-tts-gen/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sherifButt%2Fclaude-image-tts-gen/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sherifButt%2Fclaude-image-tts-gen/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sherifButt","download_url":"https://codeload.github.com/sherifButt/claude-image-tts-gen/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sherifButt%2Fclaude-image-tts-gen/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32352406,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-27T17:12:42.749Z","status":"ssl_error","status_checked_at":"2026-04-27T17:12:41.658Z","response_time":128,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["claude-code","gemini","image-generation","mcp","mcp-server","openai","openrouter","tts"],"created_at":"2026-04-19T18:04:28.379Z","updated_at":"2026-04-27T20:00:48.691Z","avatar_url":"https://github.com/sherifButt.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Claude Image \u0026 TTS Generator\n\nMulti-provider AI image and text-to-speech generation, packaged as a Claude Code plugin and MCP server.\n\nProvides multi-provider support, tier abstraction, batch mode, end-to-end cost tracking, MCP elicitation/sampling/notifications/resources, and a reproducible sidecar workflow.\n\n## Why this MCP is different\n\nThere are plenty of MCP servers that wrap one vendor. This one wraps **five** (Google Gemini, OpenAI, OpenRouter, ElevenLabs, and any OpenAI-compatible local server) behind a consistent interface, and adds the cross-cutting concerns that a thin wrapper leaves to you:\n\n- **One knob (`small | mid | pro`) spans every provider.** Code written for Gemini works unchanged against OpenAI or a local Kokoro model — swap `--provider` and the call still runs. No per-vendor quirks in your prompt code.\n- **Cost-aware from the first call.** Per-call + session + per-project ledgers, hard daily/weekly/monthly budget caps enforced *pre-call* (not after the charge), dry-run `estimate_cost` that ranks every provider/tier combo, and a $0 cache for identical repeats. You know what a generation costs before you spend, and after.\n- **Reproducibility built-in.** Every output gets a hidden `.regenerate.json` sidecar with the full recipe (prompt, model, tier, params, lineage). `regenerate` re-runs it; `iterate` adds a tweak and threads parent → child. Prompts never get lost in chat history.\n- **Cross-cutting work is handled once, not per provider.** Provider failover with logged cost delta. Batch mode (50% off) where the vendor supports it. Long-text TTS auto-chunked at sentence boundaries and stitched via ffmpeg — **including reactive chunking when a provider rejects a single-call input as too long** (v0.7.0). SRT/VTT captions from ElevenLabs timestamps. Image post-processing presets for OG / Twitter / favicon / etc.\n- **Free local escape hatch.** Same plugin, same skills, same sidecars, no API key, no network, no bill — route to Kokoro-FastAPI, Speaches, Orpheus-FastAPI, or Chatterbox-TTS. The local provider is a first-class citizen, not a bolt-on.\n- **Proactive skills.** Claude invokes the plugin automatically when a task needs an image or narration, without the user having to ask. Slash commands exist for explicit control (`/gen-image`, `/gen-speech`, `/gen-cost`, …), but the default path is ambient.\n- **MCP-native UX.** Elicitation (`create_assets` asks batch-vs-sync when ≥2 prompts queued), sampling (prompt rewriter), notifications (batch job completion), resources (recent outputs in the asset panel), and structured errors everywhere — no raw provider error blobs.\n- **Zero-shot voice cloning.** `--reference-audio my-voice.wav` + local Chatterbox-TTS or Coqui-TTS/XTTS. Reference fingerprint is mixed into the cache key so the same text with different references doesn't collide. For ElevenLabs cloning, pass the Voice Lab ID via `--voice`.\n\n\u003e ## Run it 100% local — for $0/call\n\u003e\n\u003e Point this plugin at any **OpenAI-compatible local server** and generate images\n\u003e or speech without an API key, network round-trip, or dollar spent. Everything\n\u003e else (sidecar, cache, regenerate, iterate, variants, post-processing) just works.\n\u003e\n\u003e **Recommended backends:**\n\u003e\n\u003e | Backend | Install | Modality | Notes |\n\u003e |---|---|---|---|\n\u003e | [Kokoro-FastAPI](https://github.com/remsky/Kokoro-FastAPI) | `docker run -p 8880:8880 ghcr.io/remsky/kokoro-fastapi-cpu:latest` | TTS | **default.** Kokoro-82M, CPU-capable, 50+ voices. Currently #1 on TTS Arena. |\n\u003e | [Speaches](https://github.com/speaches-ai/speaches) | docker-compose | TTS + STT | Kokoro + Piper + Whisper in one container. |\n\u003e | [Orpheus-FastAPI](https://github.com/Lex-au/Orpheus-FastAPI) | clone + pip + LLM backend | TTS | Orpheus-3B with emotion tags (`\u003claugh\u003e`, `\u003csigh\u003e`, ...). Two processes. |\n\u003e | [Chatterbox-TTS-API](https://github.com/travisvn/chatterbox-tts-api) | `uv sync \u0026\u0026 uv run main.py` | TTS | Voice cloning. GPU recommended. |\n\u003e\n\u003e ```sh\n\u003e # Kokoro-FastAPI is default; for any other server, override the base URL:\n\u003e export LOCAL_BASE_URL=http://localhost:8880/v1\n\u003e\n\u003e # See what's loaded\n\u003e node mcp-server/dist/cli.js --check-local\n\u003e\n\u003e # TTS against the local server\n\u003e node mcp-server/dist/cli.js --speech -p \"hello world\" \\\n\u003e   --provider local --model kokoro\n\u003e ```\n\u003e\n\u003e Opt in via `LOCAL_ENABLED=true` to include the local provider in the failover chain.\n\u003e\n\u003e **Not supported as a TTS backend: [LM Studio](https://lmstudio.ai/).** LM Studio's\n\u003e OpenAI-compatible server only exposes `/v1/chat/completions`, `/v1/completions`,\n\u003e and `/v1/embeddings` — no `/v1/audio/speech` or `/v1/images/generations`. Running\n\u003e Orpheus or a diffusion model inside LM Studio will not make TTS or image\n\u003e generation work through this provider. Use Kokoro-FastAPI (or one of the others\n\u003e above) instead. `check_local` will flag an LM-Studio-style server with a warning.\n\n## Features\n\n### Generation\n- **6 providers** behind a single tier abstraction (`small | mid | pro`):\n  - **Google Gemini** (image: Flash + Imagen, TTS declared)\n  - **OpenAI** (image: gpt-image-2 ×3 quality; TTS: tts-1, gpt-4o-mini-tts, tts-1-hd)\n  - **OpenRouter** (image passthrough)\n  - **ElevenLabs** (TTS with friendly voice names + raw voice IDs)\n  - **🖥 Local (`provider: local`)** — any OpenAI-compatible server (Kokoro-FastAPI, Speaches, Orpheus-FastAPI, Chatterbox, ...). $0/call, no API key, no rate limit.\n  - **🎙 Voicebox (`provider: voicebox`)** — local-first voice studio ([voicebox.sh](https://voicebox.sh)) with 7 TTS engines (Qwen3-TTS, Chatterbox, Kokoro, ...), zero-shot cloning, 23 languages. $0/call, no API key.\n- **Image-to-image edits** via reference image input (gpt-image-2, Gemini multimodal, local server if it supports `/v1/images/edits`)\n- **Long-form TTS** auto-chunked at sentence boundaries, concat'd via ffmpeg. Triggers both pre-emptively (text \u003e provider's `maxCharsPerCall`) *and* reactively (provider rejects a shorter input as too long for output-duration / token reasons — a new `INPUT_TOO_LONG` code catches that and retries with chunking on the same provider, preserving voice)\n- **SRT / VTT captions** from ElevenLabs word-level timestamps\n- **TTS auto-play** on macOS via `afplay` (opt-in)\n- **Zero-shot voice cloning** via `--reference-audio \u003cpath\u003e` against `--provider local` + Chatterbox-TTS or a Coqui-TTS / XTTS server (for ElevenLabs cloning, create the voice on elevenlabs.io/voice-lab and pass its ID via `--voice`)\n- **Per-provider default voice env vars** (`GEMINI_DEFAULT_VOICE`, `OPENAI_DEFAULT_VOICE`, `ELEVENLABS_DEFAULT_VOICE`, `LOCAL_DEFAULT_VOICE`) so you don't have to pass `--voice` on every call. Only applied when the value is valid for the resolved slot, so a Gemini name won't leak into an ElevenLabs call.\n- **`voiceDefaulted` signal** on every TTS response — when you didn't spec a voice, the response says so, letting Claude catch mismatches before spending on a long run\n\n### Cost awareness\n- **14-model pricing table** with batch (50% off) rates and 30-day staleness warning\n- **Per-call cost** in every tool response; **session ledger** persisted to `~/.claude-image-tts-gen/session.json`\n- **Per-project tracking** (cwd-hashed) — `session_spend --project`\n- **Budget caps** (daily / weekly / monthly) — soft warn at 80%, hard block at 100%\n- **Dry-run** `estimate_cost` ranks all implemented (provider, tier) combos\n- **CSV / JSON receipt export** filtered by month\n- **`health_check`** pings each configured provider in parallel and reports pricing freshness\n\n### MCP-native UX\n- **Elicitation** — `create_assets` with `mode:'auto'` asks the user batch-vs-sync when ≥2 prompts queued\n- **Notifications** — `batch_status` fires `notifications/message` on completion transitions\n- **Sampling** — optional MCP-sampling-based prompt rewriter (image, on by default, opt-out)\n- **Resources** — recent assets exposed via `claude-image-tts-gen://output/` URIs for the asset panel\n- **Structured errors** with `code`, `message`, `suggestedFix`, `cause` across all tools\n\n### Workflow\n- **Cache** — identical (provider, model, modality, text, voice, params, reference) returns the cached file at $0\n- **Sidecar** (`.regenerate.json`) per output for full reproducibility\n- **`regenerate`** re-runs from a sidecar; **`iterate`** appends an adjustment and threads lineage\n- **`variants`** — N parallel generations with auto contact-sheet PNG; **`pick_variant`** soft-deletes the rejects\n- **Provider failover** on RATE_LIMIT / 5xx / timeout with logged cost delta\n- **Style + voice presets** — named reusable defaults applied via `style` / `voicePreset`\n- **Image post-processing presets** (OG / Twitter / favicon / app icon / LinkedIn / Instagram square + story) with optional webp\n- **Background remover** (`post_process --bg-remove`) — local ONNX cutout, $0/call, offline after first run. Cascades into preset resizes so `--bg-remove --presets og,instagram-square` produces transparent variants in one pass\n\n### Plugin surface\n- 7 slash commands: `/gen-image`, `/gen-speech`, `/gen-cost`, `/gen-budget`, `/gen-batch-status`, `/gen-presets`, `/gen-health`\n- 2 proactive skills: `image-generation`, `speech-generation`\n\n## Defaults (locked)\n\n- Default provider (both modalities): **Google Gemini Flash** (cheapest, supports batch)\n- Default budget: **$5/day**, hard cap (warn 80%, block 100%)\n- Free-tier handling: every call treated as paid (no Gemini quota tracking)\n- Prompt rewriter: **on** (opt-out per project with `REWRITE_PROMPTS=false`)\n- TTS auto-play: **off** (opt in with `AUTOPLAY=true`)\n\n## Installation\n\n### Claude Code (recommended)\n\nTwo commands inside a Claude Code session — no clone, no build:\n\n**Installation:**\n```prompt\n/plugin marketplace add sherifButt/claude-image-tts-gen\n/plugin install claude-image-tts-gen@claude-image-tts-gen-marketplace\n```\n\nBefore starting Claude Code (or in a fresh terminal before relaunching), export at least your Gemini API key — grab a free one at [aistudio.google.com/apikey](https://aistudio.google.com/apikey):\n```sh\nexport GEMINI_API_KEY='your-key'\n```\nSee [Configuration](#configuration) for the full env var list and per-provider voice defaults. The plugin registers its slash commands (`/gen-image`, `/gen-speech`, …) and MCP tools automatically on enable.\n\n**Update:**\n```prompt\n/plugin marketplace update claude-image-tts-gen-marketplace\n```\n\n\u003e Note: Claude Code caches marketplace data. If `/plugin install` shows an older version than [the latest release](https://github.com/sherifButt/claude-image-tts-gen/releases), run the update command above first.\n\nSystem dependencies (optional but recommended):\n- **`ffmpeg`** — required for long-text TTS concat and audio post-processing. macOS: `brew install ffmpeg`.\n- **`sharp`** — bundled with the MCP server via npm; no manual install needed.\n\n### Manual / development install\n\nIf you want to hack on the MCP server, run the CLI standalone, or use this outside Claude Code:\n\n```sh\ngit clone https://github.com/sherifButt/claude-image-tts-gen.git\ncd claude-image-tts-gen/mcp-server\nnpm install\nnpm run build      # bundles dist/server.js, dist/cli.js, dist/refresh.js\n```\n\nWire the built server into Claude Code manually:\n\n```sh\nclaude mcp add --transport stdio claude-image-tts-gen \\\n  --env GEMINI_API_KEY=$GEMINI_API_KEY \\\n  -- node /absolute/path/to/claude-image-tts-gen/mcp-server/dist/server.js\n```\n\nOr point any MCP-aware client at `dist/server.js` directly — the `mcpServers` block in `.claude-plugin/plugin.json` shows the env the server reads.\n\n## Configuration\n\nConfigure via **shell env vars** — set before starting Claude Code (typically in `~/.zshrc` / `~/.bashrc`) or export in the shell you launch Claude Code from. The plugin's `mcpServers.env` in `plugin.json` uses `${VAR:-default}` interpolation, so unset vars fall through to sensible defaults:\n\n```sh\n# Keys — set at least one, or run a local server (no key required)\nexport GEMINI_API_KEY=...        # default image + TTS provider\nexport OPENAI_API_KEY=...        # image (gpt-image-2) + TTS (tts-1, gpt-4o-mini-tts, tts-1-hd)\nexport OPENROUTER_API_KEY=...    # image passthrough\nexport ELEVENLABS_API_KEY=...    # TTS with timestamps\n\n# Per-provider default TTS voices (optional but recommended — saves passing --voice on every call)\nexport GEMINI_DEFAULT_VOICE=Charon     # male baritone (Kore is the Gemini default; Charon, Puck, Fenrir, ... are male-leaning)\nexport OPENAI_DEFAULT_VOICE=onyx       # male\nexport ELEVENLABS_DEFAULT_VOICE=\u003cid\u003e   # from elevenlabs.io/voice-lab\nexport LOCAL_DEFAULT_VOICE=am_adam     # depends on backend (am_* = male Kokoro voices)\n\n# Local server (Kokoro-FastAPI / Speaches / Orpheus-FastAPI / ...)\nexport LOCAL_BASE_URL=http://localhost:8880/v1   # default (Kokoro-FastAPI's port)\nexport LOCAL_ENABLED=true                         # opt-in to failover chain\n# Back-compat: LMSTUDIO_BASE_URL / LMSTUDIO_ENABLED are still read.\n\n# Voicebox (voicebox.sh) — local-first voice studio with 7 TTS engines\nexport VOICEBOX_BASE_URL=http://localhost:17493   # default\nexport VOICEBOX_ENABLED=true                       # opt-in to failover chain\nexport VOICEBOX_DEFAULT_VOICE=\u003cprofile_id\u003e         # from GET /profiles\n```\n\nOther optional:\n\n```sh\nexport GEMINI_IMAGE_MODEL=gemini-2.5-flash-image  # override default model\nexport IMAGE_OUTPUT_DIR=./generated-images\nexport AUDIO_OUTPUT_DIR=./generated-audio\nexport STATE_DIR=~/.claude-image-tts-gen          # ledger + cache + presets + budget\nexport REWRITE_PROMPTS=true                       # MCP-sampling prompt rewriter\nexport AUTOPLAY=false                             # macOS afplay after TTS\nexport EMIT_SIDECAR=false                         # skip .regenerate.json per output (see below)\nexport LOG_LEVEL=info\n```\n\n**Budget** isn't an env var — it's persisted in `~/.claude-image-tts-gen/budget.json` and managed via the `set_budget` MCP tool or `/gen-budget` slash command.\n\n### Persist across sessions\n\n`export` on the command line only lasts for that terminal. Append once to `~/.zshrc` and every new terminal — and every Claude Code session — inherits the values automatically:\n\n```sh\ncat \u003e\u003e ~/.zshrc \u003c\u003c'EOF'\n\n# claude-image-tts-gen\nexport GEMINI_API_KEY='paste-your-gemini-key'\nexport OPENAI_API_KEY=''                                  # optional, leave empty if unused\nexport OPENROUTER_API_KEY=''                              # optional\nexport ELEVENLABS_API_KEY=''                              # optional\nexport GEMINI_DEFAULT_VOICE='Charon'                      # male baritone on Gemini\nexport OPENAI_DEFAULT_VOICE='onyx'                        # male on OpenAI\nexport ELEVENLABS_DEFAULT_VOICE='\u003cvoice-id-from-voicelab\u003e' # raw voice ID\nexport LOCAL_DEFAULT_VOICE='am_adam'                      # male on Kokoro-FastAPI\nexport LOCAL_BASE_URL='http://localhost:8880/v1'\nexport LOCAL_ENABLED='false'                              # set to 'true' to include in failover\nEOF\n\nsource ~/.zshrc   # load in the current terminal; new terminals inherit automatically\n```\n\nKill + relaunch Claude Code to pick up the new values. Keys are plaintext in `~/.zshrc` — fine for a personal machine; avoid if the file syncs via GitHub dotfiles or is shared.\n\n## Sidecars (`.regenerate.json`)\n\nEvery generation writes a hidden sidecar file next to the output — e.g. for\n`docs/blog/hero.png`, the plugin writes `docs/blog/.hero.png.regenerate.json`.\nThe sidecar captures the full recipe (prompt, provider, model, tier, aspect\nratio, params, cost, lineage) so two tools work later:\n\n- **`regenerate \u003cpath\u003e`** — re-run the exact same brief. Useful for a fresh\n  roll of the dice on a prompt you liked.\n- **`iterate \u003cpath\u003e --adjustment \"warmer lighting\"`** — re-run with a tweak,\n  parent → child lineage tracked in the new sidecar.\n\n### How to deal with them\n\n- **Just use them.** The dotfile name keeps `ls` and most git UIs tidy.\n  `.gitignore` them with `.*.regenerate.json` if you don't want them in VCS.\n- **One-shot, don't want it:** pass `sidecar: false` (MCP) or `--no-sidecar` (CLI).\n- **Project never uses regenerate/iterate:** set `EMIT_SIDECAR=false`.\n- **Old-style sidecars** from v0.2 and earlier (`foo.png.regenerate.json`\n  without the leading dot) are still read as a fallback — no migration needed.\n\n## Quickstart (CLI)\n\n```sh\n# Generate one image at the cheapest tier\nnode mcp-server/dist/cli.js -p \"a teal cube on white\"\n\n# Compare costs without spending\nnode mcp-server/dist/cli.js --estimate-cost --speech -p \"Hello world\"\n\n# Generate TTS with captions (ElevenLabs)\nnode mcp-server/dist/cli.js --speech -p \"Long narration...\" \\\n  --provider elevenlabs --voice aria --captions both\n\n# Save a style preset and apply it\nnode mcp-server/dist/cli.js --save-style brand --provider google \\\n  --tier small --suffix \"shot on Hasselblad, warm lighting\"\nnode mcp-server/dist/cli.js -p \"a coffee cup\" --style brand\n\n# Show today's spend\nnode mcp-server/dist/cli.js --session-spend\n\n# Resize an image for share targets\nnode mcp-server/dist/cli.js --post-process my.png \\\n  --presets og,twitter,favicon --webp\n\n# Free local TTS via Kokoro-FastAPI\ndocker run -p 8880:8880 ghcr.io/remsky/kokoro-fastapi-cpu:latest  # in another terminal\nnode mcp-server/dist/cli.js --check-local\nnode mcp-server/dist/cli.js --speech -p \"hello world\" \\\n  --provider local --model kokoro\n\n# Zero-shot voice cloning via Chatterbox-TTS (or any XTTS-style server)\n# Start the backend on its own port, then:\nexport LOCAL_BASE_URL=http://localhost:4123/v1\nnode mcp-server/dist/cli.js --speech -p \"read this in my voice\" \\\n  --provider local --model chatterbox \\\n  --reference-audio ~/voice-samples/me.wav\n```\n\n## Status\n\n**v0.7.8** — v0.7.0 architectural pump retained; plugin manifest reverted to the working 0.6.x shell-env pattern. See [CHANGELOG.md](./CHANGELOG.md) for the full timeline. Highlights since v0.6:\n\n- **Reactive chunk-on-length-error** (v0.7.0). Long-text TTS used to fail when a provider rejected the input on duration/token grounds, forcing callers to chunk externally and lose voice/cache/sidecar fidelity. A new `INPUT_TOO_LONG` error code catches those rejections and auto-retries with chunking on the same provider.\n- **Per-provider default voices** (v0.7.0). `GEMINI_DEFAULT_VOICE=Charon` etc., scoped per provider so voice names don't leak across incompatible namespaces. Applied at every slot resolution point.\n- **`voiceDefaulted` signal** (v0.7.0). Every TTS response now indicates whether the voice came from an explicit argument or a fallback default — lets agents catch mismatches before spending on a long run.\n- **`debug: true` flag** (v0.7.0). Opt-in exposure of per-chunk file paths for troubleshooting; `files[0]` is always the stitched deliverable.\n- **Plugin manifest reverted** (v0.7.8). v0.7.0-0.7.7 tried seven approaches to wire `${user_config.foo}` references through Claude Code's plugin-MCP substitution; every variant silently failed to spawn the server. v0.7.8 restores the 0.6.x `${SHELL_VAR:-default}` pattern (no `userConfig`) — the engineering above is all kept, only the install-time-prompt UX is sacrificed. Configure via shell env vars.\n- **Zero-shot voice cloning** (v0.6.0). `--reference-audio` via Chatterbox-TTS or XTTS. Sidecar records the path so `regenerate`/`iterate` reproduces the cloned voice.\n- **Google image pro** (v0.4.0). Imagen 4 for photoreal landscape/portrait.\n- **Google TTS sync** (v0.4.0). Gemini 2.5 Flash TTS / Pro TTS with 30 prebuilt voices.\n\nKnown deferred items:\n\n- **Gemini TTS batch** — sync shipped; batch uses the same SDK shape and will follow.\n- **Multi-chunk TTS captions** — single-chunk only (multi-chunk timestamp-offset math deferred).\n- **Quality fallback** for low-tier text rendering — needs an OCR heuristic.\n- **`userConfig` install prompt** — will re-introduce once Claude Code fixes the `${user_config.*}` → MCP-server spawn silent failure.\n- **Video modality (HeyGen + Synthesia)** — coming in v0.8.0 as native provider adapters, not passthrough, so video inherits the same cost / sidecar / failover machinery.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsherifbutt%2Fclaude-image-tts-gen","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsherifbutt%2Fclaude-image-tts-gen","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsherifbutt%2Fclaude-image-tts-gen/lists"}