A single short takes seven manual steps: finding a topic, script, narration, caption timing, background, editing, upload. I split those seven into swappable providers so one command produces a video.
Defaults all run locally with no API key (local LLM, macOS TTS, gradient background, estimated timing). Clone it, have ffmpeg, get a video. Paid APIs are swapped in one line at a time in config.toml.
$ shorts-factory make "Does the elevator close button actually work?"▶ script (llm) · narration (macos, 6 segments) · background (gradient) · captions (estimate) · render✓ 26.8 s / 2.1 MB → out/…
Decisions
Zero third-party dependencies in the core; only Python 3.11+ and ffmpeg.
The Homebrew ffmpeg 8 slim build has no libass, so the subtitle filter was unavailable. Captions are drawn as frames with Pillow and overlaid instead.
Structured output quality varies by local model, so the script parser has forgiving fallbacks.
Status
One command yields a 26-second, 2 MB result. Includes a browser preview panel (HTML/JS).