Communitygithub.com

clipper

Turn a long video into short vertical clips with word-by-word captions, ready to post. Use when the user drops in a video (a podcast, a YouTube video, a long talking-head recording, a live) and says "clip this", "find the best moments", "make shorts / reels / TikToks from this", "/clipper", or asks for clips with captions. Transcribes on this computer (no API key), Claude picks the 3 to 5 strongest moments, then cuts each to 9:16 framed on the speaker's face with captions burned in.

What is clipper?

clipper is a Claude Code agent skill that turn a long video into short vertical clips with word-by-word captions, ready to post. Use when the user drops in a video (a podcast, a YouTube video, a long talking-head recording, a live) and says "clip this", "find the best moments", "make shorts / reels / TikToks from this", "/clipper", or asks for clips with captions. Transcribes on this computer (no API key), Claude picks the 3 to 5 strongest moments, then cuts each to 9:16 framed on the speaker's face with captions burned in.

Works with✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/corbinsylk/clipper-skill/tree/HEAD/skills/clipper

Ask in your favorite AI

Open a new chat with this agent skill pre-loaded.

Documentation

What does clipper do?

Drop in a video and Claude finds the strongest moments, then turns them into short clips with captions, ready to post.

Everything runs on this computer. Nothing is uploaded. The skill lives in ~/.claude/skills/clipper/; its tools are scripts/transcribe.py and scripts/make_clips.py, run with the skill's own Python: ~/.claude/skills/clipper/.venv/bin/python.

0. Check the install (every run)

test -x ~/.claude/skills/clipper/.venv/bin/python && command -v ffmpeg

If either is missing, tell the user in one line and run the installer from the repo they cloned (bash install.sh inside the clipper-skill folder). If you cannot find the folder, clone it again: git clone https://github.com/corbinsylk/clipper-skill && cd clipper-skill && bash install.sh.

1. Get the video

The user drags the file in or gives a path. If they gave neither, ask for it in one line. Both scripts use the work folder <video name>-clips/ beside the video unless you pass another one. Settings the user may give (otherwise use the defaults, never ask):

SettingDefault
How many clips3 to 5, as many as are genuinely strong
Clip length20 to 60 seconds (aim for 30 to 45)
Caption coloursoff-white #F5F1EA, the word being said in clay #B03926
Captionson

2. Transcribe

~/.claude/skills/clipper/.venv/bin/python ~/.claude/skills/clipper/scripts/transcribe.py "<video>"

It prints the work folder first. The first run downloads the speech model once (about 500 MB for small); a 2-minute video takes about a minute, an hour-long one several minutes. For anything over about 10 minutes, run the command as a background command (in Claude Code: the Bash tool's run_in_background) and tell the user it is working. For a strong accent or poor audio add --model medium. A warning about an HF token or a speed tip on the first run is harmless.

3. Pick the moments (this is your job, not a script's)

Read <work folder>/transcript.md in full. Pick the 3 to 5 strongest moments. A strong moment:

  • Opens with a hook in its first sentence. A bold claim, a surprising number, a question, a mistake, a story starting. Never start on "so", "and", "um", "like I said" or a line that needs earlier context.
  • Stands on its own. Someone who never saw the full video understands it. No "this", "that thing" or "as I mentioned" pointing outside the clip.
  • Pays off. It ends on the answer, the punchline, the result or the lesson: a finished thought, never mid-sentence.
  • Has energy. Opinions, specifics, numbers, emotion, a turn. Skip greetings, sponsor reads, housekeeping and slow setup.
  • Does not repeat another pick. Each clip makes a different point, and clips never overlap in time. A short video gives fewer clips: under about 5 minutes, 1 to 3 clips is normal; never stretch or overlap to reach a number.

Score each 1 to 10 (hook, standalone, payoff, energy together). Keep only the ones scoring 7 or more; if fewer than 3 do, keep the best 3 and say they are weaker. Then write <work folder>/moments.json:

[
  {"title": "Short title for the file", "start": 63.2, "end": 101.8, "score": 9,
   "hook": "the clip's first sentence, word for word",
   "why": "one line: why this moment works",
   "caption": "a ready post caption: one hook line, then 2-3 short lines, then a question or call to action"}
]

start and end are seconds from the start of the video (transcript times are minutes:seconds, so 01:03.2 = 63.2). <work folder>/words.json has every word with its exact start (s) and end (e): read it to set the edges. Set start to the s of the hook's first word and end to the e of the payoff's last word. The script keeps the words from start to end (0.05 s grace) and never reaches into the word before or after, so to drop a word like "So" set start to the next word's s.

4. Make the clips

~/.claude/skills/clipper/.venv/bin/python ~/.claude/skills/clipper/scripts/make_clips.py "<video>"

Add --text-color "#FFFFFF" --active-color "#FFD400" for other caption colours, or --no-captions. It takes about a minute per clip. Each clip: cut on word edges, reframed to 1080x1920 (a wide video is cropped around the speaker's face; any stretch of a second or more with no face, like a graphic, a screen or B-roll, is shown whole on a blurred fill instead of cut off; a vertical video is kept whole), captions three words at a time with the spoken word highlighted, sound levelled to -14 LUFS.

5. Check before you hand over

Open every clips/NN-*.jpg: each is a strip of 8 frames across the whole clip. Look at all of them:

  • The face is in frame and the captions read, under the chin, on every talking frame.
  • The video already has captions burned in (you see two sets of words): remake all clips with --no-captions.
  • The script prints "face in X/Y checks" per clip. If X is 0 there is no face to frame (a screen recording, slides): the clip is centred, so say so in the report. Frames without a face are expected on an edited video; they are the cutaways it shows whole.
  • If a clip starts or ends mid-word or mid-thought, fix start/end in moments.json and remake only that clip with --only N.

6. Report

One short list: each clip's file, length, score and why it works, plus its post caption. Point them to clips/scores.md (all of it in one file) and the clips/ folder. Offer one next step: different moments, other caption colours, or longer/shorter clips.

Related Skills