One sentence in,
a publishable short video out

Give it a topic or an article link; get a finished vertical video with burned-in subtitles, a cover image and publish copy. Local-first — the free path costs $0 and 0 paid keys; when stock libraries come up empty, it paints a frame with a local model instead.

$0free path, end to end
230tests · 3-OS CI
EN / 中文the whole pipeline
MITlicensed
"Why cats squeeze into boxes" 56s
English script, voice and captions
"Why onions make you cry" 60s
2 of 6 shots painted locally
"A compass doesn't point north" 43s
5 of 7 shots painted locally

Four steps from idea to publish pack

The UI never says "workflow" or "parameters" — each step answers exactly one question. The GUI ships with an English toggle (the EN button, or ?lang=en); engine log lines remain Chinese for now.

Step 1: enter a topic or link
① Say the idea

A topic, a passage, or an article URL; pick length and tone. AI drafts a shot-by-shot script.

Step 2: preview and adjust
② Every shot is editable

Narration text, visual intent and search query all laid out — change any of them, and only that shot is redone.

Step 3: render and publish
③④ Render → publish pack

Voice-over, footage, burned subtitles, compositing, itemized QC; export mp4 + cover + SRT + publish copy with per-clip attribution.

Two content pipelines

Same engine (agency-orchestrator), two ways in.

Narrated explainersruns on $0 and 0 keys

Script → Edge TTS voice-over → CC stock footage → burned subtitles → QC. No paid key anywhere in the chain.

  • Stock came up empty? Paint a frame locally (FLUX.1-schnell, Apache-2.0, commercial-ok)
  • A vision model gatekeeps every candidate clip — irrelevant footage gets rejected, not shrugged in
  • Visuals change every 4–6 s; subtitle keywords highlighted, six style knobs
  • QC failures (e.g. subtitles not burned in) exit non-zero — a bad video never pretends to be a good one

AI mini-dramalocal draft / cloud final

A story → 3-shot screenplay → character sheet → image-to-video ×3 → vision acceptance → composite.

  • Local draft tier is free: MiniMax-H3 via stable-diffusion.cpp on your own machine
  • Happy with the cut? Switch to the cloud tier — per-second billing, quoted before you run
  • Redo a single shot with feedback; everything else is reused byte-for-byte
  • Every shot records source / model / cost — reproducible and attributable

Real output, not concept art

Every clip below was actually generated by OpenShorts; project JSON and full case studies live in the repo with source and model attribution.

Why onions make you cryNarrated explainer 60s · CC stock + local FLUX · $0, 0 keys
Why cats love boxesNarrated explainer · vision gatekeeping + multi-cut shots · $0, 0 keys
Late-night convenience store (local draft)AI drama · MiniMax-H3 on-device (sd.cpp) · free
Late-night convenience store (cloud final)AI drama · Agnes agnes-video-2.5-flash 720P · same script, re-rendered
Six shots of the onion video
All six shots of the onion video: stock hits plus locally-painted frames where stock had nothing — a vision judge decides what makes the cut.

What it cares about

Most text-to-video tools stop at "it generated something." OpenShorts cares about what happens after you hit publish.

QuestionOpenShorts' answer
Stock library has nothing?Paint a frame locally (free, offline) instead of shoving in unrelated footage — no "wasp eating cat food" in your cat explainer
Who reviews the visuals?A vision model scores every candidate 0–10 (≥6 leads, 4–5 fills, <4 rejected); unjudged footage never ships
Who owns output quality?Itemized QC: resolution, duration drift, audio track, burned-in subtitles, loudness — a fail is a fail, exit code non-zero
Change one word, redo everything?No. Fingerprint-level reuse: only the changed shot is redone; voice, footage and rendered segments are content-addressed
Can you account for the footage?Per-shot source / author / license / page URL; attribution auto-appended to publish copy; AI-generated frames labeled
Will it even install?One-command ffmpeg (with libass) and local model installs; 3-OS CI; errors speak plainly and name the next command

Quick start

Requires Node ≥ 20. ffmpeg and the local image model are one-command installs afterwards.

# Install (or grab the bundle from GitHub Releases)
git clone https://github.com/jnMetaCode/openshorts.git
cd openshorts && npm install

# Open the GUI (recommended): four steps to a video
npm run openshorts
# → http://127.0.0.1:4174
# Or three CLI steps (run inside the cloned repo)
npx openshorts new --lang en --topic "Why is the sky blue"
npx openshorts run ~/OpenShorts/<project>/project.json
npx openshorts export ~/OpenShorts/<project>/project.json

# Subtitles won't burn in? Install ffmpeg with libass:
npx openshorts install-ffmpeg

Script writing needs one text-model key (DeepSeek / Kimi / GLM / …— configure once, shared with the engine). Visuals and voice-over are free on the default path. See the README for the drama pipeline and local image generation.