| name | process-youtube-transcript |
| description | Process YouTube transcript notes in the Obsidian vault inbox — apply first-mention wikilinks, generate summaries, and enrich frontmatter. Use this skill whenever the user says "process youtube", "process transcripts", "enrich youtube notes", "summarize youtube", or wants to process clippings-tagged YouTube notes in the inbox.
|
Process YouTube Transcript
You are a transcript enrichment agent for an Obsidian vault. Your job is to find YouTube transcript notes in 0.inbox/, apply first-mention wikilinks, generate summaries, and insert them into the note. You do NOT file or move notes — that stays with the inbox-processor.
Re-Processing Guard
Notes track which agents have processed them via the ai-processed frontmatter property — a YAML list of agent names. Skip notes where ai-processed already contains process-youtube-transcript. Only process notes that:
- Are in
0.inbox/
- Have a
clippings tag
- Have a YouTube URL in the
source: frontmatter field (matching youtube.com or youtu.be)
- Do NOT have
process-youtube-transcript in their ai-processed list
If all matching notes are already processed, report "No new YouTube transcripts to process" and stop.
The ai-processed Pattern
This is a vault-wide convention. Any agent that enriches a note appends its name to the ai-processed list in frontmatter:
ai-processed:
- process-youtube-transcript
- inbox-processor
This creates an audit trail of which agents have touched the note. To force re-processing by this skill, the user removes process-youtube-transcript from the list.
Step 0: Preflight
Verify Obsidian is reachable:
obsidian vault
If it fails, report the error and stop.
Step 1: Find Unprocessed Notes
Search for candidates:
obsidian search query="clippings" path="0.inbox/" limit=20
For each result, read its frontmatter to check:
source: contains youtube.com or youtu.be
ai-processed does NOT contain process-youtube-transcript
If no unprocessed notes found, report and stop.
Show the user a summary table of what will be processed:
| Note | Author | Published |
|---|
| Full AI Trading Bot Using Claude Code! | Alex Carter | 2026-04-04 |
Step 2: Build Vault Vocabulary
Run the shared vocabulary script — a single obsidian eval call that returns all entities as JSON in ~0.2s:
bash .claude/skills/shared/build-vocab.sh
Returns { people: [...], projects: [...], areas: [...], tags: [{tag, count}] }. This replaces the old 4-call pattern (obsidian search × 3 + obsidian tags counts).
Focus on proper nouns and domain terms. Cache this vocabulary for the entire batch run — pass it to each subagent.
Step 3: Process Each Transcript
For each unprocessed note, delegate to a subagent (Agent tool with model: "sonnet"). Each transcript can be 10K-35K+ words, so subagents protect the main context. Sonnet handles transcript summarization and entity linking well, and keeps token costs manageable for large batches.
Subagent Instructions
The subagent receives:
- The note path
- The vault vocabulary list
- Instructions for linking and summarization
The subagent must:
3a. Read the Full Note
Use Read tool to get the complete note content. Note the structure:
---
frontmatter
---

## Transcript
...content...
3b. Apply First-Mention Wikilinks
Kepano's "link on first mentions" strategy — create a [[wikilink]] the first time each entity appears in the transcript body. All subsequent mentions stay as plain text.
Rules:
- Cross-reference entities against the vault vocabulary
- If an entity matches an existing vault note, use the exact note name:
[[Kirk Henderson]]
- If the entity doesn't have a vault note but is a meaningful proper noun (company, product, technology, person), still link it:
[[New Entity]]
- Use aliases when the transcript uses a short form:
[[Claude Code|Claude]]
- Match case-insensitively but preserve original casing in display text
- Don't link inside timestamp markers (e.g.,
**0:00** ·)
- Don't link common/generic terms — only proper nouns, products, companies, technologies, people
- Don't over-link: if uncertain, leave as plain text
- The
author field in frontmatter already has wikilinks from the clipper — don't duplicate those in the body unless the author is mentioned by name in the transcript text
3c. Generate Summary
Produce a summary section with:
- Overview (3-5 sentences): What is this video about? What's the creator's angle/thesis?
- Key Takeaways: Bulleted list of the most important points, tools, or techniques covered
- Tools & Technologies Mentioned: Bulleted list of specific products, platforms, APIs, etc.
- Timestamps of Interest: 3-5 notable moments with timestamps and brief descriptions (for quick navigation)
3d. Insert Summary into Note
Use the Edit tool to insert the summary between the YouTube embed and ## Transcript.
Find this pattern in the note:

## Transcript
Replace with:

# Summary
## Overview
...
## Key Takeaways
...
## Tools & Technologies
...
## Timestamps of Interest
...
---
## Transcript
Also apply the wikilink changes to the transcript body using Edit tool.
3e. Update Frontmatter
Mark as processed by appending to the ai-processed list:
obsidian property:set name="ai-processed" value="[process-youtube-transcript]" path="0.inbox/Note Name.md"
If ai-processed already exists with other entries, append rather than replace. Read the current value first and construct the updated list.
Also update:
obsidian property:set name="fileClass" value="researchNote" path="0.inbox/Note Name.md"
Add source/youtube tag if not already present. Keep the existing clippings tag — the inbox-processor will handle it during filing.
Subagent Error Handling
If a subagent fails on a transcript:
- Log the error
- Do NOT add
process-youtube-transcript to ai-processed — the note remains eligible for re-processing
- Continue with the next transcript
- Report the failure in the final summary
Step 4: Report
After all transcripts are processed, show:
| Note | Entities Linked | Status |
|---|
| Full AI Trading Bot Using Claude Code! | 8 | Processed |
| Claude Code + TradingView | 5 | Processed |
Total: X notes processed, Y entities linked
Linked entities: flat list of all wikilinked terms across the batch
Errors: any failures
Run History
After a successful batch, append a JSON entry to zz_config/skill_history/process-youtube-transcript.md via obsidian append (create with obsidian create ... template="Base Template" on first run).
Resolve hostname first, in its own Bash call, so it doesn't appear as $(...) in the content= arg (shell substitution triggers a permission prompt even when obsidian append * is allowlisted):
hostname -s
Then substitute the literal value into the JSON:
{"date": "YYYY-MM-DD", "host": "<literal-hostname>", "count": N, "notes": ["0.inbox/...", ...], "total_words": N_across_all_transcripts}
Skip the append when no unprocessed transcripts were found.
Edge Cases
- Very long transcripts (500+ lines): The subagent handles this — that's why each transcript gets its own subagent
- No transcript section: If
## Transcript heading is missing, skip the note and report it
- Already has a Summary section: If
# Summary already exists but ai-processed doesn't list this skill (shouldn't happen normally), add the skill to ai-processed and skip
- Duplicate entity names: If "Claude" could mean Claude (AI) or Claude (person), prefer the most contextually relevant one
- Author already wikilinked in frontmatter: The clipper adds
[[Author Name]] in the author: field. Don't re-link in the body unless the name actually appears in the transcript text
- Notes without clippings tag: Ignore — this skill only targets clippings-tagged YouTube notes
- Re-processing: Remove
process-youtube-transcript from the ai-processed list to allow re-processing