🎁 Get the FREE AI Skills Starter Guide β€” Subscribe β†’
BytesAgainBytesAgain
πŸ¦€ ClawHub

NotebookLM Skill

by @magicseek

Use this skill to query your Google NotebookLM notebooks directly from Claude Code for source-grounded, citation-backed answers from Gemini. Browser automati...

Versionv1.0.1
Downloads2,136
Installs8
Stars⭐ 3
TERMINAL
clawhub install nblm

πŸ“– About This Skill


name: nblm description: Use this skill to query your Google NotebookLM notebooks directly from Claude Code for source-grounded, citation-backed answers from Gemini. Browser automation, library management, persistent auth. Drastically reduced hallucinations through document-only responses.

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

    | Command | Description | |---------|-------------| | login | Authenticate with Google | | status | Show auth and library status | | accounts | List all Google accounts | | accounts add | Add a new Google account | | accounts switch | Switch active account (by index or email) | | accounts remove | Remove an account | | local | List notebooks in local library | | remote | List 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

    | Command | Description | |---------|-------------| | 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]</code> | Add text as source | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">source-text <source-id></code> | Get full indexed text | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">source-guide <source-id></code> | Get AI summary and keywords | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">source-rename <source-id> <name></code> | Rename a source | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">source-refresh <source-id></code> | Re-fetch URL content | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">source-delete <source-id></code> | Delete a source |</p><p style="margin:8px 0"><strong style="color:#e5e7eb">Upload options:</strong> <li style="color:#94a3b8;margin:3px 0"><code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--use-active</code> - Upload to the currently active notebook</li> <li style="color:#94a3b8;margin:3px 0"><code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--create-new</code> - Create a new notebook named after the file/folder</li> <li style="color:#94a3b8;margin:3px 0"><code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--notebook-id <id></code> - Upload to a specific notebook</li> <li style="color:#94a3b8;margin:3px 0"><code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--dry-run</code> - Show sync plan without executing (folder sync)</li> <li style="color:#94a3b8;margin:3px 0"><code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--rebuild</code> - Force rebuild tracking file (folder sync)</li></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Important:</strong> When user runs upload without specifying a target, ASK them first: > "Would you like to upload to the active notebook, or create a new notebook?" Then pass the appropriate flag (<code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--use-active</code> or <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--create-new</code>).</p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Chat & Audio/Media</h4> | Command | Description | |---------|-------------| | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">ask <question></code> | Query NotebookLM | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">podcast [--instructions TEXT]</code> | Generate audio podcast | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">podcast-status <task-id></code> | Check podcast generation status | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">podcast-download [output-path]</code> | Download latest podcast | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">briefing [--instructions TEXT]</code> | Generate brief audio summary | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">debate [--instructions TEXT]</code> | Generate debate-style audio | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">slides [--instructions TEXT]</code> | Generate slide deck | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">slides-download [output-path]</code> | Download slide deck as PDF | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">infographic [--instructions TEXT]</code> | Generate infographic | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">infographic-download [output-path]</code> | Download infographic | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">media-list [--type TYPE]</code> | List generated media (audio/video/slides/infographic) | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">media-delete <id></code> | Delete a generated media item |</p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Command Routing</h3></p><p style="margin:8px 0">Based on <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">$ARGUMENTS</code>, execute the appropriate command:</p><p style="margin:8px 0">$IF($ARGUMENTS, Parse the command from: "$ARGUMENTS"</p><p style="margin:8px 0"> <strong style="color:#e5e7eb">login</strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py auth_manager.py setup --service google</code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">accounts</strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py auth_manager.py accounts list</code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">accounts add</strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py auth_manager.py accounts add</code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">accounts switch <id></strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py auth_manager.py accounts switch "<id>"</code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">accounts remove <id></strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py auth_manager.py accounts remove "<id>"</code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">status</strong> β†’ Run both: - <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py auth_manager.py status</code> - <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py notebook_manager.py list</code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">local</strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py notebook_manager.py list</code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">remote</strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py nblm_cli.py notebooks</code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">create <name></strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py nblm_cli.py create "<name>"</code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">delete [--id ID]</strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py nblm_cli.py delete <args></code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">rename <name> [--id ID]</strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py nblm_cli.py rename "<name>" <args></code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">summary [--id ID]</strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py nblm_cli.py summary <args></code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">describe [--id ID]</strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py nblm_cli.py describe <args></code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">add <url-or-id></strong> β†’ Smart add workflow (auto-detects URL vs notebook ID)</p><p style="margin:8px 0"> <strong style="color:#e5e7eb">activate <id></strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py notebook_manager.py activate --id "<id>"</code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">sources [--id ID]</strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py nblm_cli.py sources <args></code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">upload <file></strong> β†’ First ASK user: "Upload to active notebook or create new?" Then: - Active: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py source_manager.py add --file "<file>" --use-active</code> - New: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py source_manager.py add --file "<file>" --create-new</code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">upload <folder></strong> β†’ Sync a folder: - First ASK user: "Sync to active notebook, create new, or specify notebook?" - Active: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py source_manager.py sync "<folder>" --use-active</code> - New: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py source_manager.py sync "<folder>" --create-new</code> - Specific: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py source_manager.py sync "<folder>" --notebook-id ID</code> - Dry-run: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py source_manager.py sync "<folder>" --dry-run</code> - Rebuild: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py source_manager.py sync "<folder>" --rebuild</code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">upload-zlib <url></strong> β†’ First ASK user: "Upload to active notebook or create new?" Then: - Active: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py source_manager.py add --url "<url>" --use-active</code> - New: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py source_manager.py add --url "<url>" --create-new</code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">upload-url <url></strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py nblm_cli.py upload-url "<url>"</code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">upload-youtube <url></strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py nblm_cli.py upload-youtube "<url>"</code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">upload-text <title></strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py nblm_cli.py upload-text "<title>" <args></code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">source-text <id></strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py nblm_cli.py source-text "<id>"</code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">source-guide <id></strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py nblm_cli.py source-guide "<id>"</code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">source-rename <id> <name></strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py nblm_cli.py source-rename "<id>" "<name>"</code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">source-refresh <id></strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py nblm_cli.py source-refresh "<id>"</code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">source-delete <id></strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py nblm_cli.py source-delete "<id>"</code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">ask <question></strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py nblm_cli.py ask "<question>"</code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">podcast</strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py artifact_manager.py generate --format DEEP_DIVE <args></code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">podcast-status <task-id></strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py artifact_manager.py status --task-id "<task-id>"</code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">podcast-download [output-path]</strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py artifact_manager.py download "<output-path>"</code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">briefing</strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py artifact_manager.py generate --format BRIEF <args></code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">debate</strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py artifact_manager.py generate --format DEBATE <args></code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">slides</strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py artifact_manager.py generate-slides <args></code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">slides-download [output-path]</strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py artifact_manager.py download "<output-path>" --type slide-deck</code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">infographic</strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py artifact_manager.py generate-infographic <args></code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">infographic-download [output-path]</strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py artifact_manager.py download "<output-path>" --type infographic</code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">media-list [--type TYPE]</strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py artifact_manager.py list <args></code></p><p style="margin:8px 0"> <strong style="color:#e5e7eb">media-delete <id></strong> β†’ <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py artifact_manager.py delete "<id>"</code></p><p style="margin:8px 0"> If command not recognized, show usage help.,</p><p style="margin:8px 0"> Show available commands with <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">/nblm</code> (no arguments) )</p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Podcast Options</h3></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">/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></p><p style="margin:8px 0">| Option | Values | |--------|--------| | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--length</code> | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">SHORT</code>, <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">DEFAULT</code>, <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">LONG</code> | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--instructions</code> | Custom instructions for the content | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--wait</code> | Wait for generation to complete | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--output</code> | Download path (requires <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--wait</code>) |</p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Slide Deck Options</h3></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">/nblm slides --format DETAILED_DECK --wait --output ./presentation.pdf /nblm slides --instructions "Focus on key diagrams" --format PRESENTER_SLIDES </code></pre></p><p style="margin:8px 0">| Option | Values | |--------|--------| | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--format</code> | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">DETAILED_DECK</code>, <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">PRESENTER_SLIDES</code> | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--length</code> | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">SHORT</code>, <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">DEFAULT</code> | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--instructions</code> | Custom instructions for the content | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--wait</code> | Wait for generation to complete | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--output</code> | Download path (requires <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--wait</code>) |</p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Infographic Options</h3></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">/nblm infographic --orientation LANDSCAPE --wait --output ./visual.png /nblm infographic --instructions "Highlight comparison" --detail-level DETAILED </code></pre></p><p style="margin:8px 0">| Option | Values | |--------|--------| | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--orientation</code> | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">LANDSCAPE</code>, <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">PORTRAIT</code>, <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">SQUARE</code> | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--detail-level</code> | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">CONCISE</code>, <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">STANDARD</code>, <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">DETAILED</code> | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--instructions</code> | Custom instructions for the content | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--wait</code> | Wait for generation to complete | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--output</code> | Download path (requires <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--wait</code>) |</p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Media Generation</h3></p><p style="margin:8px 0">| Command | Description | Output | |---------|-------------|--------| | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">/nblm podcast</code> | Deep-dive audio discussion | MP3 | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">/nblm briefing</code> | Brief audio summary | MP3 | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">/nblm debate</code> | Debate-style audio | MP3 | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">/nblm slides</code> | Slide deck presentation | PDF | | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">/nblm infographic</code> | Visual infographic | PNG |</p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Examples</h4> <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">/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></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Download & Manage</h4> <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">/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></p><p style="margin:8px 0"><hr style="border:none;border-top:1px solid #1e1e3f;margin:12px 0"></p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Extended Documentation</h2></p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">When to Use This Skill</h3></p><p style="margin:8px 0">Trigger when user: <li style="color:#94a3b8;margin:3px 0">Mentions NotebookLM explicitly</li> <li style="color:#94a3b8;margin:3px 0">Shares NotebookLM URL (<code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">https://notebooklm.google.com/notebook/...</code>)</li> <li style="color:#94a3b8;margin:3px 0">Asks to query their notebooks/documentation</li> <li style="color:#94a3b8;margin:3px 0">Wants to add documentation to NotebookLM library</li> <li style="color:#94a3b8;margin:3px 0">Uses phrases like "ask my NotebookLM", "check my docs", "query my notebook"</li></p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">⚠️ CRITICAL: Add Command - Smart Discovery</h3></p><p style="margin:8px 0">The add command now <strong style="color:#e5e7eb">automatically discovers metadata</strong> from the notebook:</p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em"># Smart Add (auto-discovers name, description, topics) python scripts/run.py notebook_manager.py add <notebook-id-or-url></p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">With optional overrides</h2> python scripts/run.py notebook_manager.py add <id> --name "Custom Name" --topics "custom,topics" </code></pre></p><p style="margin:8px 0"><strong style="color:#e5e7eb">What Smart Add does:</strong> 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</p><p style="margin:8px 0"><strong style="color:#e5e7eb">Supported input formats:</strong> <li style="color:#94a3b8;margin:3px 0">Notebook ID: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">5fd9f36b-8000-401d-a7a0-7aa3f7832644</code></li> <li style="color:#94a3b8;margin:3px 0">Full URL: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">https://notebooklm.google.com/notebook/5fd9f36b-8000-401d-a7a0-7aa3f7832644</code></li></p><p style="margin:8px 0">NEVER manually specify <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--name</code>, <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--description</code>, or <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--topics</code> unless the user explicitly provides them.</p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Critical: Always Use run.py Wrapper</h3></p><p style="margin:8px 0"><strong style="color:#e5e7eb">NEVER call scripts directly. ALWAYS use <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py [script]</code>:</strong></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em"># βœ… 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 "..."</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">❌ WRONG - Never call directly:</h2> python scripts/auth_manager.py status # Fails without venv! </code></pre></p><p style="margin:8px 0">The <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">run.py</code> wrapper automatically: 1. Creates <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">.venv</code> if needed 2. Installs all dependencies 3. Activates environment 4. Executes script properly</p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Core Workflow</h3></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Step 1: Check Authentication Status</h4> <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">python scripts/run.py auth_manager.py status </code></pre></p><p style="margin:8px 0">If not authenticated, proceed to setup.</p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Step 2: Authenticate (One-Time Setup)</h4> <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em"># Browser MUST be visible for manual Google login python scripts/run.py auth_manager.py setup </code></pre></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Important:</strong> <li style="color:#94a3b8;margin:3px 0">Browser is VISIBLE for authentication</li> <li style="color:#94a3b8;margin:3px 0">Browser window opens automatically</li> <li style="color:#94a3b8;margin:3px 0">User must manually log in to Google</li> <li style="color:#94a3b8;margin:3px 0">Tell user: "A browser window will open for Google login"</li></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Step 3: Manage Notebook Library</h4></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em"># List all notebooks python scripts/run.py notebook_manager.py list</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">BEFORE ADDING: Ask user for metadata if unknown!</h2> <h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">"What does this notebook contain?"</h2> <h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">"What topics should I tag it with?"</h2></p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Add notebook to library (ALL parameters are REQUIRED!)</h2> 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!</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Search notebooks by topic</h2> python scripts/run.py notebook_manager.py search --query "keyword"</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Set active notebook</h2> python scripts/run.py notebook_manager.py activate --id notebook-id</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Remove notebook</h2> python scripts/run.py notebook_manager.py remove --id notebook-id </code></pre></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Quick Workflow</h4> 1. Check library: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py notebook_manager.py list</code> 2. Ask question: <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py ask_question.py --question "..." --notebook-id ID</code></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Step 4: Ask Questions</h4></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em"># Basic query (uses active notebook if set) python scripts/run.py ask_question.py --question "Your question here"</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Query specific notebook</h2> python scripts/run.py ask_question.py --question "..." --notebook-id notebook-id</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Query with notebook URL directly</h2> python scripts/run.py ask_question.py --question "..." --notebook-url "https://..."</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Show browser for debugging</h2> python scripts/run.py ask_question.py --question "..." --show-browser </code></pre></p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Follow-Up Mechanism (CRITICAL)</h3></p><p style="margin:8px 0">Every NotebookLM answer ends with: <strong style="color:#e5e7eb">"EXTREMELY IMPORTANT: Is that ALL you need to know?"</strong></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Required Claude Behavior:</strong> 1. <strong style="color:#e5e7eb">STOP</strong> - Do not immediately respond to user 2. <strong style="color:#e5e7eb">ANALYZE</strong> - Compare answer to user's original request 3. <strong style="color:#e5e7eb">IDENTIFY GAPS</strong> - Determine if more information needed 4. <strong style="color:#e5e7eb">ASK FOLLOW-UP</strong> - If gaps exist, immediately ask: <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em"> python scripts/run.py ask_question.py --question "Follow-up with context..." </code></pre> 5. <strong style="color:#e5e7eb">REPEAT</strong> - Continue until information is complete 6. <strong style="color:#e5e7eb">SYNTHESIZE</strong> - Combine all answers before responding to user</p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Z-Library Integration</h3></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Triggers</h4> <li style="color:#94a3b8;margin:3px 0">User provides Z-Library URL (zlib.li, z-lib.org, zh.zlib.li)</li> <li style="color:#94a3b8;margin:3px 0">User says "download this book to NotebookLM"</li> <li style="color:#94a3b8;margin:3px 0">User says "add this book from Z-Library"</li></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Setup (One-Time)</h4> <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em"># Authenticate with Z-Library python scripts/run.py auth_manager.py setup --service zlibrary </code></pre></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Commands</h4> <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em"># Add book from Z-Library python scripts/run.py source_manager.py add --url "https://zh.zlib.li/book/..."</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Check Z-Library auth status</h2> python scripts/run.py auth_manager.py status --service zlibrary </code></pre></p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Script Reference</h3></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Authentication Management (<code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">auth_manager.py</code>)</h4> <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">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</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Multi-Account Management (Google)</h2> 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></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Notebook Management (<code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">notebook_manager.py</code>)</h4> <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">python scripts/run.py notebook_manager.py add --url URL --name NAME --description DESC --topics TOPICS <h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">OR use notebook ID directly:</h2> 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></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Question Interface (<code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">ask_question.py</code>)</h4> <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">python scripts/run.py ask_question.py --question "..." [--notebook-id ID] [--notebook-url URL] [--show-browser] </code></pre></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Source Manager (<code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">source_manager.py</code>)</h4> <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em"># Upload to active notebook python scripts/run.py source_manager.py add --file "/path/to/book.pdf" --use-active</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Create new notebook for upload</h2> python scripts/run.py source_manager.py add --file "/path/to/book.pdf" --create-new</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Upload to specific notebook</h2> python scripts/run.py source_manager.py add --file "/path/to/book.pdf" --notebook-id NOTEBOOK_ID</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Z-Library download and upload</h2> 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</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Sync a folder (new!)</h2> 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</p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Sync options (new!)</h2> 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></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Folder Sync:</strong> <li style="color:#94a3b8;margin:3px 0">Scans folder for supported types: PDF, TXT, MD, DOCX, HTML, EPUB</li> <li style="color:#94a3b8;margin:3px 0">Tracks sync state internally (no per-folder tracking file to manage)</li> <li style="color:#94a3b8;margin:3px 0">Sync strategy: add new, update modified (delete + re-upload), skip unchanged</li> <li style="color:#94a3b8;margin:3px 0">Multi-account aware (tracks which Google account was used)</li> <strong style="color:#e5e7eb">Note:</strong> One of <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--use-active</code>, <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--create-new</code>, or <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">--notebook-id</code> is REQUIRED. Uploads wait for NotebookLM processing and print progress as <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">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 style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">NOTEBOOKLM_UPLOAD_MODE=text</code> to upload extracted text instead (PDFs require <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">pypdf</code>).</p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Data Cleanup (<code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">cleanup_manager.py</code>)</h4> <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">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></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Watchdog Status (<code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">auth_manager.py</code>)</h4> <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">python scripts/run.py auth_manager.py watchdog-status </code></pre></p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Environment Management</h3></p><p style="margin:8px 0">The virtual environment is automatically managed: <li style="color:#94a3b8;margin:3px 0">First run creates <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">.venv</code> automatically</li> <li style="color:#94a3b8;margin:3px 0">Dependencies install automatically</li> <li style="color:#94a3b8;margin:3px 0">Node.js dependencies install automatically</li> <li style="color:#94a3b8;margin:3px 0">agent-browser daemon starts on demand and keeps browser state in memory</li> <li style="color:#94a3b8;margin:3px 0">daemon stops after 10 minutes of inactivity (any agent-browser command resets the timer)</li> <li style="color:#94a3b8;margin:3px 0">set <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">AGENT_BROWSER_OWNER_PID</code> to auto-stop when the agent process exits</li> <li style="color:#94a3b8;margin:3px 0"><code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">scripts/run.py</code> sets <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">AGENT_BROWSER_OWNER_PID</code> to its parent PID by default</li> <li style="color:#94a3b8;margin:3px 0">Everything isolated in skill directory</li></p><p style="margin:8px 0">Manual setup (only if automatic fails): <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">python -m venv .venv source .venv/bin/activate # Linux/Mac pip install -r requirements.txt npm install npm run install-browsers </code></pre></p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Data Storage</h3></p><p style="margin:8px 0">All data stored in <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">~/.claude/skills/notebooklm/data/</code>: <li style="color:#94a3b8;margin:3px 0"><code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">library.json</code> - Notebook metadata (with account associations)</li> <li style="color:#94a3b8;margin:3px 0"><code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">auth/google/</code> - Multi-account Google auth</li> - <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">index.json</code> - Account index (active account, list) - <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em"><n>-<email>.json</code> - Per-account credentials <li style="color:#94a3b8;margin:3px 0"><code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">auth/zlibrary.json</code> - Z-Library auth state</li> <li style="color:#94a3b8;margin:3px 0"><code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">agent_browser/session_id</code> - Current daemon session ID</li> <li style="color:#94a3b8;margin:3px 0"><code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">agent_browser/last_activity.json</code> - Last activity timestamp for idle shutdown</li> <li style="color:#94a3b8;margin:3px 0"><code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">agent_browser/watchdog.pid</code> - Idle watchdog process ID</li></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Security:</strong> Protected by <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">.gitignore</code>, never commit to git.</p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Configuration</h3></p><p style="margin:8px 0">Optional <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">.env</code> file in skill directory: <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">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></p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Decision Flow</h3></p><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">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></p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Troubleshooting</h3></p><p style="margin:8px 0">| Problem | Solution | |---------|----------| | ModuleNotFoundError | Use <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">run.py</code> wrapper | | Authentication fails | Browser must be visible for setup! --show-browser | | DAEMON_UNAVAILABLE | Ensure Node.js/npm installed, run <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">npm install</code>, retry | | AUTH_REQUIRED | Run <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py auth_manager.py setup</code> | | ELEMENT_NOT_FOUND | Verify notebook URL and re-run with fresh page load | | Rate limit (50/day) | Wait or add another Google account with <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">accounts add</code> | | Browser crashes | <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">python scripts/run.py cleanup_manager.py --preserve-library</code> | | Notebook not found | Check with <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">notebook_manager.py list</code> |</p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Best Practices</h3></p><p style="margin:8px 0">1. <strong style="color:#e5e7eb">Always use run.py</strong> - Handles environment automatically 2. <strong style="color:#e5e7eb">Check auth first</strong> - Before any operations 3. <strong style="color:#e5e7eb">Follow-up questions</strong> - Don't stop at first answer 4. <strong style="color:#e5e7eb">Browser visible for auth</strong> - Required for manual login 5. <strong style="color:#e5e7eb">Include context</strong> - Each question is independent 6. <strong style="color:#e5e7eb">Synthesize answers</strong> - Combine multiple responses</p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Limitations</h3></p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0">No session persistence (each question = new browser)</li> <li style="color:#94a3b8;margin:3px 0">Rate limits on free Google accounts (50 queries/day per account; use multiple accounts to increase)</li> <li style="color:#94a3b8;margin:3px 0">Manual upload required (user must add docs to NotebookLM)</li> <li style="color:#94a3b8;margin:3px 0">Browser overhead (few seconds per question)</li></p><p style="margin:8px 0"><h3 style="color:#e5e7eb;margin:18px 0 8px;font-size:1.05em">Resources (Skill Structure)</h3></p><p style="margin:8px 0"><strong style="color:#e5e7eb">Important directories and files:</strong></p><p style="margin:8px 0"><li style="color:#94a3b8;margin:3px 0"><code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">scripts/</code> - All automation scripts (ask_question.py, notebook_manager.py, etc.)</li> <li style="color:#94a3b8;margin:3px 0"><code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">data/</code> - Local storage for authentication and notebook library</li> <li style="color:#94a3b8;margin:3px 0"><code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">references/</code> - Extended documentation:</li> - <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">api_reference.md</code> - Detailed API documentation for all scripts - <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">troubleshooting.md</code> - Common issues and solutions - <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">usage_patterns.md</code> - Best practices and workflow examples <li style="color:#94a3b8;margin:3px 0"><code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">.venv/</code> - Isolated Python environment (auto-created on first run)</li> <li style="color:#94a3b8;margin:3px 0"><code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">.gitignore</code> - Protects sensitive data from being committed</li> </p></div></section><section class="skill-card" style="margin-bottom:20px"><h2 style="color:#f8fafc;font-size:1.2em;font-weight:800;margin:0 0 16px;display:flex;align-items:center;gap:8px">πŸ’‘ Examples</h2><div style="font-size:.92em;color:#94a3b8;line-height:1.75"><p style="margin:8px 0"><pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">/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></p><p style="margin:8px 0"><h4 style="color:#d1d5db;margin:14px 0 6px;font-size:.95em">Download & Manage</h4> <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">/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></p><p style="margin:8px 0"><hr style="border:none;border-top:1px solid #1e1e3f;margin:12px 0"></p><p style="margin:8px 0"><h2 style="color:#f3f4f6;margin:20px 0 10px;font-size:1.15em">Extended Documentation</h2></p></div></section><section class="skill-card" style="margin-bottom:20px"><h2 style="color:#f8fafc;font-size:1.2em;font-weight:800;margin:0 0 16px;display:flex;align-items:center;gap:8px">βš™οΈ Configuration</h2><div style="font-size:.92em;color:#94a3b8;line-height:1.75"><p style="margin:8px 0">Optional <code style="background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em">.env</code> file in skill directory: <pre style="background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0"><code style="color:#a5f3fc;background:none;padding:0;font-size:1em">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></p></div></section><section class="skill-card" style="margin-bottom:20px"><h2 style="color:#f8fafc;font-size:1.2em;font-weight:800;margin:0 0 16px;display:flex;align-items:center;gap:8px">πŸ“‹ Tips & Best Practices</h2><div style="font-size:.92em;color:#94a3b8;line-height:1.75"><p style="margin:8px 0">1. <strong style="color:#e5e7eb">Always use run.py</strong> - Handles environment automatically 2. <strong style="color:#e5e7eb">Check auth first</strong> - Before any operations 3. <strong style="color:#e5e7eb">Follow-up questions</strong> - Don't stop at first answer 4. <strong style="color:#e5e7eb">Browser visible for auth</strong> - Required for manual login 5. <strong style="color:#e5e7eb">Include context</strong> - Each question is independent 6. <strong style="color:#e5e7eb">Synthesize answers</strong> - Combine multiple responses</p></div></section></div><div class="two-col-side"></div></div></div><script> document.querySelectorAll('.copy-btn, .script-copy-btn').forEach(btn => { btn.addEventListener('click', () => { const cmd = btn.getAttribute('data-cmd'); if (!cmd) return; navigator.clipboard.writeText(cmd).then(() => { const orig = btn.textContent; btn.textContent = 'Copied!'; setTimeout(() => btn.textContent = orig, 1500); }).catch(() => {}); }); }); </script><!--$--><!--/$--></main><footer style="background:var(--bg-primary);border-top:1px solid var(--border-secondary);margin-top:60px"><div style="border-top:1px solid var(--border-light);max-width:1200px;margin:0 auto;padding:24px 20px"><div style="display:flex;justify-content:space-between;flex-wrap:wrap;gap:24px;margin-bottom:24px"><div><div style="font-weight:700;color:var(--text-muted);margin-bottom:8px">BytesAgain</div><div style="color:var(--text-muted3);font-size:.82em;max-width:200px">Discover the best AI agent skills for your workflow.</div></div><div><div style="color:var(--text-muted);font-size:.75em;text-transform:uppercase;letter-spacing:1px;margin-bottom:10px">Explore</div><div style="margin-bottom:6px"><a href="/skills" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Skills</a></div><div style="margin-bottom:6px"><a href="/articles" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Articles</a></div><div style="margin-bottom:6px"><a href="/use-case" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Cases</a></div></div><div><div style="color:var(--text-muted);font-size:.75em;text-transform:uppercase;letter-spacing:1px;margin-bottom:10px">Company</div><div style="margin-bottom:6px"><a href="/about" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">About</a></div><div style="margin-bottom:6px"><a href="/contact" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Contact</a></div><div style="margin-bottom:6px"><a href="/privacy-policy" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Privacy Policy</a></div><div style="margin-bottom:6px"><a href="/terms" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Terms</a></div><div style="margin-bottom:6px"><a href="/feedback" style="color:var(--text-muted2);text-decoration:none;font-size:.85em">Feedback</a></div></div></div><div style="border-top:1px solid var(--border-light);padding-top:16px"><div style="color:var(--text-muted4);font-size:.8em;margin-bottom:8px">Β© <!-- -->2026<!-- --> BytesAgain. All rights reserved.</div><div style="color:var(--text-muted5);font-size:.75em;line-height:1.6;max-width:720px">BytesAgain is an independent skill directory. We index and link to third-party content (ClawHub, GitHub, LobeHub, Dify, etc.) for informational purposes only. All trademarks, skill names, and content are the property of their respective owners. BytesAgain does not claim ownership of any indexed content.</div></div></div></footer><button style="position:fixed;bottom:28px;right:28px;z-index:1000;width:48px;height:48px;border-radius:50%;border:none;cursor:pointer;background:linear-gradient(135deg,#667eea,#00d4ff);color:#fff;font-size:1.3em;box-shadow:0 4px 20px #667eea66;display:flex;align-items:center;justify-content:center;transition:transform .2s">πŸ’¬</button><script src="/_next/static/chunks/0ze4gu236oq96.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[62894,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"LangProvider\"]\n3:I[89220,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"ThemeProvider\"]\n4:I[16988,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\ne:I[68027,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\",1]\n:HL[\"/_next/static/chunks/051nc0vy_6.rl.css?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"style\"]\n:HL[\"/_next/static/media/caa3a2e1cccd8315-s.p.09~u27dqhyhd6.woff2?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n5:Td5e,"])</script><script>self.__next_f.push([1,"[{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"BytesAgain\",\"url\":\"https://bytesagain.com\",\"description\":\"Search 60,000+ verified AI agent skills via MCP API or REST. Supports 7 languages. Free, no auth required.\",\"inLanguage\":[\"en\",\"zh\",\"es\",\"fr\",\"de\",\"ja\",\"ko\"],\"potentialAction\":{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https://bytesagain.com/skills?q={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}},{\"@context\":\"https://schema.org\",\"@type\":\"Organization\",\"name\":\"BytesAgain\",\"url\":\"https://bytesagain.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://bytesagain.com/og-image.png\"},\"description\":\"AI agent skill directory. Search 60,000+ skills, 1,000+ use cases, and community requests.\",\"foundingDate\":\"2026\",\"foundingLocation\":{\"@type\":\"Place\",\"name\":\"Global\"},\"sameAs\":[\"https://x.com/bytesagain\",\"https://github.com/bytesagain/ai-skills\",\"https://clawhub.ai/profile/bytesagain\"],\"contactPoint\":{\"@type\":\"ContactPoint\",\"email\":\"hello@bytesagain.com\",\"contactType\":\"customer support\"},\"numberOfEmployees\":{\"@type\":\"QuantitativeValue\",\"value\":1}},{\"@context\":\"https://schema.org\",\"@type\":\"WebApplication\",\"name\":\"BytesAgain AI Skills Search\",\"url\":\"https://bytesagain.com\",\"applicationCategory\":\"DeveloperApplication\",\"operatingSystem\":\"Web\",\"description\":\"Search engine and MCP API for 60,000+ AI agent skills. Semantic search, role recommendations, and use case packs.\",\"offers\":{\"@type\":\"Offer\",\"price\":\"0\",\"priceCurrency\":\"USD\"},\"featureList\":[\"Search 60,000+ AI agent skills\",\"Role-based recommendations for developers, creators, and traders\",\"1,000+ curated use case packs\",\"Free MCP API and REST API\",\"Multi-language search (EN, ZH, ES, FR, DE, JA, KO)\"],\"potentialAction\":{\"@type\":\"SearchAction\",\"target\":\"https://bytesagain.com/skills?q={search_term_string}\",\"query-input\":\"required name=search_term_string\"},\"dateModified\":\"2026-07-18\"},{\"@context\":\"https://schema.org\",\"@type\":\"FAQPage\",\"mainEntity\":[{\"@type\":\"Question\",\"name\":\"What is BytesAgain?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"BytesAgain is a curated directory of 60,000+ AI agent skills from ClawHub, GitHub, LobeHub, and Dify. Search skills by keyword in 7 languages, browse by role (developer, creator, trader, marketer) or by use case.\"}},{\"@type\":\"Question\",\"name\":\"How do I find AI skills on BytesAgain?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Use the search bar on BytesAgain.com to search by keyword in 7 languages. You can also browse by role (developer, creator, trader, marketer) or by use case. Each skill shows install instructions for Claude, Cursor, OpenClaw, Continue, and more.\"}},{\"@type\":\"Question\",\"name\":\"Is BytesAgain free?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes, BytesAgain is completely free. No registration required for searching skills. The MCP API is also free with rate limits.\"}},{\"@type\":\"Question\",\"name\":\"Does BytesAgain have an API for AI agents?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes! BytesAgain provides a free MCP SSE endpoint at /api/mcp/sse for AI agents, plus a REST API at /api/mcp?action=search\u0026q=\u003cquery\u003e. No authentication needed.\"}},{\"@type\":\"Question\",\"name\":\"Can I request a new AI skill on BytesAgain?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes! Visit the Requests page on BytesAgain.com to submit a skill request. Your request will be visible to the community and notified to the site admin.\"}}]}]"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"c\":[\"\",\"skill\",\"nblm\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"skill\",{\"children\":[[\"slug\",\"nblm\",\"d\",null],{\"children\":[\"__PAGE__\",{}]}]}]},\"$undefined\",\"$undefined\",16],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/051nc0vy_6.rl.css?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"link\",null,{\"rel\":\"llms\",\"href\":\"/llms.txt\"}],[\"$\",\"link\",null,{\"rel\":\"llms-full\",\"href\":\"/llms-full.txt\"}],[\"$\",\"script\",null,{\"async\":true,\"src\":\"https://www.googletagmanager.com/gtag/js?id=G-3C1MM9FWYF\"}],[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n window.dataLayer = window.dataLayer || [];\\n function gtag(){dataLayer.push(arguments);}\\n gtag('js', new Date());\\n gtag('config', 'G-3C1MM9FWYF');\\n \"}}]]}],[\"$\",\"body\",null,{\"className\":\"geist_9e050971-module__05dp7a__className\",\"style\":{\"margin\":0},\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"children\":[[\"$\",\"div\",null,{\"style\":{\"width\":\"100%\",\"background\":\"var(--bg-subscribe)\",\"borderBottom\":\"1px solid var(--border-primary)\",\"padding\":\"8px 20px\",\"textAlign\":\"center\",\"fontSize\":\".82em\",\"color\":\"#818cf8\"},\"children\":[\"🎁 \",[\"$\",\"strong\",null,{\"style\":{\"color\":\"var(--text-primary)\"},\"children\":\"Get the FREE AI Skills Starter Guide\"}],\" β€” \",[\"$\",\"a\",null,{\"href\":\"/register\",\"style\":{\"color\":\"#00d4ff\",\"textDecoration\":\"underline\"},\"children\":\"Subscribe β†’\"}]]}],[\"$\",\"$L4\",null,{}],[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"$5\"}}],\"$L6\",\"$L7\",\"$L8\"]}]}]}]]}]]}],{\"children\":[\"$L9\",{\"children\":[\"$La\",{\"children\":[\"$Lb\",{},null,false,null]},null,false,\"$@c\"]},null,false,\"$@c\"]},null,false,null],\"$Ld\",false]],\"m\":\"$undefined\",\"G\":[\"$e\",[\"$Lf\"]],\"S\":true,\"h\":null,\"s\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"10:I[39756,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n11:I[37457,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n12:I[22016,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0ka051yepewro.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"\"]\n13:I[90940,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n14:I[16397,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n16:I[97367,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"OutletBoundary\"]\n17:\"$Sreact.suspense\"\n1a:I[97367,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"ViewportBoundary\"]\n1c:I[97367,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"MetadataBoundary\"]\n"])</script><script>self.__next_f.push([1,"6:[\"$\",\"main\",null,{\"children\":[\"$\",\"$L10\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L11\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"main\",null,{\"style\":{\"minHeight\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"background\":\"#050611\",\"color\":\"#e5e7eb\"},\"children\":[[\"$\",\"style\",null,{\"children\":\"\\n .nf-box { text-align: center; padding: 60px 32px; }\\n .nf-code { font-size: 6rem; font-weight: 900; color: #22d3ee; line-height: 1; margin: 0; }\\n .nf-title { font-size: 1.8rem; font-weight: 800; margin: 12px 0 8px; }\\n .nf-desc { color: var(--text-muted2); font-size: 1rem; margin-bottom: 32px; max-width: 440px; }\\n .nf-link { display: inline-block; padding: 12px 28px; background: linear-gradient(135deg,#34d399,#22d3ee); color: #000; font-weight: 900; border-radius: 12px; text-decoration: none; }\\n \"}],[\"$\",\"div\",null,{\"className\":\"nf-box\",\"children\":[[\"$\",\"p\",null,{\"className\":\"nf-code\",\"children\":\"404\"}],[\"$\",\"h1\",null,{\"className\":\"nf-title\",\"children\":\"Page Not Found\"}],[\"$\",\"p\",null,{\"className\":\"nf-desc\",\"children\":\"The skill or page you're looking for doesn't exist or has been moved.\"}],[\"$\",\"$L12\",null,{\"className\":\"nf-link\",\"href\":\"/\",\"children\":\"Back to BytesAgain\"}]]}]]}],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]\n"])</script><script>self.__next_f.push([1,"7:[\"$\",\"$L13\",null,{}]\n8:[\"$\",\"$L14\",null,{}]\n9:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L10\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L11\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\na:[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L10\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L11\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]\nb:[\"$\",\"$1\",\"c\",{\"children\":[\"$L15\",[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/12w5ognupk9fb.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L16\",null,{\"children\":[\"$\",\"$17\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@18\"}]}]]}]\n19:[]\nc:\"$W19\"\nd:[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L1a\",null,{\"children\":\"$L1b\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L1c\",null,{\"children\":[\"$\",\"$17\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L1d\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}]\nf:[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/051nc0vy_6.rl.css?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]\n"])</script><script>self.__next_f.push([1,"1b:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"1e:I[27201,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"IconMark\"]\n18:null\n"])</script><script>self.__next_f.push([1,"1d:[[\"$\",\"title\",\"0\",{\"children\":\"NotebookLM Skill β€” AI Agent Skill | BytesAgain | BytesAgain\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Use this skill to query your Google NotebookLM notebooks directly from Claude Code for source-grounded, citation-backed answers from Gemini. Browser automati...\"}],[\"$\",\"meta\",\"2\",{\"name\":\"robots\",\"content\":\"index, follow\"}],[\"$\",\"meta\",\"3\",{\"name\":\"googlebot\",\"content\":\"index, follow, max-image-preview:large, max-snippet:-1\"}],[\"$\",\"meta\",\"4\",{\"name\":\"llms-txt\",\"content\":\"https://bytesagain.com/llms.txt\"}],[\"$\",\"meta\",\"5\",{\"name\":\"llms-full-txt\",\"content\":\"https://bytesagain.com/llms-full.txt\"}],[\"$\",\"link\",\"6\",{\"rel\":\"canonical\",\"href\":\"https://bytesagain.com/skill/nblm\"}],[\"$\",\"meta\",\"7\",{\"name\":\"baidu-site-verification\",\"content\":\"codeva-0evUqX1TFs\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:title\",\"content\":\"NotebookLM Skill β€” AI Agent Skill | BytesAgain\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:description\",\"content\":\"Use this skill to query your Google NotebookLM notebooks directly from Claude Code for source-grounded, citation-backed answers from Gemini. Browser automati...\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:url\",\"content\":\"https://bytesagain.com/skill/nblm\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:site_name\",\"content\":\"BytesAgain\"}],[\"$\",\"meta\",\"12\",{\"property\":\"og:image\",\"content\":\"https://bytesagain.com/social-preview.png\"}],[\"$\",\"meta\",\"13\",{\"property\":\"og:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"14\",{\"property\":\"og:image:height\",\"content\":\"630\"}],[\"$\",\"meta\",\"15\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"16\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"17\",{\"name\":\"twitter:title\",\"content\":\"NotebookLM Skill β€” AI Agent Skill | BytesAgain\"}],[\"$\",\"meta\",\"18\",{\"name\":\"twitter:description\",\"content\":\"Use this skill to query your Google NotebookLM notebooks directly from Claude Code for source-grounded, citation-backed answers from Gemini. Browser automati...\"}],[\"$\",\"meta\",\"19\",{\"name\":\"twitter:image\",\"content\":\"https://bytesagain.com/social-preview.png\"}],[\"$\",\"meta\",\"20\",{\"name\":\"twitter:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"21\",{\"name\":\"twitter:image:height\",\"content\":\"630\"}],[\"$\",\"link\",\"22\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.0x3dzn~oxb6tn.ico\",\"sizes\":\"256x256\",\"type\":\"image/x-icon\"}],[\"$\",\"$L1e\",\"23\",{}]]\n"])</script><script>self.__next_f.push([1,"1f:T1562,"])</script><script>self.__next_f.push([1,"\n .skill-page { max-width: 1100px; margin: 0 auto; padding: 32px 20px 80px; }\n .two-col { display: flex; gap: 32px; align-items: flex-start; }\n .two-col-main { flex: 1; min-width: 0; }\n .two-col-side { width: 300px; flex-shrink: 0; }\n @media (max-width: 860px) {\n .two-col { flex-direction: column; }\n .two-col-side { width: 100%; }\n }\n .breadcrumb { font-size: .82em; color: var(--text-muted2); margin-bottom: 28px; }\n .breadcrumb a { color: #818cf8; text-decoration: none; }\n .breadcrumb a:hover { text-decoration: underline; }\n .skill-card { background: var(--bg-card); border: 1px solid var(--border-card); border-radius: 20px; padding: 28px; margin-bottom: 24px; }\n .skill-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-bottom: 20px; flex-wrap: wrap; }\n .skill-badges { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }\n .skill-top-actions { display: flex; align-items: center; gap: 10px; margin-left: auto; }\n .badge { display: inline-flex; align-items: center; gap: 5px; font-size: .75em; font-weight: 600; padding: 4px 12px; border-radius: 999px; border: 1px solid transparent; }\n .skill-title { font-size: 1.6em; font-weight: 800; color: var(--text-primary); margin: 0 0 4px; line-height: 1.2; }\n .skill-owner { font-size: .82em; color: var(--text-muted2); margin: 0 0 14px; }\n .skill-owner span { color: #818cf8; }\n .skill-desc { font-size: .92em; color: var(--text-secondary); line-height: 1.65; margin: 0 0 16px; }\n .skill-meta { display: flex; gap: 16px; flex-wrap: wrap; margin-bottom: 18px; padding-bottom: 16px; border-bottom: 1px solid var(--border-card); }\n .meta-item { display: flex; flex-direction: column; gap: 2px; }\n .meta-label { font-size: .7em; color: var(--text-muted5); text-transform: uppercase; letter-spacing: 1px; font-weight: 600; }\n .meta-value { font-size: .92em; color: var(--text-muted2); font-weight: 600; }\n .tags-row { display: flex; gap: 6px; flex-wrap: wrap; }\n .tag { font-size: .75em; color: #6366f1; background: #6366f115; border: 1px solid #6366f130; border-radius: 6px; padding: 3px 10px; text-decoration: none; }\n .tag:hover { background: #6366f125; }\n .install-box { background: var(--bg-deep); border: 1px solid var(--border-card); border-radius: 12px; overflow: hidden; margin-bottom: 24px; }\n .install-header { display: flex; align-items: center; justify-content: space-between; padding: 10px 16px; border-bottom: 1px solid var(--border-card); }\n .install-dots { display: flex; gap: 6px; }\n .dot { width: 10px; height: 10px; border-radius: 50%; }\n .install-label { font-size: .72em; color: var(--text-muted5); font-family: monospace; letter-spacing: 1px; }\n .install-body { padding: 16px 20px; display: flex; align-items: center; justify-content: space-between; gap: 12px; }\n .install-cmd { color: var(--text-code);\n font-family: 'Courier New', monospace; font-size: 1em; }\n .copy-btn { font-size: .75em; color: #6366f1; background: #6366f115; border: 1px solid #6366f130; border-radius: 6px; padding: 5px 12px; cursor: pointer; white-space: nowrap; transition: all .15s; }\n .copy-btn:hover { background: #6366f125; }\n .btn-secondary { display: inline-flex; align-items: center; gap: 8px; padding: 13px 24px; background: transparent; border: 1px solid var(--border-card); border-radius: 10px; color: #6b7280; text-decoration: none; font-weight: 600; font-size: .95em; transition: all .15s; }\n .btn-secondary:hover { border-color: #818cf8; color: #818cf8; }\n .ours-badge { display: inline-flex; align-items: center; gap: 6px; font-size: .72em; font-weight: 700; color: #22d3ee; background: #22d3ee10; border: 1px solid #22d3ee30; border-radius: 999px; padding: 4px 14px; }\n .section-card { background: var(--bg-card); border: 1px solid var(--border-card); border-radius: 16px; padding: 22px 24px; margin-bottom: 20px; }\n .section-title { color: var(--text-primary); font-size: 1.08em; font-weight: 800; margin: 0 0 12px; display: flex; align-items: center; gap: 8px; }\n /* Script box */\n .script-header { display: flex; align-items: center; justify-content: space-between; padding: 8px 14px; background: var(--bg-input); border-bottom: 1px solid var(--border-card); }\n .script-filename { font-size: .72em; color: var(--text-muted2); font-family: 'Courier New', monospace; }\n .script-copy-btn { font-size: .72em; color: #6366f1; background: none; border: 1px solid #6366f130; border-radius: 4px; padding: 2px 10px; cursor: pointer; }\n .script-copy-btn:hover { background: #6366f115; }\n .script-body { padding: 14px 16px; font-family: 'Courier New', monospace; font-size: .82em; line-height: 1.6; color: var(--text-code); overflow-x: auto; max-height: 420px; overflow-y: auto; white-space: pre; }\n /* Articles */\n .article-card { display: block; background: var(--bg-secondary); border: 1px solid var(--border-primary); border-radius: 10px; padding: 14px 16px; text-decoration: none; transition: border-color .15s; }\n .article-card:hover { border-color: #6366f1; }\n @media (max-width: 600px) {\n .skill-card { padding: 20px; }\n .skill-title { font-size: 1.5em; }\n }\n "])</script><script>self.__next_f.push([1,"15:[[\"$\",\"style\",null,{\"children\":\"$1f\"}],\"$L20\",\"$L21\"]\n"])</script><script>self.__next_f.push([1,"22:I[78297,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/12w5ognupk9fb.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n23:Te8a5,"])</script><script>self.__next_f.push([1,"\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\nname: nblm\ndescription: Use this skill to query your Google NotebookLM notebooks directly from Claude Code for source-grounded, citation-backed answers from Gemini. Browser automation, library management, persistent auth. Drastically reduced hallucinations through document-only responses.\n\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eNotebookLM Quick Commands\u003c/h2\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eQuery Google NotebookLM for source-grounded, citation-backed answers.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eEnvironment\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eAll dependencies and authentication are handled automatically by \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003erun.py\u003c/code\u003e:\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eFirst run creates \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e.venv\u003c/code\u003e and installs Python/Node.js dependencies\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eIf Google auth is missing or expired, a browser window opens automatically\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eNo manual pre-flight steps required\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eUsage\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e/nblm \u003ccommand\u003e [args]\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eCommands\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eNotebook Management\u003c/h4\u003e\n| Command | Description |\n|---------|-------------|\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003elogin\u003c/code\u003e | Authenticate with Google |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003estatus\u003c/code\u003e | Show auth and library status |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eaccounts\u003c/code\u003e | List all Google accounts |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eaccounts add\u003c/code\u003e | Add a new Google account |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eaccounts switch \u003cid\u003e\u003c/code\u003e | Switch active account (by index or email) |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eaccounts remove \u003cid\u003e\u003c/code\u003e | Remove an account |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003elocal\u003c/code\u003e | List notebooks in local library |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eremote\u003c/code\u003e | List all notebooks from NotebookLM API |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ecreate \u003cname\u003e\u003c/code\u003e | Create a new notebook |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edelete [--id ID]\u003c/code\u003e | Delete a notebook |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003erename \u003cname\u003e [--id ID]\u003c/code\u003e | Rename a notebook |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003esummary [--id ID]\u003c/code\u003e | Get AI-generated summary |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edescribe [--id ID]\u003c/code\u003e | Get description and suggested topics |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eadd \u003curl-or-id\u003e\u003c/code\u003e | Add notebook to local library (auto-detects URL vs notebook ID) |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eactivate \u003cid\u003e\u003c/code\u003e | Set active notebook |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eSource Management\u003c/h4\u003e\n| Command | Description |\n|---------|-------------|\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003esources [--id ID]\u003c/code\u003e | List sources in notebook |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eupload \u003cfile\u003e\u003c/code\u003e | Upload a single file |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eupload \u003cfolder\u003e\u003c/code\u003e | Sync a folder of files to NotebookLM |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eupload-zlib \u003curl\u003e\u003c/code\u003e | Download from Z-Library and upload |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eupload-url \u003curl\u003e\u003c/code\u003e | Add URL as source |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eupload-youtube \u003curl\u003e\u003c/code\u003e | Add YouTube video as source |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eupload-text \u003ctitle\u003e [--content TEXT]\u003c/code\u003e | Add text as source |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003esource-text \u003csource-id\u003e\u003c/code\u003e | Get full indexed text |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003esource-guide \u003csource-id\u003e\u003c/code\u003e | Get AI summary and keywords |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003esource-rename \u003csource-id\u003e \u003cname\u003e\u003c/code\u003e | Rename a source |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003esource-refresh \u003csource-id\u003e\u003c/code\u003e | Re-fetch URL content |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003esource-delete \u003csource-id\u003e\u003c/code\u003e | Delete a source |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eUpload options:\u003c/strong\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--use-active\u003c/code\u003e - Upload to the currently active notebook\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--create-new\u003c/code\u003e - Create a new notebook named after the file/folder\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--notebook-id \u003cid\u003e\u003c/code\u003e - Upload to a specific notebook\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--dry-run\u003c/code\u003e - Show sync plan without executing (folder sync)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--rebuild\u003c/code\u003e - Force rebuild tracking file (folder sync)\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eImportant:\u003c/strong\u003e When user runs upload without specifying a target, ASK them first:\n\u003e \"Would you like to upload to the active notebook, or create a new notebook?\"\nThen pass the appropriate flag (\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--use-active\u003c/code\u003e or \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--create-new\u003c/code\u003e).\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eChat \u0026 Audio/Media\u003c/h4\u003e\n| Command | Description |\n|---------|-------------|\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eask \u003cquestion\u003e\u003c/code\u003e | Query NotebookLM |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epodcast [--instructions TEXT]\u003c/code\u003e | Generate audio podcast |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epodcast-status \u003ctask-id\u003e\u003c/code\u003e | Check podcast generation status |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epodcast-download [output-path]\u003c/code\u003e | Download latest podcast |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ebriefing [--instructions TEXT]\u003c/code\u003e | Generate brief audio summary |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edebate [--instructions TEXT]\u003c/code\u003e | Generate debate-style audio |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eslides [--instructions TEXT]\u003c/code\u003e | Generate slide deck |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eslides-download [output-path]\u003c/code\u003e | Download slide deck as PDF |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003einfographic [--instructions TEXT]\u003c/code\u003e | Generate infographic |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003einfographic-download [output-path]\u003c/code\u003e | Download infographic |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003emedia-list [--type TYPE]\u003c/code\u003e | List generated media (audio/video/slides/infographic) |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003emedia-delete \u003cid\u003e\u003c/code\u003e | Delete a generated media item |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eCommand Routing\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eBased on \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e$ARGUMENTS\u003c/code\u003e, execute the appropriate command:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e$IF($ARGUMENTS,\n Parse the command from: \"$ARGUMENTS\"\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003elogin\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py auth_manager.py setup --service google\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003eaccounts\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py auth_manager.py accounts list\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003eaccounts add\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py auth_manager.py accounts add\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003eaccounts switch \u003cid\u003e\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py auth_manager.py accounts switch \"\u003cid\u003e\"\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003eaccounts remove \u003cid\u003e\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py auth_manager.py accounts remove \"\u003cid\u003e\"\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003estatus\u003c/strong\u003e β†’ Run both:\n - \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py auth_manager.py status\u003c/code\u003e\n - \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py notebook_manager.py list\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003elocal\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py notebook_manager.py list\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003eremote\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py nblm_cli.py notebooks\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003ecreate \u003cname\u003e\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py nblm_cli.py create \"\u003cname\u003e\"\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003edelete [--id ID]\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py nblm_cli.py delete \u003cargs\u003e\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003erename \u003cname\u003e [--id ID]\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py nblm_cli.py rename \"\u003cname\u003e\" \u003cargs\u003e\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003esummary [--id ID]\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py nblm_cli.py summary \u003cargs\u003e\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003edescribe [--id ID]\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py nblm_cli.py describe \u003cargs\u003e\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003eadd \u003curl-or-id\u003e\u003c/strong\u003e β†’ Smart add workflow (auto-detects URL vs notebook ID)\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003eactivate \u003cid\u003e\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py notebook_manager.py activate --id \"\u003cid\u003e\"\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003esources [--id ID]\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py nblm_cli.py sources \u003cargs\u003e\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003eupload \u003cfile\u003e\u003c/strong\u003e β†’ First ASK user: \"Upload to active notebook or create new?\" Then:\n - Active: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py source_manager.py add --file \"\u003cfile\u003e\" --use-active\u003c/code\u003e\n - New: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py source_manager.py add --file \"\u003cfile\u003e\" --create-new\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003eupload \u003cfolder\u003e\u003c/strong\u003e β†’ Sync a folder:\n - First ASK user: \"Sync to active notebook, create new, or specify notebook?\"\n - Active: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py source_manager.py sync \"\u003cfolder\u003e\" --use-active\u003c/code\u003e\n - New: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py source_manager.py sync \"\u003cfolder\u003e\" --create-new\u003c/code\u003e\n - Specific: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py source_manager.py sync \"\u003cfolder\u003e\" --notebook-id ID\u003c/code\u003e\n - Dry-run: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py source_manager.py sync \"\u003cfolder\u003e\" --dry-run\u003c/code\u003e\n - Rebuild: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py source_manager.py sync \"\u003cfolder\u003e\" --rebuild\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003eupload-zlib \u003curl\u003e\u003c/strong\u003e β†’ First ASK user: \"Upload to active notebook or create new?\" Then:\n - Active: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py source_manager.py add --url \"\u003curl\u003e\" --use-active\u003c/code\u003e\n - New: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py source_manager.py add --url \"\u003curl\u003e\" --create-new\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003eupload-url \u003curl\u003e\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py nblm_cli.py upload-url \"\u003curl\u003e\"\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003eupload-youtube \u003curl\u003e\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py nblm_cli.py upload-youtube \"\u003curl\u003e\"\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003eupload-text \u003ctitle\u003e\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py nblm_cli.py upload-text \"\u003ctitle\u003e\" \u003cargs\u003e\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003esource-text \u003cid\u003e\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py nblm_cli.py source-text \"\u003cid\u003e\"\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003esource-guide \u003cid\u003e\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py nblm_cli.py source-guide \"\u003cid\u003e\"\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003esource-rename \u003cid\u003e \u003cname\u003e\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py nblm_cli.py source-rename \"\u003cid\u003e\" \"\u003cname\u003e\"\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003esource-refresh \u003cid\u003e\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py nblm_cli.py source-refresh \"\u003cid\u003e\"\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003esource-delete \u003cid\u003e\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py nblm_cli.py source-delete \"\u003cid\u003e\"\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003eask \u003cquestion\u003e\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py nblm_cli.py ask \"\u003cquestion\u003e\"\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003epodcast\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py artifact_manager.py generate --format DEEP_DIVE \u003cargs\u003e\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003epodcast-status \u003ctask-id\u003e\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py artifact_manager.py status --task-id \"\u003ctask-id\u003e\"\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003epodcast-download [output-path]\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py artifact_manager.py download \"\u003coutput-path\u003e\"\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003ebriefing\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py artifact_manager.py generate --format BRIEF \u003cargs\u003e\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003edebate\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py artifact_manager.py generate --format DEBATE \u003cargs\u003e\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003eslides\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py artifact_manager.py generate-slides \u003cargs\u003e\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003eslides-download [output-path]\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py artifact_manager.py download \"\u003coutput-path\u003e\" --type slide-deck\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003einfographic\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py artifact_manager.py generate-infographic \u003cargs\u003e\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003einfographic-download [output-path]\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py artifact_manager.py download \"\u003coutput-path\u003e\" --type infographic\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003emedia-list [--type TYPE]\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py artifact_manager.py list \u003cargs\u003e\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e \u003cstrong style=\"color:#e5e7eb\"\u003emedia-delete \u003cid\u003e\u003c/strong\u003e β†’ \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py artifact_manager.py delete \"\u003cid\u003e\"\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e If command not recognized, show usage help.,\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e Show available commands with \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e/nblm\u003c/code\u003e (no arguments)\n)\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003ePodcast Options\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e/nblm podcast --length DEFAULT --wait --output ./podcast.mp3\n/nblm podcast --instructions \"Focus on the key findings\"\n/nblm briefing --wait --output ./summary.mp3\n/nblm debate --instructions \"Compare the two approaches\"\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Option | Values |\n|--------|--------|\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--length\u003c/code\u003e | \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eSHORT\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eDEFAULT\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eLONG\u003c/code\u003e |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--instructions\u003c/code\u003e | Custom instructions for the content |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--wait\u003c/code\u003e | Wait for generation to complete |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--output\u003c/code\u003e | Download path (requires \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--wait\u003c/code\u003e) |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eSlide Deck Options\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e/nblm slides --format DETAILED_DECK --wait --output ./presentation.pdf\n/nblm slides --instructions \"Focus on key diagrams\" --format PRESENTER_SLIDES\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Option | Values |\n|--------|--------|\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--format\u003c/code\u003e | \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eDETAILED_DECK\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ePRESENTER_SLIDES\u003c/code\u003e |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--length\u003c/code\u003e | \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eSHORT\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eDEFAULT\u003c/code\u003e |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--instructions\u003c/code\u003e | Custom instructions for the content |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--wait\u003c/code\u003e | Wait for generation to complete |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--output\u003c/code\u003e | Download path (requires \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--wait\u003c/code\u003e) |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eInfographic Options\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e/nblm infographic --orientation LANDSCAPE --wait --output ./visual.png\n/nblm infographic --instructions \"Highlight comparison\" --detail-level DETAILED\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Option | Values |\n|--------|--------|\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--orientation\u003c/code\u003e | \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eLANDSCAPE\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ePORTRAIT\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eSQUARE\u003c/code\u003e |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--detail-level\u003c/code\u003e | \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eCONCISE\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eSTANDARD\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eDETAILED\u003c/code\u003e |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--instructions\u003c/code\u003e | Custom instructions for the content |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--wait\u003c/code\u003e | Wait for generation to complete |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--output\u003c/code\u003e | Download path (requires \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--wait\u003c/code\u003e) |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eMedia Generation\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Command | Description | Output |\n|---------|-------------|--------|\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e/nblm podcast\u003c/code\u003e | Deep-dive audio discussion | MP3 |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e/nblm briefing\u003c/code\u003e | Brief audio summary | MP3 |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e/nblm debate\u003c/code\u003e | Debate-style audio | MP3 |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e/nblm slides\u003c/code\u003e | Slide deck presentation | PDF |\n| \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e/nblm infographic\u003c/code\u003e | Visual infographic | PNG |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eExamples\u003c/h4\u003e\n\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e/nblm podcast --wait --output ./deep-dive.mp3\n/nblm briefing --instructions \"Focus on chapter 3\" --wait\n/nblm debate --length LONG --wait --output ./debate.mp3\n/nblm slides --instructions \"Include key diagrams\" --format DETAILED_DECK --wait --output ./presentation.pdf\n/nblm infographic --orientation LANDSCAPE --detail-level DETAILED --wait --output ./summary.png\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eDownload \u0026 Manage\u003c/h4\u003e\n\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e/nblm podcast-download ./my-podcast.mp3\n/nblm slides-download ./presentation.pdf\n/nblm infographic-download ./visual.png\n/nblm media-list # List all generated media\n/nblm media-list --type audio # List only audio\n/nblm media-delete \u003cid\u003e # Delete a media item\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eExtended Documentation\u003c/h2\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eWhen to Use This Skill\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eTrigger when user:\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eMentions NotebookLM explicitly\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eShares NotebookLM URL (\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ehttps://notebooklm.google.com/notebook/...\u003c/code\u003e)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eAsks to query their notebooks/documentation\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eWants to add documentation to NotebookLM library\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eUses phrases like \"ask my NotebookLM\", \"check my docs\", \"query my notebook\"\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003e⚠️ CRITICAL: Add Command - Smart Discovery\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eThe add command now \u003cstrong style=\"color:#e5e7eb\"\u003eautomatically discovers metadata\u003c/strong\u003e from the notebook:\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e# Smart Add (auto-discovers name, description, topics)\npython scripts/run.py notebook_manager.py add \u003cnotebook-id-or-url\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eWith optional overrides\u003c/h2\u003e\npython scripts/run.py notebook_manager.py add \u003cid\u003e --name \"Custom Name\" --topics \"custom,topics\"\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eWhat Smart Add does:\u003c/strong\u003e\n1. Fetches notebook title from NotebookLM API\n2. Queries the notebook content to generate description and topics\n3. Adds to local library with discovered metadata\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eSupported input formats:\u003c/strong\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eNotebook ID: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e5fd9f36b-8000-401d-a7a0-7aa3f7832644\u003c/code\u003e\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eFull URL: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ehttps://notebooklm.google.com/notebook/5fd9f36b-8000-401d-a7a0-7aa3f7832644\u003c/code\u003e\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eNEVER manually specify \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--name\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--description\u003c/code\u003e, or \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--topics\u003c/code\u003e unless the user explicitly provides them.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eCritical: Always Use run.py Wrapper\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eNEVER call scripts directly. ALWAYS use \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py [script]\u003c/code\u003e:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e# βœ… CORRECT - Always use run.py:\npython scripts/run.py auth_manager.py status\npython scripts/run.py notebook_manager.py list\npython scripts/run.py ask_question.py --question \"...\"\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003e❌ WRONG - Never call directly:\u003c/h2\u003e\npython scripts/auth_manager.py status # Fails without venv!\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eThe \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003erun.py\u003c/code\u003e wrapper automatically:\n1. Creates \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e.venv\u003c/code\u003e if needed\n2. Installs all dependencies\n3. Activates environment\n4. Executes script properly\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eCore Workflow\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eStep 1: Check Authentication Status\u003c/h4\u003e\n\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython scripts/run.py auth_manager.py status\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eIf not authenticated, proceed to setup.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eStep 2: Authenticate (One-Time Setup)\u003c/h4\u003e\n\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e# Browser MUST be visible for manual Google login\npython scripts/run.py auth_manager.py setup\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eImportant:\u003c/strong\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eBrowser is VISIBLE for authentication\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eBrowser window opens automatically\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eUser must manually log in to Google\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eTell user: \"A browser window will open for Google login\"\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eStep 3: Manage Notebook Library\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e# List all notebooks\npython scripts/run.py notebook_manager.py list\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eBEFORE ADDING: Ask user for metadata if unknown!\u003c/h2\u003e\n\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003e\"What does this notebook contain?\"\u003c/h2\u003e\n\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003e\"What topics should I tag it with?\"\u003c/h2\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eAdd notebook to library (ALL parameters are REQUIRED!)\u003c/h2\u003e\npython scripts/run.py notebook_manager.py add \\\n --url \"https://notebooklm.google.com/notebook/...\" \\\n --name \"Descriptive Name\" \\\n --description \"What this notebook contains\" \\ # REQUIRED - ASK USER IF UNKNOWN!\n --topics \"topic1,topic2,topic3\" # REQUIRED - ASK USER IF UNKNOWN!\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eSearch notebooks by topic\u003c/h2\u003e\npython scripts/run.py notebook_manager.py search --query \"keyword\"\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eSet active notebook\u003c/h2\u003e\npython scripts/run.py notebook_manager.py activate --id notebook-id\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eRemove notebook\u003c/h2\u003e\npython scripts/run.py notebook_manager.py remove --id notebook-id\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eQuick Workflow\u003c/h4\u003e\n1. Check library: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py notebook_manager.py list\u003c/code\u003e\n2. Ask question: \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py ask_question.py --question \"...\" --notebook-id ID\u003c/code\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eStep 4: Ask Questions\u003c/h4\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e# Basic query (uses active notebook if set)\npython scripts/run.py ask_question.py --question \"Your question here\"\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eQuery specific notebook\u003c/h2\u003e\npython scripts/run.py ask_question.py --question \"...\" --notebook-id notebook-id\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eQuery with notebook URL directly\u003c/h2\u003e\npython scripts/run.py ask_question.py --question \"...\" --notebook-url \"https://...\"\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eShow browser for debugging\u003c/h2\u003e\npython scripts/run.py ask_question.py --question \"...\" --show-browser\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eFollow-Up Mechanism (CRITICAL)\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eEvery NotebookLM answer ends with: \u003cstrong style=\"color:#e5e7eb\"\u003e\"EXTREMELY IMPORTANT: Is that ALL you need to know?\"\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eRequired Claude Behavior:\u003c/strong\u003e\n1. \u003cstrong style=\"color:#e5e7eb\"\u003eSTOP\u003c/strong\u003e - Do not immediately respond to user\n2. \u003cstrong style=\"color:#e5e7eb\"\u003eANALYZE\u003c/strong\u003e - Compare answer to user's original request\n3. \u003cstrong style=\"color:#e5e7eb\"\u003eIDENTIFY GAPS\u003c/strong\u003e - Determine if more information needed\n4. \u003cstrong style=\"color:#e5e7eb\"\u003eASK FOLLOW-UP\u003c/strong\u003e - If gaps exist, immediately ask:\n \u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e python scripts/run.py ask_question.py --question \"Follow-up with context...\"\n \u003c/code\u003e\u003c/pre\u003e\n5. \u003cstrong style=\"color:#e5e7eb\"\u003eREPEAT\u003c/strong\u003e - Continue until information is complete\n6. \u003cstrong style=\"color:#e5e7eb\"\u003eSYNTHESIZE\u003c/strong\u003e - Combine all answers before responding to user\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eZ-Library Integration\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eTriggers\u003c/h4\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eUser provides Z-Library URL (zlib.li, z-lib.org, zh.zlib.li)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eUser says \"download this book to NotebookLM\"\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eUser says \"add this book from Z-Library\"\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eSetup (One-Time)\u003c/h4\u003e\n\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e# Authenticate with Z-Library\npython scripts/run.py auth_manager.py setup --service zlibrary\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eCommands\u003c/h4\u003e\n\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e# Add book from Z-Library\npython scripts/run.py source_manager.py add --url \"https://zh.zlib.li/book/...\"\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eCheck Z-Library auth status\u003c/h2\u003e\npython scripts/run.py auth_manager.py status --service zlibrary\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eScript Reference\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eAuthentication Management (\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eauth_manager.py\u003c/code\u003e)\u003c/h4\u003e\n\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython scripts/run.py auth_manager.py setup # Default: Google\npython scripts/run.py auth_manager.py setup --service google\npython scripts/run.py auth_manager.py setup --service zlibrary\npython scripts/run.py auth_manager.py status # Show all services\npython scripts/run.py auth_manager.py status --service zlibrary\npython scripts/run.py auth_manager.py clear --service zlibrary # Clear auth\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eMulti-Account Management (Google)\u003c/h2\u003e\npython scripts/run.py auth_manager.py accounts list # List all accounts\npython scripts/run.py auth_manager.py accounts add # Add new account\npython scripts/run.py auth_manager.py accounts switch 1 # Switch by index\npython scripts/run.py auth_manager.py accounts switch user@gmail.com # Switch by email\npython scripts/run.py auth_manager.py accounts remove 2 # Remove account\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eNotebook Management (\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003enotebook_manager.py\u003c/code\u003e)\u003c/h4\u003e\n\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython scripts/run.py notebook_manager.py add --url URL --name NAME --description DESC --topics TOPICS\n\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eOR use notebook ID directly:\u003c/h2\u003e\npython scripts/run.py notebook_manager.py add --notebook-id ID --name NAME --description DESC --topics TOPICS\npython scripts/run.py notebook_manager.py list\npython scripts/run.py notebook_manager.py search --query QUERY\npython scripts/run.py notebook_manager.py activate --id ID\npython scripts/run.py notebook_manager.py remove --id ID\npython scripts/run.py notebook_manager.py stats\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eQuestion Interface (\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eask_question.py\u003c/code\u003e)\u003c/h4\u003e\n\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython scripts/run.py ask_question.py --question \"...\" [--notebook-id ID] [--notebook-url URL] [--show-browser]\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eSource Manager (\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003esource_manager.py\u003c/code\u003e)\u003c/h4\u003e\n\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e# Upload to active notebook\npython scripts/run.py source_manager.py add --file \"/path/to/book.pdf\" --use-active\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eCreate new notebook for upload\u003c/h2\u003e\npython scripts/run.py source_manager.py add --file \"/path/to/book.pdf\" --create-new\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eUpload to specific notebook\u003c/h2\u003e\npython scripts/run.py source_manager.py add --file \"/path/to/book.pdf\" --notebook-id NOTEBOOK_ID\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eZ-Library download and upload\u003c/h2\u003e\npython scripts/run.py source_manager.py add --url \"https://zh.zlib.li/book/...\" --use-active\npython scripts/run.py source_manager.py add --url \"https://zh.zlib.li/book/...\" --create-new\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eSync a folder (new!)\u003c/h2\u003e\npython scripts/run.py source_manager.py sync \"/path/to/docs\" --use-active\npython scripts/run.py source_manager.py sync \"/path/to/docs\" --create-new\npython scripts/run.py source_manager.py sync \"/path/to/docs\" --notebook-id NOTEBOOK_ID\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eSync options (new!)\u003c/h2\u003e\npython scripts/run.py source_manager.py sync \"/path/to/docs\" --dry-run # Preview only\npython scripts/run.py source_manager.py sync \"/path/to/docs\" --rebuild # Force re-hash all files\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eFolder Sync:\u003c/strong\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eScans folder for supported types: PDF, TXT, MD, DOCX, HTML, EPUB\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eTracks sync state internally (no per-folder tracking file to manage)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eSync strategy: add new, update modified (delete + re-upload), skip unchanged\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eMulti-account aware (tracks which Google account was used)\u003c/li\u003e\n\u003cstrong style=\"color:#e5e7eb\"\u003eNote:\u003c/strong\u003e One of \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--use-active\u003c/code\u003e, \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--create-new\u003c/code\u003e, or \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e--notebook-id\u003c/code\u003e is REQUIRED.\nUploads wait for NotebookLM processing and print progress as \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eReady: N/T\u003c/code\u003e. Press Ctrl+C to stop waiting.\nLocal file uploads use browser automation and require Google authentication.\nIf browser automation is unavailable, set \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eNOTEBOOKLM_UPLOAD_MODE=text\u003c/code\u003e to upload extracted text instead (PDFs require \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epypdf\u003c/code\u003e).\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eData Cleanup (\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ecleanup_manager.py\u003c/code\u003e)\u003c/h4\u003e\n\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython scripts/run.py cleanup_manager.py # Preview cleanup\npython scripts/run.py cleanup_manager.py --confirm # Execute cleanup\npython scripts/run.py cleanup_manager.py --preserve-library # Keep notebooks\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eWatchdog Status (\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eauth_manager.py\u003c/code\u003e)\u003c/h4\u003e\n\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython scripts/run.py auth_manager.py watchdog-status\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eEnvironment Management\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eThe virtual environment is automatically managed:\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eFirst run creates \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e.venv\u003c/code\u003e automatically\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eDependencies install automatically\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eNode.js dependencies install automatically\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eagent-browser daemon starts on demand and keeps browser state in memory\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003edaemon stops after 10 minutes of inactivity (any agent-browser command resets the timer)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eset \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eAGENT_BROWSER_OWNER_PID\u003c/code\u003e to auto-stop when the agent process exits\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003escripts/run.py\u003c/code\u003e sets \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eAGENT_BROWSER_OWNER_PID\u003c/code\u003e to its parent PID by default\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eEverything isolated in skill directory\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eManual setup (only if automatic fails):\n\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003epython -m venv .venv\nsource .venv/bin/activate # Linux/Mac\npip install -r requirements.txt\nnpm install\nnpm run install-browsers\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eData Storage\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eAll data stored in \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e~/.claude/skills/notebooklm/data/\u003c/code\u003e:\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003elibrary.json\u003c/code\u003e - Notebook metadata (with account associations)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eauth/google/\u003c/code\u003e - Multi-account Google auth\u003c/li\u003e\n - \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eindex.json\u003c/code\u003e - Account index (active account, list)\n - \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e\u003cn\u003e-\u003cemail\u003e.json\u003c/code\u003e - Per-account credentials\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eauth/zlibrary.json\u003c/code\u003e - Z-Library auth state\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eagent_browser/session_id\u003c/code\u003e - Current daemon session ID\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eagent_browser/last_activity.json\u003c/code\u003e - Last activity timestamp for idle shutdown\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eagent_browser/watchdog.pid\u003c/code\u003e - Idle watchdog process ID\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eSecurity:\u003c/strong\u003e Protected by \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e.gitignore\u003c/code\u003e, never commit to git.\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eConfiguration\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003eOptional \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e.env\u003c/code\u003e file in skill directory:\n\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003eHEADLESS=false # Browser visibility\nSHOW_BROWSER=false # Default browser display\nSTEALTH_ENABLED=true # Human-like behavior\nTYPING_WPM_MIN=160 # Typing speed\nTYPING_WPM_MAX=240\nDEFAULT_NOTEBOOK_ID= # Default notebook\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eDecision Flow\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003eUser mentions NotebookLM\n ↓\nCheck auth β†’ python scripts/run.py auth_manager.py status\n ↓\nIf not authenticated β†’ python scripts/run.py auth_manager.py setup\n ↓\nCheck/Add notebook β†’ python scripts/run.py notebook_manager.py list/add (with --description)\n ↓\nActivate notebook β†’ python scripts/run.py notebook_manager.py activate --id ID\n ↓\nAsk question β†’ python scripts/run.py ask_question.py --question \"...\"\n ↓\nSee \"Is that ALL you need?\" β†’ Ask follow-ups until complete\n ↓\nSynthesize and respond to user\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eTroubleshooting\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e| Problem | Solution |\n|---------|----------|\n| ModuleNotFoundError | Use \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003erun.py\u003c/code\u003e wrapper |\n| Authentication fails | Browser must be visible for setup! --show-browser |\n| DAEMON_UNAVAILABLE | Ensure Node.js/npm installed, run \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003enpm install\u003c/code\u003e, retry |\n| AUTH_REQUIRED | Run \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py auth_manager.py setup\u003c/code\u003e |\n| ELEMENT_NOT_FOUND | Verify notebook URL and re-run with fresh page load |\n| Rate limit (50/day) | Wait or add another Google account with \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eaccounts add\u003c/code\u003e |\n| Browser crashes | \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003epython scripts/run.py cleanup_manager.py --preserve-library\u003c/code\u003e |\n| Notebook not found | Check with \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003enotebook_manager.py list\u003c/code\u003e |\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eBest Practices\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e1. \u003cstrong style=\"color:#e5e7eb\"\u003eAlways use run.py\u003c/strong\u003e - Handles environment automatically\n2. \u003cstrong style=\"color:#e5e7eb\"\u003eCheck auth first\u003c/strong\u003e - Before any operations\n3. \u003cstrong style=\"color:#e5e7eb\"\u003eFollow-up questions\u003c/strong\u003e - Don't stop at first answer\n4. \u003cstrong style=\"color:#e5e7eb\"\u003eBrowser visible for auth\u003c/strong\u003e - Required for manual login\n5. \u003cstrong style=\"color:#e5e7eb\"\u003eInclude context\u003c/strong\u003e - Each question is independent\n6. \u003cstrong style=\"color:#e5e7eb\"\u003eSynthesize answers\u003c/strong\u003e - Combine multiple responses\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eLimitations\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eNo session persistence (each question = new browser)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eRate limits on free Google accounts (50 queries/day per account; use multiple accounts to increase)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eManual upload required (user must add docs to NotebookLM)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003eBrowser overhead (few seconds per question)\u003c/li\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch3 style=\"color:#e5e7eb;margin:18px 0 8px;font-size:1.05em\"\u003eResources (Skill Structure)\u003c/h3\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cstrong style=\"color:#e5e7eb\"\u003eImportant directories and files:\u003c/strong\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003escripts/\u003c/code\u003e - All automation scripts (ask_question.py, notebook_manager.py, etc.)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003edata/\u003c/code\u003e - Local storage for authentication and notebook library\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003ereferences/\u003c/code\u003e - Extended documentation:\u003c/li\u003e\n - \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eapi_reference.md\u003c/code\u003e - Detailed API documentation for all scripts\n - \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003etroubleshooting.md\u003c/code\u003e - Common issues and solutions\n - \u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003eusage_patterns.md\u003c/code\u003e - Best practices and workflow examples\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e.venv/\u003c/code\u003e - Isolated Python environment (auto-created on first run)\u003c/li\u003e\n\u003cli style=\"color:#94a3b8;margin:3px 0\"\u003e\u003ccode style=\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\"\u003e.gitignore\u003c/code\u003e - Protects sensitive data from being committed\u003c/li\u003e\n\u003c/p\u003e"])</script><script>self.__next_f.push([1,"20:[\"$\",\"div\",null,{\"className\":\"skill-page\",\"children\":[[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"SoftwareApplication\\\",\\\"name\\\":\\\"NotebookLM Skill\\\",\\\"description\\\":\\\"Use this skill to query your Google NotebookLM notebooks directly from Claude Code for source-grounded, citation-backed answers from Gemini. Browser automati...\\\",\\\"url\\\":\\\"https://bytesagain.com/skill/nblm\\\",\\\"applicationCategory\\\":\\\"clawhub\\\",\\\"operatingSystem\\\":\\\"Any\\\",\\\"offers\\\":{\\\"@type\\\":\\\"Offer\\\",\\\"price\\\":\\\"0\\\",\\\"priceCurrency\\\":\\\"USD\\\"},\\\"publisher\\\":{\\\"@type\\\":\\\"Organization\\\",\\\"name\\\":\\\"BytesAgain\\\",\\\"url\\\":\\\"https://bytesagain.com\\\"}}\"}}],[\"$\",\"div\",null,{\"className\":\"breadcrumb\",\"children\":[[\"$\",\"a\",null,{\"href\":\"/\",\"children\":\"BytesAgain\"}],\" β€Ί \",[\"$\",\"a\",null,{\"href\":\"/skills\",\"children\":\"Skills\"}],\" β€Ί \",\"NotebookLM Skill\"]}],[\"$\",\"div\",null,{\"className\":\"two-col\",\"children\":[[\"$\",\"div\",null,{\"className\":\"two-col-main\",\"children\":[[\"$\",\"div\",null,{\"className\":\"skill-card\",\"children\":[[\"$\",\"div\",null,{\"className\":\"skill-header\",\"children\":[[\"$\",\"div\",null,{\"className\":\"skill-badges\",\"children\":[[\"$\",\"span\",null,{\"className\":\"badge\",\"style\":{\"color\":\"#818cf8\",\"background\":\"#818cf822\",\"borderColor\":\"#818cf844\"},\"children\":[\"πŸ¦€\",\" \",\"ClawHub\"]}],false]}],[\"$\",\"div\",null,{\"className\":\"skill-top-actions\",\"children\":[\"$\",\"$L22\",null,{\"slug\":\"nblm\"}]}]]}],[\"$\",\"h1\",null,{\"className\":\"skill-title\",\"children\":\"NotebookLM Skill\"}],[\"$\",\"p\",null,{\"className\":\"skill-owner\",\"children\":[\"by \",[\"$\",\"span\",null,{\"children\":[\"@\",\"magicseek\"]}]]}],[\"$\",\"p\",null,{\"className\":\"skill-desc\",\"children\":\"Use this skill to query your Google NotebookLM notebooks directly from Claude Code for source-grounded, citation-backed answers from Gemini. Browser automati...\"}],[\"$\",\"div\",null,{\"className\":\"skill-meta\",\"children\":[[\"$\",\"div\",null,{\"className\":\"meta-item\",\"children\":[[\"$\",\"span\",null,{\"className\":\"meta-label\",\"children\":\"Version\"}],[\"$\",\"span\",null,{\"className\":\"meta-value\",\"children\":[\"v\",\"1.0.1\"]}]]}],[\"$\",\"div\",null,{\"className\":\"meta-item\",\"children\":[[\"$\",\"span\",null,{\"className\":\"meta-label\",\"children\":\"Downloads\"}],[\"$\",\"span\",null,{\"className\":\"meta-value\",\"children\":\"2,136\"}]]}],[\"$\",\"div\",null,{\"className\":\"meta-item\",\"children\":[[\"$\",\"span\",null,{\"className\":\"meta-label\",\"children\":\"Installs\"}],[\"$\",\"span\",null,{\"className\":\"meta-value\",\"children\":\"8\"}]]}],[\"$\",\"div\",null,{\"className\":\"meta-item\",\"children\":[[\"$\",\"span\",null,{\"className\":\"meta-label\",\"children\":\"Stars\"}],[\"$\",\"span\",null,{\"className\":\"meta-value\",\"children\":[\"⭐ \",\"3\"]}]]}],false,[\"$\",\"div\",null,{\"className\":\"meta-item\",\"style\":{\"flexDirection\":\"row\",\"gap\":6,\"alignItems\":\"center\"},\"children\":[[\"$\",\"a\",\"clawhub\",{\"href\":\"/?q=clawhub\",\"className\":\"tag\",\"children\":[\"#\",\"clawhub\"]}]]}]]}],[\"$\",\"div\",null,{\"style\":{\"marginTop\":6},\"children\":[\"$\",\"a\",null,{\"href\":\"https://clawhub.ai/magicseek/nblm\",\"target\":\"_blank\",\"rel\":\"noopener\",\"className\":\"btn-secondary\",\"style\":{\"padding\":\"6px 12px\",\"fontSize\":\".82em\",\"borderRadius\":8,\"background\":\"transparent\",\"border\":\"1px solid var(--border-card)\",\"color\":\"var(--text-muted2)\",\"textDecoration\":\"none\",\"whiteSpace\":\"nowrap\"},\"children\":[\"View on \",\"ClawHub\",\" β†’\"]}]}]]}],[\"$\",\"div\",null,{\"className\":\"install-box\",\"children\":[[\"$\",\"div\",null,{\"className\":\"install-header\",\"children\":[[\"$\",\"div\",null,{\"className\":\"install-dots\",\"children\":[[\"$\",\"div\",null,{\"className\":\"dot\",\"style\":{\"background\":\"#ef4444\"}}],[\"$\",\"div\",null,{\"className\":\"dot\",\"style\":{\"background\":\"#eab308\"}}],[\"$\",\"div\",null,{\"className\":\"dot\",\"style\":{\"background\":\"#22c55e\"}}]]}],[\"$\",\"span\",null,{\"className\":\"install-label\",\"children\":\"TERMINAL\"}]]}],[\"$\",\"div\",null,{\"className\":\"install-body\",\"style\":{\"flexWrap\":\"wrap\"},\"children\":[[\"$\",\"code\",null,{\"className\":\"install-cmd\",\"children\":\"clawhub install nblm\"}],[\"$\",\"button\",null,{\"className\":\"copy-btn\",\"data-cmd\":\"clawhub install nblm\",\"style\":{\"fontWeight\":700},\"children\":\"Copy\"}]]}]]}],[\"$\",\"section\",null,{\"className\":\"skill-card\",\"style\":{\"marginBottom\":20},\"children\":[[\"$\",\"h2\",null,{\"style\":{\"color\":\"#f8fafc\",\"fontSize\":\"1.2em\",\"fontWeight\":800,\"margin\":\"0 0 16px\",\"display\":\"flex\",\"alignItems\":\"center\",\"gap\":8},\"children\":\"πŸ“– About This Skill\"}],[\"$\",\"div\",null,{\"style\":{\"fontSize\":\".92em\",\"color\":\"#94a3b8\",\"lineHeight\":1.75},\"dangerouslySetInnerHTML\":{\"__html\":\"$23\"}}]]}],null,\"$L24\",\"$L25\",\"$L26\",null,null,null,false,false]}],\"$L27\"]}]]}]\n"])</script><script>self.__next_f.push([1,"21:[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n document.querySelectorAll('.copy-btn, .script-copy-btn').forEach(btn =\u003e {\\n btn.addEventListener('click', () =\u003e {\\n const cmd = btn.getAttribute('data-cmd');\\n if (!cmd) return;\\n navigator.clipboard.writeText(cmd).then(() =\u003e {\\n const orig = btn.textContent;\\n btn.textContent = 'Copied!';\\n setTimeout(() =\u003e btn.textContent = orig, 1500);\\n }).catch(() =\u003e {});\\n });\\n });\\n \"}}]\n"])</script><script>self.__next_f.push([1,"29:I[71521,[\"/_next/static/chunks/0ph_0rx9ah5dc.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/0i_x3w546rsb3.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/06ig5gym-0n-u.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\",\"/_next/static/chunks/12w5ognupk9fb.js?dpl=dpl_9zPFH6pojPkqyspdDNz28GzCc6KQ\"],\"default\"]\n28:T5ab,"])</script><script>self.__next_f.push([1,"\u003cp style=\"margin:8px 0\"\u003e\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e/nblm podcast --wait --output ./deep-dive.mp3\n/nblm briefing --instructions \"Focus on chapter 3\" --wait\n/nblm debate --length LONG --wait --output ./debate.mp3\n/nblm slides --instructions \"Include key diagrams\" --format DETAILED_DECK --wait --output ./presentation.pdf\n/nblm infographic --orientation LANDSCAPE --detail-level DETAILED --wait --output ./summary.png\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch4 style=\"color:#d1d5db;margin:14px 0 6px;font-size:.95em\"\u003eDownload \u0026 Manage\u003c/h4\u003e\n\u003cpre style=\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\"\u003e\u003ccode style=\"color:#a5f3fc;background:none;padding:0;font-size:1em\"\u003e/nblm podcast-download ./my-podcast.mp3\n/nblm slides-download ./presentation.pdf\n/nblm infographic-download ./visual.png\n/nblm media-list # List all generated media\n/nblm media-list --type audio # List only audio\n/nblm media-delete \u003cid\u003e # Delete a media item\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003chr style=\"border:none;border-top:1px solid #1e1e3f;margin:12px 0\"\u003e\u003c/p\u003e\u003cp style=\"margin:8px 0\"\u003e\u003ch2 style=\"color:#f3f4f6;margin:20px 0 10px;font-size:1.15em\"\u003eExtended Documentation\u003c/h2\u003e\u003c/p\u003e"])</script><script>self.__next_f.push([1,"24:[\"$\",\"section\",null,{\"className\":\"skill-card\",\"style\":{\"marginBottom\":20},\"children\":[[\"$\",\"h2\",null,{\"style\":{\"color\":\"#f8fafc\",\"fontSize\":\"1.2em\",\"fontWeight\":800,\"margin\":\"0 0 16px\",\"display\":\"flex\",\"alignItems\":\"center\",\"gap\":8},\"children\":\"πŸ’‘ Examples\"}],[\"$\",\"div\",null,{\"style\":{\"fontSize\":\".92em\",\"color\":\"#94a3b8\",\"lineHeight\":1.75},\"dangerouslySetInnerHTML\":{\"__html\":\"$28\"}}]]}]\n25:[\"$\",\"section\",null,{\"className\":\"skill-card\",\"style\":{\"marginBottom\":20},\"children\":[[\"$\",\"h2\",null,{\"style\":{\"color\":\"#f8fafc\",\"fontSize\":\"1.2em\",\"fontWeight\":800,\"margin\":\"0 0 16px\",\"display\":\"flex\",\"alignItems\":\"center\",\"gap\":8},\"children\":\"βš™οΈ Configuration\"}],[\"$\",\"div\",null,{\"style\":{\"fontSize\":\".92em\",\"color\":\"#94a3b8\",\"lineHeight\":1.75},\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cp style=\\\"margin:8px 0\\\"\u003eOptional \u003ccode style=\\\"background:#0d0d1e;color:#a5f3fc;padding:1px 5px;border-radius:3px;font-size:.88em\\\"\u003e.env\u003c/code\u003e file in skill directory:\\n\u003cpre style=\\\"background:#0a0a1c;border:1px solid #1e1e3f;border-radius:6px;padding:10px 12px;overflow-x:auto;font-size:.9em;margin:8px 0\\\"\u003e\u003ccode style=\\\"color:#a5f3fc;background:none;padding:0;font-size:1em\\\"\u003eHEADLESS=false # Browser visibility\\nSHOW_BROWSER=false # Default browser display\\nSTEALTH_ENABLED=true # Human-like behavior\\nTYPING_WPM_MIN=160 # Typing speed\\nTYPING_WPM_MAX=240\\nDEFAULT_NOTEBOOK_ID= # Default notebook\\n\u003c/code\u003e\u003c/pre\u003e\u003c/p\u003e\"}}]]}]\n26:[\"$\",\"section\",null,{\"className\":\"skill-card\",\"style\":{\"marginBottom\":20},\"children\":[[\"$\",\"h2\",null,{\"style\":{\"color\":\"#f8fafc\",\"fontSize\":\"1.2em\",\"fontWeight\":800,\"margin\":\"0 0 16px\",\"display\":\"flex\",\"alignItems\":\"center\",\"gap\":8},\"children\":\"πŸ“‹ Tips \u0026 Best Practices\"}],[\"$\",\"div\",null,{\"style\":{\"fontSize\":\".92em\",\"color\":\"#94a3b8\",\"lineHeight\":1.75},\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cp style=\\\"margin:8px 0\\\"\u003e1. \u003cstrong style=\\\"color:#e5e7eb\\\"\u003eAlways use run.py\u003c/strong\u003e - Handles environment automatically\\n2. \u003cstrong style=\\\"color:#e5e7eb\\\"\u003eCheck auth first\u003c/strong\u003e - Before any operations\\n3. \u003cstrong style=\\\"color:#e5e7eb\\\"\u003eFollow-up questions\u003c/strong\u003e - Don't stop at first answer\\n4. \u003cstrong style=\\\"color:#e5e7eb\\\"\u003eBrowser visible for auth\u003c/strong\u003e - Required for manual login\\n5. \u003cstrong style=\\\"color:#e5e7eb\\\"\u003eInclude context\u003c/strong\u003e - Each question is independent\\n6. \u003cstrong style=\\\"color:#e5e7eb\\\"\u003eSynthesize answers\u003c/strong\u003e - Combine multiple responses\u003c/p\u003e\"}}]]}]\n27:[\"$\",\"div\",null,{\"className\":\"two-col-side\",\"children\":[\"$\",\"$L29\",null,{\"category\":\"clawhub\",\"currentSlug\":\"nblm\",\"name\":\"NotebookLM Skill\",\"tags\":[\"clawhub\"]}]}]\n"])</script></body></html>