Turn one document into a kawaii NotebookLM slide-deck PDF. Use for "wowerpoint this", "make a deck about <file>", "turn this report into slides", or any request to render a single document as shareable narrative slides.
Installs just this skill. Get the whole plugin for auto-invocation.
β‘ How it fires
How this skill gets triggered: by you, by Claude, or both.
Fires itselfClaude auto-loads it when your prompt matches the work.
You can call itInvoke it directly when you want it.
Slash command/wowerpoint
ποΈ Context preview
The summary Claude sees to decide when to auto-load this skill.
Turn one document into a kawaii NotebookLM slide-deck PDF. Use for "wowerpoint this", "make a deck about <file>", "turn this report into slides", or any request to render a single document as shareable narrative slides.
π Stats
Stars88,343
Forks7,668
LanguageJavaScript
LicenseApache-2.0
π¦ Ships with claude-mem
</> SKILL.md
wowerpoint.SKILL.md
---name: wowerpoint
description: Turn one document into a kawaii NotebookLM slide-deck PDF. Use for "wowerpoint this", "make a deck about <file>", "turn this report into slides", or any request to render a single document as shareable narrative slides.
---# Wowerpoint
One doc in, one PDF out. Slide-deck only β videos and podcasts from the same engine are noticeably worse and out of scope; refer the user to the `notebooklm` CLI directly if they want those.
## Triggers
- "Wowerpoint <file>"
- "Make a slide deck about <file>"
- "Turn this report into slides"
- "Kawaii-deck this"
## Setup (one-time per machine)
If `notebooklm auth check` returns 0 and `command -v jq` resolves, skip.
```bash
uv tool install --with playwright --force notebooklm-py
$(uv tool dir)/notebooklm-py/bin/playwright install chromium
```
`jq` is required by the workflow's JSON parsing; install if missing (`brew install jq` on macOS, or your distro's package manager).
Then the user authenticates interactively β do not script. Tell them to type `! notebooklm login` so the OAuth ENTER lands in their terminal.
## Workflow
### 1. The source doc
You need exactly one source doc. If it doesn't exist or is too thin to carry a deck, **write it first** β use mem-search and sequential thinking to make it comprehensive (long-form, narrative, several thousand words is normal). Do not paper over a weak source by adding more sources.
The subagent's completion notification fires when the file is on disk.
## Output path
Adjacent to the source, parallel filename:
```text
<source-dir>/<source-stem>-slides.pdf
```
If the source isn't somewhere that makes sense as an output location, default to `reports/<stem>-slides.pdf`.
## Share link (WOWerpoint Server)
After the PDF lands on disk, the subagent also POSTs it to the WOWerpoint Server, which converts the 16:9 deck into a 9:16 mobile twin and returns a share URL. The share URL is the primary deliverable to the user; the PDF on disk is the backup.
Required env (exported in the user's shell β the subagent inherits the parent's environment, so plain `export` is enough; no dotenv loader runs):
If any var is missing, skip the share-link step and just hand the PDF over.
Upload pattern (run AFTER the subagent confirms the PDF exists on disk). Capture the full response so empty `id` and `error` payloads are handled β `jq -r '.id'` returns the literal string `null` on a missing key, so always pipe through `.id // empty`:
```bash
if [ -n "$WOWERPOINT_API_BASE" ] && [ -n "$WOWERPOINT_UPLOAD_TOKEN" ] && [ -n "$WOWERPOINT_VIEWER_BASE" ]; then
UPLOAD_JSON=$(curl -sS --connect-timeout 10 --max-time 30 -X POST "$WOWERPOINT_API_BASE/api/decks" \
The returned `id` is a kebab-case slug derived from the title with a random creature suffix (e.g. `tokenrouter-quest-hawk`, or `velvet-comet-tiger` if the title is empty or non-ASCII). The share URL is:
```text
$WOWERPOINT_VIEWER_BASE/d/<id>
```
It works immediately (shows a "still convertingβ¦" page that auto-reloads when ready). Conversion takes ~1β2 min per slide. Print the share URL in your final response.
## The prompt
One sentence. Default:
```text
Use kawaii characters to tell the story of <subject>. Keep it warm and clear.
```
Replace `<subject>` with a one-phrase description from the source doc's H1 or the user's framing. If the user supplies their own prompt, pass it through verbatim β don't expand it.
## Subagent template (copy-paste, parameterize)
```text
You're handling NotebookLM slide-deck generation. Work in `<repo-absolute-path>`.
Context:
- The `notebooklm` CLI is installed and authenticated (parent verified with `notebooklm auth check`).
- A notebook and source already exist.
Inputs:
- Notebook ID: `<NOTEBOOK_ID>`
- Source ID: `<SOURCE_ID>`
- Generation prompt: `<PROMPT>`
- Output path: `<OUTPUT_PATH>`
- Deck title: `<TITLE>` (the notebook title, used by the share-link step)
4. Download: `notebooklm download slide-deck <OUTPUT_PATH> -a <task_id> -n <NOTEBOOK_ID>`
5. Verify: `ls -la <OUTPUT_PATH>` confirms the file exists.
6. Upload to WOWerpoint Server for a mobile share link. Skip silently if any of `WOWERPOINT_API_BASE`, `WOWERPOINT_UPLOAD_TOKEN`, or `WOWERPOINT_VIEWER_BASE` is unset. Otherwise:
```bash
if [ -n "$WOWERPOINT_API_BASE" ] && [ -n "$WOWERPOINT_UPLOAD_TOKEN" ] && [ -n "$WOWERPOINT_VIEWER_BASE" ]; then
UPLOAD_JSON=$(curl -sS --connect-timeout 10 --max-time 30 -X POST "$WOWERPOINT_API_BASE/api/decks" \
On warning, the PDF on disk is still a valid deliverable β do not retry the upload.
Report briefly (under 200 words):
- Final artifact ID
- Time per phase (source wait, generation, render wait, download)
- Output file path + size
- Share URL (if produced)
- Any retries or warnings
- Exact error message if any step failed
Do NOT poll status manually. The `wait` commands handle backoff.
```
## Failure modes
- **`pip: command not found`** β modern macOS doesn't ship pip on PATH. Use `uv tool install`.
- **`Playwright not installed`** β install `notebooklm-py` with `--with playwright`, then `playwright install chromium`.
- **`Run 'notebooklm login' to authenticate`** β only the user can complete OAuth.
- **`task_id` parsed as empty string** β wrong JSON envelope key. `generate` returns `{"task_id": "..."}` at top level.
- **Rate-limit (`GENERATION_FAILED` or "No result found for RPC ID")** β `--retry 2` handles transients; persistent failure means wait 5β10 minutes or fall back to the web UI.
- **Source upload denied for sensitive docs** β confirm before adding sources containing credentials, customer data, or unreleased product info. NotebookLM is a Google service.
- **`--length long` does not exist** β only `default|short`. If the user asks for "long slides," use `default` and explain.
- **No `--style` flag** β kawaii lives in the prompt text.
## Operational tips
- **Rerun cheaply** β once the notebook + source exist, regenerating with a different prompt only repeats generation + download. Reuse `NOTEBOOK_ID` and `SOURCE_ID`.
- **Web UI fallback** β if generation is rate-limited >30 minutes, open the notebook URL, trigger generation in the UI, then `notebooklm artifact list -n <NOTEBOOK_ID>` and `download`.