NotebookLM does the remembering
Google's NotebookLM ingests hundreds of YouTube transcripts and answers questions with citations back to the exact spoken passage. It's the source of truth — not the model's memory.
Most AI fitness advice sounds confident but you have no idea where it came from — sports science, a bro-science Reddit thread, or thin air. This build fixes that. It's a Jeff Nippard training coach running in Claude Code on 285 of his videos, with one unbreakable rule: every claim is backed by a real video, quoted verbatim — or it doesn't get made.
285 Jeff Nippard videos → NotebookLM (a searchable, citable knowledge base) → a script that forces real citations → the coach in Claude Code that interviews you and writes your program.
Google's NotebookLM ingests hundreds of YouTube transcripts and answers questions with citations back to the exact spoken passage. It's the source of truth — not the model's memory.
ask_cited.py asks NotebookLM a question and prints the answer alongside the actual video titles and the verbatim quotes. Never paraphrased, never invented — pulled straight from the notebook this session.
The interview is wired so a claim is either backed by a title and quote the notebook returned, or it doesn't get made. If Jeff never covered something, the coach says so instead of fabricating a source.
Here's what a moment of the conversation actually looks like — that source line is real, you could open the video and hear Jeff say it:
You: interview me to get jacked
Coach: For most muscles, the growth sweet spot is about
10–20 hard sets per week. Past that you hit "junk
volume" that just costs you recovery.
📺 Source: "How Much Training Volume Do You Really Need?"
"…once you get into the 20 to 30 sets per week zone
you start running into overtraining issues…"
So, one question: how many days a week can you
realistically train?The app you chat with. Runs the interview, queries the notebook, writes your program.
Stores the 285 videos and answers with citations. Free Google account works (50-source cap).
Optional. Raises the cap to 300 sources per notebook for full channel coverage.
Optional. Drop your lifting log in and the coach scores your real volume vs. Jeff's criteria.
The repo ships a setup script that does almost everything. Two equivalent ways to run it — both do exactly what the manual steps below do, so if anything hiccups you can fall back to those.
Download the coach from github.com/artemnovitckii/jeffnippard-coach (Code → Download ZIP, then unzip), open the folder in Claude Code, and type:
› set me upClaude installs the tools, hands you the two Google logins, loads the videos, and verifies it all works.
From inside the unzipped folder:
bash setup.shPress Enter to accept the defaults. It walks through the same steps automatically.
NotebookLM has no official API, so two small community tools drive it for you. Here's the whole thing, step by step.
Install uv (a clean Python tool installer), then the two NotebookLM CLIs:
# Install uv (Mac/Linux)
curl -LsSf https://astral.sh/uv/install.sh | sh
# Then the two NotebookLM tools
uv tool install notebooklm-mcp-cli
uv tool install "notebooklm-py[browser]"
uvx --from "notebooklm-py[browser]" playwright install chromiumOn Windows PowerShell, install uv with irm https://astral.sh/uv/install.ps1 | iex instead.
The read tool and the write tool are separate projects with separate logins. Run each and complete the Google window — use the same account for both:
nlm login # read side. Lasts ~20 minutes.
notebooklm login # write side. Lasts weeks.
nlm notebook list # [] means "logged in, no notebooks yet"nlm (read) login only lasts ~20 minutes. When the coach later says "authentication expired," that's not a bug — just run nlm login again.This builds your own copy of Jeff's content (you can only query notebooks your account owns). From inside the coach folder:
# a) Scrape the channel's video list
python3 scripts/load_channel.py scrape \
--channel "https://www.youtube.com/@JeffNippard" \
--output /tmp/jeff-videos.json
# b) Create the notebook — it prints an id. COPY IT.
notebooklm create "Jeff Nippard - Training Coach"
# c) Load the videos (paste the id below)
uv run --with "notebooklm-py[browser]" python3 \
scripts/load_channel.py load \
--videos /tmp/jeff-videos.json \
--notebook <notebook-id> \
--count 300 --concurrency 1--count 300 to --count 50. Keep --concurrency 1 — loading too fast makes videos fail as empty red rows. Let it finish indexing before you query.Save your notebook id so the coach uses it automatically:
cp .notebooklm-id.example .notebooklm-idOpen .notebooklm-id in any editor and replace the first line with just your notebook id. Save. (Or export NOTEBOOKLM_ID=<your-id>.)
The moment of truth:
python3 scripts/ask_cited.py \
"How much training volume does Jeff recommend per muscle per week?"You'll get an answer followed by real Jeff video titles and the exact passages he said. If you see that, the engine works.
Open the folder in Claude Code and say:
› interview me to get jackedIt runs a real consultation — one question at a time, conversational, not a form. It walks through training volume, exercise selection, progression, and frequency, citing a real Jeff video for every principle, then writes you a program.
Want it built on your lifting history? Export your log from the Strong app and drop it at data/strong_workouts.csv — it's private and never leaves your machine. The coach scores your actual volume, frequency, and rep ranges against Jeff's criteria instead of guessing. (Open the folder with no data loaded and it starts the interview on its own.)
LLMs are extremely good at plausible-sounding nonsense. Ask one for a Jeff Nippard video and it'll happily cite a title that sounds completely real and does not exist. The moment your coach does that once, every other citation becomes suspect and the trust is gone.
So the rule is absolute: a claim is either backed by a title and quote the notebook returned this session, or the claim isn't made. The coach pre-fetches the core training topics once (so it stays fast), runs a live query for anything off-topic, and when the notebook genuinely has nothing on a subject it says so. That last behavior is a feature, not a limitation.
No, it's expected. The nlm (read) login only lasts about 20 minutes. When the coach says authentication expired, just run nlm login again and keep going.
Not to start. Free Google accounts cap at 50 videos per notebook — enough for Jeff's top content. Plus/Pro raises it to 300. On free, change --count 300 to --count 50, otherwise the extra videos show up as failed red rows (that's the tier limit, not a bug).
Working as intended. It won't invent a source Jeff never gave. An honest "I can't source that" beats a confident fake every time — that's the whole point of the project. (Deep cardio / VO2-max science isn't really Jeff's lane, for example, so it'll say so.)
Because a chatbot will happily cite a video like "How To Design The Perfect Workout Program" — a title that sounds real and does not exist. The moment that happens once, every other citation is suspect. This build makes fabrication structurally impossible: no real title + quote, no claim.
You either exceeded your tier (use --count 50 on free) or loaded too fast. Keep --concurrency 1 so NotebookLM can index each transcript cleanly, then delete the red rows and re-add them.
Yes — nothing is hardwired except the content. Load a different YouTube channel into a new notebook, put its id in .notebooklm-id, copy CLAUDE.md.template to CLAUDE.md and rewrite the persona. The citation discipline and interview flow carry over unchanged. Nutritionist, product thinker, any podcaster.
Build it, point it at your favorite expert, and never wonder where the advice came from again. Everything is open source (MIT) — the coach repo and the base skill it's built on. If a workflow breaks or you want a feature added, ping me on Instagram or join the weekly call on Skool.
Drop your email and the full build unlocks instantly — the coach repo, the setup, and every step. Plus every other resource in the library. One email a week, unsubscribe anytime.
Same machine, any YouTube channel — a nutritionist, a product thinker, a podcaster you love. Load the channel, swap the persona, keep the citation discipline.