One short takes an evening: write it, record it, hunt the b-roll, time the captions. This does the whole chain from a single line of text. An LLM writes the script and the search terms, it pulls matching stock clips, narrates them with a free voice, burns in subtitles, and hands you a 1080 by 1920 MP4. No GPU, no editor, and 125,000 people have starred it.
By Raj Singh · September 2026 · 125k stars · no GPU needed · 7 min read
Left is the whole input: subject, language, length, voice, aspect. Right is the script it wrote, which you can edit before anything renders. That edit box is the difference between a channel and a slop machine.

One key, the rest is free. The voice is Edge TTS, no account needed. The footage is Pexels or Pixabay, free keys both. The only thing you pay for is the model writing the script, at cents per video. No GPU: a four-core laptop is the stated minimum.
The music is a lawsuit waiting. The bundled tracks in resource/songs came from YouTube videos, and the README says to delete them if there is a copyright problem. Never publish those on a monetised account. Swap in your own library before the first upload.
Your clips are everyone's clips. Stock footage matched to keywords means the same Pexels clips appear in thousands of other videos. It reads as filler unless you supply your own material, which it accepts, or pay a text-to-video provider per second.
It listens on every interface. The example config sets the API to 0.0.0.0, so on a shared network anyone can reach it. Change it to 127.0.0.1 before you run this on a laptop you take outside the house.
Four ways to drive it. A web interface for the first ten videos, a CLI for the next hundred, a batch file for a queue of up to 100 tasks, and an HTTP API. It also publishes straight to TikTok, Instagram and YouTube Shorts.
Drop your email and the rest opens: the install, the four config lines that matter, the model and voice worth choosing, the CLI that batches a week of videos, and the three errors everyone hits.
One email. No follow-up unless I ship something that fits.
uv, which the project uses to pin the environment. Homebrew or the one-line installerOn first launch the project creates config.toml from config.example.toml, so there is no file to write by hand. Windows has a one-click package in Releases instead: take the .7z from Assets, not the source zip, then run update.bat before start.bat.
The install
Docker instead
Add your keys in the basic settings panel, then generate one video on a subject you know well. Judging the output on a topic you cannot fact-check is how people end up publishing nonsense.
Most settings live in the web interface, and the file is what survives a restart. These four are the ones I change on a fresh clone. The rest of the file is provider credentials you fill in only if you use that provider.
| Setting | Default | Why I change it |
|---|---|---|
| llm_provider | moonshot | The default is the project's sponsor, and the README is full of referral links to it. Nothing wrong with that, but pick the provider you already hold a key for. Leave the model name empty and it uses that provider's default. |
| listen_host | 0.0.0.0 | Every interface on the machine. On a laptop that leaves the house, 127.0.0.1 closes it. Only open it deliberately, when a second device really needs the interface. |
| subtitle_provider | edge | Fast, needs no GPU, and takes its timing from the voice track. Switch to whisper only when a caption drifts, because it downloads a model and slows every render. |
| whisper.model_size | large-v3 | About 3GB. large-v3-turbo is roughly 1.6GB and enough for narration you generated yourself. Only relevant if you switched the line above. |
| video_source | pexels | Pexels and Pixabay are both free and their libraries differ. Swapping it is the cheapest way to stop your videos looking like each other. |
The interface is for finding the settings you like. Once a video comes out right, the same job is one command, and a week of them is one file. Subtitle and voice options come from the CLI flag first, then the saved interface value, then the built-in default.
cli.py --video-subject "..." is the whole thing. Everything else has a default.--stop-at video and its siblings end the run at a stage, so you can check the scripts before spending on renders.Settings like background music, video count and paragraph count are not inherited from the interface, so pass them as flags. If the interface is set to use uploaded audio, the CLI needs --custom-audio-file explicitly.
ffmpeg_path in the [app] block to the actual binary. On Windows the separators are double backslashes.ulimit -n to see it, ulimit -n 10240 to raise it. It shows up on long batches rather than single videos.faster-whisper-large-v3 manually and put the whole folder at ./models/whisper-large-v3. Or stay on the edge subtitle mode, which needs no model at all.Copy config.toml and your fonts folder and the setup has moved machines. Everything else comes back from a clone and a sync.
One clone, four config lines, one command per video. The evening you used to spend cutting a single clip now produces a week of them, and your only real job is deciding what they should say.
↑ Unlocks the moment you submit the form above.
I'm Raj Singh, founder of DebtOps.ai and a Claude certified partner. Over the last five years I've managed $25M in ads, built AI solutions for Fortune 100 companies, and installed AI operating systems and AI brains inside small businesses. Everything here is something I've shipped, debugged, or watched a client ship. My goal with AgileSingh is to make you irreplaceable in this AI age.
Generating the video is the easy half. The OpenBot guide is an agent that can publish and watch the numbers, and the FreeLLMAPI guide makes the script-writing model cost nothing.