Back to all resources
MoneyPrinterTurbo v1.3.7 MIT · free Python on your laptop LIVE

Type a topic. Get a finished video.

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

WHAT YOU GET ON DAY ONE

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.

The MoneyPrinterTurbo web interface with a video subject field, the generated script in an editable box, and voice and aspect ratio settings
One subject, the script it wrote, and the render settings · harry0703 / MoneyPrinterTurbo
BEFORE YOU CLICK INSTALL

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.

Honest limitThis produces competent filler at volume. It cannot give you a point of view, and a feed can tell. The people getting value from it write their own scripts and use it for everything after the script.
Read the whole setup

First video in under an hour.

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.

WHAT YOU NEED
  • Python 3.11 or newer. The project recommends 3.11 exactly
  • uv, which the project uses to pin the environment. Homebrew or the one-line installer
  • Two free keys. Pexels for footage, and an LLM key for the script. Pixabay and Coverr are alternatives for the first
  • ffmpeg, downloaded and detected automatically in most environments
  • No GPU. Four cores and 4GB is the stated minimum, eight cores and 8GB is comfortable
INSTALL

Clone, sync, run

On 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

terminalmacOS or Linux
$ git clone https://github.com/harry0703/MoneyPrinterTurbo.git && cd MoneyPrinterTurbo $ uv python install 3.11 $ uv sync --frozen $ sh webui.sh → picks a free port and opens the browser for you

Docker instead

terminalthe isolated route
$ cp config.example.toml config.toml $ docker compose -f docker-compose.release.yml up → web on 127.0.0.1:8501, API docs on 127.0.0.1:8080/docs

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.

Prove itAsk it for something narrow, like how compound interest works, and watch the script box before you render. If the script is specific and the keywords next to it make sense, the footage will too. A vague script is the tell that your model choice is too small.
CONFIGURE

Four lines in config.toml

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.

config.tomlmy values
[app] llm_provider = "openai" video_source = "pexels" subtitle_provider = "edge" [whisper] model_size = "large-v3-turbo" listen_host = "127.0.0.1"
SettingDefaultWhy I change it
llm_providermoonshotThe 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_host0.0.0.0Every 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_provideredgeFast, 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_sizelarge-v3About 3GB. large-v3-turbo is roughly 1.6GB and enough for narration you generated yourself. Only relevant if you switched the line above.
video_sourcepexelsPexels and Pixabay are both free and their libraries differ. Swapping it is the cheapest way to stop your videos looking like each other.
Paid footageText-to-video providers are configured in the same file and bill per second. Seedance, MiniMax H3, Wan and others are wired in. Try one on a single video before you point a batch at it, because a batch of 20 will spend real money without asking twice.
DAILY DRIVING

Web first, CLI once it works

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.

terminalin the project root
$ uv run python cli.py --video-subject "How compound interest works" $ uv run python cli.py --batch-file ./tasks.json --stop-at video → {"total": 12, "succeeded": 11, "failed": 1, "tasks": [...]}
  • One video. cli.py --video-subject "..." is the whole thing. Everything else has a default.
  • A week of them. A JSON array of subjects, up to 100 tasks. Every entry is validated before the first one starts.
  • Stop early. --stop-at video and its siblings end the run at a stage, so you can check the scripts before spending on renders.
  • Read the summary. The batch prints one JSON block at the end with total, succeeded, failed, and the failing stage per task.

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.

WHEN IT DRIFTS

Three errors, all known

No ffmpeg exe could be found
The automatic download failed in your environment. Install ffmpeg yourself and set ffmpeg_path in the [app] block to the actual binary. On Windows the separators are double backslashes.
Errno 24, too many open files
The system limit, not the project. ulimit -n to see it, ulimit -n 10240 to raise it. It shows up on long batches rather than single videos.
Whisper will not downloadIf the model cannot be fetched from Hugging Face, get 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.
THE SHAPE OF IT

Where everything lives

config.tomlevery key and default, created on first run resource/songs/the bundled music. Replace this before you publish resource/fonts/subtitle fonts. Drop your own in here models/where a manually downloaded whisper model goes cli.pythe batch entry point, and `--help` is the real reference

Copy config.toml and your fonts folder and the setup has moved machines. Everything else comes back from a clone and a sync.

That is the whole setup

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.

Open on GitHub →

↑ Unlocks the moment you submit the form above.

RS
WRITTEN BY

Raj Singh

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.

$25M
Ads managed · 5 yrs
F100
Enterprise AI builds
Claude
Certified partner
36
Guides shipped
More guides

Now let an agent run the whole channel.

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.

Keep going

Back to all systems