The user has provided a media URL: $ARGUMENTS
Follow these steps exactly:
Step 0 — Bootstrap dependencies
Run the bootstrap script (scripts/bootstrap.sh relative to this skill's directory). It installs missing tools, verifies gh is authenticated, and skips subsequent runs via a marker file.
bash "<SKILL_DIR>/scripts/bootstrap.sh"
If it exits non-zero, stop and tell the user what to fix before continuing.
Step 1 — Resolve a YouTube URL
If the URL is already a YouTube URL (youtube.com or youtu.be), use it directly.
Otherwise (Apple Podcasts, Spotify, conference sites, etc.), extract the title from the page, then search YouTube for the matching video/episode. Use mcp__MCP_DOCKER__fetch_content or mcp__MCP_DOCKER__brave_web_search to find it.
Step 2 — Download the transcript with yt-dlp
Run:
yt-dlp --write-auto-sub --sub-lang en --skip-download --sub-format vtt -o "/tmp/media_transcript" "<YOUTUBE_URL>"
This produces /tmp/media_transcript.en.vtt. (The raw transcript stays in /tmp/ — only the final summary goes to ~/Downloads/.)
Step 3 — Parse the VTT into clean timestamped lines
Run the VTT parser script (scripts/parse_vtt.py relative to this skill's directory). It deduplicates overlapping caption windows and preserves timestamps for deep-linking:
python3 "<SKILL_DIR>/scripts/parse_vtt.py"
Output format — one line per segment:
[00:00:00] I'm doing something absolutely insane right now.
[00:00:04] Artificial intelligence is a little bit perplexing
Step 4 — Read the transcript in chunks, then generate the summary
4a — Check size and read in batches
First check how many lines the transcript has:
wc -l /tmp/media_clean_transcript.txt
Then use the Read tool (not Bash) to read the file in batches of 400 lines using offset and limit. For a 1000-line file, make three Read calls: offset=1/limit=400, offset=401/limit=400, offset=801/limit=400. Read all batches before writing anything.
4b — Write the summary
After reading all batches, write a comprehensive, well-structured markdown summary covering:
- Speaker/guest background and why they were invited or why this talk matters
- Core thesis / main argument
- All major topics discussed with concrete details, examples, frameworks, and notable quotes
- Key takeaways and actionable insights
- Books, tools, or resources mentioned
- One-sentence bottom line
Use ## section headers, bullet points, and bold text for scannability. Aim for 800–1200 words of substance.
Timestamps: For each major topic or section in the summary, include a YouTube deep-link using the timestamp from the transcript. Convert [HH:MM:SS] to total seconds for the ?t= parameter (e.g. [01:05:30] → 3930 seconds). Format as a linked timestamp at the start of the relevant bullet or subheading:
### [[01:05:30]](https://youtu.be/VIDEO_ID?t=3930) Power Concentration
or inline for bullets:
- **[[00:14:00]](https://youtu.be/VIDEO_ID?t=840) Epistemic collapse** — We are entering...
Use the YouTube URL from Step 1 as the base. Include timestamps for every major topic/section — aim for one timestamp per significant topic shift.
Step 5 — Write the markdown file
Derive a slug from the title using only lowercase letters, numbers, and hyphens — strip all other characters (spaces become hyphens, consecutive hyphens collapse to one, leading/trailing hyphens removed). This sanitization is critical: shell metacharacters in the slug (;, $(), backticks, quotes) would be injected into file paths and gh commands below. Example: jenny-wen-design-process. Save the summary to:
~/Downloads/<slug>_summary.md
Follow the template at references/media-summary-template.md.j2 (relative to this skill's directory). Key points:
- The metadata fields (Guest, Hosts, Podcast, Published) must be a bullet list, not bare lines — bare consecutive lines collapse into a single paragraph in CommonMark.
- No horizontal rules (
---) between sections. Use only one, directly before the italicised source attribution at the bottom. - Key Takeaways is the first section, before Guest Background.
gist_urlstarts as(to be filled after publishing)and is updated in Step 6.- The source link at the bottom prefers YouTube or PocketCasts over Apple Podcasts. If you already have a YouTube URL from Step 1, use that. Otherwise check for a PocketCasts link (
pca.storpocketcasts.com). Fall back to the original URL only if neither is available.
Step 6 — Publish as a public GitHub Gist
Create a public GitHub Gist with the summary content. The gist filename must be prefixed with summary-, e.g. summary-jenny-wen-design-process.md.
Use the gh CLI:
gh gist create --public --filename "summary-<slug>.md" --desc "<Title> — Media Summary" "$HOME/Downloads/<slug>_summary.md"
All arguments containing the slug or title must be double-quoted to prevent word-splitting and globbing. The --desc value is particularly important since the title may contain special characters even after slug sanitization (the description uses the original title, not the slug).
Once you have the Gist URL, update the gist_url field in the frontmatter of ~/Downloads/<slug>_summary.md, then run:
gh gist edit <gist-id> "$HOME/Downloads/<slug>_summary.md"
so the published Gist also contains the self-referencing URL.
Print the resulting Gist URL to the user.
Step 7 — Open the file and notify
Open the summary in the background (so it doesn't steal focus) and post a macOS notification:
open -g "$HOME/Downloads/<slug>_summary.md" 2>/dev/null || xdg-open "$HOME/Downloads/<slug>_summary.md" 2>/dev/null || true
osascript -e 'display notification "Summary saved and Gist published" with title "Media Summary"' 2>/dev/null || true
Final output to user
Tell the user:
- The local file path
- The public Gist URL
- A one-paragraph teaser of what the content is about