Turns a written
plainmotion.yamlproject into a narrated, deterministic MP4 — locally, with no network at render time and nothing to sign up for.
You write the script as plainmotion.yaml: scenes, narration text, cues. PlainMotion
synthesises the narration locally, measures exactly how long each word takes to say, and
uses that measured timing — not a hand-picked frame count — to decide how long each scene
runs and when each cue fires. validate checks it fast with no browser; stills renders
settled keyframes for review; render produces the final video.
Download: latest release · Buy a licence: plainlab.gumroad.com/l/plaintake (one key activates Pro in both PlainMotion and its sibling PlainTake)
Each render produces:
video.mp4— one H.264 video, captions burned in by default or muxed as a selectable track, an optional quiet music bedcaptions.srt,captions.vtt— standalone caption files, written on every renderrender-plan.json— the frozen, literal record of everything the render executed: layout, timings, argument vectors — so a re-render cannot disagree with the original
Free tier vs. Pro. Every render on the free tier ends with a short "Made with
PlainMotion" closing credit card. A Gumroad licence key
(plainmotion license activate <key>) removes it — permanently, on this machine, for
every future render. See the bundled Claude Code skill in
skills/plainmotion/SKILL.md for the full authoring
reference: the project schema, every scene type, and the CLI.
The example project in examples/plainmotion.yaml is the
video PlainMotion made about itself — narrated, four scene types, captions, a music bed.
| Requirement | Notes |
|---|---|
| FFmpeg | Installed separately — this project spawns it as a subprocess rather than bundling GPL-licensed code. plainmotion doctor checks it. |
| Chromium | plainmotion install-browser downloads it once (~356 MB) |
| Node.js 24+ | Only for installing from source — the binary release needs no Node |
Homebrew's default ffmpeg formula is built without libass, so it has no ass filter and
cannot burn captions or the free-tier credit card into the video. ffmpeg-full has it, but
it is keg-only — installing it is not enough, it must also be linked:
brew uninstall --ignore-dependencies ffmpeg
brew install ffmpeg-full
brew link --force --overwrite ffmpeg-fullOn Debian and Ubuntu, apt install ffmpeg already has libass. Either way, confirm it
before doing anything else:
plainmotion doctorTwo builds: macOS arm64 (Apple Silicon) and Linux x64. No Windows build, and no macOS Intel build.
# 1. Download the tarball for your platform, the checksums, and the installer
VERSION=0.2.0
BASE=https://github.com/plaintake/plainmotion/releases/download/v$VERSION
curl -LO $BASE/plainmotion-$VERSION-darwin-arm64.tar.gz # or -linux-x64
curl -LO $BASE/SHA256SUMS
curl -LO $BASE/install.sh
# 2. Check what you downloaded is what was published
shasum -a 256 -c SHA256SUMS --ignore-missing
# 3. Install
sh install.sh plainmotion-$VERSION-darwin-arm64.tar.gzThat installs to ~/.local/share/plainmotion and symlinks plainmotion into
~/.local/bin. Override either with PLAINMOTION_PREFIX and PLAINMOTION_BINDIR. If
~/.local/bin is not on your PATH, the installer says so.
Then, once:
plainmotion install-browser # downloads Chromium (~356 MB)
plainmotion install-voice # downloads the narration voice (~93 MB)
plainmotion doctor # checks FFmpeg, Chromium, the voiceAfter that, rendering needs no network at all.
Without the installer. The tarball is a self-contained tree and the binary finds its own resources, so this works too:
tar -xzf plainmotion-$VERSION-darwin-arm64.tar.gz
./plainmotion-$VERSION-darwin-arm64/bin/plainmotion doctorUpgrading is the same three steps. The installer replaces the whole tree rather than
merging into it — a half-upgraded install with a new binary and an old vendored Playwright is
worse than no install. Your licence lives in ~/.config/plainmotion and is not touched.
Uninstalling is rm -rf ~/.local/share/plainmotion ~/.local/bin/plainmotion, and
rm -rf ~/.config/plainmotion if you also want the licence gone.
From source — needs Node 24 and pnpm:
git clone https://github.com/plaintake/plainmotion.git
cd plainmotion
make bootstrap # pnpm install, Chromium, the speech runtime
pnpm exec plainmotion doctormake bootstrap vendors the speech engine's ONNX runtime
(node scripts/fetch-speech-runtime.ts, digest-pinned) and Playwright's Chromium; the
same install-voice step as above downloads the voice model.
- FFmpeg, because the builds that can encode PlainMotion's output are GPL (via libx264),
and keeping it a separate executable is what keeps those terms off PlainMotion and
therefore off what you make with it. See
NOTICE.md. - Chromium, because it is ~356 MB with its own licence set, and Playwright's cache is shared with any other Playwright install you already have.
PlainMotion is proprietary software, free to use with a closing credit — see
LICENSE and NOTICE.md for the full terms and third-party
attributions. plainmotion license activate <key> removes the credit; the key from a
PlainTake purchase works here too.
Open an issue: https://github.com/plaintake/plainmotion/issues