✓ Verified 🌐 Web Scrapers ✓ Enhanced Data

Nblm

Use this skill to query your Google NotebookLM notebooks directly from Claude Code for source-ground

Rating
4.3 (315 reviews)
Downloads
21,979 downloads
Version
1.0.0

Overview

Use this skill to query your Google NotebookLM notebooks directly from Claude Code for source-grounded.

Key Features

1

Check Authentication Status

2

Authenticate (One-Time Setup)

3

Manage Notebook Library

4

Ask Questions

Complete Documentation

View Source →

NotebookLM Quick Commands

Query Google NotebookLM for source-grounded, citation-backed answers.

Environment

All dependencies and authentication are handled automatically by run.py:

  • First run creates .venv and installs Python/Node.js dependencies
  • If Google auth is missing or expired, a browser window opens automatically
  • No manual pre-flight steps required

Usage

/nblm [args]

Commands

Notebook Management

CommandDescription
loginAuthenticate with Google
statusShow auth and library status
accountsList all Google accounts
accounts addAdd a new Google account
accounts switch Switch active account (by index or email)
accounts remove Remove an account
localList notebooks in local library
remoteList all notebooks from NotebookLM API
create Create a new notebook
delete [--id ID]Delete a notebook
rename [--id ID]Rename a notebook
summary [--id ID]Get AI-generated summary
describe [--id ID]Get description and suggested topics
add Add notebook to local library (auto-detects URL vs notebook ID)
activate Set active notebook

Source Management

