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):
| Setting | Default |
|---|---|
| How many clips | 3 to 5, as many as are genuinely strong |
| Clip length | 20 to 60 seconds (aim for 30 to 45) |
| Caption colours | off-white #F5F1EA, the word being said in clay #B03926 |
| Captions | on |
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/endin 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.