YouTube video in, structured archival Markdown note out. Capture the transcript, creator metadata, description, chapters, actual caption language, and provenance in one Obsidian-ready file—without an API key.
$ npx -y skills add JimmySadek/youtube-fetcher-to-markdown --agent claude-code
Run the curl in your terminal, the rest in Claude Code.
What's inside
YouTube video in, structured archival Markdown note out. Capture the transcript, creator metadata, description, chapters, actual caption language, and provenance in one Obsidian-ready file—without an API key.
npx skills add JimmySadek/youtube-fetcher-to-markdown
Paste a YouTube link and receive a file such as:
~/yt_transcripts/2026-03-04_obsidian-the-king-of-learning-tools_[hSTy_BInQs8].md
---
title: "Obsidian: The King of Learning Tools (FULL GUIDE + SETUP)"
channel: "Odysseas"
url: "https://www.youtube.com/watch?v=hSTy_BInQs8"
video_id: "hSTy_BInQs8"
fetched: "2026-03-04"
source_project: "my-project"
language: "en"
caption_type: "manual"
duration: "36m 26s"
upload_date: "2024-04-24"
tags:
- yt-transcript
---
# Obsidian: The King of Learning Tools (FULL GUIDE + SETUP)
## Video Details
| Field | Value |
|----------|-------|
| URL | https://www.youtube.com/watch?v=hSTy_BInQs8 |
| Channel | Odysseas |
| Duration | 36m 26s |
| Uploaded | 2024-04-24 |
| Fetched | 2026-03-04 |
| Source | my-project |
| Language | en (manual) |
## Video Description
The creator's description, links, and chapter markers...
## Transcript
The complete caption text...
The YAML frontmatter makes a collection queryable through tools such as Dataview, while the Markdown remains portable to Logseq, other knowledge bases, and plain text workflows.
Most transcript extractors stop at raw caption text. An archival knowledge note also needs the source URL, creator, capture date, actual language, description, chapters, and a predictable filename. YouTube Fetcher keeps that complete record in one local file.
npx skills add JimmySadek/youtube-fetcher-to-markdown
Or clone the canonical repository:
git clone https://github.com/JimmySadek/youtube-fetcher-to-markdown.git
Python 3.8 or newer is supported.
python3 -m pip install -r requirements.txt
yt-dlp is optional but recommended for descriptions, chapters, duration, and
upload dates:
brew install yt-dlp # macOS
# or: python3 -m pip install yt-dlp
Check dependencies without fetching a video:
python3 scripts/fetch_transcript.py --check-deps
The script reports missing packages but never installs them automatically.
python3 scripts/fetch_transcript.py "https://youtu.be/VIDEO_ID"
An agent using the skill resolves scripts/fetch_transcript.py relative to its
installed SKILL.md; it does not depend on one fixed home-directory path.
The first configured option wins:
--output for one exact file--output-dir for this runYOUTUBE_FETCHER_DIR for a persistent directory~/yt_transcripts/ by default# Save this note to an Obsidian vault
python3 scripts/fetch_transcript.py URL --output-dir ~/Notes/MyVault
# Set a persistent default
export YOUTUBE_FETCHER_DIR=~/Notes/MyVault
python3 scripts/fetch_transcript.py URL
# Save to one exact file
python3 scripts/fetch_transcript.py URL --output ~/Notes/video.md
Duplicate detection uses the resolved output directory. In a non-interactive
session, an existing note exits with code 3 and remains untouched. Run again
with --force only after deciding to overwrite.
| Flag | What it does |
|---|---|
--output / -o | Save to one exact file |
--output-dir | Save inside a directory or knowledge vault |
--timestamps / -t | Add timestamps to transcript lines |
--lang / -l | Request a caption language; falls back truthfully to English |
--source / -s | Override the capture-project name |
--format / -f | Export json or srt instead of Markdown |
--no-description | Skip the description and chapters section |
--stdout | Print the result instead of saving it |
--list | Show available caption languages |
--force | Bypass duplicate protection |
--check-deps | Report dependency status |
youtu.be short links/embed/, /shorts/, /live/, and legacy /v/ linksyoutube-nocookie.com/embed/ linksLookalike hosts such as youtube.com.example.org are rejected.
The repository follows the portable SKILL.md format. The same install command
works with Codex, Claude Code, Cursor, Windsurf, Gemini CLI, and other compatible
agents. Manual users can run the Python script directly.
yt-dlp
for richer metadata.yt-dlp executable when available.| Code | Meaning |
|---|---|
0 | Success |
1 | Invalid input or fetch failure |
2 | Missing required dependency |
3 | Existing note preserved; overwrite not approved |
MIT
.github/
workflows/
ci.yml
sync-legacy-master.yml
.gitignore
.scripts/
verify-isolated-install.sh
agents/
openai.yaml
assets/
banner.png
LICENSE
README.md
requirements.txt
scripts/
fetch_transcript.py
SKILL.md
specs/
youtube-fetcher-v1-1-release-and-distribution.html
tests/
test_fetch_transcript.py
test_skill_bundle.pyFAQ
youtube-fetcher-to-markdown is a Claude Code plugin with 1 hand-picked skill for content work, indexed on Flowy. Install it with the command on its page. It includes youtube-fetcher-to-markdown. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.