Download skills/builtin/clipify/SKILL.md from the publisher, or copy the path and open the repository. PlugMCP lists the skill and does not host the file.
Where does clipify live?
The publisher keeps it at https://github.com/ZJU-REAL/Easel.
Which agents can use clipify?
Claude, Cursor, and Codex can read a SKILL.md you add from the publisher's repository.
Find the funniest moments in a video, cut them as standalone clips, optionally reformat 16:9 → 9:16 (face-pan or split-screen), and burn opus-style word-by-word captions.
Inputs
A video file path (the user will provide it; otherwise ask)
Optional: requested format (9:16, 16:9, 1:1) — if not given, ask after candidates are picked
Optional: subtitle style preference — if not given, ask before captioning
Tooling (use only the fastest path)
Whisper:whisper --model tiny.en --word_timestamps True --output_format json (≈10× faster than ; quality fine for English). For non-English: (drop ).
small.en
--model base
--language
ffmpeg: hardware decode is optional and platform-specific — use -hwaccel auto, or omit it (macOS: videotoolbox; Linux: vaapi/cuda/none). Add -preset ultrafast for renders. Use -c:v libx264 -crf 20 for the final master.
Numpy for audio alignment (FFT cross-correlation). No scipy/cv2 needed.
Scripts:<skill-dir>/scripts/ (where <skill-dir> is the directory containing this SKILL.md — typically ~/.claude/skills/clipify/)
analyze.py — speaker timeline from two ROI motion files
build_pan.py — ffmpeg crop x-expression with hard cuts
build_ass.py — opus-style ASS captions from whisper JSON
audio_align.py — find offset of a sub-clip in a longer source
Working dir: /tmp/clipify/ (mkdir at start, leave artifacts for debugging).
(Use -c copy for instant trim. Re-encode only if cuts must be frame-accurate.)
Step 3 — Decide the output format
Ask the user (skip if they already specified): "9:16 (TikTok / Reels), 16:9 (YouTube), or 1:1 (Insta feed)?"
Step 4 — If 16:9 → 9:16: pan-between-faces vs split-screen
Detect source aspect with ffprobe. If source is 16:9 and target is 9:16, ask:
"Two options: (a) hard-cut pan that follows whoever is speaking (single face on screen at a time), or (b) split-screen stack with both faces visible. Which do you want?"
Skip the question if there's only one face (single-talker clip). For single-talker, just center-crop.
Step 4a — Pan-between-faces (recommended for fast-cut talking-head dialogue)
Locate the two face ROIs. Sample one frame: ffmpeg -ss <middle> -i <clip> -frames:v 1 /tmp/clipify/probe.jpg. Read it. Eyeball each face's mouth+chin area as x,y,w,h in the source's pixel space. (No cv2 needed — camera is static within a clip; one frame is enough.) Verify by drawing boxes:
Build <RIGHT_SPEAKER_ENABLE> from segments.json as between(t,a,b)+between(t,a,b)+... over the right-speaker segments. Tile crops should target ~720×640 around each face (1.125:1 to match 1080×960).
Step 5 — Add subtitles
Ask once (only if user hasn't already specified a style):
"Three subtitle styles: opus (big bold white, yellow active-word highlight), karaoke (4-word chunks, green highlight), minimal (clean Helvetica, no highlight). Or paste an example you like."
If they paste a reference image/example: match the font, size, weight, color, position, and animation as closely as possible — write a custom ASS by hand or extend build_ass.py.
Else use the preset:
# Re-run whisper on the trimmed clip for accurate timestamps relative to clip start
whisper /tmp/clipify/clip_panned.mp4 --model tiny.en --word_timestamps True --output_format json --output_dir /tmp/clipify --language en
python3 <skill-dir>/scripts/build_ass.py /tmp/clipify/clip_panned.json /tmp/clipify/captions.ass opus
Save each output to <source_dir>/clipify_out/ (mkdir if missing)
Print one line per clip: name, duration, what was funny, output path
Print the first output path (or open it — Linux xdg-open <path>, macOS open <path>) so the user can check it
Offer to iterate (different style, different ROI, swap to split-screen, retime captions)
Pitfalls (lessons from prior runs — don't repeat)
Don't over-tune ROIs. Two iterations max. Motion-diff is forgiving — wider ROIs covering mouth+chin work fine even if not perfectly mouth-centered.
Watch out for scene cuts inside a clip. Run ffmpeg -filter:v "select='gt(scene,0.3)',showinfo" -f null - to count cuts. If a 16:9→9:16 clip has many cuts, the fixed face ROIs only work for the dominant scene; warn the user, and offer to either pick a single-take clip or accept off-center framing during cuts.
Source resolution matters. If source is 4K, either downscale to 1920×1080 first (faster, fine for 9:16 output) or multiply all ROI/pan coordinates by 2.
Burned-in subtitles in source. Some "raw" clips still have subtitles. If so, find the no-subs master via audio cross-correlation (audio_align.py) and trim from there.
Don't run whisper on the full feature-length source if a short clip suffices. Whisper the trimmed clip after Step 2; only whisper the full source in Step 1 if you need a transcript to find funny moments.
State the plan in one line, then act. Don't narrate every iteration.
How do I install clipify?
Download skills/builtin/clipify/SKILL.md from the publisher, or copy the path and open the repository. PlugMCP lists the skill and does not host the file.
Where does clipify live?
The publisher keeps it at https://github.com/ZJU-REAL/Easel.
Which agents can use clipify?
Claude, Cursor, and Codex can read a SKILL.md you add from the publisher's repository.