NotebookLM - Expert Knowledge to Action
Turn any expert's content into a personalized protocol with experiments you actually run. Load 300 YouTube episodes into NotebookLM from terminal, run a cited interview about your goal, create experiments in your Obsidian daily note.
Video walkthrough: https://youtu.be/KRpZSvtMiTI
What This Does
- Load sources from terminal. You can't just tell NotebookLM to add a YouTube channel. This skill does it. One command. 300 episodes.
- Cited answers traced to exact transcript lines. Every recommendation links back to the exact episode and passage. Verifiable.
- Expert-informed interviews. Claude queries NotebookLM with YOUR goal. Generates questions informed by the expert's research on your specific topic.
- Experiments in Obsidian. Protocol becomes experiments in your daily note. Morning routine skill asks every day: how is this going?
- Any expert, any domain. Huberman for health. Lenny for product. Onboarding docs for a new job. Same pattern.
Step 0: Preflight (run this first, every time)
Before any workflow below, check the tools are installed and logged in:
bash ~/.claude/skills/notebooklm/scripts/bootstrap.sh --check
Exit 0 = ready. Exit 2 = something missing; the output names exactly what.
To install whatever is missing, re-run without --check:
bash ~/.claude/skills/notebooklm/scripts/bootstrap.sh
The two login commands are the only manual steps — they open a browser for Google
sign-in, so never run them from a tool call. Print them for the user instead.
Prerequisites
Handled automatically by
scripts/bootstrap.shabove. This section documents what it installs, for anyone who prefers to do it by hand.
1. Install nlm CLI
uv tool install notebooklm-mcp-cli
Gives you the nlm command. See notebooklm-mcp-cli for details.
2. Install notebooklm-py (for notebook creation and channel loading)
uv tool install "notebooklm-py[browser]"
uvx --from "notebooklm-py[browser]" playwright install chromium
This installs the notebooklm command in its own isolated environment (no system-Python pollution, works even with a Homebrew/PEP-668 Python). The matching Chromium build is installed for the browser automation.
If you prefer a plain pip install:
pip install "notebooklm-py[browser]" && playwright install chromium. On a Homebrew-managed Python you may need--break-system-packages.
3. Authenticate
You need two logins — the tools are independent projects with separate sessions:
# nlm: read side (queries + source listing). Borrows cookies from a
# Chromium-family browser you're already signed into. Session ~20 min.
nlm login
# notebooklm-py: write side (notebook creation + channel loading).
# Opens its own Chromium for a fresh Google login. Session lasts weeks.
notebooklm login
notebooklm-py saves cookies to ~/.notebooklm/profiles/default/storage_state.json. Check nlm with nlm notebook list (empty [] = authenticated, just no notebooks yet).
4. Obsidian Plugins
- Dataview (required) - for dashboard queries and citation tables
Quick Start
# List your notebooks
nlm notebook list
# Ask a question with citations
nlm notebook query <notebook-id> "What does Huberman say about deep focus?" --json
# List sources
nlm source list <notebook-id> --json
Workflow Routing
| User says | Workflow |
|---|---|
| "load channel", "youtube channel", "bulk load videos" | workflows/youtube-channel.md |
| "notebooklm ask", "ask notebook", "Q&A" | workflows/ask.md |
| "import notebook", "import sources" | workflows/import.md |
| "notebooklm auth", "notebooklm login" | workflows/auth.md |
The Full Pipeline
This is the workflow shown in the video:
1. Pick your expert and goal
Goal: "I want to improve my health and focus"
Expert: Andrew Huberman (@hubermanlab on YouTube)
2. Load their content
# Scrape channel videos (no auth/deps needed — pure stdlib)
python3 scripts/load_channel.py scrape \
--channel "https://www.youtube.com/@hubermanlab" \
--output /tmp/huberman-videos.json
# Create notebook (grab the printed <notebook-id>)
notebooklm create "Andrew Huberman - Health"
# Load the 300 most recent episodes.
# Run via `uv run --with` so the script can import notebooklm-py from its
# isolated tool env. Videos are newest-first, so this keeps the latest 300.
uv run --with "notebooklm-py[browser]" python3 scripts/load_channel.py load \
--videos /tmp/huberman-videos.json \
--notebook <notebook-id> \
--count 300 \
--concurrency 6
Source cap depends on tier: free = 50, NotebookLM Plus/Pro = 300 per notebook.
--count 300assumes Plus/Pro. On a free account only ~50 ingest and the rest become red, empty rows — use--count 50there. Confirm bothnlmandnotebooklmare logged into the same account with that tier (notebooklm auth check).Keep
--concurrencylow. Higher concurrency causes some adds to fail (red rows whose title is the raw URL), even on Plus. At--concurrency 1they essentially disappear. After loading, check the real split:nlm source list <notebook-id> --json | python3 -c "import json,sys;d=json.load(sys.stdin);r=[s for s in d if s['title'].strip().startswith('http')];print(f'good {len(d)-len(r)} red {len(r)}')"To repair reds: delete the red rows (
nlm source delete <id> --confirm) and re-add those videos at--concurrency 1.
3. Ask expert-informed questions
nlm notebook query <notebook-id> \
"What does Huberman recommend for sustaining deep focus for 4+ hours daily?" --json
Each answer comes with [N] citations back to the exact source and passage.
4. Run a cited interview
Claude uses the notebook to generate interview questions specific to YOUR goal. You answer honestly. Claude builds a personalized protocol where each recommendation is tied to an exact episode.
5. Create experiments
The protocol becomes experiments in your Obsidian vault:
- Each experiment has a hypothesis, protocol, success criteria, and timeframe
- They appear in your daily note every morning
- Your morning routine skill asks: "How is this experiment going? Any observations?"
6. Turn it into a reusable skill
Package the workflow as a /huberman or /lenny skill. Same pattern, different expert.
Vault Structure
Your Vault/
├── Notes/NotebookLM/
│ ├── Huberman Health.md # type: notebook (index)
│ └── huberman-health/
│ ├── Sources/ # type: notebook-source (transcripts)
│ │ └── Episode Title.md
│ └── QA/ # type: nlm-query (cited answers)
│ └── 2026-04-05 Focus Protocol.md
├── Notes/Experiments/
│ └── Morning Sunlight Protocol.md # type: experiment
└── Notes/Dashboards/
└── Health.md # Dashboard with embedded experiments
Scripts
| Script | Purpose |
|---|---|
scripts/load_channel.py |
Scrape YouTube channel + bulk-load into NotebookLM |
scripts/resolve_citations.py |
Replace [N] with [[Source#^anchor|[N]]] wikilinks |
scripts/import_sources.py |
Import sources as vault files with metadata |
scripts/extract_passages.py |
Extract cited passages from Q&A into source files |
scripts/backfill_fulltext.py |
Fetch full transcripts for source files |
All scripts use Path.cwd() as vault root. Run them from your vault directory.
Citation Resolution
The resolver turns [N] markers in NotebookLM answers into clickable [[Source#^c-XXXXXXXX|[N]]] wikilinks. Click to jump to the exact cited passage in the source transcript.
- Anchor IDs are stable (MD5 of cited text)
- Idempotent: re-running same question skips existing anchors
- Cross-source citation remap: handles collapsed source_ids
- ~96% resolution rate across tested queries
Examples
- Health: 300 Huberman episodes -> personalized health protocol with sleep, supplements, exercise experiments
- Product: 200 Lenny's Podcast episodes -> product strategy playbook with cited frameworks
- New job: Onboarding docs + team wikis + architecture decisions -> ramp-up plan with daily experiments
- Business: Hormozi content -> offer audit with value equation scoring
License
MIT