Skip to content
Agents tracked: 440 Downloads (7d): 202M down 19.5% GitHub stars: 10.4M Releases (7d): 607 Agent status: 1 with issuesSince last limit reset: Claude 28d · Codex 0d Updated Oct 21, 2026

Starter kit for a short-video pipeline

A recipe for a command that turns a script into a vertical video with voiceover, word-timed captions and stock footage, and keeps a record of every license. For Claude Code, Cursor, Codex or Copilot, with exact versions and the traps two test builds ran into.

New to kits? Read how to use a kit.

How the kit fits together

Your agent reads the brief, builds with these parts and checks its own work before you ship. Click a part to see why it was picked.

File for your agent

AGENTS.md

The plan your agent follows, a step at a time, with a check that must pass before the next step. It also holds the stack with exact versions, the licenses and the known traps.

File for your agent

first-prompt.txt

The first message you paste into your agent. It points the agent at AGENTS.md and tells it to stop after step 1 and report.

File for your agent

.mcp.json

The MCP servers the brief lists, set up for Claude Code. The kit builder writes the same setup for Cursor, Codex or Copilot.

File for your agent

CREDITS.md

The license record of every third-party file. The brief tells the agent to add a row for every file it brings in.

You bring this

Your coding agent

The kit works with any of these. Pick yours in the kit builder and the setup files change to match.

Library knowledge

Context7

4.3.0MIT

MoviePy 2 renamed most of its API, and models still write version 1 code from memory.

By Upstash · In 1,266 of 29,413 sampled repos · v4.3.0 on npm · Agent can use it through MCP

Tool and asset data

AgentGid

If the agent needs another voice, footage source or API, it asks AgentGid for one that fits your license constraints.

By AgentGid · Agent can use it through MCP

Runtime

Python 3.12

official source

One Python version has to satisfy every package below.

Nothing to install

Script writing

Your coding agent writes the scripts

official source

Each video starts as a short JSON script: a hook, three to five beats with search words for footage, and a closing line. Start here: no key, no extra cost. Add a model API when you want the pipeline to run without you.

Nothing to install

4 other candidates ruled out.

Voiceover

Kokoro-82M

0.9.4Apache-2.0

Reads the script. Licenses differ sharply here: several free voices forbid commercial use. Apache-2.0 weights, so commercial use is allowed. English, Spanish, French, Hindi, Italian, Japanese, Portuguese and Mandarin; no Russian.

Apache-2.0 · Commercial use OK · No credit needed · Free · Installs from a package registry

5 other candidates also fit, 13 ruled out.

Caption timing

Faster Whisper

1.2.1MIT

Word-by-word captions need a start and end time for every word of the finished narration. Returns word timestamps and does not need a system FFmpeg.

In 18 of 1,546 Python agent projects (1.2%) · #16 of 28 in model sdks · v1.2.1 (pypi registry) · MIT · Installs from a package registry

3 other candidates also fit.

Video assembly

MoviePy

2.2.1MIT

Cuts footage to the narration, crops to vertical, draws captions and mixes audio. Python all the way through, and it brings its own FFmpeg binary.

MIT · Commercial use OK · Credit not stated · Free · Installs from a package registry

1 other candidate also fits, 3 ruled out.

Image handling

Pillow

10.4 to 11.1MIT-CMU

MoviePy draws caption text with Pillow.

In 230 of 1,546 Python agent projects (14.9%) · #2 of 80 in files, images and media · v12.3.0, July 1, 2026 · MIT-CMU · Installs from a package registry

Stock footage

Pixabay

Pixabay Content License

The pictures under the voice. The agent searches by the keywords in each script beat. Free key, video search endpoint, 100 requests a minute.

Pixabay Content License · Commercial use OK · Credit when you use its API · Free · Agent can fetch it through an API

Asks for a credit in products that call its API while running.

Do not scrape its website. Use its API, one request at a time, and download only the files you use.

2 other candidates also fit, 11 ruled out.

Background music

YouTube Audio Library

YouTube Audio Library standard licenseoptional, off

