watch-video
When you want to extract content from a video — YouTube, Loom, Vimeo, Riverside, Zoom recording, local MP4, X/IG video, anything yt-dlp supports. Three depth modes user picks per invocation — transcript (just words, fast/free), visual (transcript + ffmpeg frame extraction + Claude vision pass on key
By coreyhaines31 · 457 installs
npx skills add coreyhaines31/makerskills --skill watch-video
Source repository · Upstream listing
/watch video — Transcribe and analyze any video at the depth you choose
Replaces and broadens the prior youtube transcript skill. YouTube is now one of many sources; depth is user controlled.
Step 1 — Parse input
Accept:
YouTube : full URL, youtu.be/<id , youtube.com/shorts/<id , raw 11 char ID
Loom : loom.com/share/<id or loom.com/embed/<id
Vimeo : vimeo.com/<id
Riverside : download URL or local file
Zoom : local .mp4 from a downloaded recording
X / IG / TikTok video : URL — defers to social fetch for metadata, uses yt dlp for the file
Local file : any path to an .mp4 / .mov / .webm / .mkv
Detect source from URL pattern or file extension. If ambiguous, ask.
Step 2 — Parse depth mode
Invocation Mode What you get
/watch video <url transcript (default) Clean text, metadata, optional chapters
/watch video <url transcript transcript Same as default
/watch video <url visual visual Transcript + frames at intervals + Claude vision pass identifying key moments
/watch video <url multimodal multimodal Native video to Gemini (if $GEMINI API KEY ), else dense Claude vision frame by frame
If the depth isn't specified and the video is 10 minutes, ask before defaulting (visual/multimodal cost real money on long videos).
Step 3 — Pull metadata
For URL sources, use yt dlp:
Capture: title, uploader/channel, duration, upload date, description (first paragraph), chapters (JSON or null).
For local files, use ffprobe:
Step 4 — Build workdir
Where:
source : youtube / loom / vimeo / riverside / zoom / local
slug : kebab case of title (first 4–6 words, max 50 chars)
date : YYYY MM DD
Step 5 — Get the transcript
Backend selection (in order):
1. Platform provided transcript if it exists and looks complete:
YouTube: yt dlp write sub write auto sub skip download sub lang en sub format vtt
Loom: fetch via https://www.loom.com/share/<id page metadata or Loom API if $LOOM API KEY set
Riverside: built in transcripts available on the recording's share page
If platform transcript exists and has timestamps, use it. Skip Whisper.
2. MLX Whisper local (default fallback — fast on Mac M series):
Or via the CLI: mlx whisper <file model mlx community/whisper large v3 turbo output dir <workdir
3. whisper.cpp (further fallback if MLX unavailable)
Download the video file first if it's a URL (use yt dlp; Loom/Vimeo/YT all supported):
720p is plenty for transcription and frame analysis (smaller download, faster processing).
Clean the transcript (only needed for YouTube auto subs which have rolling captions; Whisper output is already clean):
Save final to <workdir /transcript.txt .
Step 6 — If transcript mode: stop here
Output:
transcript.txt
metadata.json
One line summary in chat: title, source, duration, word count
Path to workdir
(Optional) Step 9 — offer to capture to second brain
Step 7 — If visual mode: extract frames + vision pass
Frame extraction (ffmpeg)
Cadence by source heuristic:
Source type Frame cadence
Screen share / Loom / demo 1 frame per 5s (UI changes fast)
Talking head / podcast 1 frame per 30s (slow change)
Slide presentation 1 frame per 10s + force a frame on each detected scene change
Default if unsure 1 frame per 15s
For scene change detection (slide decks especially):
Vision pass
Pair each frame with the transcript chunk for the same timestamp window. Then batch send to Claude vision for synthesis.
Per frame batch prompt (up to ~10 frames per call):
Here are N frames from a video at timestamps T1..TN. For each frame, describe what's on screen in 1–2 sentences. Flag: (a) UI changes from previous frame, (b) text visible on screen, (c) any moment that looks like a decision, action, or notable event. Also note the transcript text spoken during this window.
Save the output as <workdir /moments.md :
Generate summary
After moments are identified, synthesize the whole video into <workdir /summary.md :
Step 8 — If multimodal mode
Backend selection
1. Gemini native if $GEMINI API KEY is set (much cheaper + faster than per frame for long videos):
Default model: gemini 3.5 flash (released May 2026, ~$1.50 input / $9 output per 1M tokens; ~$0.15/sec of video; beats 3.1 Pro on coding/agentic benchmarks at 4× the speed). Override to gemini 3.1 pro for brand audits / high stakes analysis where details matter; gemini 2.5 flash lite for bulk cheap processing.
Files persist in Gemini Files API for ~48 hours — useful for re querying the same video with different prompts.
2. Dense Claude vision fallback if no Gemini key:
Frame cadence: 1 frame per 3s (much denser than visual mode)
Batch through Claude vision with the multimodal analysis prompt
Slower and more expensive than Gemini for long videos — warn the user before running on 10min content
Multimodal output
Same summary.md template as Step 7 + an extended section:
Exact extra sections depend on the use case (brand audit, ad review, talk delivery review, client call read). Use case is inferred from the source + the user's verbal framing when invoking.
Step 9 — Optional: capture to second brain
After any mode completes, offer:
"Want to capture this to second brain? I'll write a call <slug .md (or meeting / note / resource ) to ${SECOND BRAIN VAULT: $HOME/Documents/SecondBrain}/raw/ with the summary, source URL, and transcript link."
Type prefix by source:
Source Prefix
Loom / Zoom / Riverside / Otter / call recording call
Meeting (own notes, not a transcript) meeting
Talk / keynote / conference note
Ad / landing page video / marketing reference / competitor video resource
File body: 1 line source, the summary, link to full workdir.
Step 10 — Report
In chat:
One line headline: <source · <title · <duration · <mode · <word count words
Workdir path
For visual / multimodal : brief list of top 3 key moments
For all modes: any action items / decisions flagged for triage
If captured to second brain: that path too
Sources reference
Source Download Built in transcript Notes
YouTube yt dlp Auto subs ( write auto sub ) Same as the prior youtube transcript skill
Loom yt dlp (Loom supported) Yes — fetch via embed metadata or Loom API Async screenshare focus — prime use case
Vimeo yt dlp Sometimes Marketing/embed videos
Riverside Direct URL from export, or local file Yes — Riverside generates them Podcast episodes
Zoom Local .mp4 (downloaded recordings) Sometimes (Zoom audio transcript file) Client calls
X / IG / TikTok Defer to social fetch for metadata, yt dlp for file No Short form
Local file n/a n/a Drop a path
Composes with
social fetch — for X/IG/TikTok URL metadata (engagement, author, replies) before video processing
second brain — capture summary as raw/call <slug .md , meeting , note , or resource per source type
decide — when a video contains a flagged decision, route to /decide for structured capture
pm — action items flagged in summary can be triaged to project boards
slide deck — talk recordings → outline extraction → deck draft (loop)
jab hook — quotes + clip worthy moments from podcast/talk videos feed BIP/promo posts
skillify from video — primary use case for visual mode on process recordings. the user records themselves doing a workflow (Loom/screen share), this skill extracts transcript + key visual moments, then skillify synthesizes the workflow into a SKILL.md. "Record once, AI converts to skill."
Error handling
Failure Response
Video unavailable / private / region locked Report and stop
No subtitles + Whisper not installed Tell the user: pip install mlx whisper (Mac)
ffmpeg missing (for visual/multimodal) Tell the user: brew install ffmpeg
Vision pass returns empty / unclear Lower the frame count, retry, or fall back to transcript only with a note
Multimodal requested but no $GEMINI API KEY and 30min video Warn cost, offer to fall back to visual mode
yt dlp binary missing brew install yt dlp
Notes on quality
User picks depth, not the skill. Transcript / visual / multimodal are 3 different cost + latency profiles. Long videos ( 10 min) always confirm before spending on visual/multimodal.
Platform transcript first, Whisper second. YouTube auto subs, Loom transcripts, Riverside built in transcripts — all free + instant when they exist. Fall back to MLX Whisper local only when nothing platform provided works.
MLX Whisper local is the fast path on Mac. M series machines transcribe faster than real time. Cloud Whisper is a distant second choice — costs money, network dependency, worse latency on typical durations.
Frame cadence by source type. Screen share / demos need 1 frame per 5s (UI changes fast); talking head podcasts need 1 per 30s (slow change). Default 15s if unsure. Wrong cadence = missed key moments OR wasted vision pass cost.
720p is plenty. Downloading 1080p / 4K for transcription + frame analysis wastes bandwidth + storage. yt dlp f "bv [height<=720]+ba/b[height<=720]" is the default.
Scene change detection catches slide transitions. When the video is a slide presentation, add ffmpeg vf "select='gt(scene,0.3)'" to force a frame on each detected slide change — more reliable than pure time based sampling.
Multimodal cost warning is non optional. Gemini multimodal on a 60 min video is meaningfully expensive. Warn before running; offer transcript only as fallback if the user isn't sure.
Summary format includes routing hints. Decisions flagged + Action items flagged sections signal /decide and /pm follow ups. Downstream composability lives in the summary structure.