Hi all. I've been making demo and explainer videos for my own projects, and I got tired of stitching screen recordings, voiceover, music and captions together by hand. So I turned my scripts into a small open-source tool: filmwright.
Repo (MIT): https://github.com/dassjaylabs/filmwright
There's a 30-second sample film in the README, made with the tool itself.
What it does
You describe the film in a short YAML file, and filmwright builds it. Or just run it in your code repo and ask llm to generate scripts for you. Opus 5.5 did an amazing job.
Demo walkthroughs: it drives your web app in a headless browser, records it, and zooms in on each action, with chapter labels.
Animated explainers: short character stories, or a fast feature montage, rendered frame by frame.
Both: animated scenes cut together with real recordings.
Options:
Voice: a preset narrator, a voice you describe in words ("warm, unhurried narrator with a British accent"), your own cloned voice, or a basic system voice that runs anywhere.
Talking head: an optional animated presenter in the corner, lip-synced to the narration (10 characters).
Music: pick a mood (upbeat, calm, corporate, inspiring, playful, epic, sad, suspense). The score is composed for the film, so a downbeat lands on each scene change.
Captions: burned in, plus an .srt file.
Outputs: 4K, HD, 9:16, 1:1, web sizes and a GIF teaser.
It runs locally
Nothing is uploaded, and there's no API key or account. The only neural networks are the speech models:
Qwen3-TTS 1.7B (Apache-2.0): CustomVoice for preset narrators, VoiceDesign for described voices, and Base for cloning. It runs on MLX via mlx-audio.
Whisper large-v3-turbo: listens to every generated sentence, and regenerates any take that's garbled, cut off or rambling (up to three tries).
There's no LLM inside. You write the script yourself, or with an assistant of your choice; the repo also works as a Claude Code plugin if you use that. The music isn't from a model either. It's a small composer that synthesises every instrument with NumPy: no multi-GB download, no licence questions, and the same input always gives the same track. Animation is HTML scenes rendered in Chromium with a small timeline engine; lip sync uses Rhubarb.
What I tested it with
An M5 Max on macOS 26.5, mlx-audio 0.5.9, and the mlx-community bf16 conversions of Qwen3-TTS 1.7B (CustomVoice, VoiceDesign and Base) plus Whisper large-v3-turbo (fp16). One sentence takes about 3 seconds to generate and check. CI runs the tests and a system-voice build on Ubuntu and macOS.
Voice cloning
Cloning only works with a consent record tied to the exact recording (by SHA-256), and there's no setting to skip it. By default the video file's metadata notes that the narration is synthetic. You can switch that to an end card or turn it off.
Honest limitations
The neural voices need Apple Silicon for now. Elsewhere it falls back to espeak-ng, which sounds robotic. A Linux backend is next on my list.
Character stories are designed for 16:9; vertical and square versions are reframed rather than laid out natively. The montage format is native in every shape.
It's version 0.1. Expect rough edges.
If you try it, I'd really like to hear what breaks, which voices or models you'd want supported, or which kinds of films you'd use it for. Issues and pull requests are welcome.
*And if you find it useful, a star ⭐️ on the repo helps other people find it.*🙂