A quiet bed under the voice. Cleared for monetized YouTube videos, but there is no API: you download tracks by hand in YouTube Studio.

YouTube Audio Library standard license / Creative Commons (per track) · Commercial use with conditions · Credit depends on the item · Free · You download it by hand

Commercial use comes with conditions: read its rules.

Credit depends on the item: record each one.

3 other candidates also fit, 26 ruled out.

Caption font · from Google Fonts

Poppins

OFL-1.1

MoviePy 2 draws captions from a font file on disk, at one fixed weight. Open licenses that allow embedding in video, and single files with direct links. Keep the license file next to the font.

SIL OFL 1.1 (most), Apache-2.0 (some), Ubuntu Font License 1.0 · Commercial use OK · No credit needed · Free · 151 KB · static file · Agent can fetch it through an API

6 other candidates also fit, 1 ruled out.

When the agent is done

8 checks

  • With a footage key in .env, python -m pipeline make --script scripts/example.json writes out/example/final.mp4. Without a key it stops with a message that names the missing key, and --footage saved still writes the video from the saved example response.
  • ffprobe reports 1080x1920, 30 fps, H.264 video and AAC audio, and a length between 20 and 60 seconds.
  • The audio track covers the whole video and is not silent (mean level above -40 dB). Every caption fits inside 960 px, and frames grabbed at the midpoint of three captions, the widest one among them, each show their own caption with complete letters.
  • Footage changes every 3 to 6 seconds, the picture changes at every planned cut frame, and no shot has a uniformly black band on opposite edges.
  • out/example/credits.json lists every clip with its source, page URL, author and license, plus the voice package, the voice model and the font.
  • python -m pipeline make --dry-run works with no network and no keys: placeholder clips, a generated tone track in place of speech, and word timings spread from the script. It writes to out/example-dry/, never over a real video.
  • Unit tests cover caption grouping and shot timing and pass with python -m pytest.
  • Keys live in .env, .env.example lists them, .env is in .gitignore, and no log line or error message contains a key.
Scheduling

APScheduler

3.11.3MIToptional, off

Runs the pipeline at set times.

In 42 of 1,546 Python agent projects (2.7%) · #1 of 10 in jobs, queues and workflows · v3.11.3, June 28, 2026 · MIT · Installs from a package registry

1 other candidate also fits.

After the agent

Left to you

  • Listen to one finished video before anything is published: a check can measure loudness, not whether the voice reads well. Decide then whether the pauses between sentences are too long (--trim-silence) and whether the voice is loud enough.
  • Create the Pixabay account and put the key into .env.
Files for your agentAgent tools (MCP)CodeArt, sound and contentChecksOptional, off by default

What you get

The result

A Python command line tool: give it a script file and it writes final.mp4 (1080x1920, narrated, captioned, cut to stock footage) plus a credits file.

7 files
Ready for your agent
  • AGENTS.md: the plan, with a check after every step
  • first-prompt.txt, install.txt, .mcp.json
  • CREDITS.md, CLAUDE.md, kit.json
16 parts
Every part is free or has a free tier
  • Pipeline: Apache-2.0, MIT, MIT-CMU
  • Content: Pixabay Content License, OFL-1.1
  • Agent tools: MIT
3 of 4 asset sources allow commercial use with no credit needed. Plus 1 optional part, off by default.
7 / 8
Checks met in the last test build
  • Build 2, Oct 12, 2026
  • 30 things in the brief reported, 2 serious
  • Findings went back into recipe v0.3
The brief counts it as done when these 8 checks pass
  • With a footage key in .env, python -m pipeline make --script scripts/example.json writes out/example/final.mp4. Without a key it stops with a message that names the missing key, and --footage saved still writes the video from the saved example response.
  • ffprobe reports 1080x1920, 30 fps, H.264 video and AAC audio, and a length between 20 and 60 seconds.
  • The audio track covers the whole video and is not silent (mean level above -40 dB). Every caption fits inside 960 px, and frames grabbed at the midpoint of three captions, the widest one among them, each show their own caption with complete letters.
  • Footage changes every 3 to 6 seconds, the picture changes at every planned cut frame, and no shot has a uniformly black band on opposite edges.
  • out/example/credits.json lists every clip with its source, page URL, author and license, plus the voice package, the voice model and the font.
  • python -m pipeline make --dry-run works with no network and no keys: placeholder clips, a generated tone track in place of speech, and word timings spread from the script. It writes to out/example-dry/, never over a real video.
  • Unit tests cover caption grouping and shot timing and pass with python -m pytest.
  • Keys live in .env, .env.example lists them, .env is in .gitignore, and no log line or error message contains a key.