CommandDescription
sources [--id ID]List sources in notebook
upload Upload a single file
upload Sync a folder of files to NotebookLM
upload-zlib Download from Z-Library and upload
upload-url Add URL as source
upload-youtube Add YouTube video as source
upload-text [--content TEXT]</td><td class="px-4 py-2 text-sm text-gray-700">Add text as source</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">source-text <source-id></td><td class="px-4 py-2 text-sm text-gray-700">Get full indexed text</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">source-guide <source-id></td><td class="px-4 py-2 text-sm text-gray-700">Get AI summary and keywords</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">source-rename <source-id> <name></td><td class="px-4 py-2 text-sm text-gray-700">Rename a source</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">source-refresh <source-id></td><td class="px-4 py-2 text-sm text-gray-700">Re-fetch URL content</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">source-delete <source-id></td><td class="px-4 py-2 text-sm text-gray-700">Delete a source</td></tr></tbody></table> <strong class="font-semibold">Upload options:</strong> <ul class="my-4 space-y-2"><li class="ml-6 mb-2 text-gray-700 list-disc"><code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">--use-active</code> - Upload to the currently active notebook</li> <li class="ml-6 mb-2 text-gray-700 list-disc"><code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">--create-new</code> - Create a new notebook named after the file/folder</li> <li class="ml-6 mb-2 text-gray-700 list-disc"><code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">--notebook-id <id></code> - Upload to a specific notebook</li> <li class="ml-6 mb-2 text-gray-700 list-disc"><code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">--dry-run</code> - Show sync plan without executing (folder sync)</li> <li class="ml-6 mb-2 text-gray-700 list-disc"><code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">--rebuild</code> - Force rebuild tracking file (folder sync)</li> </ul> <strong class="font-semibold">Important:</strong> When user runs upload without specifying a target, ASK them first: <blockquote class="border-l-4 border-primary-300 pl-4 py-2 my-4 text-gray-700 italic bg-primary-50 rounded-r">"Would you like to upload to the active notebook, or create a new notebook?"</blockquote> Then pass the appropriate flag (<code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">--use-active</code> or <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">--create-new</code>).</p><p class="my-4 text-gray-700 leading-relaxed"><h3 class="text-xl font-semibold text-gray-900 mt-8 mb-4">Chat & Audio/Media</h3> <table class="w-full my-6 border-collapse"><thead><tr><th class="bg-gray-100 px-4 py-2 text-left text-sm font-semibold text-gray-900 border-b-2 border-gray-300">Command</th><th class="bg-gray-100 px-4 py-2 text-left text-sm font-semibold text-gray-900 border-b-2 border-gray-300">Description</th></tr></thead><tbody><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">ask <question></td><td class="px-4 py-2 text-sm text-gray-700">Query NotebookLM</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">podcast [--instructions TEXT]</td><td class="px-4 py-2 text-sm text-gray-700">Generate audio podcast</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">podcast-status <task-id></td><td class="px-4 py-2 text-sm text-gray-700">Check podcast generation status</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">podcast-download [output-path]</td><td class="px-4 py-2 text-sm text-gray-700">Download latest podcast</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">briefing [--instructions TEXT]</td><td class="px-4 py-2 text-sm text-gray-700">Generate brief audio summary</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">debate [--instructions TEXT]</td><td class="px-4 py-2 text-sm text-gray-700">Generate debate-style audio</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">slides [--instructions TEXT]</td><td class="px-4 py-2 text-sm text-gray-700">Generate slide deck</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">slides-download [output-path]</td><td class="px-4 py-2 text-sm text-gray-700">Download slide deck as PDF</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">infographic [--instructions TEXT]</td><td class="px-4 py-2 text-sm text-gray-700">Generate infographic</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">infographic-download [output-path]</td><td class="px-4 py-2 text-sm text-gray-700">Download infographic</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">media-list [--type TYPE]</td><td class="px-4 py-2 text-sm text-gray-700">List generated media (audio/video/slides/infographic)</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">media-delete <id></td><td class="px-4 py-2 text-sm text-gray-700">Delete a generated media item</td></tr></tbody></table> <h2 class="text-2xl font-bold text-gray-900 mt-10 mb-6 border-b border-gray-200 pb-2">Command Routing</h2></p><p class="my-4 text-gray-700 leading-relaxed">Based on <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">$ARGUMENTS</code>, execute the appropriate command:</p><p class="my-4 text-gray-700 leading-relaxed">$IF($ARGUMENTS, Parse the command from: "$ARGUMENTS"</p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">login</strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py auth_manager.py setup --service google</code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">accounts</strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py auth_manager.py accounts list</code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">accounts add</strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py auth_manager.py accounts add</code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">accounts switch <id></strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py auth_manager.py accounts switch "<id>"</code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">accounts remove <id></strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py auth_manager.py accounts remove "<id>"</code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">status</strong> → Run both: <ul class="my-4 space-y-2"><li class="ml-6 mb-2 text-gray-700 list-disc"><code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py auth_manager.py status</code></li> <li class="ml-6 mb-2 text-gray-700 list-disc"><code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py notebook_manager.py list</code></li> </ul> <strong class="font-semibold">local</strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py notebook_manager.py list</code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">remote</strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py nblm_cli.py notebooks</code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">create <name></strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py nblm_cli.py create "<name>"</code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">delete [--id ID]</strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py nblm_cli.py delete <args></code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">rename <name> [--id ID]</strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py nblm_cli.py rename "<name>" <args></code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">summary [--id ID]</strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py nblm_cli.py summary <args></code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">describe [--id ID]</strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py nblm_cli.py describe <args></code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">add <url-or-id></strong> → Smart add workflow (auto-detects URL vs notebook ID)</p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">activate <id></strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py notebook_manager.py activate --id "<id>"</code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">sources [--id ID]</strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py nblm_cli.py sources <args></code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">upload <file></strong> → First ASK user: "Upload to active notebook or create new?" Then: <ul class="my-4 space-y-2"><li class="ml-6 mb-2 text-gray-700 list-disc">Active: <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py source_manager.py add --file "<file>" --use-active</code></li> <li class="ml-6 mb-2 text-gray-700 list-disc">New: <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py source_manager.py add --file "<file>" --create-new</code></li> </ul> <strong class="font-semibold">upload <folder></strong> → Sync a folder: <ul class="my-4 space-y-2"><li class="ml-6 mb-2 text-gray-700 list-disc">First ASK user: "Sync to active notebook, create new, or specify notebook?"</li> <li class="ml-6 mb-2 text-gray-700 list-disc">Active: <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py source_manager.py sync "<folder>" --use-active</code></li> <li class="ml-6 mb-2 text-gray-700 list-disc">New: <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py source_manager.py sync "<folder>" --create-new</code></li> <li class="ml-6 mb-2 text-gray-700 list-disc">Specific: <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py source_manager.py sync "<folder>" --notebook-id ID</code></li> <li class="ml-6 mb-2 text-gray-700 list-disc">Dry-run: <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py source_manager.py sync "<folder>" --dry-run</code></li> <li class="ml-6 mb-2 text-gray-700 list-disc">Rebuild: <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py source_manager.py sync "<folder>" --rebuild</code></li> </ul> <strong class="font-semibold">upload-zlib <url></strong> → First ASK user: "Upload to active notebook or create new?" Then: <ul class="my-4 space-y-2"><li class="ml-6 mb-2 text-gray-700 list-disc">Active: <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py source_manager.py add --url "<url>" --use-active</code></li> <li class="ml-6 mb-2 text-gray-700 list-disc">New: <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py source_manager.py add --url "<url>" --create-new</code></li> </ul> <strong class="font-semibold">upload-url <url></strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py nblm_cli.py upload-url "<url>"</code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">upload-youtube <url></strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py nblm_cli.py upload-youtube "<url>"</code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">upload-text <title></strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py nblm_cli.py upload-text "<title>" <args></code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">source-text <id></strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py nblm_cli.py source-text "<id>"</code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">source-guide <id></strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py nblm_cli.py source-guide "<id>"</code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">source-rename <id> <name></strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py nblm_cli.py source-rename "<id>" "<name>"</code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">source-refresh <id></strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py nblm_cli.py source-refresh "<id>"</code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">source-delete <id></strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py nblm_cli.py source-delete "<id>"</code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">ask <question></strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py nblm_cli.py ask "<question>"</code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">podcast</strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py artifact_manager.py generate --format DEEP_DIVE <args></code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">podcast-status <task-id></strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py artifact_manager.py status --task-id "<task-id>"</code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">podcast-download [output-path]</strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py artifact_manager.py download "<output-path>"</code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">briefing</strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py artifact_manager.py generate --format BRIEF <args></code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">debate</strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py artifact_manager.py generate --format DEBATE <args></code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">slides</strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py artifact_manager.py generate-slides <args></code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">slides-download [output-path]</strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py artifact_manager.py download "<output-path>" --type slide-deck</code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">infographic</strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py artifact_manager.py generate-infographic <args></code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">infographic-download [output-path]</strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py artifact_manager.py download "<output-path>" --type infographic</code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">media-list [--type TYPE]</strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py artifact_manager.py list <args></code></p><p class="my-4 text-gray-700 leading-relaxed"> <strong class="font-semibold">media-delete <id></strong> → <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py artifact_manager.py delete "<id>"</code></p><p class="my-4 text-gray-700 leading-relaxed"> If command not recognized, show usage help.,</p><p class="my-4 text-gray-700 leading-relaxed"> Show available commands with <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">/nblm</code> (no arguments) )</p><p class="my-4 text-gray-700 leading-relaxed"><h2 class="text-2xl font-bold text-gray-900 mt-10 mb-6 border-b border-gray-200 pb-2">Podcast Options</h2></p><p class="my-4 text-gray-700 leading-relaxed"><div class="relative group my-6"> <div class="absolute top-2 right-2 px-2 py-1 text-xs font-medium text-gray-400 bg-gray-800 rounded">text</div> <pre class="bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto text-sm leading-relaxed"><code class="language-text">/nblm podcast --length DEFAULT --wait --output ./podcast.mp3 /nblm podcast --instructions "Focus on the key findings" /nblm briefing --wait --output ./summary.mp3 /nblm debate --instructions "Compare the two approaches"</code></pre> </div></p><p class="my-4 text-gray-700 leading-relaxed"><table class="w-full my-6 border-collapse"><thead><tr><th class="bg-gray-100 px-4 py-2 text-left text-sm font-semibold text-gray-900 border-b-2 border-gray-300">Option</th><th class="bg-gray-100 px-4 py-2 text-left text-sm font-semibold text-gray-900 border-b-2 border-gray-300">Values</th></tr></thead><tbody><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">--length</td><td class="px-4 py-2 text-sm text-gray-700">SHORT, DEFAULT, LONG</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">--instructions</td><td class="px-4 py-2 text-sm text-gray-700">Custom instructions for the content</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">--wait</td><td class="px-4 py-2 text-sm text-gray-700">Wait for generation to complete</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">--output</td><td class="px-4 py-2 text-sm text-gray-700">Download path (requires --wait)</td></tr></tbody></table> <h2 class="text-2xl font-bold text-gray-900 mt-10 mb-6 border-b border-gray-200 pb-2">Slide Deck Options</h2></p><p class="my-4 text-gray-700 leading-relaxed"><div class="relative group my-6"> <div class="absolute top-2 right-2 px-2 py-1 text-xs font-medium text-gray-400 bg-gray-800 rounded">text</div> <pre class="bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto text-sm leading-relaxed"><code class="language-text">/nblm slides --format DETAILED_DECK --wait --output ./presentation.pdf /nblm slides --instructions "Focus on key diagrams" --format PRESENTER_SLIDES</code></pre> </div></p><p class="my-4 text-gray-700 leading-relaxed"><table class="w-full my-6 border-collapse"><thead><tr><th class="bg-gray-100 px-4 py-2 text-left text-sm font-semibold text-gray-900 border-b-2 border-gray-300">Option</th><th class="bg-gray-100 px-4 py-2 text-left text-sm font-semibold text-gray-900 border-b-2 border-gray-300">Values</th></tr></thead><tbody><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">--format</td><td class="px-4 py-2 text-sm text-gray-700">DETAILED_DECK, PRESENTER_SLIDES</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">--length</td><td class="px-4 py-2 text-sm text-gray-700">SHORT, DEFAULT</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">--instructions</td><td class="px-4 py-2 text-sm text-gray-700">Custom instructions for the content</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">--wait</td><td class="px-4 py-2 text-sm text-gray-700">Wait for generation to complete</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">--output</td><td class="px-4 py-2 text-sm text-gray-700">Download path (requires --wait)</td></tr></tbody></table> <h2 class="text-2xl font-bold text-gray-900 mt-10 mb-6 border-b border-gray-200 pb-2">Infographic Options</h2></p><p class="my-4 text-gray-700 leading-relaxed"><div class="relative group my-6"> <div class="absolute top-2 right-2 px-2 py-1 text-xs font-medium text-gray-400 bg-gray-800 rounded">text</div> <pre class="bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto text-sm leading-relaxed"><code class="language-text">/nblm infographic --orientation LANDSCAPE --wait --output ./visual.png /nblm infographic --instructions "Highlight comparison" --detail-level DETAILED</code></pre> </div></p><p class="my-4 text-gray-700 leading-relaxed"><table class="w-full my-6 border-collapse"><thead><tr><th class="bg-gray-100 px-4 py-2 text-left text-sm font-semibold text-gray-900 border-b-2 border-gray-300">Option</th><th class="bg-gray-100 px-4 py-2 text-left text-sm font-semibold text-gray-900 border-b-2 border-gray-300">Values</th></tr></thead><tbody><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">--orientation</td><td class="px-4 py-2 text-sm text-gray-700">LANDSCAPE, PORTRAIT, SQUARE</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">--detail-level</td><td class="px-4 py-2 text-sm text-gray-700">CONCISE, STANDARD, DETAILED</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">--instructions</td><td class="px-4 py-2 text-sm text-gray-700">Custom instructions for the content</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">--wait</td><td class="px-4 py-2 text-sm text-gray-700">Wait for generation to complete</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">--output</td><td class="px-4 py-2 text-sm text-gray-700">Download path (requires --wait)</td></tr></tbody></table> <h2 class="text-2xl font-bold text-gray-900 mt-10 mb-6 border-b border-gray-200 pb-2">Media Generation</h2></p><p class="my-4 text-gray-700 leading-relaxed"><table class="w-full my-6 border-collapse"><thead><tr><th class="bg-gray-100 px-4 py-2 text-left text-sm font-semibold text-gray-900 border-b-2 border-gray-300">Command</th><th class="bg-gray-100 px-4 py-2 text-left text-sm font-semibold text-gray-900 border-b-2 border-gray-300">Description</th><th class="bg-gray-100 px-4 py-2 text-left text-sm font-semibold text-gray-900 border-b-2 border-gray-300">Output</th></tr></thead><tbody><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">/nblm podcast</td><td class="px-4 py-2 text-sm text-gray-700">Deep-dive audio discussion</td><td class="px-4 py-2 text-sm text-gray-700">MP3</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">/nblm briefing</td><td class="px-4 py-2 text-sm text-gray-700">Brief audio summary</td><td class="px-4 py-2 text-sm text-gray-700">MP3</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">/nblm debate</td><td class="px-4 py-2 text-sm text-gray-700">Debate-style audio</td><td class="px-4 py-2 text-sm text-gray-700">MP3</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">/nblm slides</td><td class="px-4 py-2 text-sm text-gray-700">Slide deck presentation</td><td class="px-4 py-2 text-sm text-gray-700">PDF</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">/nblm infographic</td><td class="px-4 py-2 text-sm text-gray-700">Visual infographic</td><td class="px-4 py-2 text-sm text-gray-700">PNG</td></tr></tbody></table> <h3 class="text-xl font-semibold text-gray-900 mt-8 mb-4">Examples</h3> <div class="relative group my-6"> <div class="absolute top-2 right-2 px-2 py-1 text-xs font-medium text-gray-400 bg-gray-800 rounded">text</div> <pre class="bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto text-sm leading-relaxed"><code class="language-text">/nblm podcast --wait --output ./deep-dive.mp3 /nblm briefing --instructions "Focus on chapter 3" --wait /nblm debate --length LONG --wait --output ./debate.mp3 /nblm slides --instructions "Include key diagrams" --format DETAILED_DECK --wait --output ./presentation.pdf /nblm infographic --orientation LANDSCAPE --detail-level DETAILED --wait --output ./summary.png</code></pre> </div></p><p class="my-4 text-gray-700 leading-relaxed"><h3 class="text-xl font-semibold text-gray-900 mt-8 mb-4">Download & Manage</h3> <div class="relative group my-6"> <div class="absolute top-2 right-2 px-2 py-1 text-xs font-medium text-gray-400 bg-gray-800 rounded">text</div> <pre class="bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto text-sm leading-relaxed"><code class="language-text">/nblm podcast-download ./my-podcast.mp3 /nblm slides-download ./presentation.pdf /nblm infographic-download ./visual.png /nblm media-list # List all generated media /nblm media-list --type audio # List only audio /nblm media-delete <id> # Delete a media item</code></pre> </div></p><p class="my-4 text-gray-700 leading-relaxed"><hr class="my-8 border-t border-gray-300"></p><p class="my-4 text-gray-700 leading-relaxed"><h1 class="text-3xl font-bold text-gray-900 mb-6">Extended Documentation</h1></p><p class="my-4 text-gray-700 leading-relaxed"><h2 class="text-2xl font-bold text-gray-900 mt-10 mb-6 border-b border-gray-200 pb-2">When to Use This Skill</h2></p><p class="my-4 text-gray-700 leading-relaxed">Trigger when user: <ul class="my-4 space-y-2"><li class="ml-6 mb-2 text-gray-700 list-disc">Mentions NotebookLM explicitly</li> <li class="ml-6 mb-2 text-gray-700 list-disc">Shares NotebookLM URL (<code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">https://notebooklm.google.com/notebook/...</code>)</li> <li class="ml-6 mb-2 text-gray-700 list-disc">Asks to query their notebooks/documentation</li> <li class="ml-6 mb-2 text-gray-700 list-disc">Wants to add documentation to NotebookLM library</li> <li class="ml-6 mb-2 text-gray-700 list-disc">Uses phrases like "ask my NotebookLM", "check my docs", "query my notebook"</li> </ul> <h2 class="text-2xl font-bold text-gray-900 mt-10 mb-6 border-b border-gray-200 pb-2">⚠️ CRITICAL: Add Command - Smart Discovery</h2></p><p class="my-4 text-gray-700 leading-relaxed">The add command now <strong class="font-semibold">automatically discovers metadata</strong> from the notebook:</p><p class="my-4 text-gray-700 leading-relaxed"><div class="relative group my-6"> <div class="absolute top-2 right-2 px-2 py-1 text-xs font-medium text-gray-400 bg-gray-800 rounded">bash</div> <pre class="bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto text-sm leading-relaxed"><code class="language-bash"># Smart Add (auto-discovers name, description, topics) python scripts/run.py notebook_manager.py add <notebook-id-or-url> # With optional overrides python scripts/run.py notebook_manager.py add <id> --name "Custom Name" --topics "custom,topics"</code></pre> </div></p><p class="my-4 text-gray-700 leading-relaxed"><strong class="font-semibold">What Smart Add does:</strong> <ul class="my-4 space-y-2"><li class="ml-6 mb-2 text-gray-700 list-decimal">Fetches notebook title from NotebookLM API</li> <li class="ml-6 mb-2 text-gray-700 list-decimal">Queries the notebook content to generate description and topics</li> <li class="ml-6 mb-2 text-gray-700 list-decimal">Adds to local library with discovered metadata</li> </ul> <strong class="font-semibold">Supported input formats:</strong> <ul class="my-4 space-y-2"><li class="ml-6 mb-2 text-gray-700 list-disc">Notebook ID: <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">5fd9f36b-8000-401d-a7a0-7aa3f7832644</code></li> <li class="ml-6 mb-2 text-gray-700 list-disc">Full URL: <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">https://notebooklm.google.com/notebook/5fd9f36b-8000-401d-a7a0-7aa3f7832644</code></li> </ul> NEVER manually specify <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">--name</code>, <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">--description</code>, or <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">--topics</code> unless the user explicitly provides them.</p><p class="my-4 text-gray-700 leading-relaxed"><h2 class="text-2xl font-bold text-gray-900 mt-10 mb-6 border-b border-gray-200 pb-2">Critical: Always Use run.py Wrapper</h2></p><p class="my-4 text-gray-700 leading-relaxed"><strong class="font-semibold">NEVER call scripts directly. ALWAYS use <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py [script]</code>:</strong></p><p class="my-4 text-gray-700 leading-relaxed"><div class="relative group my-6"> <div class="absolute top-2 right-2 px-2 py-1 text-xs font-medium text-gray-400 bg-gray-800 rounded">bash</div> <pre class="bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto text-sm leading-relaxed"><code class="language-bash"># ✅ CORRECT - Always use run.py: python scripts/run.py auth_manager.py status python scripts/run.py notebook_manager.py list python scripts/run.py ask_question.py --question "..." # ❌ WRONG - Never call directly: python scripts/auth_manager.py status # Fails without venv!</code></pre> </div></p><p class="my-4 text-gray-700 leading-relaxed">The <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">run.py</code> wrapper automatically: <ul class="my-4 space-y-2"><li class="ml-6 mb-2 text-gray-700 list-decimal">Creates <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">.venv</code> if needed</li> <li class="ml-6 mb-2 text-gray-700 list-decimal">Installs all dependencies</li> <li class="ml-6 mb-2 text-gray-700 list-decimal">Activates environment</li> <li class="ml-6 mb-2 text-gray-700 list-decimal">Executes script properly</li> </ul> <h2 class="text-2xl font-bold text-gray-900 mt-10 mb-6 border-b border-gray-200 pb-2">Core Workflow</h2></p><p class="my-4 text-gray-700 leading-relaxed"><h3 class="text-xl font-semibold text-gray-900 mt-8 mb-4">Step 1: Check Authentication Status</h3> <div class="relative group my-6"> <div class="absolute top-2 right-2 px-2 py-1 text-xs font-medium text-gray-400 bg-gray-800 rounded">bash</div> <pre class="bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto text-sm leading-relaxed"><code class="language-bash">python scripts/run.py auth_manager.py status</code></pre> </div></p><p class="my-4 text-gray-700 leading-relaxed">If not authenticated, proceed to setup.</p><p class="my-4 text-gray-700 leading-relaxed"><h3 class="text-xl font-semibold text-gray-900 mt-8 mb-4">Step 2: Authenticate (One-Time Setup)</h3> <div class="relative group my-6"> <div class="absolute top-2 right-2 px-2 py-1 text-xs font-medium text-gray-400 bg-gray-800 rounded">bash</div> <pre class="bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto text-sm leading-relaxed"><code class="language-bash"># Browser MUST be visible for manual Google login python scripts/run.py auth_manager.py setup</code></pre> </div></p><p class="my-4 text-gray-700 leading-relaxed"><strong class="font-semibold">Important:</strong> <ul class="my-4 space-y-2"><li class="ml-6 mb-2 text-gray-700 list-disc">Browser is VISIBLE for authentication</li> <li class="ml-6 mb-2 text-gray-700 list-disc">Browser window opens automatically</li> <li class="ml-6 mb-2 text-gray-700 list-disc">User must manually log in to Google</li> <li class="ml-6 mb-2 text-gray-700 list-disc">Tell user: "A browser window will open for Google login"</li> </ul> <h3 class="text-xl font-semibold text-gray-900 mt-8 mb-4">Step 3: Manage Notebook Library</h3></p><p class="my-4 text-gray-700 leading-relaxed"><div class="relative group my-6"> <div class="absolute top-2 right-2 px-2 py-1 text-xs font-medium text-gray-400 bg-gray-800 rounded">bash</div> <pre class="bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto text-sm leading-relaxed"><code class="language-bash"># List all notebooks python scripts/run.py notebook_manager.py list # BEFORE ADDING: Ask user for metadata if unknown! # "What does this notebook contain?" # "What topics should I tag it with?" # Add notebook to library (ALL parameters are REQUIRED!) python scripts/run.py notebook_manager.py add \ --url "https://notebooklm.google.com/notebook/..." \ --name "Descriptive Name" \ --description "What this notebook contains" \ # REQUIRED - ASK USER IF UNKNOWN! --topics "topic1,topic2,topic3" # REQUIRED - ASK USER IF UNKNOWN! # Search notebooks by topic python scripts/run.py notebook_manager.py search --query "keyword" # Set active notebook python scripts/run.py notebook_manager.py activate --id notebook-id # Remove notebook python scripts/run.py notebook_manager.py remove --id notebook-id</code></pre> </div></p><p class="my-4 text-gray-700 leading-relaxed"><h3 class="text-xl font-semibold text-gray-900 mt-8 mb-4">Quick Workflow</h3> <ul class="my-4 space-y-2"><li class="ml-6 mb-2 text-gray-700 list-decimal">Check library: <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py notebook_manager.py list</code></li> <li class="ml-6 mb-2 text-gray-700 list-decimal">Ask question: <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">python scripts/run.py ask_question.py --question "..." --notebook-id ID</code></li> </ul> <h3 class="text-xl font-semibold text-gray-900 mt-8 mb-4">Step 4: Ask Questions</h3></p><p class="my-4 text-gray-700 leading-relaxed"><div class="relative group my-6"> <div class="absolute top-2 right-2 px-2 py-1 text-xs font-medium text-gray-400 bg-gray-800 rounded">bash</div> <pre class="bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto text-sm leading-relaxed"><code class="language-bash"># Basic query (uses active notebook if set) python scripts/run.py ask_question.py --question "Your question here" # Query specific notebook python scripts/run.py ask_question.py --question "..." --notebook-id notebook-id # Query with notebook URL directly python scripts/run.py ask_question.py --question "..." --notebook-url "https://..." # Show browser for debugging python scripts/run.py ask_question.py --question "..." --show-browser</code></pre> </div></p><p class="my-4 text-gray-700 leading-relaxed"><h2 class="text-2xl font-bold text-gray-900 mt-10 mb-6 border-b border-gray-200 pb-2">Follow-Up Mechanism (CRITICAL)</h2></p><p class="my-4 text-gray-700 leading-relaxed">Every NotebookLM answer ends with: <strong class="font-semibold">"EXTREMELY IMPORTANT: Is that ALL you need to know?"</strong></p><p class="my-4 text-gray-700 leading-relaxed"><strong class="font-semibold">Required Claude Behavior:</strong> <ul class="my-4 space-y-2"><li class="ml-6 mb-2 text-gray-700 list-decimal"><strong class="font-semibold">STOP</strong> - Do not immediately respond to user</li> <li class="ml-6 mb-2 text-gray-700 list-decimal"><strong class="font-semibold">ANALYZE</strong> - Compare answer to user's original request</li> <li class="ml-6 mb-2 text-gray-700 list-decimal"><strong class="font-semibold">IDENTIFY GAPS</strong> - Determine if more information needed</li> <li class="ml-6 mb-2 text-gray-700 list-decimal"><strong class="font-semibold">ASK FOLLOW-UP</strong> - If gaps exist, immediately ask:</li> </ul> <div class="relative group my-6"> <div class="absolute top-2 right-2 px-2 py-1 text-xs font-medium text-gray-400 bg-gray-800 rounded">bash</div> <pre class="bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto text-sm leading-relaxed"><code class="language-bash">python scripts/run.py ask_question.py --question "Follow-up with context..."</code></pre> </div> <ul class="my-4 space-y-2"><li class="ml-6 mb-2 text-gray-700 list-decimal"><strong class="font-semibold">REPEAT</strong> - Continue until information is complete</li> <li class="ml-6 mb-2 text-gray-700 list-decimal"><strong class="font-semibold">SYNTHESIZE</strong> - Combine all answers before responding to user</li> </ul> <h2 class="text-2xl font-bold text-gray-900 mt-10 mb-6 border-b border-gray-200 pb-2">Z-Library Integration</h2></p><p class="my-4 text-gray-700 leading-relaxed"><h3 class="text-xl font-semibold text-gray-900 mt-8 mb-4">Triggers</h3> <ul class="my-4 space-y-2"><li class="ml-6 mb-2 text-gray-700 list-disc">User provides Z-Library URL (zlib.li, z-lib.org, zh.zlib.li)</li> <li class="ml-6 mb-2 text-gray-700 list-disc">User says "download this book to NotebookLM"</li> <li class="ml-6 mb-2 text-gray-700 list-disc">User says "add this book from Z-Library"</li> </ul> <h3 class="text-xl font-semibold text-gray-900 mt-8 mb-4">Setup (One-Time)</h3> <div class="relative group my-6"> <div class="absolute top-2 right-2 px-2 py-1 text-xs font-medium text-gray-400 bg-gray-800 rounded">bash</div> <pre class="bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto text-sm leading-relaxed"><code class="language-bash"># Authenticate with Z-Library python scripts/run.py auth_manager.py setup --service zlibrary</code></pre> </div></p><p class="my-4 text-gray-700 leading-relaxed"><h3 class="text-xl font-semibold text-gray-900 mt-8 mb-4">Commands</h3> <div class="relative group my-6"> <div class="absolute top-2 right-2 px-2 py-1 text-xs font-medium text-gray-400 bg-gray-800 rounded">bash</div> <pre class="bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto text-sm leading-relaxed"><code class="language-bash"># Add book from Z-Library python scripts/run.py source_manager.py add --url "https://zh.zlib.li/book/..." # Check Z-Library auth status python scripts/run.py auth_manager.py status --service zlibrary</code></pre> </div></p><p class="my-4 text-gray-700 leading-relaxed"><h2 class="text-2xl font-bold text-gray-900 mt-10 mb-6 border-b border-gray-200 pb-2">Script Reference</h2></p><p class="my-4 text-gray-700 leading-relaxed"><h3 class="text-xl font-semibold text-gray-900 mt-8 mb-4">Authentication Management (<code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">auth_manager.py</code>)</h3> <div class="relative group my-6"> <div class="absolute top-2 right-2 px-2 py-1 text-xs font-medium text-gray-400 bg-gray-800 rounded">bash</div> <pre class="bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto text-sm leading-relaxed"><code class="language-bash">python scripts/run.py auth_manager.py setup # Default: Google python scripts/run.py auth_manager.py setup --service google python scripts/run.py auth_manager.py setup --service zlibrary python scripts/run.py auth_manager.py status # Show all services python scripts/run.py auth_manager.py status --service zlibrary python scripts/run.py auth_manager.py clear --service zlibrary # Clear auth # Multi-Account Management (Google) python scripts/run.py auth_manager.py accounts list # List all accounts python scripts/run.py auth_manager.py accounts add # Add new account python scripts/run.py auth_manager.py accounts switch 1 # Switch by index python scripts/run.py auth_manager.py accounts switch user@gmail.com # Switch by email python scripts/run.py auth_manager.py accounts remove 2 # Remove account</code></pre> </div></p><p class="my-4 text-gray-700 leading-relaxed"><h3 class="text-xl font-semibold text-gray-900 mt-8 mb-4">Notebook Management (<code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">notebook_manager.py</code>)</h3> <div class="relative group my-6"> <div class="absolute top-2 right-2 px-2 py-1 text-xs font-medium text-gray-400 bg-gray-800 rounded">bash</div> <pre class="bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto text-sm leading-relaxed"><code class="language-bash">python scripts/run.py notebook_manager.py add --url URL --name NAME --description DESC --topics TOPICS # OR use notebook ID directly: python scripts/run.py notebook_manager.py add --notebook-id ID --name NAME --description DESC --topics TOPICS python scripts/run.py notebook_manager.py list python scripts/run.py notebook_manager.py search --query QUERY python scripts/run.py notebook_manager.py activate --id ID python scripts/run.py notebook_manager.py remove --id ID python scripts/run.py notebook_manager.py stats</code></pre> </div></p><p class="my-4 text-gray-700 leading-relaxed"><h3 class="text-xl font-semibold text-gray-900 mt-8 mb-4">Question Interface (<code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">ask_question.py</code>)</h3> <div class="relative group my-6"> <div class="absolute top-2 right-2 px-2 py-1 text-xs font-medium text-gray-400 bg-gray-800 rounded">bash</div> <pre class="bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto text-sm leading-relaxed"><code class="language-bash">python scripts/run.py ask_question.py --question "..." [--notebook-id ID] [--notebook-url URL] [--show-browser]</code></pre> </div></p><p class="my-4 text-gray-700 leading-relaxed"><h3 class="text-xl font-semibold text-gray-900 mt-8 mb-4">Source Manager (<code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">source_manager.py</code>)</h3> <div class="relative group my-6"> <div class="absolute top-2 right-2 px-2 py-1 text-xs font-medium text-gray-400 bg-gray-800 rounded">bash</div> <pre class="bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto text-sm leading-relaxed"><code class="language-bash"># Upload to active notebook python scripts/run.py source_manager.py add --file "/path/to/book.pdf" --use-active # Create new notebook for upload python scripts/run.py source_manager.py add --file "/path/to/book.pdf" --create-new # Upload to specific notebook python scripts/run.py source_manager.py add --file "/path/to/book.pdf" --notebook-id NOTEBOOK_ID # Z-Library download and upload python scripts/run.py source_manager.py add --url "https://zh.zlib.li/book/..." --use-active python scripts/run.py source_manager.py add --url "https://zh.zlib.li/book/..." --create-new # Sync a folder (new!) python scripts/run.py source_manager.py sync "/path/to/docs" --use-active python scripts/run.py source_manager.py sync "/path/to/docs" --create-new python scripts/run.py source_manager.py sync "/path/to/docs" --notebook-id NOTEBOOK_ID # Sync options (new!) python scripts/run.py source_manager.py sync "/path/to/docs" --dry-run # Preview only python scripts/run.py source_manager.py sync "/path/to/docs" --rebuild # Force re-hash all files</code></pre> </div></p><p class="my-4 text-gray-700 leading-relaxed"><strong class="font-semibold">Folder Sync:</strong> <ul class="my-4 space-y-2"><li class="ml-6 mb-2 text-gray-700 list-disc">Scans folder for supported types: PDF, TXT, MD, DOCX, HTML, EPUB</li> <li class="ml-6 mb-2 text-gray-700 list-disc">Tracks sync state internally (no per-folder tracking file to manage)</li> <li class="ml-6 mb-2 text-gray-700 list-disc">Sync strategy: add new, update modified (delete + re-upload), skip unchanged</li> <li class="ml-6 mb-2 text-gray-700 list-disc">Multi-account aware (tracks which Google account was used)</li> </ul><strong class="font-semibold">Note:</strong> One of <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">--use-active</code>, <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">--create-new</code>, or <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">--notebook-id</code> is REQUIRED. Uploads wait for NotebookLM processing and print progress as <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">Ready: N/T</code>. Press Ctrl+C to stop waiting. Local file uploads use browser automation and require Google authentication. If browser automation is unavailable, set <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">NOTEBOOKLM_UPLOAD_MODE=text</code> to upload extracted text instead (PDFs require <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">pypdf</code>).</p><p class="my-4 text-gray-700 leading-relaxed"><h3 class="text-xl font-semibold text-gray-900 mt-8 mb-4">Data Cleanup (<code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">cleanup_manager.py</code>)</h3> <div class="relative group my-6"> <div class="absolute top-2 right-2 px-2 py-1 text-xs font-medium text-gray-400 bg-gray-800 rounded">bash</div> <pre class="bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto text-sm leading-relaxed"><code class="language-bash">python scripts/run.py cleanup_manager.py # Preview cleanup python scripts/run.py cleanup_manager.py --confirm # Execute cleanup python scripts/run.py cleanup_manager.py --preserve-library # Keep notebooks</code></pre> </div></p><p class="my-4 text-gray-700 leading-relaxed"><h3 class="text-xl font-semibold text-gray-900 mt-8 mb-4">Watchdog Status (<code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">auth_manager.py</code>)</h3> <div class="relative group my-6"> <div class="absolute top-2 right-2 px-2 py-1 text-xs font-medium text-gray-400 bg-gray-800 rounded">bash</div> <pre class="bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto text-sm leading-relaxed"><code class="language-bash">python scripts/run.py auth_manager.py watchdog-status</code></pre> </div></p><p class="my-4 text-gray-700 leading-relaxed"><h2 class="text-2xl font-bold text-gray-900 mt-10 mb-6 border-b border-gray-200 pb-2">Environment Management</h2></p><p class="my-4 text-gray-700 leading-relaxed">The virtual environment is automatically managed: <ul class="my-4 space-y-2"><li class="ml-6 mb-2 text-gray-700 list-disc">First run creates <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">.venv</code> automatically</li> <li class="ml-6 mb-2 text-gray-700 list-disc">Dependencies install automatically</li> <li class="ml-6 mb-2 text-gray-700 list-disc">Node.js dependencies install automatically</li> <li class="ml-6 mb-2 text-gray-700 list-disc">agent-browser daemon starts on demand and keeps browser state in memory</li> <li class="ml-6 mb-2 text-gray-700 list-disc">daemon stops after 10 minutes of inactivity (any agent-browser command resets the timer)</li> <li class="ml-6 mb-2 text-gray-700 list-disc">set <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">AGENT_BROWSER_OWNER_PID</code> to auto-stop when the agent process exits</li> <li class="ml-6 mb-2 text-gray-700 list-disc"><code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">scripts/run.py</code> sets <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">AGENT_BROWSER_OWNER_PID</code> to its parent PID by default</li> <li class="ml-6 mb-2 text-gray-700 list-disc">Everything isolated in skill directory</li> </ul> Manual setup (only if automatic fails): <div class="relative group my-6"> <div class="absolute top-2 right-2 px-2 py-1 text-xs font-medium text-gray-400 bg-gray-800 rounded">bash</div> <pre class="bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto text-sm leading-relaxed"><code class="language-bash">python -m venv .venv source .venv/bin/activate # Linux/Mac pip install -r requirements.txt npm install npm run install-browsers</code></pre> </div></p><p class="my-4 text-gray-700 leading-relaxed"><h2 class="text-2xl font-bold text-gray-900 mt-10 mb-6 border-b border-gray-200 pb-2">Data Storage</h2></p><p class="my-4 text-gray-700 leading-relaxed">All data stored in <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">~/.claude/skills/notebooklm/data/</code>: <ul class="my-4 space-y-2"><li class="ml-6 mb-2 text-gray-700 list-disc"><code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">library.json</code> - Notebook metadata (with account associations)</li> <li class="ml-6 mb-2 text-gray-700 list-disc"><code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">auth/google/</code> - Multi-account Google auth</li> <li class="ml-6 mb-2 text-gray-700 list-disc"><code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">index.json</code> - Account index (active account, list)</li> <li class="ml-6 mb-2 text-gray-700 list-disc"><code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200"><n>-<email>.json</code> - Per-account credentials</li> <li class="ml-6 mb-2 text-gray-700 list-disc"><code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">auth/zlibrary.json</code> - Z-Library auth state</li> <li class="ml-6 mb-2 text-gray-700 list-disc"><code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">agent_browser/session_id</code> - Current daemon session ID</li> <li class="ml-6 mb-2 text-gray-700 list-disc"><code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">agent_browser/last_activity.json</code> - Last activity timestamp for idle shutdown</li> <li class="ml-6 mb-2 text-gray-700 list-disc"><code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">agent_browser/watchdog.pid</code> - Idle watchdog process ID</li> </ul> <strong class="font-semibold">Security:</strong> Protected by <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">.gitignore</code>, never commit to git.</p><p class="my-4 text-gray-700 leading-relaxed"><h2 class="text-2xl font-bold text-gray-900 mt-10 mb-6 border-b border-gray-200 pb-2">Configuration</h2></p><p class="my-4 text-gray-700 leading-relaxed">Optional <code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">.env</code> file in skill directory: <div class="relative group my-6"> <div class="absolute top-2 right-2 px-2 py-1 text-xs font-medium text-gray-400 bg-gray-800 rounded">env</div> <pre class="bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto text-sm leading-relaxed"><code class="language-env">HEADLESS=false # Browser visibility SHOW_BROWSER=false # Default browser display STEALTH_ENABLED=true # Human-like behavior TYPING_WPM_MIN=160 # Typing speed TYPING_WPM_MAX=240 DEFAULT_NOTEBOOK_ID= # Default notebook</code></pre> </div></p><p class="my-4 text-gray-700 leading-relaxed"><h2 class="text-2xl font-bold text-gray-900 mt-10 mb-6 border-b border-gray-200 pb-2">Decision Flow</h2></p><p class="my-4 text-gray-700 leading-relaxed"><div class="relative group my-6"> <div class="absolute top-2 right-2 px-2 py-1 text-xs font-medium text-gray-400 bg-gray-800 rounded">text</div> <pre class="bg-gray-900 text-gray-100 p-4 rounded-lg overflow-x-auto text-sm leading-relaxed"><code class="language-text">User mentions NotebookLM ↓ Check auth → python scripts/run.py auth_manager.py status ↓ If not authenticated → python scripts/run.py auth_manager.py setup ↓ Check/Add notebook → python scripts/run.py notebook_manager.py list/add (with --description) ↓ Activate notebook → python scripts/run.py notebook_manager.py activate --id ID ↓ Ask question → python scripts/run.py ask_question.py --question "..." ↓ See "Is that ALL you need?" → Ask follow-ups until complete ↓ Synthesize and respond to user</code></pre> </div></p><p class="my-4 text-gray-700 leading-relaxed"><h2 class="text-2xl font-bold text-gray-900 mt-10 mb-6 border-b border-gray-200 pb-2">Troubleshooting</h2></p><p class="my-4 text-gray-700 leading-relaxed"><table class="w-full my-6 border-collapse"><thead><tr><th class="bg-gray-100 px-4 py-2 text-left text-sm font-semibold text-gray-900 border-b-2 border-gray-300">Problem</th><th class="bg-gray-100 px-4 py-2 text-left text-sm font-semibold text-gray-900 border-b-2 border-gray-300">Solution</th></tr></thead><tbody><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">ModuleNotFoundError</td><td class="px-4 py-2 text-sm text-gray-700">Use run.py wrapper</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">Authentication fails</td><td class="px-4 py-2 text-sm text-gray-700">Browser must be visible for setup! --show-browser</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">DAEMON_UNAVAILABLE</td><td class="px-4 py-2 text-sm text-gray-700">Ensure Node.js/npm installed, run npm install, retry</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">AUTH_REQUIRED</td><td class="px-4 py-2 text-sm text-gray-700">Run python scripts/run.py auth_manager.py setup</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">ELEMENT_NOT_FOUND</td><td class="px-4 py-2 text-sm text-gray-700">Verify notebook URL and re-run with fresh page load</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">Rate limit (50/day)</td><td class="px-4 py-2 text-sm text-gray-700">Wait or add another Google account with accounts add</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">Browser crashes</td><td class="px-4 py-2 text-sm text-gray-700">python scripts/run.py cleanup_manager.py --preserve-library</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50"><td class="px-4 py-2 text-sm text-gray-700">Notebook not found</td><td class="px-4 py-2 text-sm text-gray-700">Check with notebook_manager.py list</td></tr></tbody></table> <h2 class="text-2xl font-bold text-gray-900 mt-10 mb-6 border-b border-gray-200 pb-2">Best Practices</h2> <ul class="my-4 space-y-2"><li class="ml-6 mb-2 text-gray-700 list-decimal"><strong class="font-semibold">Always use run.py</strong> - Handles environment automatically</li> <li class="ml-6 mb-2 text-gray-700 list-decimal"><strong class="font-semibold">Check auth first</strong> - Before any operations</li> <li class="ml-6 mb-2 text-gray-700 list-decimal"><strong class="font-semibold">Follow-up questions</strong> - Don't stop at first answer</li> <li class="ml-6 mb-2 text-gray-700 list-decimal"><strong class="font-semibold">Browser visible for auth</strong> - Required for manual login</li> <li class="ml-6 mb-2 text-gray-700 list-decimal"><strong class="font-semibold">Include context</strong> - Each question is independent</li> <li class="ml-6 mb-2 text-gray-700 list-decimal"><strong class="font-semibold">Synthesize answers</strong> - Combine multiple responses</li> </ul> <h2 class="text-2xl font-bold text-gray-900 mt-10 mb-6 border-b border-gray-200 pb-2">Limitations</h2> <ul class="my-4 space-y-2"><li class="ml-6 mb-2 text-gray-700 list-disc">No session persistence (each question = new browser)</li> <li class="ml-6 mb-2 text-gray-700 list-disc">Rate limits on free Google accounts (50 queries/day per account; use multiple accounts to increase)</li> <li class="ml-6 mb-2 text-gray-700 list-disc">Manual upload required (user must add docs to NotebookLM)</li> <li class="ml-6 mb-2 text-gray-700 list-disc">Browser overhead (few seconds per question)</li> </ul> <h2 class="text-2xl font-bold text-gray-900 mt-10 mb-6 border-b border-gray-200 pb-2">Resources (Skill Structure)</h2></p><p class="my-4 text-gray-700 leading-relaxed"><strong class="font-semibold">Important directories and files:</strong> <ul class="my-4 space-y-2"><li class="ml-6 mb-2 text-gray-700 list-disc"><code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">scripts/</code> - All automation scripts (ask_question.py, notebook_manager.py, etc.)</li> <li class="ml-6 mb-2 text-gray-700 list-disc"><code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">data/</code> - Local storage for authentication and notebook library</li> <li class="ml-6 mb-2 text-gray-700 list-disc"><code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">references/</code> - Extended documentation:</li> <li class="ml-6 mb-2 text-gray-700 list-disc"><code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">api_reference.md</code> - Detailed API documentation for all scripts</li> <li class="ml-6 mb-2 text-gray-700 list-disc"><code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">troubleshooting.md</code> - Common issues and solutions</li> <li class="ml-6 mb-2 text-gray-700 list-disc"><code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">usage_patterns.md</code> - Best practices and workflow examples</li> <li class="ml-6 mb-2 text-gray-700 list-disc"><code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">.venv/</code> - Isolated Python environment (auto-created on first run)</li> <li class="ml-6 mb-2 text-gray-700 list-disc"><code class="px-1.5 py-0.5 text-sm text-primary-700 bg-primary-50 rounded font-mono border border-primary-200">.gitignore</code> - Protects sensitive data from being committed</li> </ul></p></div> </div> </div> <!-- Installation --> <section class="card" aria-labelledby="installation-heading" data-astro-cid-jrlgpo3w> <h2 id="installation-heading" class="text-2xl font-bold text-gray-900 mb-4" data-astro-cid-jrlgpo3w>Installation</h2> <div class="code-block-container relative group " data-astro-cid-i4kugh4e> <div class="flex items-center justify-between px-4 py-2 bg-gray-800 border-b border-gray-700 rounded-t-lg" data-astro-cid-i4kugh4e> <span class="text-sm text-gray-300 font-mono" data-astro-cid-i4kugh4e>Terminal</span> <span class="text-xs text-gray-500 uppercase" data-astro-cid-i4kugh4e>bash</span> </div> <div class="relative" data-astro-cid-i4kugh4e> <pre class="!mt-0 !rounded-t-none" data-astro-cid-i4kugh4e><code id="code-pjxef7q6o" class="language-bash" data-astro-cid-i4kugh4e> openclaw install nblm </code></pre> <!-- Copy Button --> <button class="copy-button absolute top-2 right-2 p-2 bg-gray-700 hover:bg-gray-600 text-gray-300 rounded-lg transition-all duration-200 opacity-0 group-hover:opacity-100 focus:opacity-100" data-code-id="code-pjxef7q6o" aria-label="Copy code to clipboard" data-astro-cid-i4kugh4e> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24" data-astro-cid-i4kugh4e> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z" data-astro-cid-i4kugh4e></path> </svg> <span class="copy-text sr-only" data-astro-cid-i4kugh4e>Copy</span> </button> <!-- Copied Indicator --> <div class="copied-indicator absolute top-2 right-14 px-3 py-1.5 bg-green-600 text-white text-sm rounded-lg opacity-0 transition-opacity duration-200 pointer-events-none" data-astro-cid-i4kugh4e> Copied! </div> </div> </div> <script>(function(){const codeId = "code-pjxef7q6o"; const copyButton = document.querySelector(`[data-code-id="${codeId}"]`); const copiedIndicator = document.querySelector('.copied-indicator'); if (copyButton) { copyButton.addEventListener('click', async () => { const codeElement = document.getElementById(codeId); const code = codeElement?.textContent || ''; try { await navigator.clipboard.writeText(code); // Show copied state copyButton.classList.add('copied'); copiedIndicator?.classList.remove('opacity-0'); // Reset after 2 seconds setTimeout(() => { copyButton.classList.remove('copied'); copiedIndicator?.classList.add('opacity-0'); }, 2000); } catch (err) { console.error('Failed to copy code:', err); } }); } })();</script> </section> <!-- Verification Command (if available from enhanced data) --> <!-- Code Examples (if available) --> <div class="card" data-astro-cid-cpq6uwpo><h2 class="text-2xl font-bold text-gray-900 mb-6 flex items-center" data-astro-cid-cpq6uwpo><span class="text-2xl mr-2" data-astro-cid-cpq6uwpo>💻</span>Code Examples</h2><div class="space-y-6" data-astro-cid-cpq6uwpo><div class="code-example" data-astro-cid-cpq6uwpo><h3 class="text-lg font-semibold text-gray-900 mb-2" data-astro-cid-cpq6uwpo>/nblm debate --instructions "Compare the two approaches"</h3><div class="relative" data-astro-cid-cpq6uwpo><div class="flex items-center justify-between bg-gray-800 text-gray-300 px-4 py-2 rounded-t-lg text-sm" data-astro-cid-cpq6uwpo><span class="font-mono" data-astro-cid-cpq6uwpo>nblm-debate---instructions-compare-the-two-approaches.txt</span><button class="copy-btn px-3 py-1 bg-primary-600 hover:bg-primary-700 text-white rounded text-xs font-medium transition-colors" data-astro-cid-cpq6uwpo> Copy Code </button></div><pre class="bg-gray-900 text-gray-100 p-4 rounded-b-lg overflow-x-auto text-sm leading-relaxed" data-astro-cid-cpq6uwpo><code class="language-text" data-astro-cid-cpq6uwpo>| Option | Values | |--------|--------| | `--length` | `SHORT`, `DEFAULT`, `LONG` | | `--instructions` | Custom instructions for the content | | `--wait` | Wait for generation to complete | | `--output` | Download path (requires `--wait`) | ## Slide Deck Options</code></pre></div></div><div class="code-example" data-astro-cid-cpq6uwpo><h3 class="text-lg font-semibold text-gray-900 mb-2" data-astro-cid-cpq6uwpo>/nblm slides --instructions "Focus on key diagrams" --format PRESENTER_SLIDES</h3><div class="relative" data-astro-cid-cpq6uwpo><div class="flex items-center justify-between bg-gray-800 text-gray-300 px-4 py-2 rounded-t-lg text-sm" data-astro-cid-cpq6uwpo><span class="font-mono" data-astro-cid-cpq6uwpo>nblm-slides---instructions-focus-on-key-diagrams---format-presenterslides.txt</span><button class="copy-btn px-3 py-1 bg-primary-600 hover:bg-primary-700 text-white rounded text-xs font-medium transition-colors" data-astro-cid-cpq6uwpo> Copy Code </button></div><pre class="bg-gray-900 text-gray-100 p-4 rounded-b-lg overflow-x-auto text-sm leading-relaxed" data-astro-cid-cpq6uwpo><code class="language-text" data-astro-cid-cpq6uwpo>| Option | Values | |--------|--------| | `--format` | `DETAILED_DECK`, `PRESENTER_SLIDES` | | `--length` | `SHORT`, `DEFAULT` | | `--instructions` | Custom instructions for the content | | `--wait` | Wait for generation to complete | | `--output` | Download path (requires `--wait`) | ## Infographic Options</code></pre></div></div><div class="code-example" data-astro-cid-cpq6uwpo><h3 class="text-lg font-semibold text-gray-900 mb-2" data-astro-cid-cpq6uwpo>/nblm infographic --instructions "Highlight comparison" --detail-level DETAILED</h3><div class="relative" data-astro-cid-cpq6uwpo><div class="flex items-center justify-between bg-gray-800 text-gray-300 px-4 py-2 rounded-t-lg text-sm" data-astro-cid-cpq6uwpo><span class="font-mono" data-astro-cid-cpq6uwpo>nblm-infographic---instructions-highlight-comparison---detail-level-detailed.txt</span><button class="copy-btn px-3 py-1 bg-primary-600 hover:bg-primary-700 text-white rounded text-xs font-medium transition-colors" data-astro-cid-cpq6uwpo> Copy Code </button></div><pre class="bg-gray-900 text-gray-100 p-4 rounded-b-lg overflow-x-auto text-sm leading-relaxed" data-astro-cid-cpq6uwpo><code class="language-text" data-astro-cid-cpq6uwpo>| Option | Values | |--------|--------| | `--orientation` | `LANDSCAPE`, `PORTRAIT`, `SQUARE` | | `--detail-level` | `CONCISE`, `STANDARD`, `DETAILED` | | `--instructions` | Custom instructions for the content | | `--wait` | Wait for generation to complete | | `--output` | Download path (requires `--wait`) | ## Media Generation | Command | Description | Output | |---------|-------------|--------| | `/nblm podcast` | Deep-dive audio discussion | MP3 | | `/nblm briefing` | Brief audio summary | MP3 | | `/nblm debate` | Debate-style audio | MP3 | | `/nblm slides` | Slide deck presentation | PDF | | `/nblm infographic` | Visual infographic | PNG | ### Examples</code></pre></div></div><div class="code-example" data-astro-cid-cpq6uwpo><h3 class="text-lg font-semibold text-gray-900 mb-2" data-astro-cid-cpq6uwpo>/nblm media-delete <id> # Delete a media item</h3><div class="relative" data-astro-cid-cpq6uwpo><div class="flex items-center justify-between bg-gray-800 text-gray-300 px-4 py-2 rounded-t-lg text-sm" data-astro-cid-cpq6uwpo><span class="font-mono" data-astro-cid-cpq6uwpo>nblm-media-delete-id--delete-a-media-item.txt</span><button class="copy-btn px-3 py-1 bg-primary-600 hover:bg-primary-700 text-white rounded text-xs font-medium transition-colors" data-astro-cid-cpq6uwpo> Copy Code </button></div><pre class="bg-gray-900 text-gray-100 p-4 rounded-b-lg overflow-x-auto text-sm leading-relaxed" data-astro-cid-cpq6uwpo><code class="language-text" data-astro-cid-cpq6uwpo>--- # Extended Documentation ## When to Use This Skill Trigger when user: - Mentions NotebookLM explicitly - Shares NotebookLM URL (`https://notebooklm.google.com/notebook/...`) - Asks to query their notebooks/documentation - Wants to add documentation to NotebookLM library - Uses phrases like "ask my NotebookLM", "check my docs", "query my notebook" ## ⚠️ CRITICAL: Add Command - Smart Discovery The add command now **automatically discovers metadata** from the notebook:</code></pre></div></div><div class="code-example" data-astro-cid-cpq6uwpo><h3 class="text-lg font-semibold text-gray-900 mb-2" data-astro-cid-cpq6uwpo>python scripts/run.py notebook_manager.py add <id> --name "Custom Name" --topics "custom,topics"</h3><div class="relative" data-astro-cid-cpq6uwpo><div class="flex items-center justify-between bg-gray-800 text-gray-300 px-4 py-2 rounded-t-lg text-sm" data-astro-cid-cpq6uwpo><span class="font-mono" data-astro-cid-cpq6uwpo>python-scriptsrunpy-notebookmanagerpy-add-id---name-custom-name---topics-customtopics.txt</span><button class="copy-btn px-3 py-1 bg-primary-600 hover:bg-primary-700 text-white rounded text-xs font-medium transition-colors" data-astro-cid-cpq6uwpo> Copy Code </button></div><pre class="bg-gray-900 text-gray-100 p-4 rounded-b-lg overflow-x-auto text-sm leading-relaxed" data-astro-cid-cpq6uwpo><code class="language-text" data-astro-cid-cpq6uwpo>**What Smart Add does:** 1. Fetches notebook title from NotebookLM API 2. Queries the notebook content to generate description and topics 3. Adds to local library with discovered metadata **Supported input formats:** - Notebook ID: `5fd9f36b-8000-401d-a7a0-7aa3f7832644` - Full URL: `https://notebooklm.google.com/notebook/5fd9f36b-8000-401d-a7a0-7aa3f7832644` NEVER manually specify `--name`, `--description`, or `--topics` unless the user explicitly provides them. ## Critical: Always Use run.py Wrapper **NEVER call scripts directly. ALWAYS use `python scripts/run.py [script]`:**</code></pre></div></div><div class="code-example" data-astro-cid-cpq6uwpo><h3 class="text-lg font-semibold text-gray-900 mb-2" data-astro-cid-cpq6uwpo>python scripts/auth_manager.py status # Fails without venv!</h3><div class="relative" data-astro-cid-cpq6uwpo><div class="flex items-center justify-between bg-gray-800 text-gray-300 px-4 py-2 rounded-t-lg text-sm" data-astro-cid-cpq6uwpo><span class="font-mono" data-astro-cid-cpq6uwpo>python-scriptsauthmanagerpy-status--fails-without-venv.txt</span><button class="copy-btn px-3 py-1 bg-primary-600 hover:bg-primary-700 text-white rounded text-xs font-medium transition-colors" data-astro-cid-cpq6uwpo> Copy Code </button></div><pre class="bg-gray-900 text-gray-100 p-4 rounded-b-lg overflow-x-auto text-sm leading-relaxed" data-astro-cid-cpq6uwpo><code class="language-text" data-astro-cid-cpq6uwpo>The `run.py` wrapper automatically: 1. Creates `.venv` if needed 2. Installs all dependencies 3. Activates environment 4. Executes script properly ## Core Workflow ### Step 1: Check Authentication Status</code></pre></div></div><div class="code-example" data-astro-cid-cpq6uwpo><h3 class="text-lg font-semibold text-gray-900 mb-2" data-astro-cid-cpq6uwpo>python scripts/run.py auth_manager.py status</h3><div class="relative" data-astro-cid-cpq6uwpo><div class="flex items-center justify-between bg-gray-800 text-gray-300 px-4 py-2 rounded-t-lg text-sm" data-astro-cid-cpq6uwpo><span class="font-mono" data-astro-cid-cpq6uwpo>python-scriptsrunpy-authmanagerpy-status.txt</span><button class="copy-btn px-3 py-1 bg-primary-600 hover:bg-primary-700 text-white rounded text-xs font-medium transition-colors" data-astro-cid-cpq6uwpo> Copy Code </button></div><pre class="bg-gray-900 text-gray-100 p-4 rounded-b-lg overflow-x-auto text-sm leading-relaxed" data-astro-cid-cpq6uwpo><code class="language-text" data-astro-cid-cpq6uwpo>If not authenticated, proceed to setup. ### Step 2: Authenticate (One-Time Setup)</code></pre></div></div><div class="code-example" data-astro-cid-cpq6uwpo><h3 class="text-lg font-semibold text-gray-900 mb-2" data-astro-cid-cpq6uwpo>python scripts/run.py auth_manager.py setup</h3><div class="relative" data-astro-cid-cpq6uwpo><div class="flex items-center justify-between bg-gray-800 text-gray-300 px-4 py-2 rounded-t-lg text-sm" data-astro-cid-cpq6uwpo><span class="font-mono" data-astro-cid-cpq6uwpo>python-scriptsrunpy-authmanagerpy-setup.txt</span><button class="copy-btn px-3 py-1 bg-primary-600 hover:bg-primary-700 text-white rounded text-xs font-medium transition-colors" data-astro-cid-cpq6uwpo> Copy Code </button></div><pre class="bg-gray-900 text-gray-100 p-4 rounded-b-lg overflow-x-auto text-sm leading-relaxed" data-astro-cid-cpq6uwpo><code class="language-text" data-astro-cid-cpq6uwpo>**Important:** - Browser is VISIBLE for authentication - Browser window opens automatically - User must manually log in to Google - Tell user: "A browser window will open for Google login" ### Step 3: Manage Notebook Library</code></pre></div></div><div class="code-example" data-astro-cid-cpq6uwpo><h3 class="text-lg font-semibold text-gray-900 mb-2" data-astro-cid-cpq6uwpo>python scripts/run.py notebook_manager.py remove --id notebook-id</h3><div class="relative" data-astro-cid-cpq6uwpo><div class="flex items-center justify-between bg-gray-800 text-gray-300 px-4 py-2 rounded-t-lg text-sm" data-astro-cid-cpq6uwpo><span class="font-mono" data-astro-cid-cpq6uwpo>python-scriptsrunpy-notebookmanagerpy-remove---id-notebook-id.txt</span><button class="copy-btn px-3 py-1 bg-primary-600 hover:bg-primary-700 text-white rounded text-xs font-medium transition-colors" data-astro-cid-cpq6uwpo> Copy Code </button></div><pre class="bg-gray-900 text-gray-100 p-4 rounded-b-lg overflow-x-auto text-sm leading-relaxed" data-astro-cid-cpq6uwpo><code class="language-text" data-astro-cid-cpq6uwpo>### Quick Workflow 1. Check library: `python scripts/run.py notebook_manager.py list` 2. Ask question: `python scripts/run.py ask_question.py --question "..." --notebook-id ID` ### Step 4: Ask Questions</code></pre></div></div><div class="code-example" data-astro-cid-cpq6uwpo><h3 class="text-lg font-semibold text-gray-900 mb-2" data-astro-cid-cpq6uwpo>python scripts/run.py ask_question.py --question "..." --show-browser</h3><div class="relative" data-astro-cid-cpq6uwpo><div class="flex items-center justify-between bg-gray-800 text-gray-300 px-4 py-2 rounded-t-lg text-sm" data-astro-cid-cpq6uwpo><span class="font-mono" data-astro-cid-cpq6uwpo>python-scriptsrunpy-askquestionpy---question----show-browser.txt</span><button class="copy-btn px-3 py-1 bg-primary-600 hover:bg-primary-700 text-white rounded text-xs font-medium transition-colors" data-astro-cid-cpq6uwpo> Copy Code </button></div><pre class="bg-gray-900 text-gray-100 p-4 rounded-b-lg overflow-x-auto text-sm leading-relaxed" data-astro-cid-cpq6uwpo><code class="language-text" data-astro-cid-cpq6uwpo>## Follow-Up Mechanism (CRITICAL) Every NotebookLM answer ends with: **"EXTREMELY IMPORTANT: Is that ALL you need to know?"** **Required Claude Behavior:** 1. **STOP** - Do not immediately respond to user 2. **ANALYZE** - Compare answer to user's original request 3. **IDENTIFY GAPS** - Determine if more information needed 4. **ASK FOLLOW-UP** - If gaps exist, immediately ask:</code></pre></div></div></div></div> <!-- Configuration Table (if available) --> <div class="card"><h2 class="text-2xl font-bold text-gray-900 mb-6 flex items-center"><span class="text-2xl mr-2">⚙️</span>Configuration Options</h2><div class="space-y-6"><div><h3 class="text-lg font-semibold text-gray-900 mb-3 flex items-center"><span class="w-2 h-2 bg-primary-500 rounded-full mr-2"></span>boolean</h3><div class="overflow-x-auto"><table class="w-full"><thead><tr class="border-b-2 border-gray-300"><th class="text-left py-3 px-4 text-sm font-semibold text-gray-900 bg-gray-50 rounded-tl-lg"> Option </th><th class="text-left py-3 px-4 text-sm font-semibold text-gray-900 bg-gray-50"> Default </th><th class="text-left py-3 px-4 text-sm font-semibold text-gray-900 bg-gray-50 rounded-tr-lg"> Description </th></tr></thead><tbody><tr class="border-b border-gray-200 hover:bg-gray-50 transition-colors"><td class="py-3 px-4"><code class="px-2 py-1 text-sm font-mono text-primary-700 bg-primary-50 rounded border border-primary-200">HEADLESS</code></td><td class="py-3 px-4"><code class="px-2 py-1 text-xs font-mono text-gray-700 bg-gray-100 rounded">false</code></td><td class="py-3 px-4 text-sm text-gray-700">-</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50 transition-colors"><td class="py-3 px-4"><code class="px-2 py-1 text-sm font-mono text-primary-700 bg-primary-50 rounded border border-primary-200">SHOW_BROWSER</code></td><td class="py-3 px-4"><code class="px-2 py-1 text-xs font-mono text-gray-700 bg-gray-100 rounded">false</code></td><td class="py-3 px-4 text-sm text-gray-700">-</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50 transition-colors"><td class="py-3 px-4"><code class="px-2 py-1 text-sm font-mono text-primary-700 bg-primary-50 rounded border border-primary-200">STEALTH_ENABLED</code></td><td class="py-3 px-4"><code class="px-2 py-1 text-xs font-mono text-gray-700 bg-gray-100 rounded">true</code></td><td class="py-3 px-4 text-sm text-gray-700">-</td></tr></tbody></table></div></div><div><h3 class="text-lg font-semibold text-gray-900 mb-3 flex items-center"><span class="w-2 h-2 bg-primary-500 rounded-full mr-2"></span>number</h3><div class="overflow-x-auto"><table class="w-full"><thead><tr class="border-b-2 border-gray-300"><th class="text-left py-3 px-4 text-sm font-semibold text-gray-900 bg-gray-50 rounded-tl-lg"> Option </th><th class="text-left py-3 px-4 text-sm font-semibold text-gray-900 bg-gray-50"> Default </th><th class="text-left py-3 px-4 text-sm font-semibold text-gray-900 bg-gray-50 rounded-tr-lg"> Description </th></tr></thead><tbody><tr class="border-b border-gray-200 hover:bg-gray-50 transition-colors"><td class="py-3 px-4"><code class="px-2 py-1 text-sm font-mono text-primary-700 bg-primary-50 rounded border border-primary-200">TYPING_WPM_MIN</code></td><td class="py-3 px-4"><code class="px-2 py-1 text-xs font-mono text-gray-700 bg-gray-100 rounded">160</code></td><td class="py-3 px-4 text-sm text-gray-700">-</td></tr><tr class="border-b border-gray-200 hover:bg-gray-50 transition-colors"><td class="py-3 px-4"><code class="px-2 py-1 text-sm font-mono text-primary-700 bg-primary-50 rounded border border-primary-200">TYPING_WPM_MAX</code></td><td class="py-3 px-4"><code class="px-2 py-1 text-xs font-mono text-gray-700 bg-gray-100 rounded">240</code></td><td class="py-3 px-4 text-sm text-gray-700">-</td></tr></tbody></table></div></div><div><h3 class="text-lg font-semibold text-gray-900 mb-3 flex items-center"><span class="w-2 h-2 bg-primary-500 rounded-full mr-2"></span>string</h3><div class="overflow-x-auto"><table class="w-full"><thead><tr class="border-b-2 border-gray-300"><th class="text-left py-3 px-4 text-sm font-semibold text-gray-900 bg-gray-50 rounded-tl-lg"> Option </th><th class="text-left py-3 px-4 text-sm font-semibold text-gray-900 bg-gray-50"> Default </th><th class="text-left py-3 px-4 text-sm font-semibold text-gray-900 bg-gray-50 rounded-tr-lg"> Description </th></tr></thead><tbody><tr class="border-b border-gray-200 hover:bg-gray-50 transition-colors"><td class="py-3 px-4"><code class="px-2 py-1 text-sm font-mono text-primary-700 bg-primary-50 rounded border border-primary-200">DEFAULT_NOTEBOOK_ID</code></td><td class="py-3 px-4"><code class="px-2 py-1 text-xs font-mono text-gray-700 bg-gray-100 rounded">#</code></td><td class="py-3 px-4 text-sm text-gray-700">-</td></tr></tbody></table></div></div></div></div> <!-- Requirements --> <!-- Code Example --> <!-- Testing Notes --> <!-- Tags --> <div class="card" data-astro-cid-jrlgpo3w> <h2 class="text-2xl font-bold text-gray-900 mb-4" data-astro-cid-jrlgpo3w>Tags</h2> <div class="flex flex-wrap gap-2" data-astro-cid-jrlgpo3w> <span class="px-3 py-1.5 text-sm text-gray-600 bg-gray-50 rounded-lg border border-gray-200" data-astro-cid-jrlgpo3w> #browser_and-automation </span><span class="px-3 py-1.5 text-sm text-gray-600 bg-gray-50 rounded-lg border border-gray-200" data-astro-cid-jrlgpo3w> #code </span> </div> </div> </div> <!-- Sidebar --> <div class="space-y-6" data-astro-cid-jrlgpo3w> <!-- Quick Info --> <div class="card" data-astro-cid-jrlgpo3w> <h3 class="font-semibold text-gray-900 mb-4" data-astro-cid-jrlgpo3w>Quick Info</h3> <div class="space-y-3 text-sm" data-astro-cid-jrlgpo3w> <div class="flex justify-between" data-astro-cid-jrlgpo3w> <span class="text-gray-600" data-astro-cid-jrlgpo3w>Category</span> <span class="font-medium text-gray-900" data-astro-cid-jrlgpo3w>Web Scrapers</span> </div> <div class="flex justify-between" data-astro-cid-jrlgpo3w> <span class="text-gray-600" data-astro-cid-jrlgpo3w>Model</span> <span class="font-medium text-gray-900" data-astro-cid-jrlgpo3w>Claude 3.5</span> </div> <div class="flex justify-between" data-astro-cid-jrlgpo3w> <span class="text-gray-600" data-astro-cid-jrlgpo3w>Complexity</span> <span class="font-medium text-gray-900" data-astro-cid-jrlgpo3w>One-Click</span> </div> <div class="flex justify-between" data-astro-cid-jrlgpo3w> <span class="text-gray-600" data-astro-cid-jrlgpo3w>Author</span> <span class="font-medium text-gray-900" data-astro-cid-jrlgpo3w>magicseek</span> </div> <div class="flex justify-between" data-astro-cid-jrlgpo3w> <span class="text-gray-600" data-astro-cid-jrlgpo3w>Last Updated</span> <span class="font-medium text-gray-900" data-astro-cid-jrlgpo3w>3/10/2026</span> </div> </div> </div> <!-- Model Badge --> <div class="card bg-gradient-to-br from-blue-50 to-indigo-50 border-blue-100" data-astro-cid-jrlgpo3w> <div class="flex items-center justify-between" data-astro-cid-jrlgpo3w> <div class="flex items-center space-x-3" data-astro-cid-jrlgpo3w> <div class="text-3xl" data-astro-cid-jrlgpo3w>🚀</div> <div data-astro-cid-jrlgpo3w> <div class="text-sm text-gray-600" data-astro-cid-jrlgpo3w>Optimized for</div> <div class="font-semibold text-gray-900" data-astro-cid-jrlgpo3w>Claude 3.5</div> </div> </div> <span class="inline-flex items-center gap-1.5 px-2.5 py-1 text-xs font-medium rounded-lg bg-purple-50 text-purple-700 border border-purple-200 hover:bg-purple-100 transition-colors" title="Optimized for Claude 3.5 Sonnet" data-astro-cid-3xlfahoe> <span data-astro-cid-3xlfahoe>🧠</span> </span> </div> </div> <!-- Install CTA --> <div class="card bg-gradient-to-br from-primary-500 to-primary-600 text-white border-0" data-astro-cid-jrlgpo3w> <h3 class="font-semibold text-lg mb-2" data-astro-cid-jrlgpo3w>Ready to Install?</h3> <p class="text-primary-100 text-sm mb-4" data-astro-cid-jrlgpo3w> Get started with this skill in seconds </p> <div class="bg-white/20 backdrop-blur-sm rounded-lg p-3 font-mono text-sm" data-astro-cid-jrlgpo3w> openclaw install nblm </div> </div> <!-- External Links (if available) --> <div class="card" data-astro-cid-jrlgpo3w> <h3 class="font-semibold text-gray-900 mb-4" data-astro-cid-jrlgpo3w>Resources</h3> <div class="space-y-3" data-astro-cid-jrlgpo3w> <a href="https://github.com/openclaw/skills/tree/main/skills/magicseek/nblm/SKILL.md" target="_blank" rel="noopener noreferrer" class="flex items-center justify-between p-3 rounded-lg border border-gray-200 hover:border-primary-300 hover:bg-primary-50 transition-colors" data-astro-cid-jrlgpo3w> <div class="flex items-center space-x-3" data-astro-cid-jrlgpo3w> <div class="text-2xl" data-astro-cid-jrlgpo3w>📂</div> <div data-astro-cid-jrlgpo3w> <div class="font-medium text-gray-900" data-astro-cid-jrlgpo3w>OpenClaw Skills</div> <div class="text-xs text-gray-500" data-astro-cid-jrlgpo3w>View on OpenClaw GitHub</div> </div> </div> <span class="text-primary-600" data-astro-cid-jrlgpo3w>→</span> </a> </div> </div> </div> </div> </div> </section> <section class="section bg-gray-50" data-astro-cid-jrlgpo3w> <div class="container" data-astro-cid-jrlgpo3w> <h2 class="text-2xl font-bold text-gray-900 mb-6" data-astro-cid-jrlgpo3w>Related Skills</h2> <div class="grid md:grid-cols-2 lg:grid-cols-3 gap-6" data-astro-cid-jrlgpo3w> <a href="/skills/4claw/" class="skill-card group block" data-astro-cid-rwasicqo> <!-- Header --> <div class="flex items-start justify-between mb-4" data-astro-cid-rwasicqo> <div class="flex-1" data-astro-cid-rwasicqo> <div class="flex items-center space-x-2 mb-2" data-astro-cid-rwasicqo> <span class="inline-flex items-center px-2 py-0.5 text-xs font-semibold text-green-700 bg-green-50 rounded-full border border-green-200" data-astro-cid-rwasicqo> ✓ Verified </span> <span class="inline-flex items-center px-2 py-0.5 text-xs font-medium text-gray-600 bg-gray-100 rounded-full" data-astro-cid-rwasicqo> 💻 Development </span> </div> <h3 class="text-lg font-semibold text-gray-900 group-hover:text-primary-600 transition-colors" data-astro-cid-rwasicqo> 4claw </h3> </div> </div> <!-- Description --> <p class="text-sm text-gray-600 mb-4 line-clamp-2" data-astro-cid-rwasicqo> 4claw — a moderated imageboard for AI agents. </p> <!-- Badges --> <div class="flex flex-wrap gap-2 mb-4" data-astro-cid-rwasicqo> <span class="inline-flex items-center gap-1.5 px-2.5 py-1 text-xs font-medium rounded-lg bg-purple-50 text-purple-700 border border-purple-200 hover:bg-purple-100 transition-colors" title="Optimized for Claude 3.5 Sonnet" data-astro-cid-3xlfahoe> <span data-astro-cid-3xlfahoe>🧠</span> <span data-astro-cid-3xlfahoe>Claude-Ready</span> </span> <span class="inline-flex items-center px-2.5 py-1 text-xs font-medium rounded-lg class={complexityInfo.level === 1 ? 'text-green-700 bg-green-50' : complexityInfo.level === 2 ? 'text-blue-700 bg-blue-50' : 'text-purple-700 bg-purple-50'}> {complexityInfo.level === 1 ? '⚡' : complexityInfo.level === 2 ? '🔗' : '🧠'} {complexityInfo.name} </span> </div> <!-- Tags --> {skill.tags.length > 0 && ( <div class=" flex flex-wrap gap-1.5 mb-4" data-astro-cid-rwasicqo> <span class="inline-block px-2 py-1 text-xs text-gray-500 bg-gray-50 rounded border border-gray-100" data-astro-cid-rwasicqo> #ai_and-llms </span> </span></div> )} <!-- Footer Stats --> <div class="flex items-center justify-between pt-4 border-t border-gray-100" data-astro-cid-rwasicqo> <div class="flex items-center space-x-4 text-sm text-gray-500" data-astro-cid-rwasicqo> <div class="flex items-center space-x-1" data-astro-cid-rwasicqo> <span class="text-yellow-500" data-astro-cid-rwasicqo>★</span> <span class="font-medium" data-astro-cid-rwasicqo>4.4</span> <span class="text-xs" data-astro-cid-rwasicqo>(118)</span> </div> <div class="flex items-center space-x-1" data-astro-cid-rwasicqo> <span data-astro-cid-rwasicqo>↓</span> <span class="font-medium" data-astro-cid-rwasicqo>4,990</span> </div> </div> <div class="text-xs text-gray-400" data-astro-cid-rwasicqo> v1.0.0 </div> </div> </a> <a href="/skills/aap-passport/" class="skill-card group block" data-astro-cid-rwasicqo> <!-- Header --> <div class="flex items-start justify-between mb-4" data-astro-cid-rwasicqo> <div class="flex-1" data-astro-cid-rwasicqo> <div class="flex items-center space-x-2 mb-2" data-astro-cid-rwasicqo> <span class="inline-flex items-center px-2 py-0.5 text-xs font-semibold text-green-700 bg-green-50 rounded-full border border-green-200" data-astro-cid-rwasicqo> ✓ Verified </span> <span class="inline-flex items-center px-2 py-0.5 text-xs font-medium text-gray-600 bg-gray-100 rounded-full" data-astro-cid-rwasicqo> 💻 Development </span> </div> <h3 class="text-lg font-semibold text-gray-900 group-hover:text-primary-600 transition-colors" data-astro-cid-rwasicqo> Aap Passport </h3> </div> </div> <!-- Description --> <p class="text-sm text-gray-600 mb-4 line-clamp-2" data-astro-cid-rwasicqo> Agent Attestation Protocol - The Reverse Turing Test. </p> <!-- Badges --> <div class="flex flex-wrap gap-2 mb-4" data-astro-cid-rwasicqo> <span class="inline-flex items-center gap-1.5 px-2.5 py-1 text-xs font-medium rounded-lg bg-purple-50 text-purple-700 border border-purple-200 hover:bg-purple-100 transition-colors" title="Optimized for Claude 3.5 Sonnet" data-astro-cid-3xlfahoe> <span data-astro-cid-3xlfahoe>🧠</span> <span data-astro-cid-3xlfahoe>Claude-Ready</span> </span> <span class="inline-flex items-center px-2.5 py-1 text-xs font-medium rounded-lg class={complexityInfo.level === 1 ? 'text-green-700 bg-green-50' : complexityInfo.level === 2 ? 'text-blue-700 bg-blue-50' : 'text-purple-700 bg-purple-50'}> {complexityInfo.level === 1 ? '⚡' : complexityInfo.level === 2 ? '🔗' : '🧠'} {complexityInfo.name} </span> </div> <!-- Tags --> {skill.tags.length > 0 && ( <div class=" flex flex-wrap gap-1.5 mb-4" data-astro-cid-rwasicqo> <span class="inline-block px-2 py-1 text-xs text-gray-500 bg-gray-50 rounded border border-gray-100" data-astro-cid-rwasicqo> #ai_and-llms </span> </span></div> )} <!-- Footer Stats --> <div class="flex items-center justify-between pt-4 border-t border-gray-100" data-astro-cid-rwasicqo> <div class="flex items-center space-x-4 text-sm text-gray-500" data-astro-cid-rwasicqo> <div class="flex items-center space-x-1" data-astro-cid-rwasicqo> <span class="text-yellow-500" data-astro-cid-rwasicqo>★</span> <span class="font-medium" data-astro-cid-rwasicqo>4.3</span> <span class="text-xs" data-astro-cid-rwasicqo>(89)</span> </div> <div class="flex items-center space-x-1" data-astro-cid-rwasicqo> <span data-astro-cid-rwasicqo>↓</span> <span class="font-medium" data-astro-cid-rwasicqo>4,621</span> </div> </div> <div class="text-xs text-gray-400" data-astro-cid-rwasicqo> v1.0.0 </div> </div> </a> <a href="/skills/adaptive-suite/" class="skill-card group block" data-astro-cid-rwasicqo> <!-- Header --> <div class="flex items-start justify-between mb-4" data-astro-cid-rwasicqo> <div class="flex-1" data-astro-cid-rwasicqo> <div class="flex items-center space-x-2 mb-2" data-astro-cid-rwasicqo> <span class="inline-flex items-center px-2 py-0.5 text-xs font-semibold text-green-700 bg-green-50 rounded-full border border-green-200" data-astro-cid-rwasicqo> ✓ Verified </span> <span class="inline-flex items-center px-2 py-0.5 text-xs font-medium text-gray-600 bg-gray-100 rounded-full" data-astro-cid-rwasicqo> 💻 Development </span> </div> <h3 class="text-lg font-semibold text-gray-900 group-hover:text-primary-600 transition-colors" data-astro-cid-rwasicqo> Adaptive Suite </h3> </div> </div> <!-- Description --> <p class="text-sm text-gray-600 mb-4 line-clamp-2" data-astro-cid-rwasicqo> A continuously adaptive skill suite that empowers Clawdbot. </p> <!-- Badges --> <div class="flex flex-wrap gap-2 mb-4" data-astro-cid-rwasicqo> <span class="inline-flex items-center gap-1.5 px-2.5 py-1 text-xs font-medium rounded-lg bg-purple-50 text-purple-700 border border-purple-200 hover:bg-purple-100 transition-colors" title="Optimized for Claude 3.5 Sonnet" data-astro-cid-3xlfahoe> <span data-astro-cid-3xlfahoe>🧠</span> <span data-astro-cid-3xlfahoe>Claude-Ready</span> </span> <span class="inline-flex items-center px-2.5 py-1 text-xs font-medium rounded-lg class={complexityInfo.level === 1 ? 'text-green-700 bg-green-50' : complexityInfo.level === 2 ? 'text-blue-700 bg-blue-50' : 'text-purple-700 bg-purple-50'}> {complexityInfo.level === 1 ? '⚡' : complexityInfo.level === 2 ? '🔗' : '🧠'} {complexityInfo.name} </span> </div> <!-- Tags --> {skill.tags.length > 0 && ( <div class=" flex flex-wrap gap-1.5 mb-4" data-astro-cid-rwasicqo> <span class="inline-block px-2 py-1 text-xs text-gray-500 bg-gray-50 rounded border border-gray-100" data-astro-cid-rwasicqo> #ai_and-llms </span><span class="inline-block px-2 py-1 text-xs text-gray-500 bg-gray-50 rounded border border-gray-100" data-astro-cid-rwasicqo> #bot </span> </span></div> )} <!-- Footer Stats --> <div class="flex items-center justify-between pt-4 border-t border-gray-100" data-astro-cid-rwasicqo> <div class="flex items-center space-x-4 text-sm text-gray-500" data-astro-cid-rwasicqo> <div class="flex items-center space-x-1" data-astro-cid-rwasicqo> <span class="text-yellow-500" data-astro-cid-rwasicqo>★</span> <span class="font-medium" data-astro-cid-rwasicqo>4.7</span> <span class="text-xs" data-astro-cid-rwasicqo>(88)</span> </div> <div class="flex items-center space-x-1" data-astro-cid-rwasicqo> <span data-astro-cid-rwasicqo>↓</span> <span class="font-medium" data-astro-cid-rwasicqo>1,625</span> </div> </div> <div class="text-xs text-gray-400" data-astro-cid-rwasicqo> v1.0.0 </div> </div> </a> <a href="/skills/adversarial-prompting/" class="skill-card group block" data-astro-cid-rwasicqo> <!-- Header --> <div class="flex items-start justify-between mb-4" data-astro-cid-rwasicqo> <div class="flex-1" data-astro-cid-rwasicqo> <div class="flex items-center space-x-2 mb-2" data-astro-cid-rwasicqo> <span class="inline-flex items-center px-2 py-0.5 text-xs font-semibold text-green-700 bg-green-50 rounded-full border border-green-200" data-astro-cid-rwasicqo> ✓ Verified </span> <span class="inline-flex items-center px-2 py-0.5 text-xs font-medium text-gray-600 bg-gray-100 rounded-full" data-astro-cid-rwasicqo> 💻 Development </span> </div> <h3 class="text-lg font-semibold text-gray-900 group-hover:text-primary-600 transition-colors" data-astro-cid-rwasicqo> Adversarial Prompting </h3> </div> </div> <!-- Description --> <p class="text-sm text-gray-600 mb-4 line-clamp-2" data-astro-cid-rwasicqo> Adversarial analysis to critique, fix. </p> <!-- Badges --> <div class="flex flex-wrap gap-2 mb-4" data-astro-cid-rwasicqo> <span class="inline-flex items-center gap-1.5 px-2.5 py-1 text-xs font-medium rounded-lg bg-purple-50 text-purple-700 border border-purple-200 hover:bg-purple-100 transition-colors" title="Optimized for Claude 3.5 Sonnet" data-astro-cid-3xlfahoe> <span data-astro-cid-3xlfahoe>🧠</span> <span data-astro-cid-3xlfahoe>Claude-Ready</span> </span> <span class="inline-flex items-center px-2.5 py-1 text-xs font-medium rounded-lg class={complexityInfo.level === 1 ? 'text-green-700 bg-green-50' : complexityInfo.level === 2 ? 'text-blue-700 bg-blue-50' : 'text-purple-700 bg-purple-50'}> {complexityInfo.level === 1 ? '⚡' : complexityInfo.level === 2 ? '🔗' : '🧠'} {complexityInfo.name} </span> </div> <!-- Tags --> {skill.tags.length > 0 && ( <div class=" flex flex-wrap gap-1.5 mb-4" data-astro-cid-rwasicqo> <span class="inline-block px-2 py-1 text-xs text-gray-500 bg-gray-50 rounded border border-gray-100" data-astro-cid-rwasicqo> #ai_and-llms </span> </span></div> )} <!-- Footer Stats --> <div class="flex items-center justify-between pt-4 border-t border-gray-100" data-astro-cid-rwasicqo> <div class="flex items-center space-x-4 text-sm text-gray-500" data-astro-cid-rwasicqo> <div class="flex items-center space-x-1" data-astro-cid-rwasicqo> <span class="text-yellow-500" data-astro-cid-rwasicqo>★</span> <span class="font-medium" data-astro-cid-rwasicqo>4.6</span> <span class="text-xs" data-astro-cid-rwasicqo>(372)</span> </div> <div class="flex items-center space-x-1" data-astro-cid-rwasicqo> <span data-astro-cid-rwasicqo>↓</span> <span class="font-medium" data-astro-cid-rwasicqo>28,222</span> </div> </div> <div class="text-xs text-gray-400" data-astro-cid-rwasicqo> v1.0.0 </div> </div> </a> </div> </div> </section> </main> <footer class="bg-gray-900 text-gray-300"> <div class="container py-16"> <div class="grid grid-cols-2 md:grid-cols-6 gap-8 mb-12"> <!-- Brand Column --> <div class="col-span-2"> <a href="/" class="flex items-center mb-4"> <!-- SVG Logo --> <img src="/logo.svg" alt="AICLawSkills Logo" class="h-10 w-auto rounded-lg"> </a> <p class="text-sm text-gray-400 mb-6 max-w-sm"> The comprehensive skill library for OpenClaw AI automation platform. Explore verified skills and boost your productivity. </p> <!-- Social Proof Stats --> <div class="mb-6 grid grid-cols-3 gap-4"> <div class="text-center"> <div class="text-2xl font-bold text-white">100%</div> <div class="text-xs text-gray-400">Verified Skills</div> </div> <div class="text-center"> <div class="text-2xl font-bold text-white">Free</div> <div class="text-xs text-gray-400">Open Source</div> </div> <div class="text-center"> <div class="text-2xl font-bold text-white">4.8★</div> <div class="text-xs text-gray-400">User Rating</div> </div> </div> <!-- Trust Badges --> <div class="flex flex-wrap gap-3 mb-6"> <div class="flex items-center gap-2 text-xs text-gray-400 bg-gray-800 px-3 py-1 rounded-full"> <span class="text-green-400">✓</span> 100% Verified </div> <div class="flex items-center gap-2 text-xs text-gray-400 bg-gray-800 px-3 py-1 rounded-full"> <span class="text-blue-400">🛡️</span> Security Audited </div> <div class="flex items-center gap-2 text-xs text-gray-400 bg-gray-800 px-3 py-1 rounded-full"> <span class="text-purple-400">⚡</span> Updated Weekly </div> </div> <div class="flex space-x-4"> <a href="https://github.com" class="text-gray-400 hover:text-white transition-colors" aria-label="GitHub"> <svg class="h-5 w-5" fill="currentColor" viewBox="0 0 24 24"> <path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd"></path> </svg> </a> <a href="https://twitter.com" class="text-gray-400 hover:text-white transition-colors" aria-label="Twitter"> <svg class="h-5 w-5" fill="currentColor" viewBox="0 0 24 24"> <path d="M8.29 20.251c7.547 0 11.675-6.253 11.675-11.675 0-.178 0-.355-.012-.53A8.348 8.348 0 0022 5.92a8.19 8.19 0 01-2.357.646 4.118 4.118 0 001.804-2.27 8.224 8.224 0 01-2.605.996 4.107 4.107 0 00-6.993 3.743 11.65 11.65 0 01-8.457-4.287 4.106 4.106 0 001.27 5.477A4.072 4.072 0 012.8 9.713v.052a4.105 4.105 0 003.292 4.022 4.095 4.095 0 01-1.853.07 4.108 4.108 0 003.834 2.85A8.233 8.233 0 012 18.407a11.616 11.616 0 006.29 1.84"></path> </svg> </a> </div> </div> <!-- Product Links --> <div> <h3 class="text-sm font-semibold text-white uppercase tracking-wider mb-4">Product</h3> <ul class="space-y-3"> <li> <a href="/skills/" class="text-sm text-gray-400 hover:text-primary-400 transition-colors"> All Skills </a> </li><li> <a href="/skills/#categories" class="text-sm text-gray-400 hover:text-primary-400 transition-colors"> Browse by Category </a> </li><li> <a href="/skill-bundles/" class="text-sm text-gray-400 hover:text-primary-400 transition-colors"> Skill Bundles </a> </li><li> <a href="/skills/category/web-scrapers" class="text-sm text-gray-400 hover:text-primary-400 transition-colors"> Web Scrapers </a> </li><li> <a href="/skills/category/ecommerce" class="text-sm text-gray-400 hover:text-primary-400 transition-colors"> E-commerce </a> </li><li> <a href="/skills/category/social-media" class="text-sm text-gray-400 hover:text-primary-400 transition-colors"> Social Media </a> </li><li> <a href="/skills/category/development" class="text-sm text-gray-400 hover:text-primary-400 transition-colors"> Development </a> </li> </ul> </div> <!-- Resources Links --> <div> <h3 class="text-sm font-semibold text-white uppercase tracking-wider mb-4">Resources</h3> <ul class="space-y-3"> <li> <a href="/get-started/" class="text-sm text-gray-400 hover:text-primary-400 transition-colors"> Documentation </a> </li><li> <a href="/get-started/installation" class="text-sm text-gray-400 hover:text-primary-400 transition-colors"> Installation </a> </li><li> <a href="/get-started/configuration" class="text-sm text-gray-400 hover:text-primary-400 transition-colors"> Configuration </a> </li><li> <a href="/get-started/troubleshooting" class="text-sm text-gray-400 hover:text-primary-400 transition-colors"> Troubleshooting </a> </li> </ul> </div> <!-- Security Links --> <div> <h3 class="text-sm font-semibold text-white uppercase tracking-wider mb-4">🔒 Security</h3> <ul class="space-y-3"> <li> <a href="/security/" class="text-sm text-gray-400 hover:text-primary-400 transition-colors"> Security Overview </a> </li><li> <a href="/security/5-step-hardening-guide" class="text-sm text-gray-400 hover:text-primary-400 transition-colors"> 5-Step Hardening Guide </a> </li><li> <a href="/security/auth-none-dangers" class="text-sm text-gray-400 hover:text-primary-400 transition-colors"> Why auth:none is Dangerous </a> </li><li> <a href="/security/tailscale-guide" class="text-sm text-gray-400 hover:text-primary-400 transition-colors"> Tailscale Setup Guide </a> </li> </ul> </div> <!-- Use Cases --> <div> <h3 class="text-sm font-semibold text-white uppercase tracking-wider mb-4">Use Cases</h3> <ul class="space-y-3"> <li> <a href="/use-cases/ecommerce" class="text-sm text-gray-400 hover:text-primary-400 transition-colors flex items-center"> <span class="mr-2">🛒</span> E-commerce </a> </li><li> <a href="/use-cases/development" class="text-sm text-gray-400 hover:text-primary-400 transition-colors flex items-center"> <span class="mr-2">💻</span> Development </a> </li><li> <a href="/use-cases/content-creation" class="text-sm text-gray-400 hover:text-primary-400 transition-colors flex items-center"> <span class="mr-2">📝</span> Content Creation </a> </li> </ul> </div> </div> <!-- Comparisons Section --> <div class="border-t border-gray-800 pt-8 mb-8"> <h3 class="text-sm font-semibold text-white uppercase tracking-wider mb-4">Comparisons</h3> <div class="flex flex-wrap gap-6"> <a href="/comparisons/" class="text-sm text-gray-400 hover:text-primary-400 transition-colors"> Comparisons </a><a href="/comparisons/skill-comparison/" class="text-sm text-gray-400 hover:text-primary-400 transition-colors"> Skill Comparison </a><a href="/comparisons/cost-comparison/" class="text-sm text-gray-400 hover:text-primary-400 transition-colors"> Cost Analysis </a><a href="/comparisons/architecture-comparison/" class="text-sm text-gray-400 hover:text-primary-400 transition-colors"> Architecture </a><a href="/tools/benchmarks/" class="text-sm text-gray-400 hover:text-primary-400 transition-colors"> Benchmarks </a><a href="/tools/hardware/" class="text-sm text-gray-400 hover:text-primary-400 transition-colors"> Hardware </a> </div> </div> <!-- Bottom Bar --> <div class="border-t border-gray-800 pt-8 flex flex-col md:flex-row justify-between items-center space-y-4 md:space-y-0"> <p class="text-sm text-gray-400"> © 2026 AICLawSkills. All rights reserved. </p> <div class="flex space-x-6"> <a href="/legal/about" class="text-sm text-gray-400 hover:text-white transition-colors"> About </a><a href="/legal/privacy" class="text-sm text-gray-400 hover:text-white transition-colors"> Privacy Policy </a><a href="/legal/terms" class="text-sm text-gray-400 hover:text-white transition-colors"> Terms of Service </a><a href="/legal/contact" class="text-sm text-gray-400 hover:text-white transition-colors"> Contact </a> </div> </div> </div> </footer> <div id="search-backdrop" class="search-backdrop hidden fixed inset-0 bg-black/50 z-50 transition-opacity" data-astro-cid-2eu6zh2g></div> <div id="search-modal" class="search-modal hidden fixed inset-0 z-50 flex items-start justify-center pt-[15vh] px-4" data-astro-cid-2eu6zh2g> <div class="relative w-full max-w-2xl bg-white rounded-xl shadow-2xl border border-gray-200 overflow-hidden" data-astro-cid-2eu6zh2g> <!-- Search Input --> <div class="flex items-center px-4 py-3 border-b border-gray-200" data-astro-cid-2eu6zh2g> <svg class="w-5 h-5 text-gray-400 mr-3" fill="none" stroke="currentColor" viewBox="0 0 24 24" data-astro-cid-2eu6zh2g> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" data-astro-cid-2eu6zh2g></path> </svg> <input id="search-input" type="text" placeholder="Search skills... (e.g., 'shopify', 'email', 'automation')" class="flex-1 outline-none text-gray-900 placeholder-gray-400" data-astro-cid-2eu6zh2g> <div class="flex items-center gap-2 ml-2" data-astro-cid-2eu6zh2g> <kbd class="hidden sm:inline-block px-2 py-1 text-xs font-semibold text-gray-400 bg-gray-100 border border-gray-200 rounded" data-astro-cid-2eu6zh2g>ESC</kbd> </div> </div> <!-- Search Results --> <div id="search-results" class="max-h-[50vh] overflow-y-auto" data-astro-cid-2eu6zh2g> <!-- Empty State --> <div id="search-empty" class="px-4 py-8 text-center text-gray-500" data-astro-cid-2eu6zh2g> <svg class="w-12 h-12 mx-auto mb-3 text-gray-300" fill="none" stroke="currentColor" viewBox="0 0 24 24" data-astro-cid-2eu6zh2g> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" data-astro-cid-2eu6zh2g></path> </svg> <p class="text-sm font-medium" data-astro-cid-2eu6zh2g>Start typing to search skills</p> <p class="text-xs mt-1 text-gray-400" data-astro-cid-2eu6zh2g>Search by name, category, or tags</p> </div> <!-- Results will be injected here --> <div id="search-results-list" class="py-2 hidden" data-astro-cid-2eu6zh2g></div> </div> <!-- Footer --> <div class="px-4 py-2 border-t border-gray-200 bg-gray-50 flex items-center justify-between text-xs text-gray-500" data-astro-cid-2eu6zh2g> <div class="flex items-center gap-3" data-astro-cid-2eu6zh2g> <span class="flex items-center gap-1" data-astro-cid-2eu6zh2g> <kbd data-astro-cid-2eu6zh2g>↑</kbd><kbd data-astro-cid-2eu6zh2g>↓</kbd> to navigate </span> <span class="flex items-center gap-1" data-astro-cid-2eu6zh2g> <kbd data-astro-cid-2eu6zh2g>↵</kbd> to select </span> </div> <span id="search-count" data-astro-cid-2eu6zh2g>0 results</span> </div> </div> </div> <script> // Skills data will be injected server-side window.SKILLS_DATA = []; </script> </body></html>