yamlreel
2026
Role
Creator and maintainer: open-source Python tool
Overview
Short technical videos take hours in an editor, and most of that time goes into nudging boxes and syncing text by hand.
yamlreel replaces the editor with a spec: you write the scenes in YAML (a typed hook, an animated diagram, a code walkthrough, bullets, a big number, a web page capture) and one command renders the finished video.
There is no timeline underneath: every frame is drawn in Python and streamed straight to ffmpeg.
Each render also writes a poster frame, a contact sheet with two labelled stills per scene to review before publishing, and a ready-to-paste title, description and hashtags.
The background music is composed on the machine, in a Japanese pentatonic scale by default, so there is nothing to license, and an optional voiceover can speak each scene in a cloned voice from a local text-to-speech server.
The project's own demo video was made by yamlreel from a single YAML file.
It is published on PyPI (pip install yamlreel), runs on Python 3.10+, and I use it every day to produce a YouTube Shorts series.
Responsibilities
- Designed the spec format and built the renderer in about 2,600 lines of Python: Pillow and NumPy draw each frame, and raw frames are piped to ffmpeg for H.264 and AAC, with no intermediate image files.
- Built seven scene types (title, typed line, bullets, highlighted code, big stat, animated diagram, web screenshot) with eased reveals, packets flowing along diagram edges, lower-third captions and a slow camera move on screenshots.
- Rendered one spec to 1920×1080, 1080×1920 and 1080×1080, with a half-size, 12 fps preview mode for checking layout and timing in seconds.
- Wrote a procedural music generator (plucked koto-style strings, configurable scale, tempo and seed) so every video has an original, royalty-free track.
- Added per-scene voiceover through a local TTS server or WAV files: a scene can read its own script or the text on screen, and its length stretches to fit the speech.
- Treated every spec as untrusted input: file paths stay inside allowed folders and cannot escape through symlinks, private and internal addresses are refused, and a pinning proxy closes the DNS-rebinding gap during page captures.
- Added layered configuration (built-in defaults, user config, project config, spec, CLI flags), three built-in themes plus custom ones, starter templates (yamlreel init) and a validate command.
- Shipped it as a maintained open-source project: 72 tests, CI on Python 3.10 and 3.12, a protected main branch, PyPI releases through Trusted Publishing with manual approval, a security policy, and contributor docs that brought in its first outside pull request.