video-editor
Skill1 starsChanged 12 days agoMITView on GitHub
Edit the user's own videos and photos into one finished video cut to a song they provide - beat-synced cuts, Ken Burns moves on stills, dissolves, titles and an end card, optional voiceover and captions - rendered in any aspect ratio the user picks (16:9, 16:10, 4:3, 21:9, 9:16, 4:5, 1:1 or custom). Use when the user asks to make a montage, reel, slideshow, travel or event video, highlight video, music video or social clip from clips and images plus a music track. For Netigen product films use netigen-video instead.
19 other projects use a version of this.
Adopted by
Most recently taken up by
- orage-developers/skills-editortheir own version, first seen Nov 8, 2026
- weibo-job/guagua-animation-skillstheir own version, first seen Nov 8, 2026
- fralapo/awesome-agent-skillstheir own version, first seen Nov 7, 2026
- humzabuilds/claude-skillstheir own version, first seen Oct 20, 2026
- nelsonelagunar/obs-ai-workflowtheir own version, first seen Oct 15, 2026
- jtydhr88/ComfyTVtheir own version, first seen Oct 8, 2026
Used with
Projects with it also use brainstorm.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
nicolasestremSkillbrainstorm
Structured idea generation and solution exploration with systematic analysis.
Also in 3 projects that use this
Other versions19 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 19
- jtydhr88/ComfyTV★ 1.2ksame name
- ckorhonen/claude-skills★ 17same name
- coopersimson96/ai-content-system★ 17same name
- EverythingAI-Pro/ai-video-editor★ 16same name
- Isaac-Flath/agent-starter-skills★ 8same name
- darker2016/WorkbuddySkillGroups4DSH★ 6same name
- EmersonBraun/skills★ 4same name
- kevinaimonster/skill-hub★ 4same name
- tyler-berggren/tb-claude-kit★ 2same name
- weibo-job/guagua-animation-skills★ 2same name
9 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repositoryOne other file it gives its agents.
- fix-android-tv-lagSkill
The file
We split this skill into the rules it gives an agent
4 rules. 0 are common, 1 is distinctive, and 3 are very specific to this project.
0
Common
Most of the 12 edited versions we read keep these.
1
Distinctive
This author's own choices. Worth a look.
3
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 14
Only the user's media and song: Never add stock or AI-generated footage, images or music unless the user asks.
- Very specific: line 16
The song is the master clock: Never time-stretch or pitch the song.
- Very specific: line 18
Privacy: If media shows strangers' faces in close-up, number plates, addresses, documents or screens with personal data, point it out and …
- Very specific: line 72
Keep start/end on beats from beats.json when you move a cut.
“Common” is measured: kept by at least 6 in 10 of the 12 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Video editor (any footage + the user's song)
Turns a folder of the user's clips and photos into a cinematic, beat-cut video scored with the song they give you. Same toolchain as netigen-video: Python + ffmpeg to prepare media and audio, HyperFrames (HTML + GSAP) to compose, one project per aspect ratio, a two-pass loudnorm, a mux of the exact mix.
The working code is in scripts/. Editing and render rules: reference/edit-render.md. Audio, voiceover and delivery: reference/audio-deliver.md.
Hard rules
- Only the user's media and song. Never add stock or AI-generated footage, images or music unless the user asks. If a slot has no good shot, reuse or shorten; say so.
- Never touch the originals. Everything is read from the user's paths and written under
$FILM_ROOT. Never delete or overwrite input files. - The song is the master clock. Never time-stretch or pitch the song. Trim it (
song_in) and fade it; cuts land on its beats (beats.json). Hard cuts on beats, dissolves for slow songs. - Frame each ratio on purpose. Each aspect ratio is prepared natively from the source with a focus point. When the source aspect is far from the canvas (a landscape clip in 9:16), use
contain(sharp picture over a blurred fill) rather than cropping away faces or text. Never cut a face or a line of on-screen text at an edge. - Privacy. If media shows strangers' faces in close-up, number plates, addresses, documents or screens with personal data, point it out and offer a blur box (
bluron the shot); blur goes into the pixels in prepare.py. - Copyright note, once. Commercial songs may be muted or claimed on YouTube/Instagram/LinkedIn. Mention it in one line at hand-off; it is the user's call, never a blocker.
- Be fast. Send an early preview, do one review pass and one fix pass, deliver, and ask before any further round. "Just change X" changes only X.
- Standing preferences: reply in English, no commits unless asked, never commit to master, no co-author trailer, never force push. Ask before installing anything system-wide (ffmpeg goes in
<film>/bin).
Step 0: Intake (ask before anything else)
Use AskUserQuestion, and ask only what the request leaves open, with one exception: always ask the aspect-ratio questions, offering every supported ratio, even when the request names some (pre-mark the named ones as "(Recommended)" and list them first), so the user sees all the choices before anything renders. If the user has not given the media folder or the song file, ask for the paths in plain text first (they are not multiple-choice). Round 1:
| Question | Options (multi-select; "Other" takes any custom ratio, e.g. 2:3 or 3:2) |
| Wide ratios? | 16:9 (YouTube, TV, laptop) · 16:10 (laptop, presentation) · 4:3 (tablet, classic) · 21:9 (cinema, ultrawide) |
| Tall or square ratios? | 9:16 (Reels, Shorts, Stories, WhatsApp status) · 4:5 (Instagram / Facebook feed) · 1:1 (square feed) · None |
Then the rest of round 1:
| Question | Options (first is the default) |
| How long? | Fit to the media (about 2 s a shot) · 30 s · 15 s · The whole song |
| Pace / feel? | Medium: cut every 2 bars, soft dissolves · Slow & cinematic: long dissolves · Fast: hard cut on every beat or two |
Round 2 (only what is still open):
| Question | Options |
| Text on screen? | Title + end card · Title only · None · Captions from a voiceover |
| Which part of the song? | From the start · The loudest part (auto) · End on the song's real ending |
| Clip sound? | Mute clips, song only (default) · Keep sound on chosen clips, under the song |
| Order? | As the files are named · By date taken · I'll pick the order |
| Look? | Full-bleed, dark (default) · Framed on dark · Light |
Then show the plan as one table (shots in order with their source, length and move; the song window; ratios; ETA) and ask the user to confirm. Typical time: 20-40 min for a 30 s film in two ratios, mostly render time.
Step 1: Preflight and scaffold
- Tooling: Python 3.11 with numpy, scipy, PIL; Node 22+ for
npx. ffmpeg: use$FFMPEGor PATH if present; otherwise ask, then fetch the BtbN build into<film>/bin(queryhttps://api.github.com/repos/BtbN/FFmpeg-Builds/releases/latestfor the real asset name, never guess it). Animageio_ffmpegbinary from any venv works too (probe.py falls back to parsingffmpeg -iwhen there is no ffprobe), but HyperFrames renders want ffprobe as well. - Scaffold
<film>(default: under the session scratchpad) as in scripts/README.md: copyscripts/tools,scripts/edit,scripts/audiointo it, and exportFILM_ROOT,FILM_NAME,FFMPEG. - Per ratio:
npx -y hyperframes@0.8.134 init videos/$FILM_NAME-<ratio> --non-interactive --example=blank, then copyscripts/shared/{gsap.min.js,grain.png}intoassets/lib/andscripts/shared/fonts/*intoassets/fonts/. Without GSAP the timeline renders blank. Always pin 0.8.134.
Step 2: Look at the media
python -I tools/probe.py <folder or files...> writes edit/media_index.json and numbered contact sheets edit/contact-N.jpg. Read every contact sheet, and for clips a 6-frame strip each (one frame says little about what happens in a take). Note which clips are HDR (iPhone HLG; prepare.py tone-maps them) and which are handheld ("stabilize": true). Note per item: the subject and where it sits (for focus), which clips have the best moment and when (for in), rotated or dark shots, and anything private. Drop broken files and say so.
Step 3: The song
Convert the user's song once: ffmpeg -i <song> -ar 48000 -ac 2 -c:a pcm_s16le audio/song.wav. Then python -I tools/beats.py audio/song.wav writes audio/beats.json (tempo, beats, downbeats, bar loudness, lifts). Sanity-check the tempo against the feel of the song; if it is doubled or halved, re-run with --bpm <n>. Details: reference/audio-deliver.md.
Step 4: Plan the cut
python -I tools/plan.py [--duration 30|song] [--pace slow|medium|fast] [--song-in 0|auto|end|<s>] [--order as-listed|date|name] [--title "Line one\n*serif line*"] [--end-card "..."] [--theme dark|light] [--look fullbleed|framed] [--name "..."] writes edit/timeline.json and prints the shot table and NOTES (reused inputs, dropped inputs, clips shorter than their slot).
Then edit timeline.json by hand from what you saw on the contact sheets. It is the only source of timing:
- Order the shots into a story: an opening shot that works as a thumbnail, build, the strongest shots on the song's lifts, a calm closing shot before the end card.
- Per shot:
focus[x, y] (0-1, where the subject is),move(push-in, push-out, pan-left/right/up/down, still),amount,fit(auto, cover, contain),xf(dissolve length; 0 is a hard cut),blurboxes; for clipsin(seconds into the source),speed(0.5-2; never speed up faces talking),keep_audioandaudio_gain. - Keep
start/endon beats frombeats.jsonwhen you move a cut. Put big moments on downbeats orlifts. - Texts:
{"text", "style": "title"|"lower"|"caption", "start", "end"}; in a title, a line wrapped in*...*is set in italic serif.
Step 5: Prepare, build, audio
python -I edit/prepare.py <fmt> [shot ids] # per ratio; pass ids to redo only those
python -I edit/build.py <fmt> # writes videos/$FILM_NAME-<ratio>/index.html
python -I audio/build_audio.py --diag && (cd audio && bash norm.sh) # song (+VO, clip sound, SFX) -> mix.wav at -14 LUFS
cp audio/mix.wav videos/$FILM_NAME-<ratio>/assets/mix.wavFormat keys: land 16:9, port 9:16, 1x1, 4x5, 16x10, 4x3, 21x9, or any custom WxH ratio such as 2x3 or 3x2 (short side 1080 px; wide ones follow the 16:9 layout, tall and square ones the 9:16 layout). Rebuild from the first stage that changed: timeline -> prepare -> build; timeline or song -> build_audio -> norm -> copy.
Step 6: Check, preview, render
- In each project:
npx -y hyperframes@0.8.134 check(0 errors needed;container_overflowinfos on plates are expected, since plates are larger than the window by design). Fix contrast warnings by changingaccent. snapshot --describe false --no-end --timeout 20000 --at <one moment per shot + each text>; read every contact sheet. Look for faces or text cut at edges, wrong focus, dark shots, text over busy areas.- Send an early preview: render the first ratio, mux, make a crf 21 preview under 30 MB and send it with SendUserFile.
- Render:
render --sdr --crf 16 --fps 30 --workers 2 --output renders/<name>-vN.mp4in the background, then confirm the master is h264/bt709 with ffprobe (phone footage is HDR; see reference/edit-render.md). Then mux the exactmix.wav(commands in reference/edit-render.md); portrait renders needfillborders=right=8:mode=smear.
Step 7: Review once, then deliver
Extract frames at 2 fps from the muxed master and check them against the checklist in reference/edit-render.md. Fix only real defects, re-render once, deliver:
deliver/<Name>-<ratio>.mp4masters,deliver/preview/*-preview.mp4(sent),deliver/<name>.srtif there is text or VO (python -I tools/srt.py deliver/<name>.srt), and an optional post caption if the user wants one.- Hand-off notes: what was left out and why, any shot reused or held on its last frame, the song window used, the copyright line, and file paths.
- Last question, always: ask with AskUserQuestion (multi-select, not as plain text) which other aspect ratios they want, offering every supported ratio not yet delivered: 16:9 · 16:10 · 4:3 · 21:9 · 9:16 · 4:5 · 1:1 (split into a wide and a tall/square question when more than four remain), plus "None". A new ratio reuses timeline.json and mix.wav: prepare, build, check, render, mux.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

