Video
Process a video URL — transcribe, summarize, and output to terminal, Linear, or Obsidian with executive summary, chapters, and references.
Video Skill
Process a video URL into a structured summary with executive summary, chapters, transcript, and references. Output to terminal, Linear issue, or Obsidian vault note.
Scope: This skill covers video-to-knowledge processing — download, transcribe, summarize, and format. It is NOT about video editing, encoding, or streaming. For Linear issue management beyond video, see Linear MCP directly.
Usage
/video <url> # process + print summary to terminal
/video <url> --linear [ISSUE-ID] # create/update Linear issue
/video <url> --obsidian # create Obsidian note in Videos/New/
/video --obsidian-triage # batch-process untitled notes in vault root
/video --people-backfill # add profile images to People pages missing them
Pipeline
All modes share the same processing pipeline (except --obsidian-triage and --obsidian-watched which operate on existing notes).
Step 1: Process Video
MANIFEST=$(bash <skill-dir>/process_video.sh "<url>")
This produces:
manifest.json— metadata, paths to all artifactsvideo.mp4— downloaded videoaudio.wav— extracted audiovideo.jpgorthumbnail.jpg— thumbnail imagevideo.info.json— yt-dlp metadata (YouTube sources)transcript.txt— Whisper transcriptionsegments.json— timestamped transcript segments
Step 2: Read Artifacts
Read the manifest, transcript, and segments files. For YouTube videos, also read info.json for metadata.
Step 3: Generate Content
Using the transcript and metadata, generate:
Executive Summary — numbered list, 3-7 items capturing the key takeaways. Each item is one sentence. Focus on what the viewer would want to know without watching the full video.
Chapters — structured timeline of the video:
- YouTube with chapters: Use chapters from manifest
chaptersarray - YouTube without chapters: AI-generate 3-7 chapters from transcript by identifying topic shifts
- Non-YouTube: AI-generate 3-7 chapters from transcript segments
Each chapter has: start timestamp, title, one-sentence description.
- YouTube with chapters: Use chapters from manifest
References — extract any URLs, tools, libraries, or resources mentioned in the transcript. List as markdown links. Omit section if no references found.
YouTube Timestamp Links
For YouTube sources, chapter timestamps link directly to the video:
https://youtu.be/{video_id}?t={seconds}
Where {seconds} is start_time as integer. Format display time as M:SS (e.g., 2:15).
For non-YouTube sources, use plain timestamps without links: **[M:SS Title]**.
Output Routing
Terminal (default)
Print to stdout:
- Executive Summary (numbered list)
- Chapters with timestamps
- References
- Note: do NOT print the full transcript to terminal — it's too long. Mention that it's available in the work directory.
Linear (--linear)
Read formatters/linear.md for the full Linear formatting rules, layout, and issue creation/update process.
Obsidian (--obsidian, --obsidian-triage, --obsidian-watched)
Read formatters/obsidian.md for the full Obsidian note formatting, triage, and watched-move logic.
Non-YouTube Handling
The pipeline gracefully degrades for non-YouTube sources:
| Capability | YouTube | Non-YouTube |
|---|---|---|
| Thumbnail | yt-dlp --write-thumbnail |
ffmpeg frame at 10% |
| Title | From info.json |
AI-generated from transcript |
| Chapters | From metadata or AI-generated | AI-generated only |
| Timestamp links | youtu.be/{id}?t= deep links |
Plain timestamps |
| Video ID | From info.json |
Empty |
| Duration | From info.json |
From ffprobe |
Config Files
.claude/linear.json (in repo root)
Required for --linear mode. See formatters/linear.md for details.
{
"teamId": "TEAM-xxx",
"teamKey": "RAJ",
"projectId": "PROJ-xxx",
"milestone": "M3: Members"
}
.claude/supabase-assets.json (symlinked from ~/.claude/supabase-assets.json)
Required for --linear mode thumbnail uploads and People page avatar uploads. Points to the centralized rajababa-assets Supabase project (shared across all repos).
{
"supabaseUrl": "https://xxx.supabase.co",
"supabaseAnonKey": "eyJ..."
}
Dependencies
- yt-dlp — video download + metadata extraction
- ffmpeg / ffprobe — audio extraction, thumbnail fallback, duration detection
- Whisper — speech-to-text transcription (via
venv/) - jq — JSON parsing of info.json and manifest
- Obsidian CLI (1.12.4+) — for
--obsidianmodes. Enable in Obsidian → Settings → General → Command line interface - Linear MCP — for
--linearmode issue creation/updates - Supabase Storage — for
--linearmode thumbnail uploads and People page avatars (centralizedrajababa-assetsproject, privateassetsbucket)
Manifest Schema
{
"url": "<original-url>",
"work_dir": "<path>",
"video": "<path-to-mp4>",
"audio": "<path-to-wav>",
"thumbnail": "<path-to-jpg-or-empty>",
"thumbnail_url": "<remote-thumbnail-url-or-empty>",
"info_json": "<path-to-info.json>",
"transcript": "<path-to-transcript.txt>",
"segments": "<path-to-segments.json>",
"title": "Video Title",
"duration": 623,
"video_id": "dQw4w9WgXcQ",
"extractor": "youtube",
"chapters": [
{"start_time": 0, "end_time": 120, "title": "Introduction"},
{"start_time": 120, "end_time": 340, "title": "Main Topic"}
],
"created_at": "2026-03-15T..."
}