claude-agent-skills-hub / notebooklm-py
CLAUDE.md0 starsChanged 55 days agoMITView on GitHub
Guidance for Claude Code working in this repo. Also follow the file/naming conventions in CONTRIBUTING.md. notebooklm-py is an unofficial async Python client for Google NotebookLM. It drives Google's internal batchexecute RPC protocol to automate notebooks, sources, AI querying, and studio artifacts (podcasts, videos, quizzes, …). Critical constraint: the obfuscated RPC method IDs in src/notebooklm/rpc/types.py are undocumented and can break whenever Google changes them — the #1 breakage class. The pre-commit hook runs ruff (format + lint) on staged files. Also…
In this repository55 other files it gives its agents.
- agent-browser/AGENTS.mdAGENTS.md
- caveman/AGENTS.mdAGENTS.md
- find-skills/AGENTS.mdAGENTS.md
- graphify/AGENTS.mdAGENTS.md
- gsap/AGENTS.mdAGENTS.md
- gstack/AGENTS.mdAGENTS.md
- humanizer/AGENTS.mdAGENTS.md
- hyperframes/AGENTS.mdAGENTS.md
- hyperiux-components/AGENTS.mdAGENTS.md
- i-have-adhd/AGENTS.mdAGENTS.md
- impeccable/AGENTS.mdAGENTS.md
- last30days-skill/AGENTS.mdAGENTS.md
- marketingskills/AGENTS.mdAGENTS.md
- notebooklm-py/AGENTS.mdAGENTS.md
- ponytail/AGENTS.mdAGENTS.md
- superdesign-skill/AGENTS.mdAGENTS.md
- superpowers/AGENTS.mdAGENTS.md
- caveman/CLAUDE.mdCLAUDE.md
- claude-hud/CLAUDE.mdCLAUDE.md
- gsap/CLAUDE.mdCLAUDE.md
- gstack/CLAUDE.mdCLAUDE.md
- hyperframes/CLAUDE.mdCLAUDE.md
- hyperiux-components/CLAUDE.mdCLAUDE.md
- impeccable/CLAUDE.mdCLAUDE.md
- last30days-skill/CLAUDE.mdCLAUDE.md
- marketingskills/CLAUDE.mdCLAUDE.md
- superdesign-skill/CLAUDE.mdCLAUDE.md
- ui-ux-pro-max/CLAUDE.mdCLAUDE.md
- ui-ux-pro-max-skill/CLAUDE.mdCLAUDE.md
- llms.txtllms.txt
- brandkitSkill
- industrial-brutalist-uiSkill
- defuddleSkill
- gpt-tasteSkill
- gstackSkill
- humanizerSkill
- imagegen-frontend-mobileSkill
- imagegen-frontend-webSkill
- image-to-codeSkill
- json-canvasSkill
- last30daysSkill
- llm-councilSkill
- minimalist-uiSkill
- notebooklmSkill
- obsidian-basesSkill
- obsidian-cliSkill
- obsidian-markdownSkill
- full-output-enforcementSkill
- redesign-existing-projectsSkill
- high-end-visual-designSkill
- stitch-design-tasteSkill
- design-taste-frontendSkill
- design-taste-frontend-v1Skill
- ui-ux-design-patternsSkill
- webgpu-threejs-tslSkill
The file
We split this CLAUDE.md into the rules it gives an agent
2 rules. About 0 are common, 1 is distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 74
After opening a PR, drive it to merge:
- Very specific: line 78
Not done until all checks pass, all threads addressed, and mergeStateStatus is CLEAN.
≈ “Common” is an estimate: at least 1 in 5 of the 26,980 CLAUDE.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
CLAUDE.md
Guidance for Claude Code working in this repo. Also follow the file/naming conventions in CONTRIBUTING.md.
Project Overview
notebooklm-py is an unofficial async Python client for Google NotebookLM. It drives Google's internal batchexecute RPC protocol to automate notebooks, sources, AI querying, and studio artifacts (podcasts, videos, quizzes, …).
Critical constraint: the obfuscated RPC method IDs in src/notebooklm/rpc/types.py are undocumented and can break whenever Google changes them — the #1 breakage class.
Development Commands
# Canonical contributor install (respects uv.lock; full guide: docs/installation.md)
uv sync --frozen --extra browser --extra dev --extra markdown
source .venv/bin/activate
uv run playwright install chromium
uv run pytest # all tests (e2e excluded by default)
uv run pytest --cov # with coverage
uv run pytest tests/e2e -m e2e # e2e (requires auth)
uv run notebooklm --help # CLIBefore Pushing
The pre-commit hook runs ruff (format + lint) on staged files. Also run these manually — CI fails otherwise:
uv run mypy src/notebooklm --ignore-missing-imports
uv run pytestArchitecture
cli/ (Click) → _app/ (transport-neutral business logic, reusable by MCP/HTTP adapters) → client.py + _*.py (client runtime) → rpc/ (batchexecute encode/decode).
See docs/architecture.md for the layered design, call flows, cross-cutting policies (loop affinity, idempotency, schema validation), the per-file index, and the full repository tree.
Common Pitfalls
- RPC method IDs change — re-capture network traffic and update
rpc/types.py. - Position-sensitive nested params — copy the shape from an existing implementation; source-id nesting varies (
[id]/[[id]]/[[[id]]]/[[[[id]]]]). - CSRF tokens expire — call
client.refresh_auth()or re-runnotebooklm login. - Rate limiting — add delays between bulk operations.
- Concurrency — one
NotebookLMClientis bound to itsopen()-time event loop: create one per thread, never reuse across event loops orAuthTokenstenants. See the concurrency contract.
Usage
async with NotebookLMClient.from_storage() as client:
notebooks = await client.notebooks.list()
await client.sources.add_url(nb_id, url)
answer = await client.chat.ask(nb_id, question)
status = await client.artifacts.generate_audio(nb_id)CLI: top-level commands (login, use, status, list, ask) plus grouped subcommands (source add, label list, artifact list, generate audio, download video, note create, mcp install <client>, …). Full reference: docs/cli-reference.md.
An opt-in MCP server (mcp extra, console script notebooklm-mcp) exposes the same _app/ business logic over the Model Context Protocol; notebooklm mcp install <client> wires it into Claude Desktop/Code, Cursor, or Windsurf, and desktop-extension/ packages a one-click .mcpb bundle.
An opt-in single-tenant REST server (server extra, console script notebooklm-server) exposes guarded /v1 FastAPI routes over the same _app/ layer. It is experimental, loopback-bound by default, and requires NOTEBOOKLM_SERVER_TOKEN; see docs/installation.md#rest-api-server.
Testing
Unit (tests/unit/, no network; includes _app, CLI, server, and guardrail tests) · integration (tests/integration/, VCR cassette replay) · e2e (tests/e2e/, real API, @pytest.mark.e2e). VCR cassettes match on rpcids + decoded body shape. Details: docs/development.md.
Docs
docs/: installation · cli-reference · python-api · configuration · troubleshooting · development · architecture · mcp-guide · rpc-development · rpc-reference · stability · adr/.
Pull Request Workflow (required)
After opening a PR, drive it to merge:
- Poll
gh pr checks <PR>until all pass; investigate and fix any failures. - Address every review comment (especially
gemini-code-assist): make the fix, push, then reply on the thread (Addressed in <SHA>: …). Unreplied threads block merge. - Not done until all checks pass, all threads addressed, and
mergeStateStatusisCLEAN.
Claude review is not automatic — comment @claude review on the PR to trigger the .github/workflows/claude.yml workflow. Treat claude[bot] as a first-class reviewer the merge gate waits on, alongside gemini-code-assist / coderabbitai:
- It posts inline review-thread comments plus a sticky summary comment ("Claude finished … task"). The action does not submit a formal GitHub review, so
claude[bot]never appears ingh pr view --json reviews/reviewDecisionand is not a required check — do not infer "claude reviewed" from those. gh pr checksmay show aclaudeentry as skipping: every comment (incl. other bots') firesclaude.yml, and runs not from ateng-lin@claudecomment correctly skip via the jobif:gate. That skip is not the review run — find the real one withgh run list --workflow=claude.yml --json event,conclusion(look for thesuccessrun) or just read the comment below.- Before merging, confirm the review landed and address it. The two halves live on different endpoints: the sticky summary is an issue comment (
gh api /repos/<owner>/<repo>/issues/<PR>/comments), and the inline findings are pull-request review comments on the diff (gh api /repos/<owner>/<repo>/pulls/<PR>/comments) — filter either with--jq '.[]|select(.user.login=="claude[bot]").body'. Resolve any inlineclaude[bot]threads like any other bot's.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