Left to you, because no check can do it: Listen to one finished video before anything is published: a check can measure loudness, not whether the voice reads well. Decide then whether the pauses between sentences are too long (--trim-silence) and whether the voice is loud enough. Create the Pixabay account and put the key into .env.

The parts and why each was picked

Defaults for commercial use, free parts and Claude Code. Change them.

Pipeline

Runtime
Python 3.12 official source

One Python version has to satisfy every package below.

Nothing to install

Script writing
Your coding agent writes the scripts official source

Each video starts as a short JSON script: a hook, three to five beats with search words for footage, and a closing line. Start here: no key, no extra cost. Add a model API when you want the pipeline to run without you.

Nothing to install

4 other candidates ruled out: see why.

Voiceover

Reads the script. Licenses differ sharply here: several free voices forbid commercial use. Apache-2.0 weights, so commercial use is allowed. English, Spanish, French, Hindi, Italian, Japanese, Portuguese and Mandarin; no Russian.

Apache-2.0 · Commercial use OK · No credit needed · Free · Installs from a package registry

Also fits: Chatterbox, Piper, Amazon Polly, Google Cloud Text-to-Speech and 1 more. Ruled out: 13, see why.

Caption timing

Word-by-word captions need a start and end time for every word of the finished narration. Returns word timestamps and does not need a system FFmpeg.

In 18 of 1,546 Python agent projects (1.2%) · #16 of 28 in model sdks · v1.2.1 (pypi registry) · MIT · Installs from a package registry

Also fits: AssemblyAI, Groq Speech-to-Text (Whisper), Whisper.

Video assembly
MoviePy 2.2.1

Cuts footage to the narration, crops to vertical, draws captions and mixes audio. Python all the way through, and it brings its own FFmpeg binary.

MIT · Commercial use OK · Credit not stated · Free · Installs from a package registry

Also fits: FFmpeg. Ruled out: 3, see why.

Image handling
Pillow 10.4 to 11.1

MoviePy draws caption text with Pillow.

In 230 of 1,546 Python agent projects (14.9%) · #2 of 80 in files, images and media · v12.3.0, July 1, 2026 · MIT-CMU · Installs from a package registry

Installed along with them: Requests 2.34.2, python-dotenv 1.2.4, pytest 9.1.1, SoundFile 0.14.0, PyAV below 19, NumPy below 2.5.

Content

Stock footage

The pictures under the voice. The agent searches by the keywords in each script beat. Free key, video search endpoint, 100 requests a minute.

Pixabay Content License · Commercial use OK · Credit when you use its API · Free · Agent can fetch it through an API

Asks for a credit in products that call its API while running.

Do not scrape its website. Use its API, one request at a time, and download only the files you use.

Also fits: Coverr, NASA Image and Video Library. Ruled out: 11, see why.

Background musicoptional, off

A quiet bed under the voice. Cleared for monetized YouTube videos, but there is no API: you download tracks by hand in YouTube Studio.

YouTube Audio Library standard license / Creative Commons (per track) · Commercial use with conditions · Credit depends on the item · Free · You download it by hand

Commercial use comes with conditions: read its rules.

Credit depends on the item: record each one.

Also fits: Free Music Archive, ccMixter, Mixkit. Ruled out: 26, see why.

Caption font

MoviePy 2 draws captions from a font file on disk, at one fixed weight. Open licenses that allow embedding in video, and single files with direct links. Keep the license file next to the font.

SIL OFL 1.1 (most), Apache-2.0 (some), Ubuntu Font License 1.0 · Commercial use OK · No credit needed · Free · 151 KB · static file · Agent can fetch it through an API

