Turn any script into a narrated video — AI voice, subtitles, B-roll, music, done.
| Input | Output |
|---|---|
| Markdown script | MP4 video (1080p/4K) |
| Sections → scenes | AI narration (Kokoro/Edge/OpenAI TTS) |
| Code blocks → syntax highlights | Auto-generated subtitles (SRT/VTT) |
| Image refs → B-roll | Background music (Suno/UDIO) |
| Metadata → chapters | YouTube-ready chapters + description |
# Install
pipx install openscript
# Or with uv
uv tool install openscript
# First video in 60 seconds
openscript init my-video
# Edit my-video/script.md
openscript render my-video
# → my-video/output/final.mp4---
title: "Rust Async in 3 Minutes"
voice: "af_heart"
music: "ambient-tech"
---
# Intro
Rust async isn't magic. It's a state machine.
## The Future Trait
```rust
trait Future {
type Output;
fn poll(self: Pin<&mut Self>, cx: &mut Context) -> Poll<Self::Output>;
}[B-roll: rust-logo.png]
Executors drive futures to completion. tokio::spawn polls until Ready.
[B-roll: tokio-diagram.png]
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Script │────▶│ Parser │────▶│ Composer │────▶│ Renderer │
│ (Markdown) │ │ (AST + │ │ (Remotion │ │ (FFmpeg/ │
│ │ │ metadata) │ │ + TTS) │ │ Remotion) │
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
│ │ │
▼ ▼ ▼
Frontmatter Scene graph Video + audio
validation composition synchronization
| Category | Details |
|---|---|
| TTS | Kokoro (local), Edge TTS, OpenAI, ElevenLabs |
| Subtitles | Word-level timing, style presets, multi-language |
| B-roll | Auto-fetch from Pexels/Unsplash, local images, code animations |
| Music | Suno, UDIO, local files, ducking under narration |
| Code | Syntax highlighting (syntect), line-by-line reveal, terminal recording |
| Export | MP4 (H.264/HEVC), WebM, ProRes, vertical/horizontal |
| Command | Description |
|---|---|
openscript init <name> |
Scaffold new project |
openscript render <name> |
Full render pipeline |
openscript preview <name> |
Fast preview (no B-roll/music) |
openscript voice <name> |
Generate narration only |
openscript subtitle <name> |
Generate SRT/VTT only |
| Script → Video | Subtitle styling | Code animation |
|---|---|---|
![]() |
![]() |
![]() |
| B-roll integration | Music ducking | Chapter markers |
|---|---|---|
![]() |
![]() |
![]() |
- Python 3.11+
- FFmpeg 6+
- Node.js 20+ (for Remotion)
- 4 GB RAM minimum
MIT — see LICENSE.






