What does clip-anything do?
Purpose
Turns a long recording (one file, several files, or a folder that is one session) into the top N vertical highlight clips using the free, local clip-anything CLI. The skill drives the tool, shows what it would cut before it cuts, and reads the report so the user knows why each moment was picked. It never uploads, posts or sends footage anywhere; the CLI itself makes no network calls except an optional, one-time Whisper model download that asks first.
Prerequisites
uvx(from uv) orpipxon PATH. The CLI is a Python package;uvx clip-anythingruns it without an install.ffmpegandffprobeon PATH. The CLI exits with code 3 and an install line when they are missing.- A recording the user can point to:
.mp4 .mkv .mov .m4v .ts .m2ts .mts .webm .avi .flv, or a folder of them.
Instructions
Work from the user's current directory. Use the exact paths the user gave; quote them. Do not move, rename or delete footage. Do not install anything beyond what the steps below print as a suggestion for the user to run.
Workflow
(Use the steps in order; a step that cannot be completed is reported, not skipped.)
- Check the tools. Run
command -v uvx || command -v pipxandcommand -v ffmpeg && command -v ffprobe. Ifuvxandpipxare both missing, print and stop:curl -LsSf https://astral.sh/uv/install.sh | sh(macOS/Linux) orwinget install astral-sh.uv(Windows). If ffmpeg is missing, print and stop:brew install ffmpeg/sudo apt install ffmpeg/winget install Gyan.FFmpeg. Usepipx run clip-anythingwherever this file saysuvx clip-anythingif only pipx exists. - Resolve the input. If the user named a file or folder, use it. If they said "my recording" with no path, look for video files in the current directory (search for the extensions above, newest first). Ask only when there are several plausible inputs or none; otherwise proceed and say which path was used. A folder is passed as-is: the CLI treats it as one session.
- Dry run first, always. Run
uvx clip-anything "<input>" --dry-run --json 2>/dev/null(add--count Nif the user named a number). Parse the JSON from stdout. Show a short table: rank,starttoendas mm:ss,duration_s,score,titleif present, and the top component fromcomponents. Ifclipsis empty, say so plainly and readwarnings(abelow_floorwarning means nothing cleared the action bar) before suggesting--min-score 0or a lower value. - Render. Unless the user asked only for a preview, run
uvx clip-anything "<input>"with the same options, without--dry-runand--json, so the progress UI shows. Add--yesonly if the user said captions are wanted and has agreed to the one-time model download; otherwise let the CLI ask. Report the output folder (./clipsby default, or--out). - Explain the picks. Read
clips/report.json(read the file, orpython3 -I -cover it). For eachokclip give one line: the time span, the score, and which signals carried it (components: loudness over baseline, audio onsets, motion, audio/motion agreement, static-card penalty, speech bonus when present). Mentionlayoutwhen it isfacecamandcaptionswhen true. List every entry inwarningsin plain words; the tool degrades out loud and the user should hear it. - Offer the knobs, one line each, only the ones that fit what the user saw:
--count Nmore or fewer clips (it is a maximum; quiet sessions return fewer)--min-score 0.3lower the action bar;--min-score 0rank the file against itself--min 20 --max 60clip length bounds in seconds--crop centerstatic centre crop instead of following the action--no-captionsnever burn captions;--facecam offno webcam stack--visionlocal Ollama re-rank and titles (experimental; only talks to127.0.0.1:11434)--forceoverwrite clips from the last run;--no-cacheignore cached analysis A re-run with different knobs takes seconds because analysis is cached next to the video.
- Disclosure. When captions or titles are present, say once: captions are machine transcription (faster-whisper, local) and titles come from a local vision model; both can be wrong and should be checked before posting.
Examples
- "Make 5 shorts from last night's stream, it's in ~/Videos/obs/" → step 1, pass the folder,
--count 5dry run, show the table, render, explain. - "Why did it pick a loading screen?" → open
report.json, show that clip'scomponents(a highcardvalue means the static-card penalty fired but loud onsets still won), suggest--min-score 0.6or a higherw_cardin a--configTOML. - "Just show me what it would cut, don't render" → steps 1 to 3 only.
Limitations
- Transcript-first moments (a joke with no action) score low by design; the tool ranks action, speech is a bonus.
- The action bar was calibrated on two games; an unseen game may return fewer clips than asked. Say so instead of forcing clips with
--min-score 0unprompted. - 1080p60 sources analyse at roughly 100 s per hour; a multi-hour file is a wait, not a hang.
- The skill does not edit clips, pick thumbnails, or post anywhere. Posting is the user's step.
Troubleshooting
- Exit 2: bad input (missing path, unsupported file, folder with no videos). Show the CLI's message.
- Exit 3: ffmpeg or ffprobe missing. Print the install line for the user's OS from step 1.
- Exit 1: nothing rendered. Read
warningsin the dry-run JSON; usuallybelow_floor. - Captions written as a sidecar
.assinstead of burned in: the ffmpeg build has no libass (stock Homebrew formula). Anffmpeg-fullbuild on PATH fixes it; everything else still works. --visionhad no effect: Ollama is not running or has no vision model; the run continues action-only and leaves one warning.