Skip to content

Latest commit

 

History

4 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PlainMotion — narrated explainer videos from a YAML file

Turns a written plainmotion.yaml project 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 bed
  • captions.srt, captions.vtt — standalone caption files, written on every render
  • render-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.

What it looks like

The example project in examples/plainmotion.yaml is the video PlainMotion made about itself — narrated, four scene types, captions, a music bed.

Before you install

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

FFmpeg must have libass to burn captions or the closing credit

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-full

On Debian and Ubuntu, apt install ffmpeg already has libass. Either way, confirm it before doing anything else:

plainmotion doctor

Install

Two 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.gz

That 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 voice

After 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 doctor

Upgrading 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 doctor

make 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.

Why FFmpeg and Chromium are not included

  • 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.

Licensing

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.

Getting help

Open an issue: https://github.com/plaintake/plainmotion/issues

About

Explainer video as Code

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Contributors