Vox Director
Alisa0808/vox-director
Turn ONE topic into a finished Vox-style paper-collage explainer / ad video, end to end on the Atlas Cloud API + local ffmpeg — script, collage keyframes, motion, voice-over, music, captions, all…
Overlays deterministic, accurate text on AI-generated video clips and builds short single-file Python video projects without a Remotion toolchain.
$ npx skills add digitalsamba/claude-code-video-toolkit --skill moviepy -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install digitalsamba/claude-code-video-toolkit moviepy --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/digitalsamba/claude-code-video-toolkit.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/moviepy .claude/skills/moviepy && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "moviepy" agent skill from https://github.com/digitalsamba/claude-code-video-toolkit/tree/main/.claude/skills/moviepy into .claude/skills/moviepy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "moviepy", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/digitalsamba/claude-code-video-toolkit/tree/main/.claude/skills/moviepyType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add digitalsamba/claude-code-video-toolkit --skill moviepy -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install digitalsamba/claude-code-video-toolkit moviepy --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/digitalsamba/claude-code-video-toolkit.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/moviepy .agents/skills/moviepy && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "moviepy" agent skill from https://github.com/digitalsamba/claude-code-video-toolkit/tree/main/.claude/skills/moviepy into .agents/skills/moviepy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "moviepy", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add digitalsamba/claude-code-video-toolkit --skill moviepy -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install digitalsamba/claude-code-video-toolkit moviepy --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/digitalsamba/claude-code-video-toolkit.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/moviepy .cursor/skills/moviepy && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "moviepy" agent skill from https://github.com/digitalsamba/claude-code-video-toolkit/tree/main/.claude/skills/moviepy into .cursor/skills/moviepy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "moviepy", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/digitalsamba/claude-code-video-toolkit.git --path .claude/skills/moviepy--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add digitalsamba/claude-code-video-toolkit --skill moviepy -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install digitalsamba/claude-code-video-toolkit moviepy --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/digitalsamba/claude-code-video-toolkit.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/moviepy .gemini/skills/moviepy && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "moviepy" agent skill from https://github.com/digitalsamba/claude-code-video-toolkit/tree/main/.claude/skills/moviepy into .gemini/skills/moviepy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "moviepy", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install digitalsamba/claude-code-video-toolkit moviepyInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add digitalsamba/claude-code-video-toolkit --skill moviepy -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/digitalsamba/claude-code-video-toolkit.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/moviepy .github/skills/moviepy && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "moviepy" agent skill from https://github.com/digitalsamba/claude-code-video-toolkit/tree/main/.claude/skills/moviepy into .github/skills/moviepy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "moviepy", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add digitalsamba/claude-code-video-toolkit --skill moviepy -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install digitalsamba/claude-code-video-toolkit moviepy --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/digitalsamba/claude-code-video-toolkit.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/moviepy .opencode/skills/moviepy && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "moviepy" agent skill from https://github.com/digitalsamba/claude-code-video-toolkit/tree/main/.claude/skills/moviepy into .opencode/skills/moviepy/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "moviepy", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
moviepyOverlays deterministic, accurate text on AI-generated video clips and builds short single-file Python video projects without a Remotion toolchain.
The core argument is that any genre where text has to be exactly right, legally, editorially or commercially, is a genre where AI-rendered in-frame text isn't good enough, since names must be spelled correctly and prices must be exact in a way generation models can't guarantee; moviepy is the fix, layering deterministic text on top of bare AI-generated visuals from tools like LTX-2 or SadTalker. It's chosen over Remotion for overlaying labels on those outputs, building a sub-30-second ad-style spot in one file, compositing data-driven visuals such as a matplotlib animation turned into a video, or a one-off transformation on an existing video file.
Two runnable examples ship with the skill: a 15-second ad-style spot with an audio-anchored timeline, text overlay and optional voiceover with ducked music, and an animated time-series chart with a deterministic title and source attribution that pairs matplotlib for the data with moviepy for the trustworthy text. Both run with a single command and produce a real output file immediately, with moviepy, Pillow and matplotlib declared as dependencies in the project's own setup and installed together.
Read from SKILL.md and the folder at commit 2c99460. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
uvFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use uv, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
moviepy Text-on-Video Composer loads about 3.3k tokens when it runs. Until then it costs about 131 tokens; SKILL.md has 1,073 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from digitalsamba/claude-code-video-toolkit at commit 2c99460, republished under its MIT licence (© digitalsamba). 1,073 words, ~3,275 tokens.
.claude/skills/moviepy/SKILL.md (or your agent's skills folder).moviepy is the toolkit's go-to library for putting deterministic text on top of AI-generated video and for building short, single-file Python video projects without a Remotion toolchain.
The deeper principle is trustworthy text: any genre where text has to be readable, accurate, and consistent (legally, editorially, or commercially) is a genre where AI-rendered in-frame text is unacceptable and a moviepy overlay step is the natural fix. Names must be spelled right. Prices must be exact. Source attributions must be pixel-perfect. AI generation models cannot guarantee any of that.
| Use moviepy when… | Use Remotion when… |
|---|---|
| Overlaying text/labels on an LTX-2 or SadTalker output | Building long-form sprint reviews or product demos |
Building sub-30s ad-style spots in a single build.py | Multi-template, multi-brand, design-heavy work |
Compositing data-driven visuals (matplotlib FuncAnimation → mp4) | Anything needing React components or design system reuse |
| One-off transformations on existing video files | Anything where the project lifecycle (planning → render) matters |
| You want zero Node.js / no React mental overhead | You want hot-reload preview in Remotion Studio |
Two runnable references for everything in this skill live in examples/:
examples/quick-spot/build.py — 15-second ad-style spot. Audio-anchored timeline, text overlay, optional VO + ducked music. Renders silent out of the box with zero external assets.examples/data-viz-chart/build.py — animated time-series chart with deterministic title and source attribution. Demonstrates the matplotlib (data) + moviepy (trustworthy text) split.Both run with uv run build.py and produce a real out.mp4 immediately. Read them alongside this skill — every pattern below is shown working there.
Dependencies. moviepy, Pillow, and matplotlib are declared in the root pyproject.toml and installed with the toolkit's one-line Python setup: uv sync. If you hit Missing dependency when running an example, run that command from the repo root — the examples' build.py files will tell you the same thing in their error message and exit cleanly rather than printing a bare traceback.
Both LTX-2 and SadTalker output bare visuals:
The fix is to generate the visual cleanly, then composite text over it deterministically with moviepy. This is the canonical pattern in this toolkit:
from moviepy import VideoFileClip, ImageClip, CompositeVideoClip
# 1. AI-generated visual (LTX-2 or SadTalker output)
bg = VideoFileClip("lugh_ltx.mp4").without_audio()
# 2. Text rendered via PIL → ImageClip (see "Text rendering" below)
title = (
ImageClip("text_cache/intro_title.png")
.with_duration(2.0)
.with_start(0.5)
.with_position(("center", 880))
)
# 3. Composite
final = CompositeVideoClip([bg, title], size=(1920, 1080))
final.write_videofile("lugh_with_caption.mp4", fps=30, codec="libx264")Common shapes this takes:
| Shape | LTX-2 use | SadTalker use |
|---|---|---|
| Title card over hero footage | "INTRODUCING LONGARM" over a cinematic LTX-2 b-roll | n/a |
| Lower third / name plate | n/a | "Lugh — Ancient Warrior God" under a talking head |
| Quote caption | "I am going home." over an LTX-2 character cameo | Same, over a SadTalker talking head |
| Brand attribution | Logo + URL fade-in over the last second | Same |
| Tinted overlay for contrast | Dark navy semi-transparent layer behind text | Same |
The "AI-visual + deterministic text overlay" pattern is the natural production pipeline for several styles of video. If the request matches one of these, reach for moviepy by default:
| Genre | What you overlay | Why moviepy is the right call |
|---|---|---|
| News / talking-head journalism | Speaker name plates, location bars, breaking-news banners, source attribution, pull quotes | Names must be spelled right (editorial / legal). The biggest category by volume. |
| Documentary segments | Interviewee lower thirds, chapter titles, archival source credits, location stamps | Same trust requirement as news. |
| Trailers / promo spots | Title cards, credit overlays ("FROM THE DIRECTOR OF…"), date stings, quote cards, CTAs | Tightly timed, text-heavy, every frame matters. The q2-townhall-longarm-ad example is exactly this. |
| Social short-form (Reels, TikTok, Shorts) | Word-accurate captions for sound-off viewing, hashtag overlays | Most social viewing is muted; captions are non-negotiable. |
| Product demos with annotations | Pricing callouts, feature labels, "click here" pointers over screen recordings, before/after labels | Prices and product names must be exact. |
| Tutorials / explainers | Step number overlays, terminal-command captions, keyboard-shortcut callouts | Step numbers must be sequential, commands must be copy-pasteable. |
Lesser-but-real fits: music videos (lyric overlays), reaction videos (source attribution), sports recaps (score overlays), real-estate tours (price / sqft), conference talks (speaker + session plate).
For full SRT-driven subtitling (long-form, time-coded, multilingual) moviepy is workable but not ideal — reach for ffmpeg with subtitles filter or a dedicated subtitle tool. moviepy is best for hand-placed overlays, not bulk caption tracks.
TextClipCritical gotcha: moviepy 2.x's TextClip(method='label') has a tight-bbox bug that clips letter ascenders and descenders (the tops of capitals, the tails of g/p/y). On Apple Silicon you'll see characters with sliced edges and not realise what's wrong for hours.
The workaround: render text to a transparent PNG via PIL, then load it as an ImageClip. Cache the result by content hash so re-builds are free.
import hashlib
from pathlib import Path
from PIL import Image, ImageDraw, ImageFont
ARIAL_BOLD = "/System/Library/Fonts/Supplemental/Arial Bold.ttf"
def render_text_png(txt, size, hex_color, cache_dir="./text_cache"):
cache = Path(cache_dir); cache.mkdir(parents=True, exist_ok=True)
key = hashlib.sha1(f"{txt}|{size}|{hex_color}".encode()).hexdigest()[:16]
path = cache / f"{key}.png"
if path.exists():
return str(path)
font = ImageFont.truetype(ARIAL_BOLD, size)
bbox = ImageDraw.Draw(Image.new("RGBA", (1, 1))).textbbox((0, 0), txt, font=font)
tw, th = bbox[2] - bbox[0], bbox[3] - bbox[1]
pad = max(20, size // 4)
img = Image.new("RGBA", (tw + pad * 2, th + pad * 2), (0, 0, 0, 0))
rgb = tuple(int(hex_color.lstrip("#")[i:i+2], 16) for i in (0, 2, 4))
ImageDraw.Draw(img).text((pad - bbox[0], pad - bbox[1]), txt, font=font, fill=(*rgb, 255))
img.save(path)
return str(path)The full helper (with kwargs for bold, position, fades, and cleaner ergonomics) is in examples/quick-spot/build.py — copy it rather than re-implementing.
For ad-style edits where every frame matters, generate per-scene VO first and anchor every visual to known absolute timestamps. This eliminates timing drift entirely. See CLAUDE.md → Video Timing → Audio-Anchored Timelines for the full pattern. The short version:
# Audio-anchored timeline (25s):
# Scene 1 tired 0.3 → 3.74 (audio 3.44s)
# Scene 2 worries 4.0 → 8.88 (audio 4.88s)
text_clip("TIRED OF", start=0.5, duration=1.2)
text_clip("THIRD-PARTY", start=1.0, duration=1.8)
vo_clip("01_tired.mp3", start=0.3)
vo_clip("02_worries.mp3", start=4.0)from moviepy import VideoFileClip, ImageClip, CompositeVideoClip
bg = VideoFileClip("ltx_hero.mp4").without_audio()
caption = (
ImageClip(render_text_png("THE FUTURE OF AGENTS", 140, "#FFFFFF"))
.with_duration(bg.duration)
.with_position(("center", 880))
)
CompositeVideoClip([bg, caption], size=bg.size).write_videofile("captioned.mp4", fps=30)from moviepy import VideoFileClip, ImageClip, ColorClip, CompositeVideoClip
talking = VideoFileClip("narrator_sadtalker.mp4")
W, H = talking.size
# Semi-transparent bar across the bottom for contrast
bar = (
ColorClip((W, 140), color=(20, 24, 38))
.with_duration(talking.duration)
.with_opacity(0.75)
.with_position(("center", H - 160))
)
name = (
ImageClip(render_text_png("LUGH", 72, "#F06859"))
.with_duration(talking.duration)
.with_position((80, H - 150))
)
title = (
ImageClip(render_text_png("Ancient Warrior God", 36, "#FFFFFF"))
.with_duration(talking.duration)
.with_position((80, H - 80))
)
CompositeVideoClip([talking, bar, name, title]).write_videofile("with_lower_third.mp4", fps=30)LTX-2 b-roll is often too visually busy for legible text. Drop a semi-transparent navy layer between the video and the text:
from moviepy import ColorClip
tint = (
ColorClip((W, H), color=(20, 24, 38))
.with_duration(duration)
.with_opacity(0.55)
)
# Composite order: bg → tint → text
CompositeVideoClip([bg, tint, text_clip])from moviepy import VideoFileClip, CompositeVideoClip, ColorClip
left = VideoFileClip("demo_a.mp4").resized(width=960).with_position(( 0, "center"))
right = VideoFileClip("demo_b.mp4").resized(width=960).with_position((960, "center"))
bg = ColorClip((1920, 1080), color=(0, 0, 0)).with_duration(max(left.duration, right.duration))
CompositeVideoClip([bg, left, right]).write_videofile("split.mp4", fps=30)from moviepy import AudioFileClip, CompositeAudioClip
from moviepy.audio.fx.MultiplyVolume import MultiplyVolume
from moviepy.audio.fx.AudioFadeIn import AudioFadeIn
from moviepy.audio.fx.AudioFadeOut import AudioFadeOut
music = AudioFileClip("music.mp3").with_effects([
MultiplyVolume(0.22), # duck under VO
AudioFadeIn(0.5),
AudioFadeOut(1.5),
])
vo = [
AudioFileClip(f"scenes/0{i}.mp3").with_effects([MultiplyVolume(1.15)]).with_start(start)
for i, start in [(1, 0.3), (2, 4.0), (3, 9.1)]
]
final_audio = CompositeAudioClip([music] + vo)subclipped (not subclip), with_duration / with_start / with_position (not set_duration etc.), with_effects([...]) instead of .fadein()/.fadeout(). Many tutorials online still show 1.x syntax — be skeptical.TextClip(method='label') clips ascenders/descenders. Always use the PIL workaround above.OffthreadVideo is Remotion-only. moviepy uses VideoFileClip. Don't mix the two.ANTIALIAS errors, upgrade Pillow.ColorClip takes RGB tuples, not hex strings. Use (20, 24, 38), not "#141826".VideoFileClip is loaded by default. Call .without_audio() if you only want the visual — composing with audio you don't want will cause silent VO drops in CompositeAudioClip.size=(W, H) on CompositeVideoClip. Without it, output dimensions follow the first clip, which can be smaller than your target.| Task | Tool |
|---|---|
| Animate a still image | tools/ltx2.py --input |
| Talking head from photoreal portrait | tools/sadtalker.py |
| Talking head from stylized character | tools/ltx2.py --input (see ltx2 skill) |
| Add a label/caption/lower third to either of the above | moviepy + PIL (this skill) |
| Convert / compress / resize an existing file | ffmpeg (see ffmpeg skill) |
| Long-form, design-system-driven video | Remotion (see remotion skill) |
examples/quick-spot/build.pyexamples/data-viz-chart/build.pyCLAUDE.md → Video Timing → Audio-Anchored Timelinesltx2, ffmpeg, remotion© digitalsamba, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/moviepy of digitalsamba/claude-code-video-toolkit.
Open the folder on GitHubat commit 2c99460
moviepy Text-on-Video Composer next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| moviepy Text-on-Video Composer this skilldigitalsamba/claude-code-video-toolkit | 2.2k | — | ~3.3k | Automated safety check: Pass | MIT | |
| Vox DirectorAlisa0808/vox-director | 2.2k | — | ~5.6k | Automated safety check: Pass | MIT | |
| Cap Cinematic Demo GeneratorCapSoftware/Cap | 23k | — | ~2.4k | Automated safety check: Pass | Custom licence | |
| VideoDB Video Search and Editingaffaan-m/ECC | 276k | 3 repos | ~3.5k | Automated safety check: Notes | MIT | |
| Ffmpeg Skillkajisho5/ffmpeg-skill | 1.9k | — | ~7.4k | Automated safety check: Pass | MIT | |
| OpenStoryline Install HelperFireRedTeam/FireRed-OpenStoryline | 3.5k | — | ~1.5k | Automated safety check: Notes | Apache-2.0 |
Alisa0808/vox-director
Turn ONE topic into a finished Vox-style paper-collage explainer / ad video, end to end on the Atlas Cloud API + local ffmpeg — script, collage keyframes, motion, voice-over, music, captions, all…
CapSoftware/Cap
Turns any URL into a short cinematic product-demo video on macOS, scouting the page, recording it with virtual input, then treating the clip with Cap's 3D camera and music.
affaan-m/ECC
Ingests, indexes, searches, edits and monitors video, audio and live streams through the VideoDB Python SDK, returning stream links, clips and timestamps.
kajisho5/ffmpeg-skill
Edit video and audio with local FFmpeg from natural-language requests: cut, trim, join, resize/reframe (9:16, 1:1), speed change, captions and subtitles (SRT/ASS, animated, karaoke), logos and text…
FireRedTeam/FireRed-OpenStoryline
Installs, repairs and starts a local source checkout of FireRed-OpenStoryline, from prerequisites and a venv to resources, config and the MCP and web servers.
cortega26/chile-hub
Execute Python code in a safe sandboxed environment via [inference.sh](https://inference.sh).
digitalsamba/claude-code-video-toolkit
Command recipes for converting, resizing, compressing, trimming and extracting audio from video with FFmpeg, including settings for Remotion projects.
digitalsamba/claude-code-video-toolkit
Generates narration, sound effects and cloned voices through the ElevenLabs API, with model and setting choices tuned to the content's style.
digitalsamba/claude-code-video-toolkit
Generates roughly five-second video clips from a text prompt or a still image with the LTX-2.3 22B model, run through a Modal endpoint by `tools/ltx2.py`.
digitalsamba/claude-code-video-toolkit
Records browser interactions as video with Playwright, covering viewport sizing, cursor highlighting, and converting output for Remotion.
digitalsamba/claude-code-video-toolkit
Generates background music, vocal tracks, covers and stems with ACE-Step 1.5 through a bundled music_gen.py tool, using cloud or self-hosted providers.
digitalsamba/claude-code-video-toolkit
Turns a casual image request into the structured JSON caption Ideogram 4 needs for legible on-image text, exact brand colors and controlled layout.
Works with
Categories
Overlays deterministic, accurate text on AI-generated video clips and builds short single-file Python video projects without a Remotion toolchain. The core argument is that any genre where text has to be exactly right, legally, editorially or commercially, is a genre where AI-rendered in-frame text isn't good enough, since names must be spelled correctly and prices must be exact in a way generation models can't guarantee; moviepy is the fix, layering deterministic text on top of bare AI-generated visuals from tools like LTX-2 or SadTalker. It's chosen over Remotion for overlaying labels on those outputs, building a sub-30-second ad-style spot in one file, compositing data-driven visuals such as a matplotlib animation turned into a video, or a one-off transformation on an existing video file.
moviepy Text-on-Video Composer fits situations like: adding accurate labels or captions to an AI-generated video clip; building a short ad-style video spot without a Remotion project; turning a matplotlib animation into a video with a stable title.
Run `npx skills add digitalsamba/claude-code-video-toolkit --skill moviepy -a claude-code`. Or copy the skill folder (.claude/skills/moviepy in digitalsamba/claude-code-video-toolkit) into .claude/skills/moviepy in your project. Claude Code loads it when a task matches its description.
Run `npx skills add digitalsamba/claude-code-video-toolkit --skill moviepy -a codex`. Or copy the skill folder (.claude/skills/moviepy in digitalsamba/claude-code-video-toolkit) into .agents/skills/moviepy in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add digitalsamba/claude-code-video-toolkit --skill moviepy -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/moviepy, .gemini/skills/moviepy, .github/skills/moviepy and .opencode/skills/moviepy in your project.
Going by SKILL.md and its folder, moviepy Text-on-Video Composer needs the command-line tools its instructions call (uv). Our summary lists: Python with moviepy, Pillow and matplotlib; `uv` to run the bundled build scripts.
SKILL.md contains no URLs. Its commands use uv, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
moviepy Text-on-Video Composer is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.3k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with moviepy Text-on-Video Composer: Vox Director (Alisa0808/vox-director, 2.2k stars), Cap Cinematic Demo Generator (CapSoftware/Cap, 23k stars), VideoDB Video Search and Editing (affaan-m/ECC, 276k stars) and Ffmpeg Skill (kajisho5/ffmpeg-skill, 1.9k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
digitalsamba (a GitHub organization) maintains it in digitalsamba/claude-code-video-toolkit, which has 2,192 GitHub stars. The repository holds 11 skills in this directory. The repository was last updated on October 5, 2026.
Source: digitalsamba/claude-code-video-toolkit on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.