Back to the catalog

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

More