slidecast
Generate self-contained HTML presentations and convert them into voiced, slide-synced MP4 videos using ElevenLabs text-to-speech. Bring your
Open source Open in the app JSON README (API)
About
Generate self-contained HTML presentations and convert them into voiced, slide-synced MP4 videos using ElevenLabs text-to-speech. Bring your own ElevenLabs API key.
Details
- Kind
- Plugins
- Topic
- AI, RAG & memory
- Publisher
- alinaqi
- Origin
- marketplace
- Category
- ferramentas
- Last push
- 2026-05-30T21:19:49Z
- Repository state
- ativo
- Language
- HTML
- License
- MIT
- Added
- 2026-08-30 01:48:58
- Updated
- 2026-08-30 01:48:58
- Origin id
alinaqi/slidecast/slidecast
README
<h1 align="center">ποΈ slidecast</h1>
<p align="center">
<b>Turn any topic into a polished HTML slide deck β then narrate it into a slide-synced video.</b><br/>
A <a href="https://code.claude.com">Claude Code</a> plugin powered by <a href="https://elevenlabs.io">ElevenLabs</a> text-to-speech.
</p>
<p align="center">
<img alt="Claude Code plugin" src="https://img.shields.io/badge/Claude%20Code-plugin-6c5ce7">
<img alt="License: MIT" src="https://img.shields.io/badge/license-MIT-green">
<img alt="Bring your own key" src="https://img.shields.io/badge/ElevenLabs-bring%20your%20own%20key-1db954">
</p>
---
```text
You: make a 10-slide presentation about our Q3 roadmap, dark theme
Claude: β¦writes roadmap.html (a clean, self-contained deck)
You: now turn it into a narrated video with a calm female voice
Claude: β¦writes narration.json, picks a voice, renders + speaks each slide β roadmap.mp4
```
slidecast adds two skills to Claude Code:
| Skill | What it does |
| :-- | :-- |
| **create-presentation** | Generates a branded, self-contained **HTML deck** β 16:9, keyboard-navigable, themeable accent colour, optional dimmed logo watermark. |
| **narrate-to-video** | Renders each slide headless, generates **per-slide narration** with ElevenLabs, and stitches a **slide-synced MP4** with ffmpeg. |
Both are model-invoked β just describe what you want. No commands to memorize.
> **Bring your own ElevenLabs key.** slidecast never bundles credentials; speech runs on *your* account, billed to *your* quota.
---
## Requirements
| Tool | Why | Install |
| :-- | :-- | :-- |
| `ELEVENLABS_API_KEY` | text-to-speech (your account) | [elevenlabs.io](https://elevenlabs.io) β Profile β API Keys |
| `ffmpeg` + `ffprobe` | audio/video assembly | `brew install ffmpeg` Β· `apt install ffmpeg` |
| Google Chrome / Chromium | headless slide rendering | any recent build (auto-detected, or set `CHROME_BIN`) |
| `python3` | helper scripts (stdlib only β no pip installs) | preinstalled on macOS/Linux |
Only the create-presentation skill works without ElevenLabs; you just won't be able to render video.
## Install
```text
/plugin marketplace add alinaqi/slidecast
/plugin install slidecast@slidecast
```
Then make your key available to the session (or put it in your shell profile):
```text
! export ELEVENLABS_API_KEY=sk_your_key_here
```
## Usage
**Make a deck**
```text
> Create a 12-slide deck introducing our API, accent colour #6366f1, brand "Acme".
```
You get a single `acme-api.html` you can open in any browser. Arrow keys navigate; `#3` jumps to slide 3.
**Narrate it into a video**
```text
> Turn acme-api.html into a narrated video. Use a warm British female voice.
```
Claude 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.
**Iterate cheaply.** The build is idempotent: edit one slide's narration, delete that clip, re-run β only the changed slide is regenerated.
## How it works
1. **The deck** is one self-contained HTML file with a tiny slide engine:
`#N` jumps to slide N Β· `?render=1` hides the nav chrome (for clean frames) Β· arrow keys navigate.
2. **`narration.json`** maps each slide to spoken text:
```json
{ "voice_id": "<id>", "model": "eleven_multilingual_v2",
"segments": [ { "slide": 1, "text": "..." }, { "slide": 2, "text": "..." } ] }
```
3. **`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.
Nothing is hard-coded β swap the voice, edit the text, rebrand the template, and re-run.
## Choosing a voice
```bash
# your account voices
python3 scripts/list_voices.py
# the public shared library, filtered
python3 scripts/list_voices.py --shared --gender female --language en
```
Put the chosen `voice_id` in `narration.json`. Models: `eleven_multilingual_v2` (accents / non-English), `eleven_turbo_v2_5` (fast & cheap), `eleven_v3` (most expressive).
## Tuning (environment variables)
| Var | Default | Effect |
| :-- | :-- | :-- |
| `SLIDECAST_TAIL` | `0.6` | seconds of silence held after each line |
| `SLIDECAST_WIDTH` / `SLIDECAST_HEIGHT` | `1920` / `1080` | output resolution |
| `SLIDECAST_FORCE` | `0` | `1` = regenerate all audio + renders |
| `SLIDECAST_STABILITY` / `SLIDECAST_SIMILARITY` / `SLIDECAST_STYLE` | `0.5` / `0.75` / `0.0` | ElevenLabs voice settings |
| `CHROME_BIN` | auto | explicit Chrome/Chromium path |
## Local development
```bash
git clone https://github.com/alinaqi/slidecast
claude --plugin-dir ./slidecast/plugins/slidecast # load without installing
claude plugin validate ./slidecast/plugins/slidecast # validate the manifest
```
Run `/reload-plugins` after edits to pick up changes.
## Project layout
```
slidecast/
βββ .claude-plugin/marketplace.json # distribution catalog
βββ plugins/slidecast/
βββ .claude-plugin/plugin.json # plugin manifest
βββ skills/
β βββ create-presentation/SKILL.md
β βββ narrate-to-video/SKILL.md
βββ scripts/
β βββ build_video.sh # deck.html + narration.json β mp4
β βββ tts.py # ElevenLabs TTS (reads ELEVENLABS_API_KEY)
β βββ list_voices.py # browse account / shared voices
βββ templates/
βββ deck-template.html # the reusable, themeable deck
βββ narration.example.json
```
## Troubleshooting
- **`ELEVENLABS_API_KEY is not set`** β export it in the same session that runs the build.
- **`Chrome/Chromium not found`** β install Chrome, or `export CHROME_BIN=/path/to/chrome`.
- **`ffmpeg is required`** β `brew install ffmpeg` (ships ffprobe too).
- **A slide looks wrong in the video** β open `deck.html?render=1#N` in a browser to debug that exact frame.
## Contributing
Issues and PRs welcome. Keep scripts dependency-free (Python stdlib only) and ASCII-clean. Run `claude plugin validate` before submitting.
## Privacy
slidecast 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.
## License
[MIT](./LICENSE) Β© 2026 Ali Shaheen