Also fits: Fontsource, Fira Code, Hack, Bunny Fonts and 2 more. Ruled out: 1, see why.

Publish

Schedulingoptional, off

Runs the pipeline at set times.

In 42 of 1,546 Python agent projects (2.7%) · #1 of 10 in jobs, queues and workflows · v3.11.3, June 28, 2026 · MIT · Installs from a package registry

Also fits: schedule.

For your agent

Library knowledge
Context7 4.3.0

MoviePy 2 renamed most of its API, and models still write version 1 code from memory.

By Upstash · In 1,266 of 29,413 sampled repos · v4.3.0 on npm · Agent can use it through MCP

Tool and asset data

If the agent needs another voice, footage source or API, it asks AgentGid for one that fits your license constraints.

By AgentGid · Agent can use it through MCP

Licenses of the assets

SourceUsed forTermsLicense page
Kokoro-82M Voiceover Apache-2.0 Apache-2.0read Oct 10, 2026
MoviePy Video assembly MIT MITread Oct 10, 2026
Pixabay Stock footage Commercial use OK; Credit when you use its API; Can ship inside your build, with conditions Pixabay Content Licenseread Oct 10, 2026
Google FontsPoppins Caption font Commercial use OK; No credit needed; Can ship inside your build, with conditions SIL OFL 1.1 (most), Apache-2.0 (some), Ubuntu Font License 1.0read Oct 10, 2026

License terms as the sources state them, read on the dates shown. The kit's CREDITS.md starts with these rows and the brief tells the agent to add one for every file it brings in. This is a record, not legal advice.

The plan your agent follows

The agent works one step at a time and does not start a step until the previous one meets its "Done when" lines. The full instructions, with code, are in AGENTS.md.

  1. Scaffold · done when:
    • python -m pipeline --help lists the commands and python -m pytest runs.
    • The kit files listed under "Before you start" are still there.
  2. Script format · done when:
    • An invalid script fails with a message that names the missing field.
  3. Voice · done when:
    • narration.wav holds the whole script, and the per-beat durations plus the pauses add up to its length.
    • The narration is between 20 and 60 seconds long; the stage refuses to go on otherwise.
  4. Caption timing · done when:
    • A unit test feeds fixed word timings in and gets the expected caption groups out.
    • For the example script, the recognised word count equals the script's in every line, and no caption is wider than 960 px.
  5. Footage · done when:
    • Running the stage for the example script fills the cache and the credits record, and a second run makes no network calls.
    • A property test over random scripts (the standard random module is enough) finds every shot between 90 and 180 frames long.
  6. Assembly · done when:
    • final.mp4 exists and ffprobe reports 1080x1920, 30 fps, one H.264 video stream and one AAC audio stream, as long as the narration.
    • A frame grabbed in the middle of the widest caption shows complete letters: nothing is cut off at the sides, and descenders such as g, j, p and y are whole.
    • The picture differs between the frame before and the frame at every planned cut.
  7. Checks and credits · done when:
    • python -m pipeline check out/example prints a pass for every line.
  8. Verify · done when:
    • Every line under Definition of done is true, and anything that could not be verified (for example the live footage search without a key) is named in PROGRESS.md.

Known traps

