Repurposes long-form video (podcasts, interviews, talks) into short-form vertical clips for Instagram Reels, TikTok, and YouTube Shorts. Handles transcription, moment selection, clip extraction, speaker-tracked reframing (16:9 to 9:16), and animated captions.
npx skills add https://github.com/gooseworks-ai/goose-skills --skill video-clipper
Takes a long-form video and produces ready-to-post short-form vertical clips with speaker-tracked framing and professional animated captions. Works with podcasts, interviews, talks, and any talking-head content.
brew install ffmpeg on macOS, apt install ffmpeg on Linux)openai-whisper and requests packages (pip install openai-whisper requests). Note: openai-whisper installs PyTorch (~2GB download). This skill uses openai-whisper instead of the lighter whisper-cpp because it provides word-level timestamps needed for accurate viral moment scoring.brew install yt-dlp on macOS, pip install yt-dlp on Linux.env file (project root or any parent directory):KLAP_API_KEY — from klap.app (reframing with speaker tracking)CAPTIONS_AI_API_KEY — from captions.ai / platform.mirage.app (animated captions)Before starting: Verify that FFmpeg, yt-dlp, and the Python packages are installed. If any are missing, instruct the user to install them before proceeding.
| Step | Cost |
|---|---|
| Whisper (transcription) | Free (local) |
| FFmpeg (clip extraction) | Free (local) |
| Klap (reframing) | ~$1.50-2.50/clip depending on plan |
| Captions.ai (captions) | ~$0.15/min of output |
| Total per clip | ~$2-3 |
The user provides:
/path/to/podcast.mp4https://www.youtube.com/watch?v=...ctpl_DxflLOnuKkb198FNdI9E (Heat). List available templates via the API if user wants to browse.Based on input type:
Local file:
# Verify it exists and get duration
ffprobe -v quiet -print_format json -show_format "video.mp4"
YouTube URL:
yt-dlp -f "bestvideo[height<=720]+bestaudio/best[height<=720]" --merge-output-format mp4 -o "<workdir>/source.mp4" "<URL>"
Other URL:
curl -L -o "<workdir>/source.mp4" "<URL>"
import whisper
model = whisper.load_model("base")
result = model.transcribe("source.mp4", language="en", word_timestamps=True)
Save both:
transcript.json — full result with word-level timestamps (needed for Step 3)transcript.txt — readable version with timestamps per segment (for Claude to analyze)This is the key intelligence step. Claude reads the full transcript and identifies potential clip moments.
Step 3a: Segment the transcript into candidate moments
Scan the transcript for self-contained 15-60 second windows. Look for natural start/end points (topic changes, pauses, complete thoughts).
Step 3b: Score each candidate moment on this rubric
For each candidate, score 1-10 on these five criteria:
| Criteria | What to look for | Score guide |
|---|---|---|
| Hook Strength | Does the first sentence grab attention? Is it a surprising claim, provocative question, or bold statement? | 10 = "wait, what?" reaction. 1 = generic setup |
| Quotability | Contains a memorable one-liner that people would screenshot or share? | 10 = tweet-worthy standalone quote. 1 = no standalone phrases |
| Emotional Intensity | Does the speaker show passion, humor, anger, vulnerability, or conviction? | 10 = genuine emotion. 1 = monotone/flat delivery |
| Self-Containedness | Does it make complete sense without watching the rest of the video? | 10 = fully standalone. 1 = needs prior context |
| Surprise/Controversy | Does it challenge conventional wisdom, reveal something unexpected, or take a hot take? | 10 = counterintuitive insight. 1 = commonly known information |
Total score = sum of all five (max 50).
Step 3c: Rank and select top N moments
Step 3d: Present to user for approval
For each selected moment, show:
Wait for user approval. User can:
Do NOT proceed to Step 4 until user approves.
For each approved moment, extract with FFmpeg:
ffmpeg -y -ss <start> -to <end> -i source.mp4 -c copy clip<N>-raw.mp4
Upload each raw clip to Klap for AI-powered speaker-tracked reframing to 9:16.
API: Klap
POST https://api.klap.app/v2/tasks/video-to-videoAuthorization: Bearer <KLAP_API_KEY>Submit each clip:
import requests
headers = {
"Authorization": f"Bearer {klap_key}",
}
# Direct file upload
with open("clip-raw.mp4", "rb") as f:
r = requests.post(
"https://api.klap.app/v2/tasks/video-to-video",
headers=headers,
files={"video": f},
data={
"language": "en",
"editing_options": '{"captions":false,"reframe":true,"emojis":false,"intro_title":false}',
"dimensions": '{"width":1080,"height":1920}'
}
)
task_id = r.json()["id"]
output_id = r.json().get("output_id")
Poll until ready:
# Poll every 30 seconds
r = requests.get(f"https://api.klap.app/v2/tasks/{task_id}", headers=headers)
status = r.json()["status"] # "processing" or "ready"
output_id = r.json()["output_id"] # project ID when ready
Export the reframed video:
# Request export
r = requests.post(
f"https://api.klap.app/v2/projects/{output_id}/exports",
headers=headers,
json={}
)
export_id = r.json()["id"]
# Poll export every 15 seconds
r = requests.get(
f"https://api.klap.app/v2/projects/{output_id}/exports/{export_id}",
headers=headers
)
# When status != "processing", download from src_url
download_url = r.json()["src_url"]
Klap handles:
Upload each reframed clip to Captions.ai for professional animated captions.
API: Captions.ai (Mirage)
POST https://api.mirage.app/v1/videos/captionsx-api-key: <CAPTIONS_AI_API_KEY>Submit each clip:
headers = {"x-api-key": captions_key}
with open("clip-reframed.mp4", "rb") as f:
r = requests.post(
"https://api.mirage.app/v1/videos/captions",
headers=headers,
files={"video": f},
data={"caption_template_id": "ctpl_DxflLOnuKkb198FNdI9E"}
)
video_id = r.json()["video_id"]
Poll until complete:
# Poll every 10 seconds
r = requests.get(f"https://api.mirage.app/v1/videos/{video_id}", headers=headers)
status = r.json()["status"] # QUEUED → PROCESSING → COMPLETE or FAILED
Download the captioned video:
r = requests.get(
f"https://api.mirage.app/v1/videos/{video_id}/content",
headers=headers,
allow_redirects=True
)
with open("clip-FINAL.mp4", "wb") as f:
f.write(r.content)
Video requirements for Captions.ai:
Available caption templates (fetch full list via GET https://api.mirage.app/v1/videos/captions/templates):
Some popular templates:
| Template | ID |
|---|---|
| Heat (default) | ctpl_DxflLOnuKkb198FNdI9E |
| Buzz | ctpl_yvE0ZnYzEj6ClCD2ee1f |
| Medusa | ctpl_yNnJyDLSH5oIouKdjQx2 |
| Drive | ctpl_wR9PXfmxW1DFxEUuATFg |
| Magazine | ctpl_vrs1M2VrxvzQWNRypRvh |
| Energy | ctpl_oofP3mxbx8CaEPNYqnKD |
| Sirius | ctpl_miZu2nLWyP7X8oEAAHcM |
| Milky Way | ctpl_jcTmJGX77Uwz2AqLOX4S |
For each final clip, Claude writes platform-specific captions:
Instagram Reel:
TikTok:
YouTube Short:
LinkedIn (if applicable):
Save everything to the output directory:
<output-dir>/
clip1-FINAL.mp4 # Ready-to-post clip
clip2-FINAL.mp4
clip3-FINAL.mp4
captions.md # All platform captions for each clip
summary.md # Overview: source video, clips made, scores, costs
Output specs:
User provides video
↓
[ASK] "Do you want me to pick the best moments, or do you have specific timestamps?"
↓
Whisper transcribes locally (free)
↓
Claude scores moments on viral rubric (hook, quotability, emotion, self-contained, surprise)
↓
[ASK] "Here are the top N moments with scores. Approve, adjust, or add your own?"
↓
FFmpeg extracts raw clips (free)
↓
Klap reframes to 9:16 with speaker tracking (~$2/clip)
↓
Captions.ai adds animated captions (~$0.15/clip)
↓
Claude writes platform-specific captions
↓
Output: final clips + captions, ready to post
brew install yt-dlp and keep updated. If download fails, user should download the video manually and provide the local file path.whisper.load_model("medium") for better accuracy at the cost of slower transcription.Add these to your .env file:
KLAP_API_KEY=kak_xxxxx
CAPTIONS_AI_API_KEY=sk-xxxxx
No other API keys or local dependencies required. Whisper model downloads automatically on first run.
Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.
Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.
Improves the quality of images, especially screenshots, by enhancing resolution, sharpness, and clarity. Perfect for preparing images for presentations, documentation, or social media posts.
Downloads videos from YouTube and other platforms for offline viewing, editing, or archival. Handles various formats and quality options.
Lightweight WSI tile extraction and preprocessing. Use for basic slide processing tissue detection, tile extraction, stain normalization for H&E images. Best for simple pipelines, dataset preparation, quick tile-based analysis. For advanced spatial proteomics, multiplexed imaging, or deep learning pipelines use pathml.
Microscopy data management platform. Access images via Python, retrieve datasets, analyze pixels, manage ROIs/annotations, batch processing, for high-content screening and microscopy workflows.
Python library for working with DICOM (Digital Imaging and Communications in Medicine) files. Use this skill when reading, writing, or modifying medical imaging data in DICOM format, extracting pixel data from medical images (CT, MRI, X-ray, ultrasound), anonymizing DICOM files, working with DICOM metadata and tags, converting DICOM images to other formats, handling compressed DICOM data, or processing medical imaging datasets. Applies to tasks involving medical image analysis, PACS systems, radiology workflows, and healthcare imaging applications.
This skill should be used when working with pre-trained transformer models for natural language processing, computer vision, audio, or multimodal tasks. Use for text generation, classification, question answering, translation, summarization, image classification, object detection, speech recognition, and fine-tuning models on custom datasets.
Take gooseworks-ai/video-clipper from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference pip, brew.
Without those the skill loads but fails at the first command.