Docs
Commands
Every explainroo command and its options.
How do I run a command?
Run npx --yes explainroo <command> in any folder. In a clone of explainroo, run node bin/explainroo.js <command> instead. These docs write both as explainroo <command>. Most commands take the project folder as their first argument. If you leave it out, they use the current folder. Every command takes --json when a program needs to read the output.
explainroo <command> --help prints the options of one command and an example. A flag the command doesn’t take is an error that lists the flags it takes.
Which commands make a video?
| Command | What it does |
|---|---|
init <dir> |
creates a starter project. Options: --theme, --size, --pace, --language, --voice, --title. --format product-launch starts from a format, with its example script and scenes and its guide in format.md. The theme and voice flags choose built-in looks and Kokoro voices. Set custom looks or other voice sources in video.json |
formats [format] |
lists the formats that come with explainroo and the ones you installed, or prints the guide of one. formats add <git address> prints the git commands it will run and installs nothing until you add --yes. --commit <id> takes that commit. See formats |
set <project> <key> <value> |
writes one setting into video.json, like set videos/dns targetSeconds 40. A dotted key like sizes.shorts.pace sets a setting of one size, and null takes the key out. A value that isn’t JSON is text, so set videos/dns brand.accent '#e8a24a' needs no quotes. It prints the value it wrote with its type. A value that fails the usual check changes nothing |
voice [project] |
makes the narration and the word times. It redoes only changed scenes and quotes what it heard around each word it could not confirm. --estimate prints how long the video will be about and makes nothing. --force redoes all scenes. --new buys again only the paid sentences that got no good answer |
words [project] [scenes] |
prints each spoken word of the scenes you name, like words videos/dns hook tip, with its start time in seconds, and the markers. Without a scene it prints every scene. A word spoken more than once shows its cue, like fills#2. A time with ~ is estimated, because the speech model wrote the word together with others or didn’t confirm it |
preview [project] |
opens a live browser preview that reloads when you save. --port sets the port, 4400 by default. --size tries another size |
still [project] [times] |
saves PNG frames. Times: 12.5, scene, scene@2.4, scene@start, scene@end. Without times, it saves every scene’s end. --size changes size, --scale changes image scale, and --transparent keeps alpha. still talk.mp4 3 12.5 takes any video file, with times in seconds |
sheet [project] [scene] |
saves a contact sheet, or the sheet of one scene with sheet videos/dns intro. --every <seconds> sets frame spacing, --cols <n> sets columns, and --large makes frames 640 pixels wide. --times 3,12.5,intro@2 puts only those moments on the sheet, in that order. sheet talk.mp4 takes any video file |
check [project] |
checks layout, timing, pronunciation, clips, formulas and chapters. Errors give an error code. --view-width <pixels> checks text in a smaller player. --step <seconds> sets the time between checks, 0.25 by default. --verbose adds the times of the words that only nearly matched. check talk.mp4 checks any video file, and --script compares its speech with a text |
render [project] |
saves the video and its subtitle files, cover and chapters. See the render options below |
verify [project] |
checks a finished MP4, WebM or MOV for loudness, true peak, black frames, silence and clear narration. With --size or --platform, it checks the file that render wrote with the same flag. --file <path> picks another file. Transparent video gets no black-frame check. GIFs are not checked. The last line says whether the file passed. verify talk.mp4 checks any video file |
cut <video> |
writes <name>.cut.md, the words of your own recording with their times. Delete words and pauses in it, and cut <video> --apply writes <name>.cut.mp4. --apply --dry-run tries the list without writing a file. See cutting your own recording |
export [project] |
saves a web player in out/player/. --out <dir> picks another folder, and --size tiktok writes out/player-tiktok/. Serve it with a static web server. See publishing a video |
clean [project] |
lists and takes out what build/ holds that the next run makes again by itself, like the frames of clips and recordings. It says how much room that frees. The narration in build/voice/ stays. --dry-run only lists it |
Which options work on several commands?
| Option | What it does |
|---|---|
--size <size> |
uses another size for this run. See trying another size. Works on preview still sheet check render verify export |
--no-watermark |
leaves out the watermark for this run. Works on the same commands as --size |
--platform <name> |
sets up the run the way that platform’s package is made. Works on still sheet check render verify |
--lang <lang> |
uses the version of the video in that language. See several languages. Works on voice words preview still sheet check render verify export package share publish |
--json |
prints output a program can read. Works on every command |
Which options does render take?
| Option | What it does |
|---|---|
--format mp4 |
the default. Other choices are gif, webm and mov |
--transparent |
keeps the background transparent. Needs --format webm or --format mov |
--size <size> |
uses another size for this run |
--platform <name> |
uses the size and settings that a package for that platform uses |
--draft |
makes a quick half-size out/draft.mp4, or the chosen format’s ending |
--quality fast |
makes a full-size final without motion blur. --quality final is the default. It can’t go with --draft |
--from <seconds>, --to <seconds> |
renders part of the video. Partial renders leave out the chapters and the cover |
--workers <n> |
how many Chrome pages draw at once. Try --workers 2 if a busy computer stops a render |
--scale <number> |
changes the rendered frame size |
--out <file> |
picks the output file. Its ending must match the format |
A normal render writes out/video.mp4, video.srt, video.vtt and video.cover.jpg. Scenes with chapter titles also get video.chapters.txt and chapters in the MP4. Videos without narration get no subtitle files. Extra files share the video’s name, including with --out.
A final draws six samples per frame for the motion blur, so it is several times slower than a draft. Once your computer has made a final of the same kind, render says about how long the next one takes. Its last line says how long the render took.
GIFs are silent, run at 15 frames per second and have a long side of at most 960 pixels. See publishing a video for uploading, transparent exports and the web player.
How do I try another size?
--size leaves video.json alone. The narration is shared between sizes, unless a size has a pace of its own in "sizes".
With --size tiktok, outputs become out/video-tiktok.mp4, out/draft-tiktok.mp4, out/stills-tiktok/ and out/sheet-tiktok.jpg. A scene sheet is out/sheet-intro-tiktok.jpg. Ratios use a hyphen, such as video-9-16.mp4. --no-watermark leaves out the watermark for one run and adds -no-watermark to the names the same way. render --out still picks the name you give it. verify --size tiktok checks out/video-tiktok.mp4, and verify --file checks a file with a name of your own.
--platform tiktok sets up the run the way a TikTok package is made, with its size and its block in "sizes". It also follows the platform’s watermark rule. TikTok has no watermark, and the other platforms keep the one in video.json. render prints one line that says whether the watermark is on, and why.
Which commands post or share a video?
| Command | What it does |
|---|---|
package [project] |
writes a folder in out/package/<platform>/ to post on one platform. --platform is youtube, shorts, tiktok, reels, linkedin or x. --title, --description and --hashtags win over post.json. --size picks the size for x |
publish [project] |
posts a package after a typed yes, or with --yes where there is no terminal. --via is youtube, buffer or blotato. --dry-run shows the exact post and sends nothing. --draft saves it as a draft in Buffer. --new posts again |
share [project] |
uploads a video to explainroo.com for a page link, once that service runs. Until then it sends nothing and says so. --platform shares a package, and --file another file |
Posting a video explains the other options of publish.
Which commands help with product demos, images and clips?
| Command | What it does |
|---|---|
capture [project] <url> |
saves screenshots, wording, colors, font files and logos in assets/capture/<hostname>/. --mobile adds mobile screenshots. --name pricing saves to its own folder, so several pages of one site stay side by side. See product demos |
record <project> <name> |
runs the steps in recordings/<name>.json in a browser of its own, and saves assets/recordings/<name>.webm with a log of every step. --keep-profile keeps the browser profile for a site that needs a login. record [project] --inspect <url> lists what a step can click or type into, and records nothing. See recording the real app |
image [project] <name> "<prompt>" |
makes an AI illustration through OpenRouter in assets/<name>.png. Options: --model best or --model cheap, --aspect, --ref, --no-style. The same request returns the file it already bought, and --new buys it again |
images [project] |
lists the images made for the project and their costs |
clip [project] "<prompt>" |
buys a short AI video clip through OpenRouter in assets/clips/. --seconds is required. A purchase needs --max-cost or a budget, and --dry-run shows the price and spends nothing. See AI video clips |
presenter [project] <scene> |
makes a clip of an AI presenter who speaks the narration of a scene, through a presenter service you picked. --avatars lists its avatars, and --dry-run shows the price and buys nothing. See presenters |
Which commands set up outside services?
| Command | What it does |
|---|---|
services [step] |
lists the choices for each step, free ones first, with what each costs and what leaves your computer. The steps are voice, timing, images, clips, presenters, music, sharing and posting |
connect <service> |
sets a service up. It tests a key and saves it, or signs you in through the browser. --key-stdin reads the key from standard input, and --project <dir> saves it for one project |
history [project] |
prints the paid jobs that are still open, with the command that continues each one. Then it lists what was spent and what was rendered. Times are in your computer’s time zone |
For clips, services shows the price per second on the day you run it. It reads OpenRouter’s public price list at most once a day. A key never goes on the command line. See settings for where connect saves it.
Which commands help me look things up?
| Command | What it does |
|---|---|
docs [topic] [section] |
prints the instructions for coding agents, one topic, or one section of a topic. --list lists the topics, and docs <topic> --sections lists the sections of a topic with their size |
voices |
lists Kokoro voices and their languages. --language es filters the list |
voices [project] --provider <id> |
lists the names, ids and labels available to your key at elevenlabs or cartesia |
say "text" |
saves a Kokoro voice sample. Options: --voice, --speed, --out. It uses the chosen voice’s language |
themes |
lists the seven built-in looks and music styles |
sizes |
lists platform sizes and their content areas, with and without the watermark and bold captions. Before 0.6 this was explainroo formats |
icons <word> |
searches the 1,854 icons by name and tag. When nothing matches, it prints close names |
doctor [project] |
checks Node, ffmpeg, Chrome, the speech models and what other languages need. With a project, it checks that project’s languages and voices. For a project with recordings, it also checks the ffmpeg that record needs. Before there is one, --language es checks one language. On Debian and Ubuntu, --fetch also sets up espeak-ng without root when a language needs it. --fetch --record gets the ffmpeg for record ahead of time. It prints the folder of the examples that come with explainroo |
help |
shows the commands. --help or -h also works |
version |
shows the installed version. --version also works |
doctor --fetch downloads the models your setup needs, and with --language es the ones Spanish needs. It downloads the English speech check model only when English is among the languages. doctor also prints where your settings file is. Use --quiet to hide progress messages. See voices and languages for voice sources and settings for API keys and environment variables.