Turns a written plainmotion.yaml project into a narrated, deterministic
MP4 — locally, with no network at render time and nothing to sign up for.
This video was generated from a text file. The poster frame above is product output too.
Scenes, narration text and cues as one plainmotion.yaml file. No
timeline, no frame counts.
PlainMotion synthesises the narration locally and measures exactly how long each word takes to say — scene durations and cue timings come from that measurement.
plainmotion render produces one H.264 MP4, SRT/VTT caption sidecars,
and a frozen render-plan.json — a re-render cannot disagree with the
original.
scenes: # Act 1 — the claim. - id: hook type: title duration: auto narration: text: > This video was generated from a text file. No timeline. No screen recording. Just a script. Here is how. visual: headline: Generated from a text file subtitle: Every frame, every word — one file cues: - { atPhrase: "This video was generated", action: reveal, target: headline } - { atPhrase: "Just a script", action: reveal, target: subtitle } - { atPhrase: "Just a script", action: emphasize, target: headline }
— examples/plainmotion.yaml, the script behind PlainMotion's own demo video. Eight more scenes follow.
No account, no API key, no telemetry. After two one-time downloads, rendering needs no network at all.
Every render emits a frozen render plan — the literal record of layout, timings and encoder arguments.
Every command speaks --json, and a bundled Claude Code skill knows
the whole schema. You direct; the agent writes the yaml.
The full engine is free — every render ends with a short "Made with PlainMotion" credit. One licence key removes it, permanently.