What test builds and the official docs showed going wrong with these parts. Each one is in the brief, so the agent reads it before it gets there.

  • MoviePy 2 removed moviepy.editor. Import from moviepy; set_* methods became with_*; resize, crop and subclip became resized, cropped and subclipped; effects are classes passed to with_effects([...]), which takes a list. MoviePy docs, checked by running 2.2.1
  • With Pillow 11.2 or newer, MoviePy 2.2.1's TextClip cuts off the bottom of the text and of the stroke. The Stack pins Pillow below 11.2, and the vertical margin of half the font size protects you if the pin is ever lifted. The 12 px at the sides keep the stroke of the first and last letter whole. measured with Pillow 11.1.0 and 11.3.0, Oct 12, 2026
  • Always pass TextClip the path of a font file you ship. A family name raises ValueError: Invalid font; leaving font out does not fail, it quietly uses Pillow's default font. MoviePy docs and test build
  • write_videofile puts MP3 audio into an .mp4 unless you pass audio_codec='aac'. checked by running 2.2.1, Oct 12, 2026
  • Google Fonts ships some families only as a variable file whose default weight is thin (Montserrat is one). TextClip cannot choose a weight, so captions come out as hairlines. Use the static file named under Assets. google/fonts, checked Oct 12, 2026
  • kokoro 0.9.4 needs Python below 3.13. pip refuses it on 3.13, but uv installs it there without a word, so check the interpreter yourself. PyPI, checked with pip and uv, Oct 12, 2026
  • When its espeak fallback is missing, Kokoro skips words it does not know and says nothing: its logger is switched off. The package brings its own espeak-ng through espeakng-loader, so the system package the README asks for was not needed in the test build. Check anyway: the recognised word count must equal the script's. Kokoro source and second test build
  • The speech recogniser returns what it heard, not what you wrote: numbers, names and homophones can differ. Captions show the script's spelling with the recognised times. test build
  • "At least 1080 px tall" is not enough for a vertical video: a 1920x1080 clip passes that test and still has to be enlarged 1.78 times. Test the size of the 9:16 crop. Pixabay API docs and test build
  • Cache search results for 24 hours and download only the clips you use; Pixabay asks for both. AgentGid: Pixabay
  • faster-whisper 1.2.1 breaks with PyAV 19, which came out on Sep 29, 2026: TypeError: open() got an unexpected keyword argument 'metadata_errors' at the first transcribe. The Stack pins av below 19. PyAV changelog and second test build
  • A four-word caption at 84 px can be 1,400 px wide. TextClip makes the clip as wide as the text and the composite crops what does not fit, without an error. second test build
  • CompositeVideoClip(..., use_bgclip=True) takes its length from the captions, not from the background: without with_duration the video stops when the last caption does. checked by running 2.2.1, Oct 12, 2026
  • A TextClip has no start, no length and position (0, 0) until you set them: left alone, every caption sits in the top left corner for the whole video. second test build

Checks on this kit

  • Note Pillow is pinned to 10.4 to 11.1. moviepy 2.2.1 accepts pillow >=9.2.0 and <12.0, but with 11.2 or newer its captions are cut off at the bottom. The pin installs 11.1.0 today. Source
  • Note numpy is pinned below 2.5: with 2.5, moviepy 2.2.1 prints a DeprecationWarning for every decoded frame. Source
  • Note PyAV is pinned below 19: faster-whisper 1.2.1 passes an argument to av.open that PyAV 19 removed, and there is no newer faster-whisper yet. Source
  • Note Use Python 3.12. kokoro 0.9.4 requires Python <3.13,>=3.10. pip refuses a newer interpreter; uv does not. Source
  • Note Kokoro pulls in PyTorch and over a hundred packages: about 3 GB with the default GPU wheels, about 1.7 GB with CPU-only PyTorch. First run downloads a voice model of about 330 MB. Source

What happened when an agent built from it

The recipe was given to a fresh coding agent in a clean sandbox, twice. The agent got only the kit files. It had to build the project and write down everything in the brief that was wrong, missing or unclear.

Build 1 · brief v0.1 · Oct 12, 2026

dry run only
no full run was possible
28
things in the brief reported as wrong, missing or unclear
not counted
serious ones

Only the dry run could be run. The caption renderer cut off the bottom of every caption, and the linked font came out as hairlines.

Build 2 · brief v0.2 · Oct 12, 2026

7 of 8
lines of the definition of done met
30
things in the brief reported as wrong, missing or unclear
2
serious: stopped the build or gave a wrong result

The voice model and speech recognition ran for real for the first time. A dependency released nine days earlier broke the transcription call, and four-word captions were wider than the frame.

Result of the last build. A 30-second narrated video with word-timed captions, rendered from a real voice model. 81 of 81 words were recognised. Its findings went back into the recipe, which is now at v0.3. That version has not been built again as a whole.

