md2video is a small agent-friendly workflow for turning source content into an animated, narrated video with HyperFrames. Videos render directly from HTML/CSS scenes and seekable GSAP animations, not static PDF pages.
The renderer uses HyperFrames while preserving the existing scene JSON, narration, and audio workspace format. See CHANGELOG.md for the history.
prompts/slide-prompt.md: create animated scene data (slides.json) and narration (script.json) underoutput/<presentation-slug>/.prompts/tts-prompt.md: generate one narration MP3 per slide fromscript.json.prompts/combine-prompt.md: render scenes, narration MP3s, and available SRT captions intovideo.mp4with HyperFrames.prompts/script2intro-prompt.md: generateintro.txtfromscript.json.prompts/thumbnail-prompt.md: generatethumbnail.pngfrom a crafted Qwen-Image prompt.prompts/upload-prompt.md: publishvideo.mp4to Bilibili viascripts/upload_bilibili.py.scripts/tts_from_script.py: standaloneuv runTTS helper.scripts/render_video.mjs: HyperFrames preview, HTML/timeline preparation, and narrated video renderer.video/: reusable animated layouts; see the scene schema and renderer guide.examples/hyperframes-demo/: a five-scene animation demo that renders without API credentials.scripts/thumbnail_from_prompt.py: standaloneuv runthumbnail image helper.scripts/upload_bilibili.py: standaloneuv runBilibili uploader; reads login cookies straight from the local browser.
Install dependencies with bun install; Node.js 22+ and FFmpeg/FFprobe must be available. HyperFrames provisions a headless browser when needed. For a quick animation demo:
bun run video --workspace examples/hyperframes-demo --silent- Start with either a source file such as
source.mdor a direct text prompt. - Use
prompts/slide-prompt.mdto create a presentation workspace underoutput/<presentation-slug>/. - Validate scenes and narration, then continue automatically. Preview is opt-in: use
bun run preview --workspace output/<presentation-slug>only when requested. - Use
prompts/tts-prompt.mdto createoutput/<presentation-slug>/audio/slide-XX.mp3files. - Use
prompts/combine-prompt.md, or runbun run video --workspace output/<presentation-slug>, to createvideo.mp4directly with HyperFrames. - Optionally use
prompts/script2intro-prompt.mdto createoutput/<presentation-slug>/intro.txt. - Optionally use
prompts/thumbnail-prompt.mdto createoutput/<presentation-slug>/thumbnail.png. - Optionally use
prompts/upload-prompt.mdto publishvideo.mp4to Bilibili (title/description come fromintro.txt, cover fromthumbnail.png). The upload publishes directly;--dry-runis available for troubleshooting.
The prompt files are stage-specific on purpose. Pick the prompt that matches the artifact you want to generate, and keep all outputs for a presentation in the same output/<presentation-slug>/ directory.
Follow the workflow defaults: complete requested stages automatically without preview or approval pauses, stopping only at the user's requested boundary or a genuine blocker. A complete video request includes the MP4, intro, and AI cover; “do not upload” still completes those local artifacts. Uploading, publishing, committing, and pushing require an explicit request.
HyperFrames is the only supported renderer. Workspaces need scene data, narration, and audio. Existing generated artifacts are not migrated or deleted automatically. See video/README.md for requirements and limitations.
Generated presentations live in the ai-video repo, mounted here as the output/ git submodule. Clone with submodules:
git clone --recurse-submodules https://github.com/isomoes-video/md2video.git
# or, in an existing clone:
git submodule update --initAfter generating new artifacts, commit and push inside output/ first, then commit the updated submodule pointer in this repo.