Turn any YouTube video into structured knowledge that Claude remembers
Paste a link. Get study-grade notes with timestamps, topic segmentation,
and key insights saved to Claude's memory for future conversations.
Table of Contents
Most transcript tools give you a wall of text. yt-learner gives you knowledge.
| Feature | Raw Transcript | Generic Summarizer | yt-learner |
|---|---|---|---|
| Timestamps | Per-line clutter | None | Section-level navigation |
| Topic segmentation | None | Basic | Duration-adaptive |
| Study-grade prose | No | Bullet dumps | Flowing academic notes |
| Obsidian integration | No | No | YAML + callouts + wikilinks |
| Claude memory | No | No | Learns for future sessions |
| Error handling | None | Generic | 9 YouTube-specific error types |
| Multi-language | Single | Single | 6 languages, priority fallback |
| Batch processing | No | No | Playlist support |
The difference: yt-learner doesn't just transcribe — it refines, segments, structures, and integrates video knowledge into Claude's persistent memory. After processing a video, Claude genuinely knows what was taught and can reference it in future conversations.
You share a YouTube link. Claude does the rest:
You: "Learn from this: https://youtube.com/watch?v=dQw4w9WgXcQ"
Claude: Extracts transcript → Cleans & refines → Segments into topics →
Structures as Obsidian notes → Saves key insights to memory →
Presents summary with top insights and timestamps
Trigger phrases (English + Italian):
- "watch this", "learn from this video", "what does this video say"
- "transcribe this", "take notes from YouTube"
- "riassumi questo video", "impara da questo video"
- Any message containing a
youtube.comoryoutu.beURL
yt-learner Pipeline
┌─────────────────────────────────────────────┐
│ │
│ Phase 1: EXTRACT │
│ ├── Parse URL/ID (6 URL formats + bare ID) │
│ ├── Check available languages │
│ ├── Fetch transcript via API │
│ └── Get video metadata (title, channel) │
│ │
│ Phase 2: REFINE │
│ ├── Fix punctuation & disfluencies │
│ ├── Correct technical terms │
│ ├── Identify speaker changes │
│ └── Segment into topics (duration-adaptive) │
│ │
│ Phase 3: STRUCTURE │
│ ├── YAML frontmatter (hierarchical tags) │
│ ├── Abstract callout (written LAST) │
│ ├── Core concepts table (5-12 entries) │
│ ├── Topic sections (flowing prose + [!tip]) │
│ ├── Key takeaways (actionable insights) │
│ ├── Resources mentioned (table) │
│ ├── Connections (wikilinks) │
│ └── Raw transcript (collapsible <details>) │
│ │
│ Phase 4: LEARN │
│ ├── Identify novel insights │
│ ├── Create memory entries │
│ └── Connect to existing knowledge │
│ │
│ Phase 5: DELIVER │
│ ├── Summary banner │
│ ├── Top 3-5 insights with timestamps │
│ └── Follow-up action menu │
│ │
└─────────────────────────────────────────────┘
| Phase | Input | Output | Techniques |
|---|---|---|---|
| Extract | YouTube URL | Raw JSON transcript | youtube-transcript-api v1.2.4+, 6 URL patterns, language priority fallback |
| Refine | Raw transcript | Clean, segmented text | Disfluency removal, technical term correction, pause-based topic detection |
| Structure | Refined text | Obsidian .md note |
YAML frontmatter, callouts, wikilinks, section timestamps, collapsible raw transcript |
| Learn | Structured note | Memory entries | Novel insight detection, domain relevance scoring, cross-reference to existing knowledge |
| Deliver | All above | User-facing summary | Banner card, top insights with timestamps, follow-up action menu |
yt-learner produces Obsidian-native Markdown notes with:
title: "Video Title"
tags:
- type/video
- topic/machine-learning
- status/processed
source: youtube
video_id: "dQw4w9WgXcQ"
channel: "Channel Name"
duration: "45:30"| Section | Purpose | Style |
|---|---|---|
[!abstract] |
Self-contained video summary | 3-5 flowing sentences |
| Core Concepts | Quick reference table | 5-12 self-contained definitions |
| Notes (by topic) | Full knowledge content | Flowing prose with [!tip], [!example], [!warning] callouts |
| Key Takeaways | Actionable insights | Bold lead-in bullets in [!tip] callout |
| Resources | Tools/books mentioned | Table: Resource, Type, Context |
| Connections | Knowledge graph links | [[wikilinks]] to related vault notes |
| Raw Transcript | Source of truth | Collapsible <details> with all timestamps |
The notes follow a strict academic-analytical voice:
- Third person, impersonal — "The key advantage is..." not "He says the advantage is..."
- Flowing prose — paragraphs, not bullet dumps
- Timestamps at section level only —
### Topic [MM:SS - MM:SS], not per-line - Caveated and qualified — "suggests", "consistent with", not overclaiming
/plugin marketplace add Silence-view/yt-learner
/plugin install yt-learner@yt-learner
npx skills add git@github.com:Silence-view/yt-learner.git
Clone this repository and add it to your Claude Code plugins:
git clone https://github.com/Silence-view/yt-learner.git ~/.claude/plugins/local/yt-learnergit clone https://github.com/Silence-view/yt-learner.git
cp -r yt-learner/skills/ ~/.codex/skills/git clone https://github.com/Silence-view/yt-learner.git ~/.opencode/skills/yt-learnerThe skill requires youtube-transcript-api (v1.2.0+):
pip install youtube-transcript-apiOr let Claude install it automatically on first use — the skill will detect the missing dependency and offer to install it.
You: "https://youtube.com/watch?v=VIDEO_ID"
Claude will automatically detect the YouTube URL, invoke yt-learner, and produce structured notes.
You: "Learn from this video: https://youtu.be/VIDEO_ID"
You: "Transcribe and take notes from https://youtube.com/watch?v=VIDEO_ID"
You: "Riassumi questo video: https://youtube.com/watch?v=VIDEO_ID"
You: "Transcribe this in Italian: https://youtube.com/watch?v=VIDEO_ID"
You: "Process these videos and create an index:
- https://youtube.com/watch?v=ID1
- https://youtube.com/watch?v=ID2
- https://youtube.com/watch?v=ID3"
The Python extractor can also be used standalone:
# Extract transcript as JSON
python scripts/yt_transcript.py "https://youtube.com/watch?v=VIDEO_ID" -f json -o transcript.json
# List available languages
python scripts/yt_transcript.py --list-languages "https://youtube.com/watch?v=VIDEO_ID"
# Extract in specific languages with priority
python scripts/yt_transcript.py "VIDEO_ID" -l it en es -f timestamped
# Install the dependency
python scripts/yt_transcript.py --installDefault language priority: it, en, es, fr, de, pt. Override per-request:
python scripts/yt_transcript.py "URL" -l en fr de| Format | Flag | Description |
|---|---|---|
| JSON | -f json |
Full structured data with metadata |
| Text | -f text |
Plain text, all snippets joined |
| Timestamped | -f timestamped |
[MM:SS] text per line |
Automatic segmentation adapts to video duration:
| Duration | Topics | Approach |
|---|---|---|
| < 10 min | 2-4 | Fine-grained, almost every shift |
| 10-30 min | 4-8 | Major theme changes |
| 30-60 min | 6-12 | Grouped related sub-topics |
| > 60 min | 10-20 | Chapter-level, processed in chunks |
The skill handles all YouTube API error types with user-friendly messages:
| Error | Cause | Response |
|---|---|---|
DependencyMissing |
youtube-transcript-api not installed |
Offers to install via pip |
TranscriptsDisabled |
Video owner disabled subtitles | Explains the limitation |
NoTranscriptFound |
No transcript in requested languages | Lists available languages, retries |
VideoUnavailable |
Private, deleted, or region-locked | Explains possible causes |
TooManyRequests |
YouTube rate limiting | Suggests waiting |
InvalidURL |
Unrecognized URL format | Lists supported formats |
PoTokenRequired |
YouTube bot detection | Suggests retry later |
RequestBlocked |
IP or network blocked | Suggests VPN/different network |
IpBlocked |
IP banned by YouTube | Suggests VPN/proxy |
yt-learner/
├── .claude-plugin/
│ ├── plugin.json # Plugin manifest (name, version, keywords)
│ └── marketplace.json # Marketplace listing metadata
├── skills/
│ └── yt-learner/
│ ├── SKILL.md # Main skill definition (290 lines)
│ ├── scripts/
│ │ └── yt_transcript.py # Python transcript extractor (334 lines)
│ └── references/
│ ├── refinement-guide.md # Transcript cleanup & segmentation guide
│ └── video-note-template.md # Obsidian note template & style rules
├── README.md # This file
├── LICENSE # MIT License
└── CHANGELOG.md # Version history
| Requirement | Version | Purpose |
|---|---|---|
| Python | 3.9+ | Runs the transcript extractor |
youtube-transcript-api |
1.2.0+ | YouTube transcript API (instance-based) |
| Claude Code | Latest | Skill execution environment |
Important: This skill uses the new instance-based API introduced in youtube-transcript-api v1.2.0. The old static methods (YouTubeTranscriptApi.get_transcript()) were removed. The extractor uses YouTubeTranscriptApi().fetch() which is the correct current API.
The extractor handles all common YouTube URL patterns:
https://www.youtube.com/watch?v=VIDEO_IDhttps://youtu.be/VIDEO_IDhttps://youtube.com/embed/VIDEO_IDhttps://youtube.com/shorts/VIDEO_IDhttps://youtube.com/live/VIDEO_IDhttps://youtube.com/v/VIDEO_IDVIDEO_ID(bare 11-character ID)
This plugin follows the Agent Skills specification and works with:
- Claude Code — full marketplace support
- Codex CLI — copy
skills/to~/.codex/skills/ - OpenCode — clone to
~/.opencode/skills/ - Any skills-compatible agent — standard
SKILL.mdformat
Contributions are welcome. Please:
- Fork the repository
- Create a feature branch (
git checkout -b feature/your-feature) - Commit your changes
- Push to the branch
- Open a Pull Request
- Additional output templates (e.g., Notion, Logseq)
- Support for non-YouTube video platforms
- Improved speaker diarization
- Chapter detection from video descriptions
- Integration with video chapter markers
MIT — Andre, 2026