Checked again on Oct 19, 2026. AgentGid checks every recipe each week, without a model: 7 pinned packages all still exist on their registries; the pip lines resolve together; 25 links in the brief: all open (1 refused automated requests, which some sites do). npm lines are checked pin by pin, not installed.

Not checked by anyone yet

  • The live footage search: there was no Pixabay key, so the build used the example clip from the API documentation
  • How the voice sounds: nobody listened
  • An NVIDIA GPU, macOS and Windows
  • The hosted-voice and YouTube upload variants

The kit files

Put them in an empty project folder, open your coding agent there and paste the first prompt (Claude Code first asks you to approve the MCP servers in .mcp.json). These are the files for Claude Code with the default answers; the kit builder writes them for Cursor, Codex, Copilot or another agent, and for other choices. Full guide: how to use a kit.

FileWhat it isSize
AGENTS.mdThe brief: what to build, stack and versions, licenses, plan with checks, known traps325 lines
CREDITS.mdThe license record of every third-party file28 lines
first-prompt.txtYour first message to the agent8 lines
install.txtInstall commands with exact versions8 lines
CLAUDE.mdOne line that imports AGENTS.md for Claude Code1 lines
.mcp.jsonThe MCP servers the brief lists, for Claude Code15 lines
kit.jsonThe kit as data: parts, versions, checks326 lines

Download all (.zip)

first-prompt.txt the agent stops after each step and reports
Read AGENTS.md from top to bottom before you do anything else. The kit files it lists are already in this folder.

Then do step 1 of the plan and stop. Report back with:
1. the commands you ran,
2. what each "Done when" check showed (a screenshot or the output),
3. anything in AGENTS.md that turned out to be wrong, missing or out of date.

Do not start step 2 until I reply.
Or let it run the whole plan
Read AGENTS.md from top to bottom before you do anything else. The kit files it lists are already in this folder.

Then work through the plan in order. After each step, run its "Done when" checks yourself and write one line in PROGRESS.md: the step, what you checked, and the result.
You may install the packages and download the files that AGENTS.md lists without asking. Stop and ask me only for what its "Before you start" section says needs a person.
When a check fails, fix the cause and run it again. If it still fails after two real fixes, stop and tell me what you tried.
Keep a list in PROGRESS.md of anything in AGENTS.md that turned out to be wrong, missing or out of date.
When every line of the Definition of done is true, stop and show me how to run it.
install.txt
# system packages (use your OS package manager)
ffmpeg

python3.12 -m venv .venv && source .venv/bin/activate   # with uv: uv venv --python 3.12 .venv && source .venv/bin/activate, then write "uv pip install" below
python --version   # must print 3.12.x
# no NVIDIA GPU: run the next line first (CPU-only PyTorch, about 2 GB less to download). With an NVIDIA GPU, skip it.
pip install torch --index-url https://download.pytorch.org/whl/cpu
pip install kokoro==0.9.4 faster-whisper==1.2.1 moviepy==2.2.1 "pillow>=10.4,<11.2" requests==2.34.2 python-dotenv==1.2.4 pytest==9.1.1 soundfile==0.14.0 "av<19" "numpy<2.5"

Other versions of this kit

Voice

A local model costs nothing per video but needs a few GB of disk. A hosted voice sounds more polished and is paid by the character.

Local model (this page) Hosted voice

Publishing

File only (this page) Upload to YouTube

Monetized channel

Some licenses allow YouTube but not ad revenue. This filters voice, footage and music.

No (this page) Yes

Language of the script

Fonts must cover the script, and voices and speech models must know the language.

English (this page) Russian

Other versions were not test-built as a whole: the kit says which parts differ from the tested one.

Ask for this kit from your agent

Agents connected to the AgentGid MCP server get the same kit without this page: list_recipes(), then plan_project({"recipe": "short-video", "answers": {"agent": "cursor"}, "files": true}). Every brief also tells the agent to ask AgentGid before it adds a part that is not listed.

Recipe short-video v0.3. Data snapshot Oct 12, 2026: versions, licenses and prices change, so check the linked pages before you ship.

Comments

  • Built something with this kit? Share what worked, what broke and what you changed.

Other kits