skills/vid-transcript/SKILL.md
Process one or more YouTube or Vimeo video transcripts (including private or domain-embedded Vimeo). Accepts comma-separated URLs, runs each transcript through 7 mandatory phases (normalize readability, detect prompts, structure prompt blocks, structured notes, summary, actionable insights, assemble final doc), and outputs a single formatted DOCX. Use when the user provides YouTube or Vimeo links and asks to process, transcribe, or extract prompts from videos.
npx skillsauth add asets-gobizit/claude-skills vid-transcriptInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
An autonomous agent that retrieves YouTube transcripts via NoteGPT and processes them into a single structured DOCX document.
This skill has executable code that actually runs:
process_video.py - Main implementation
process_video_local.py - Local file processor
verify-output2.ps1 - Verification script
Run directly from PowerShell:
python "C:\Users\dansk\.claude\skills\vid-transcript\process_video.py" "https://youtu.be/XXXXX"
python "C:\Users\dansk\.claude\skills\vid-transcript\process_video_local.py" "C:\Path\To\Video.mp4"
You are an autonomous AI agent specializing in processing YouTube video content. Your function is to obtain transcripts using the NoteGPT tool and reformat them according to strict, multi-phase rules.
This skill integrates with the following external APIs and software tools:
| Tool/API | Purpose | Integration |
|----------|---------|-------------|
| yt-dlp | Download transcripts from YouTube and Vimeo videos | Command-line tool with API access to subtitle endpoints |
| YouTube API | Extract auto-generated and manual subtitles | Accessed through yt-dlp's --write-auto-sub and --write-sub flags |
| Vimeo API | Access public, private, and domain-embedded Vimeo videos | HTTP requests with optional referer headers and video passwords via yt-dlp |
| python-docx | Generate formatted Word (.docx) documents | Python library for document creation with styling and layout control |
| Python Standard Library | Text processing (regex, file I/O) | Built-in modules for transcript cleaning and normalization |
Key Features:
--referer header--video-password flagYouTube Videos/ folder with key points, URL, transcript link, and implementation status tracking (links to [[Skills Install Log]])Use this skill when:
Important: This skill must be invoked explicitly through direct user request in conversation. Simply describing the URL or format does NOT trigger execution.
When you (user) provide:
"Process this video from Builder Methods about Git"
^ I will then automatically create:
"Process this video: https://vimeo.com/1162618541 | referer:https://buildermethods.com/library/git-essentials-claude-code"
Simply provide the domain URL, course page, or video page, and I will:
Direct YouTube: "Process: https://youtu.be/XXXXX"
Direct Vimeo: "Transcribe: https://vimeo.com/123456"
Domain-embedded: "Process the Git video from buildermethods.com/library/git-essentials-claude-code"
^ I auto-construct: https://vimeo.com/1162618541 | referer:https://buildermethods.com/library/git-essentials-claude-code
Multiple videos: "Process these: https://youtu.be/AAAA, https://vimeo.com/BBBB"
I will automatically run verification to confirm output files were created:
& "C:\Users\dansk\.claude\skills\vid-transcript\verify-output2.ps1"
If user provides a domain URL (not a direct video link):
src attribute to get the Vimeo IDhttps://vimeo.com/[EXTRACTED_ID] | referer:[domain]Accept one or more URLs, comma-separated. Supported formats:
YouTube:
https://www.youtube.com/watch?v=XXXXXhttps://youtu.be/XXXXXVimeo (standard):
https://vimeo.com/XXXXXXXXXVimeo (private or domain-embedded):
https://vimeo.com/XXXXXXXXX | referer:https://www.example.comhttps://vimeo.com/XXXXXXXXX | referer:https://www.example.com | password:YOURPASSWORDMultiple videos:
https://youtu.be/AAAA, https://vimeo.com/BBBBFor EACH YouTube URL provided:
Before running yt-dlp, parse the input to extract the URL, optional referer, and optional password:
https://vimeo.com/123 | referer:https://site.com | password:abc → URL + referer + passwordFor YouTube:
yt-dlp --write-auto-sub --sub-lang en --skip-download --sub-format vtt -o "%(title)s" "<URL>"
If auto-subs fail, try manual subs:
yt-dlp --write-sub --sub-lang en --skip-download --sub-format vtt -o "%(title)s" "<URL>"
For Vimeo (standard public):
yt-dlp --write-auto-sub --sub-lang en --skip-download --sub-format vtt -o "%(title)s" "<URL>"
For Vimeo (private or domain-embedded) — add referer and/or password flags:
yt-dlp --write-auto-sub --sub-lang en --skip-download --sub-format vtt \
--referer "<REFERER_DOMAIN>" \
--video-password "<PASSWORD_IF_PROVIDED>" \
-o "%(title)s" "<URL>"
Omit --video-password if no password was provided.
If subtitles are unavailable for any Vimeo video, notify the user: "No subtitles found for [URL]. The video may not have captions available."
State to the user: "Downloading transcript for [URL]."
Then parse the VTT file into clean raw text and save it as a .txt file. Delete the .vtt file afterward.
import re, os
vtt_file = "<VTT_FILE>" # e.g. "Video Title.en.vtt"
txt_file = vtt_file.replace(".en.vtt", ".txt").replace(".vtt", ".txt")
lines = open(vtt_file, 'r', encoding='utf-8').readlines()
out = []
prev = ''
for line in lines:
line = line.strip()
if not line or line.startswith('WEBVTT') or line.startswith('Kind:') or line.startswith('Language:'):
continue
if re.match(r'\d{2}:\d{2}:\d{2}\.\d+ --> ', line):
continue
clean = re.sub(r'<[^>]+>', '', line)
if clean and clean != prev:
out.append(clean)
prev = clean
raw_text = '\n'.join(out).strip()
# Save as plain .txt (not VTT)
with open(txt_file, 'w', encoding='utf-8') as f:
f.write(raw_text)
# Remove the raw VTT file
os.remove(vtt_file)
The txt_file path is what you use as the raw transcript source for the 4 phases.
Apply the phases below to each video's raw transcript text. Process EXACTLY and IN ORDER.
Rules:
Actions:
Result: A clean, professional, human-readable script.
Identify every sentence or paragraph in the Phase 1 output that functions as an instruction, request, or command directed at an AI.
Indicators include (but are not limited to):
Rules:
Immediately AFTER each detected prompt in the text, insert a structured block using EXACTLY the following format:
Prompt
GOAL:
<What this prompt is meant to achieve>
INPUT:
<What the user provides to Claude, inferred strictly from the surrounding text>
INSTRUCTIONS:
<Step-by-step instructions inferred from the script. Do not introduce requirements that are not implied.>
OUTPUT:
<What the final result should look like>
Rules:
Convert the Phase 1 transcript into organized knowledge sections.
Output:
KEY IDEAS
DETAILED NOTES
Rules:
Write a concise explanation of the video.
Include:
Output: 2–4 paragraphs based strictly on the transcript content.
After the DOCX is assembled (Phase 7), Claude performs a personal relevance check by comparing the video's recommendations against Danny's actual Claude Code setup.
Steps:
C:\Users\dansk\.claude\CLAUDE.md (global instructions, skills, workflows)C:\Users\dansk\.claude\projects\C--Users-dansk-Claude\memory\MEMORY.md (project memory — tools, bots, API keys, business context)Output format (plain text to pass to append_evaluation_section):
[Recommendation from video — e.g., "Set up a 3-layer memory system"]
Verdict: Already Implemented
Your setup already includes this — CLAUDE.md has global instructions, MEMORY.md has project memory, and Obsidian vault serves as long-term knowledge base.
[Another recommendation — e.g., "Use MCP servers for real-time data"]
Verdict: Worth Adding
You don't currently have MCP servers configured. Adding one for SuperAGI or Zoho CRM data could enhance your AI consulting workflows.
[Another recommendation — e.g., "Deploy Claude on a VPS"]
Verdict: Not Relevant
You run OpenClaw locally on your Windows PC, which works fine for your current usage. VPS deployment is for teams needing 24/7 uptime.
How to insert into the DOCX:
from process_video import append_evaluation_section
append_evaluation_section(docx_path, evaluation_text)
This function inserts the evaluation after the Summary section and before the Transcript section, with color-coded verdicts (green = Already Implemented, blue = Worth Adding, gray = Not Relevant).
Extract concrete things the viewer can do or apply.
Include:
Output: Bullet-pointed list. Only include actions clearly implied or stated in the transcript.
Assemble ALL processed video sections into a single DOCX document.
Each video section must contain, in order:
Formatting requirements:
Use this python-docx template, dynamically populated with the processed content:
from docx import Document
from docx.shared import Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
doc = Document()
# Set default font
style = doc.styles['Normal']
style.font.name = 'Calibri'
style.font.size = Pt(11)
# For each video section:
# --- Add page break (except for first section) ---
# doc.add_page_break()
# --- Video title (Heading 1) ---
# doc.add_heading(VIDEO_TITLE, level=1)
# --- Video URL (YouTube or Vimeo) ---
# p = doc.add_paragraph()
# run = p.add_run('Source: ' + VIDEO_URL) # VIDEO_URL = the full Vimeo or YouTube URL
# run.font.color.rgb = RGBColor(0, 102, 204)
# run.font.size = Pt(10)
# p.alignment = WD_ALIGN_PARAGRAPH.LEFT
# doc.add_paragraph('')
# --- Script paragraphs ---
# doc.add_paragraph(normalized_text_paragraph)
# --- Prompt blocks ---
# doc.add_heading('Prompt', level=2)
# p = doc.add_paragraph()
# p.add_run('GOAL: ').bold = True # NOTE: assign run to var first
# p.add_run('description here')
# ... repeat for INPUT, INSTRUCTIONS, OUTPUT
doc.save('OUTPUT_FILENAME.docx')
Save the final DOCX to:
C:\Users\dansk\Zoho WorkDrive (Go Biz IT)\00 Claude.ai\@CoWorkAccess\Vid-Trrasncipts-Files\
Files saved to Vid-Trrasncipts-Files\ per video:
<Video Title>.txt — plain text transcript (cleaned, no VTT formatting, no timestamps)<VideoTitle(s)> - Processed.docx — Word document with all video sections containing:
history.xlsx — updated automatically with a new row containing:
.txt transcriptRequires openpyxl: pip install openpyxl
After processing completes, verify success by checking:
Step 1: Confirm Output Files Exist
C:\Users\dansk\Zoho WorkDrive (Go Biz IT)\00 Claude.ai\@CoWorkAccess\Vid-Trrasncipts-Files\<Video Title>.txt (plain text, no format, readable)<Video Title> - Processed.docx (formatted Word document)Step 2: Validate File Contents
.txt file:
HH:MM:SS.mmm --> HH:MM:SS.mmm).docx file:
Step 3: Troubleshooting If Files Missing
data-ai
Automated backup skill for PKA + Obsidian + Claude memory. Snapshots pka.db (via SQLite .backup so WAL is handled safely), the Obsidian vault, Claude memory files, agent profiles, and the help-content Excel into a single timestamped zip in Zoho WorkDrive. Daily/weekly/monthly retention rotation built in. USE WHEN Danny says "backup", "run backup", "snapshot pka", or to recover from a snapshot.
testing
Run any question, idea, or decision through a council of 5 AI advisors who independently analyze it, peer-review each other anonymously, and synthesize a final verdict. Based on Karpathy's LLM Council methodology, packaged as the stress-test skill. MANDATORY TRIGGERS: 'stress-test this', 'stress test this', 'pressure-test this', 'pressure test this', 'war room this', 'council this', 'run the council', 'debate this'. STRONG TRIGGERS (use when combined with a real decision or tradeoff): 'should I X or Y', 'which option', 'what would you do', 'is this the right move', 'validate this', 'get multiple perspectives', 'I can't decide', 'I'm torn between'. Do NOT trigger on simple yes/no questions, factual lookups, or casual 'should I' without a meaningful tradeoff (e.g. 'should I use markdown' is not a stress-test question). DO trigger when the user presents a genuine decision with stakes, multiple options, and context that suggests they want it pressure-tested from multiple angles.
content-media
Weekly scan of Obsidian vault for empty/low-content notes. Moves them to zToBeDeleted/ for user review. Use when the user says "tidy obsidian", "clean obsidian", "obsidian cleanup", or on scheduled weekly run.
development
Design-first website builder. Accepts a Claude Design export (HTML or screenshot) as a visual blueprint, collects business inputs, calls Claude API to generate a design-matched index.html, and publishes to GitHub Pages. Falls back to vibe-based generation if no design is provided. Use when the user says "make-website-design", "design website", "build from design", or provides a Claude Design export for website generation.