{
  "markdown": "<h1 align=\"center\">🎙️ slidecast</h1>\n\n<p align=\"center\">\n  <b>Turn any topic into a polished HTML slide deck — then narrate it into a slide-synced video.</b><br/>\n  A <a href=\"https://code.claude.com\">Claude Code</a> plugin powered by <a href=\"https://elevenlabs.io\">ElevenLabs</a> text-to-speech.\n</p>\n\n<p align=\"center\">\n  <img alt=\"Claude Code plugin\" src=\"https://img.shields.io/badge/Claude%20Code-plugin-6c5ce7\">\n  <img alt=\"License: MIT\" src=\"https://img.shields.io/badge/license-MIT-green\">\n  <img alt=\"Bring your own key\" src=\"https://img.shields.io/badge/ElevenLabs-bring%20your%20own%20key-1db954\">\n</p>\n\n---\n\n```text\nYou:    make a 10-slide presentation about our Q3 roadmap, dark theme\nClaude: …writes roadmap.html  (a clean, self-contained deck)\n\nYou:    now turn it into a narrated video with a calm female voice\nClaude: …writes narration.json, picks a voice, renders + speaks each slide → roadmap.mp4\n```\n\nslidecast adds two skills to Claude Code:\n\n| Skill | What it does |\n| :-- | :-- |\n| **create-presentation** | Generates a branded, self-contained **HTML deck** — 16:9, keyboard-navigable, themeable accent colour, optional dimmed logo watermark. |\n| **narrate-to-video** | Renders each slide headless, generates **per-slide narration** with ElevenLabs, and stitches a **slide-synced MP4** with ffmpeg. |\n\nBoth are model-invoked — just describe what you want. No commands to memorize.\n\n> **Bring your own ElevenLabs key.** slidecast never bundles credentials; speech runs on *your* account, billed to *your* quota.\n\n---\n\n## Requirements\n\n| Tool | Why | Install |\n| :-- | :-- | :-- |\n| `ELEVENLABS_API_KEY` | text-to-speech (your account) | [elevenlabs.io](https://elevenlabs.io) → Profile → API Keys |\n| `ffmpeg` + `ffprobe` | audio/video assembly | `brew install ffmpeg` · `apt install ffmpeg` |\n| Google Chrome / Chromium | headless slide rendering | any recent build (auto-detected, or set `CHROME_BIN`) |\n| `python3` | helper scripts (stdlib only — no pip installs) | preinstalled on macOS/Linux |\n\nOnly the create-presentation skill works without ElevenLabs; you just won't be able to render video.\n\n## Install\n\n```text\n/plugin marketplace add alinaqi/slidecast\n/plugin install slidecast@slidecast\n```\n\nThen make your key available to the session (or put it in your shell profile):\n\n```text\n! export ELEVENLABS_API_KEY=sk_your_key_here\n```\n\n## Usage\n\n**Make a deck**\n\n```text\n> Create a 12-slide deck introducing our API, accent colour #6366f1, brand \"Acme\".\n```\n\nYou get a single `acme-api.html` you can open in any browser. Arrow keys navigate; `#3` jumps to slide 3.\n\n**Narrate it into a video**\n\n```text\n> Turn acme-api.html into a narrated video. Use a warm British female voice.\n```\n\nClaude drafts `narration.json` (one line per slide), picks a voice, and runs the build. The `acme-api.mp4` lands next to the deck — each slide held for exactly the length of its narration.\n\n**Iterate cheaply.** The build is idempotent: edit one slide's narration, delete that clip, re-run — only the changed slide is regenerated.\n\n## How it works\n\n1. **The deck** is one self-contained HTML file with a tiny slide engine:\n   `#N` jumps to slide N · `?render=1` hides the nav chrome (for clean frames) · arrow keys navigate.\n2. **`narration.json`** maps each slide to spoken text:\n   ```json\n   { \"voice_id\": \"<id>\", \"model\": \"eleven_multilingual_v2\",\n     \"segments\": [ { \"slide\": 1, \"text\": \"...\" }, { \"slide\": 2, \"text\": \"...\" } ] }\n   ```\n3. **`build_video.sh`** calls ElevenLabs per segment, screenshots each slide via headless Chrome, builds a per-slide ffmpeg clip held for the audio's duration (plus a short tail), and concatenates them into the final MP4.\n\nNothing is hard-coded — swap the voice, edit the text, rebrand the template, and re-run.\n\n## Choosing a voice\n\n```bash\n# your account voices\npython3 scripts/list_voices.py\n# the public shared library, filtered\npython3 scripts/list_voices.py --shared --gender female --language en\n```\n\nPut the chosen `voice_id` in `narration.json`. Models: `eleven_multilingual_v2` (accents / non-English), `eleven_turbo_v2_5` (fast & cheap), `eleven_v3` (most expressive).\n\n## Tuning (environment variables)\n\n| Var | Default | Effect |\n| :-- | :-- | :-- |\n| `SLIDECAST_TAIL` | `0.6` | seconds of silence held after each line |\n| `SLIDECAST_WIDTH` / `SLIDECAST_HEIGHT` | `1920` / `1080` | output resolution |\n| `SLIDECAST_FORCE` | `0` | `1` = regenerate all audio + renders |\n| `SLIDECAST_STABILITY` / `SLIDECAST_SIMILARITY` / `SLIDECAST_STYLE` | `0.5` / `0.75` / `0.0` | ElevenLabs voice settings |\n| `CHROME_BIN` | auto | explicit Chrome/Chromium path |\n\n## Local development\n\n```bash\ngit clone https://github.com/alinaqi/slidecast\nclaude --plugin-dir ./slidecast/plugins/slidecast    # load without installing\nclaude plugin validate ./slidecast/plugins/slidecast # validate the manifest\n```\n\nRun `/reload-plugins` after edits to pick up changes.\n\n## Project layout\n\n```\nslidecast/\n├── .claude-plugin/marketplace.json     # distribution catalog\n└── plugins/slidecast/\n    ├── .claude-plugin/plugin.json      # plugin manifest\n    ├── skills/\n    │   ├── create-presentation/SKILL.md\n    │   └── narrate-to-video/SKILL.md\n    ├── scripts/\n    │   ├── build_video.sh              # deck.html + narration.json → mp4\n    │   ├── tts.py                      # ElevenLabs TTS (reads ELEVENLABS_API_KEY)\n    │   └── list_voices.py              # browse account / shared voices\n    └── templates/\n        ├── deck-template.html          # the reusable, themeable deck\n        └── narration.example.json\n```\n\n## Troubleshooting\n\n- **`ELEVENLABS_API_KEY is not set`** — export it in the same session that runs the build.\n- **`Chrome/Chromium not found`** — install Chrome, or `export CHROME_BIN=/path/to/chrome`.\n- **`ffmpeg is required`** — `brew install ffmpeg` (ships ffprobe too).\n- **A slide looks wrong in the video** — open `deck.html?render=1#N` in a browser to debug that exact frame.\n\n## Contributing\n\nIssues and PRs welcome. Keep scripts dependency-free (Python stdlib only) and ASCII-clean. Run `claude plugin validate` before submitting.\n\n## Privacy\n\nslidecast runs entirely on your machine and **collects no data** — no servers, no telemetry, no accounts. The only outbound request is your own narration text + voice settings going **directly to ElevenLabs** (with your key) to synthesize audio, governed by [ElevenLabs' privacy policy](https://elevenlabs.io/privacy). See [PRIVACY.md](./PRIVACY.md) for details.\n\n## License\n\n[MIT](./LICENSE) © 2026 Ali Shaheen\n",
  "bytes": 6532,
  "sha": "7e5a24861abdc9a96cb66b2ecf5b845cad26b2ab511f471b45798818283d1ad1",
  "repo_slug": "alinaqi/slidecast",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/plg_alinaqi_slidecast_slidecast_2100e7ab/readme"
}