VideoDeck is a local markdown-to-video presentation studio.
It lets you:
- write slides in markdown
- add
Speaker Note:lines for narration - preview the deck in the browser
- listen to per-slide Kokoro narration previews
- render the full presentation into an MP4 with Remotion
The project combines three parts:
-
React UI: The editor, slide preview, timeline, render pipeline status, and video player live in the frontend.
-
Kokoro narration: Narration is generated locally with
kokoro-js. A slide can include aSpeaker Note:line, which is used as the voiceover text. -
Remotion rendering: The final video is rendered with Remotion. The backend parses the markdown, generates narration audio, builds slide props, and renders an MP4.
The app supports these markdown-like features in both preview and final render:
- slide separator:
---on its own line - speaker note:
Speaker Note: ...on its own line - headings:
#,##,### - bold:
**text** - italic:
*text* - inline code:
`code` - bullet lists:
- item - numbered lists:
1. item - blockquotes:
> quote - fenced code blocks:
```ts ... ``` - images:

Notes:
---is ignored when it appears inline or inside fenced code blocks.Speaker Note:is only treated as metadata when it appears at the start of its own line.
-
src/App.tsx Main editor and preview UI.
-
shared/videodeck-core.mjs Shared markdown parsing, theme definitions, timing estimates, and validation helpers used by the UI and render server.
-
render/Root.tsx Remotion composition used for final video rendering.
-
render/server.mjs Render API routes, markdown parsing, Kokoro generation, and Remotion render pipeline.
-
server.mjs Single Node entrypoint for local development and production-style serving.
- Node.js 18+ recommended
- macOS/Linux environment capable of running Remotion and local model inference
The first narration generation can take longer because Kokoro needs to load model assets.
npm installStart the app with a single process:
npm run devOpen:
http://localhost:3210
This starts:
- the React app through Vite middleware
- the render API
- narration preview and final video endpoints
npm run buildThis runs TypeScript checks and builds the frontend into dist/.
Build first:
npm run buildThen start the production server:
npm run startOpen:
http://localhost:3210
npm run devStarts the single local app server.
npm run buildTypechecks and builds the frontend.
npm testRuns the shared parser and validation regression tests.
npm run startServes the built app plus render API in production mode.
npm run vite-devStarts raw Vite only. Mostly useful for debugging.
npm run render-serverStarts only the render backend. Mostly useful for debugging the render pipeline separately.
When you click Render Final Video, the backend runs these stages:
- Parse slides from markdown
- Generate Kokoro voice audio for slides with speaker notes
- Prepare Remotion composition props
- Render the final MP4
The UI polls render job state and displays progress for each stage.
Rendered videos and temporary slide audio files are written under:
renders/
This folder is ignored by git.
- The markdown renderer is intentionally narrow and presentation-focused, not full CommonMark.
- Narration preview and final video narration depend on local Kokoro model loading.
- Remotion rendering can be slower on the first run.