Paper Slide Deck Generator
Transform academic papers and content into professional slide deck images with automatic figure extraction.
Usage
/paper-slide-deck path/to/paper.pdf
/paper-slide-deck path/to/paper.pdf --style academic-paper
/paper-slide-deck path/to/content.md --style sketch-notes
/paper-slide-deck path/to/content.md --audience executives
/paper-slide-deck path/to/content.md --lang zh
/paper-slide-deck path/to/content.md --slides 10
/paper-slide-deck path/to/content.md --outline-only
/paper-slide-deck # Then paste content
Setup (one-time)
The TypeScript scripts (merge-to-*, detect-figures, extract-figure,
apply-template) need Node dependencies. Install them once:
cd ${SKILL_DIR}/scripts && npm install
This installs canvas, pdfjs-dist, pptxgenjs, and pdf-lib (a package-lock.json
pins versions). If a script exits with missing Node dependency "<name>", run the
command above. The Python generator (generate-slides.py) auto-installs google-genai
on first run.
Also install PyMuPDF (pip install pymupdf) — it is the reliable fallback for
extracting figures from pages that embed bitmaps (X-rays, CAM heatmaps, photographs),
where the pdfjs + canvas path in extract-figure.ts fails with
Error: Image or Canvas expected. For medical-imaging papers this is the common case,
not the exception, so treat PyMuPDF as required, not optional.
Image generation & no-API-key path
Image generation needs either a GOOGLE_API_KEY/GEMINI_API_KEY (Gemini API) or the
Gemini Web skill. If no key and no web option is available, the skill still works in
a degraded mode — do not abort:
- Run with
--outline-only to produce the outline + prompts (no images).
- For a source PDF, extract real figures/tables with
detect-figures.ts +
extract-figure.ts + apply-template.ts (no API key needed — pure rendering).
- Merge whatever slides exist (
extract-sourced pages) into PPTX/PDF, and hand the
prompts/ back to the user to generate images later when a key is available.
Script Directory
Important: All scripts are located in the scripts/ subdirectory of this skill.
Agent Execution Instructions:
- Determine this SKILL.md file's directory path as
SKILL_DIR
- Script path =
${SKILL_DIR}/scripts/<script-name>.ts
- Replace all
${SKILL_DIR} in this document with the actual path
Script Reference:
| Script |
Purpose |
scripts/generate-slides.py |
Generate AI slides via Gemini API (Python) |
scripts/merge-to-pptx.ts |
Merge slides into PowerPoint |
scripts/merge-to-pdf.ts |
Merge slides into PDF |
scripts/detect-figures.ts |
Auto-detect figures/tables in PDF (heuristic; verify pages) |
scripts/extract-figure.ts |
Render a full PDF page to PNG (optional --crop; PyMuPDF fallback) |
scripts/apply-template.ts |
Apply figure container template |
Options
| Option |
Description |
--style <name> |
Visual style (see Style Gallery) |
--audience <type> |
Target audience: beginners, intermediate, experts, executives, general |
--lang <code> |
Output language (en, zh, ja, etc.) |
--slides <number> |
Target slide count |
--outline-only |
Generate outline only, skip image generation |
Style Gallery
| Style |
Description |
Best For |
academic-paper |
Clean professional, precise charts |
Academic-style visuals, technical handouts (for a faithful editable talk use scholar-slides) |
blueprint (Default) |
Technical schematics, grid texture |
Architecture, system design |
chalkboard |
Black chalkboard, colorful chalk |
Education, tutorials, classroom |
notion |
SaaS dashboard, card-based layouts |
Product demos, SaaS, B2B |
bold-editorial |
Magazine cover, bold typography, dark |
Product launches, keynotes |
corporate |
Navy/gold, structured layouts |
Investor decks, proposals |
dark-atmospheric |
Cinematic dark mode, glowing accents |
Entertainment, gaming |
editorial-infographic |
Magazine explainers, flat illustrations |
Tech explainers, research |
fantasy-animation |
Ghibli/Disney style, hand-drawn |
Educational, storytelling |
intuition-machine |
Technical briefing, bilingual labels |
Technical docs, academic |
minimal |
Ultra-clean, maximum whitespace |
Executive briefings, premium |
pixel-art |
Retro 8-bit, chunky pixels |
Gaming, developer talks |
scientific |
Academic diagrams, precise labeling |
Biology, chemistry, medical |
sketch-notes |
Hand-drawn, warm & friendly |
Educational, tutorials |
vector-illustration |
Flat vector, retro & cute |
Creative, children's content |
vintage |
Aged-paper, historical styling |
Historical, heritage, biography |
watercolor |
Hand-painted textures, natural warmth |
Lifestyle, wellness, travel |
Auto Style Selection
| Content Signals |
Selected Style |
| paper, thesis, defense, conference, ieee, acm, icml, neurips, cvpr, acl, aaai, iclr |
academic-paper |
| tutorial, learn, education, guide, intro, beginner |
sketch-notes |
| classroom, teaching, school, chalkboard, blackboard |
chalkboard |
| architecture, system, data, analysis, technical |
blueprint |
| creative, children, kids, cute, illustration |
vector-illustration |
| briefing, bilingual, infographic, concept |
intuition-machine |
| executive, minimal, clean, simple, elegant |
minimal |
| saas, product, dashboard, metrics, productivity |
notion |
| investor, quarterly, business, corporate, proposal |
corporate |
| launch, marketing, keynote, bold, impact, magazine |
bold-editorial |
| entertainment, music, gaming, creative, atmospheric |
dark-atmospheric |
| explainer, journalism, science communication |
editorial-infographic |
| story, fantasy, animation, magical, whimsical |
fantasy-animation |
| gaming, retro, pixel, developer, nostalgia |
pixel-art |
| biology, chemistry, medical, pathway, scientific |
scientific |
| history, heritage, vintage, expedition, historical |
vintage |
| lifestyle, wellness, travel, artistic, natural |
watercolor |
| Default |
blueprint |
Academic-signal caution: When the content matches academic-paper signals (paper/thesis/neurips/cvpr/icml/…), this skill still bakes text into an image, so equations, result tables, and exact numbers may be garbled. Extract real figures/tables from the source PDF (Source: extract) rather than letting the model redraw them, and if the deck needs faithful, editable formulas/data, tell the user to use scholar-slides instead.
Layout Gallery
Optional layout hints for individual slides. Specify in outline's // LAYOUT section.
Slide-Specific Layouts
| Layout |
Description |
Best For |
title-hero |
Large centered title + subtitle |
Cover slides, section breaks |
quote-callout |
Featured quote with attribution |
Testimonials, key insights |
key-stat |
Single large number as focal point |
Impact statistics, metrics |
split-screen |
Half image, half text |
Feature highlights, comparisons |
icon-grid |
Grid of icons with labels |
Features, capabilities, benefits |
two-columns |
Content in balanced columns |
Paired information, dual points |
three-columns |
Content in three columns |
Triple comparisons, categories |
image-caption |
Full-bleed image + text overlay |
Visual storytelling, emotional |
agenda |
Numbered list with highlights |
Session overview, roadmap |
bullet-list |
Structured bullet points |
Simple content, lists |
Infographic-Derived Layouts
| Layout |
Description |
Best For |
linear-progression |
Sequential flow left-to-right |
Timelines, step-by-step |
binary-comparison |
Side-by-side A vs B |
Before/after, pros-cons |
comparison-matrix |
Multi-factor grid |
Feature comparisons |
hierarchical-layers |
Pyramid or stacked levels |
Priority, importance |
hub-spoke |
Central node with radiating items |
Concept maps, ecosystems |
bento-grid |
Varied-size tiles |
Overview, summary |
funnel |
Narrowing stages |
Conversion, filtering |
dashboard |
Metrics with charts/numbers |
KPIs, data display |
venn-diagram |
Overlapping circles |
Relationships, intersections |
circular-flow |
Continuous cycle |
Recurring processes |
winding-roadmap |
Curved path with milestones |
Journey, timeline |
tree-branching |
Parent-child hierarchy |
Org charts, taxonomies |
iceberg |
Visible vs hidden layers |
Surface vs depth |
bridge |
Gap with connection |
Problem-solution |
Academic-Specific Layouts
| Layout |
Description |
Best For |
paper-title |
Title, authors, affiliations, venue |
Conference paper cover |
outline-agenda |
Numbered section list with highlights |
Talk structure overview |
methods-diagram |
Central architecture/pipeline diagram |
Methods, system design |
results-chart |
Chart area + data annotations |
Quantitative results |
equation-focus |
Centered equation + variable definitions |
Mathematical derivations |
qualitative-grid |
2x2 or 3x2 image comparison grid |
Visual results, ablations |
references-list |
Numbered citation list |
Key references slide |
contributions |
Numbered contribution points |
Contributions summary |
Usage: Add Layout: <name> in slide's // LAYOUT section to guide visual composition.
Design Philosophy
This deck is designed for reading and sharing, not live presentation:
- Each slide must be self-explanatory without verbal commentary
- Structure content for logical flow when scrolling
- Include all necessary context within each slide
- Optimize for social media sharing and offline reading
File Management
Output Directory
Each session creates an independent directory named by content slug:
slide-deck/{topic-slug}/
├── source-{slug}.{ext} # Source files (text, images, etc.)
├── outline.md
├── outline-{style}.md # Style variant outlines
├── prompts/
│ └── 01-slide-cover.md, 02-slide-{slug}.md, ...
├── 01-slide-cover.png, 02-slide-{slug}.png, ...
├── {topic-slug}.pptx
└── {topic-slug}.pdf
Slug Generation:
- Extract main topic from content (2-4 words, kebab-case)
- Example: "Introduction to Machine Learning" →
intro-machine-learning
Conflict Resolution
If slide-deck/{topic-slug}/ already exists:
- Append timestamp:
{topic-slug}-YYYYMMDD-HHMMSS
- Example:
intro-ml exists → intro-ml-20260118-143052
Source Files
Copy all sources with naming source-{slug}.{ext}:
source-article.md (main text content)
source-diagram.png (image from conversation)
source-data.xlsx (additional file)
Multiple sources supported: text, images, files from conversation.
Workflow
Step 1: Analyze Content
Save source content (if pasted, save as source.md)
Follow references/analysis-framework.md for deep content analysis
Determine style (use --style or auto-select from signals)
Detect languages (source vs. user preference)
Plan slide count (--slides or dynamic)
For academic papers (PDF with figures): Run automatic figure detection:
npx -y bun ${SKILL_DIR}/scripts/detect-figures.ts --pdf source-paper.pdf --output figures.json
This outputs a JSON file with all detected figures/tables, their page numbers, and captions.
Caption detection is heuristic — verify, especially the first-page teaser. The
line-anchored Figure N matcher reliably finds captions that sit on their own line
(single-column layouts), but misses figures whose caption is interleaved with body
text on a two-column first page — which is often the paper's most important
architecture/overview figure. After running detect-figures, cross-check the source's
Figure 1 explicitly: if the paper's text references a Figure N that is absent from
figures.json, add it manually via an // IMAGE_SOURCE block and extract it with the
PyMuPDF fallback. Do not assume figures.json is complete.
Step 2: Generate Outline Variants
- Generate 3 style variant outlines based on content analysis
- Follow
references/outline-template.md for structure
- Auto-populate IMAGE_SOURCE for academic papers:
- Read
figures.json from Step 1
- Map figures to slides using rules in
references/analysis-framework.md Section 8
- Automatically add
// IMAGE_SOURCE blocks to appropriate slides:
- Architecture/pipeline figures → Methods slides (
Source: extract)
- Results tables → Quantitative results slides (
Source: extract)
- Comparison images → Qualitative results slides (
Source: extract)
- Conceptual/simple diagrams → Leave for AI generation (
Source: generate or omit)
- Save as
outline-{style}.md for each variant
Step 3: User Confirmation
Single AskUserQuestion with all applicable options:
| Question |
When to Ask |
| Style variant |
Always (3 options + custom) |
| Language |
Only if source ≠ user language |
After selection:
- Copy selected
outline-{style}.md to outline.md
- Regenerate in different language if requested
- User may edit
outline.md for fine-tuning
If --outline-only, stop here.
Step 4: Generate Prompts
- Read
references/base-prompt.md
- Combine with style instructions from outline
- Add slide-specific content
- If
Layout: specified in outline, include layout guidance in prompt:
- Reference layout characteristics for image composition
- Example:
Layout: hub-spoke → "Central concept in middle with related items radiating outward"
- Save to
prompts/ directory
Step 5: Image Generation Method Selection
Before generating images, ask user to choose generation method:
Use AskUserQuestion with options:
| Option |
Label |
Description |
| 1 |
Gemini API (Recommended) |
Official Google API via Python. Requires GOOGLE_API_KEY env var. |
| 2 |
Gemini Web (Browser-based) |
⚠️ Uses reverse-engineered web API. No API key needed but may break. |
Based on selection:
Option 1: Gemini API (Python)
- Verify API key: Check
GOOGLE_API_KEY or GEMINI_API_KEY environment variable
- Run generation script:
python3 ${SKILL_DIR}/scripts/generate-slides.py <slide-deck-dir>
The default model is gemini-3-pro-image (Nano Banana Pro, GA). Override with
--model <id> if needed. The older gemini-3-pro-image-preview id is deprecated.
Script Features:
- Auto-installs
google-genai package if missing
- Reads prompt files as
*.md (or *.txt) from prompts/
- Errors out (non-zero) if no prompt files are found — no silent "nothing to do"
- Retry logic with exponential backoff (3 retries)
- Sets
response_modalities=["IMAGE"] so the model returns image parts
- Skips already-generated slides (> 10KB, any image extension)
- Writes each slide to the deck root (e.g.
01-slide-cover.png), the same
place extracted-figure slides land — so one merge step picks up both
- Saves with the real image extension (Gemini often returns JPEG even when
PNG is requested → saved as
.jpg, never a mislabeled .png)
- Supports custom model via
--model flag
Troubleshooting:
- If server disconnection errors occur, script auto-retries
- For persistent failures, re-run the script (it skips completed slides)
- Check API quota if many failures occur
Option 2: Gemini Web Skill
Consent Check: Read consent file at:
- Windows:
$APPDATA/baoyu-skills/gemini-web/consent.json
- macOS:
~/Library/Application Support/baoyu-skills/gemini-web/consent.json
- Linux:
~/.local/share/baoyu-skills/gemini-web/consent.json
If no consent or version mismatch, display disclaimer and ask:
⚠️ DISCLAIMER: This uses a reverse-engineered Gemini Web API (NOT official).
Risks: May break anytime, no support, possible account risk.
For each slide, run:
npx -y bun ${GEMINI_WEB_SKILL_DIR}/scripts/main.ts \
--promptfiles prompts/01-slide-cover.md \
--image 01-slide-cover.png \
--sessionId slides-{topic-slug}-{timestamp}
Where GEMINI_WEB_SKILL_DIR = path to baoyu-danger-gemini-web skill directory.
Proxy support: If user is in restricted network, prepend:
HTTP_PROXY=http://127.0.0.1:7890 HTTPS_PROXY=http://127.0.0.1:7890
Step 5.5: Process IMAGE_SOURCE (Automatic Figure Extraction)
For academic presentations, IMAGE_SOURCE metadata was auto-populated in Step 2 based on figure detection from Step 1.
Automatic Execution:
Parse outline to identify slides with Source: extract
Create figures directory: mkdir -p figures
For each extract slide, automatically:
- Read the Figure number, Page, and Caption from metadata
- Run figure extraction script:
npx -y bun ${SKILL_DIR}/scripts/extract-figure.ts \
--pdf source-paper.pdf \
--page <page-number> \
--output figures/figure-<N>.png
Note: extract-figure.ts renders the entire page to a high-resolution
PNG — it does not auto-detect or crop a single figure's bounding box. On a
two-column page you will get both columns. To isolate one figure, either pass
--crop "x,y,width,height" (pixels in the rendered/scaled page) or open the
PNG, confirm it visually, and crop manually before applying the template.
- Run template application script:
npx -y bun ${SKILL_DIR}/scripts/apply-template.ts \
--figure figures/figure-<N>.png \
--title "<slide-headline>" \
--caption "Figure <N>: <caption-text>" \
--output <NN>-slide-<slug>.png
- Report: "Extracted: Figure N → slide NN"
For slides with Source: generate (or no IMAGE_SOURCE):
- Proceed to Step 6 for AI generation
Note: Source PDF must be saved as source-paper.pdf in output directory.
Troubleshooting:
- If figure detection missed a figure: manually add
// IMAGE_SOURCE block to outline
- If wrong figure mapped: edit the
Figure: and Page: values in outline
- If extraction fails: check PDF page number (1-indexed)
PyMuPDF Fallback for Page Extraction:
If extract-figure.ts fails with "Image or Canvas expected" error (common with complex PDFs), use PyMuPDF:
import fitz
doc = fitz.open("source-paper.pdf")
page = doc[page_num - 1] # 0-indexed
mat = fitz.Matrix(3, 3) # 3x scale for high resolution
pix = page.get_pixmap(matrix=mat)
pix.save(f"extracted/page-{page_num}.png")
Then apply template using apply-template.ts.
Step 6: Generate Images
- Use selected method from Step 5
- Skip slides already processed in Step 5.5 (those with
Source: extract)
- Generate session ID:
slides-{topic-slug}-{timestamp}
- Generate each remaining slide with same session ID
- Report progress: "Generated X/N"
- Auto-retry once on generation failure
Step 6.5: Proofread Generated Images (Content Integrity)
Text-to-image bakes text into pixels and will garble spelling, math symbols, and
numbers — this is the single biggest risk of this skill. Do not ship unchecked.
For every generated slide (especially any with equations, tables, key numbers,
or non-Latin text), use Read to open the PNG and visually check:
- Spelling / wording — headline and body text match the outline, no invented or
mangled words.
- Math & symbols — equations, subscripts, Greek letters, operators are correct
(or absent). Assume the model got them wrong until you confirm otherwise.
- Numbers & units — any figure that carries data matches the source exactly.
If garbling is found:
- Regenerate that slide with a corrected/simplified prompt (spell risky terms
phonetically, reduce text density, move exact numbers to a caption). Max 2 retries.
- If it still fails after 2 retries, flag the slide
[CHECK] in the Step 8 summary
and recommend one of:
- Replace with an extracted figure/table from the source PDF (
Source: extract), or
- Simplify the slide to remove the fragile text, or
- For a deck that genuinely needs faithful, editable formulas/data, switch to
scholar-slides.
Never silently deliver a slide with garbled math or data — always surface it.
Step 7: Merge to PPTX and PDF
npx -y bun ${SKILL_DIR}/scripts/merge-to-pptx.ts <slide-deck-dir>
npx -y bun ${SKILL_DIR}/scripts/merge-to-pdf.ts <slide-deck-dir>
Step 8: Output Summary
Slide Deck Complete!
Topic: [topic]
Style: [style name]
Location: [directory path]
Slides: N total
- 01-slide-cover.png ✓ Cover
- 02-slide-intro.png ✓ Content
- 04-slide-results.png ⚠ [CHECK] math/numbers — verify or use scholar-slides
- ...
- {NN}-slide-back-cover.png ✓ Back Cover
Outline: outline.md
PPTX: {topic-slug}.pptx
PDF: {topic-slug}.pdf
List any [CHECK]-flagged slides (from Step 6.5) explicitly so the user knows which
slides may contain garbled text/math/data and how to remediate them.
Slide Modification
See references/modification-guide.md for:
- Edit single slide workflow
- Add new slide (with renumbering)
- Delete slide (with renumbering)
- File naming conventions
Image Generation Dependencies
Gemini API (Option 1 - Recommended)
Requires:
GOOGLE_API_KEY or GEMINI_API_KEY environment variable
- Python 3.8+ with pip
google-genai package (auto-installed by script)
Model: gemini-3-pro-image (default; Nano Banana Pro, GA). The older
gemini-3-pro-image-preview id is deprecated — override with --model only if needed.
Gemini Web Skill (Option 2)
Requires:
baoyu-danger-gemini-web skill installed at .claude/skills/baoyu-danger-gemini-web
- Google Chrome browser with logged-in Google account
- User consent for reverse-engineered API disclaimer
PDF Figure Extraction
Requires (install via cd ${SKILL_DIR}/scripts && npm install):
- Primary:
pdfjs-dist npm package (use legacy build for Node.js)
canvas npm package for extract-figure.ts / apply-template.ts
- Fallback:
pymupdf Python package (more reliable for complex PDFs)
References
| File |
Content |
references/analysis-framework.md |
Deep content analysis for presentations |
references/outline-template.md |
Outline structure and STYLE_INSTRUCTIONS format |
references/modification-guide.md |
Edit, add, delete slide workflows |
references/content-rules.md |
Content and style guidelines |
references/base-prompt.md |
Base prompt for image generation |
references/figure-container-template.md |
Visual specs for extracted figure containers |
references/styles/<style>.md |
Full style specifications |
Notes
Image Generation
- Nano Banana Pro API: Recommended. Stable, reliable, requires API key
- Gemini Web: No API key needed, but uses reverse-engineered API with account risk
- Generation time: 10-30 seconds per slide
- Auto-retry once on generation failure
- Maintain style consistency via session ID
Content Guidelines
- Use stylized alternatives for sensitive public figures
- Both methods use the same underlying Gemini model for image generation
Extension Support
Custom styles and configurations via EXTEND.md.
Check paths (priority order):
.paper-skills/paper-slide-deck/EXTEND.md (project)
~/.paper-skills/paper-slide-deck/EXTEND.md (user)
If found, load before Step 1. Extension content overrides defaults.
1---
2name: paper-slide-deck
3description: Use when the user wants visually striking, shareable slide-deck IMAGES from any content — an article, blog post, topic, or paper — where look-and-feel matters more than editable precision (风格化幻灯/小红书配图/公众号配图/视觉化海报), optimized for reading and social sharing rather than live presentation. Offers 17 T2I aesthetic styles (watercolor, sketch-notes, pixel-art, editorial, chalkboard, etc.); each slide is an AI-generated image (Gemini/Nano Banana), so the look is distinctive but text/math/data are baked into the image (not editable). NOT for a faithful academic talk where equations, numbers, tables, and citations must stay exact, editable, and projector-ready (组会/答辩/thesis defense/conference/results-heavy talks) — for that use scholar-slides instead, since text-to-image will garble math and data.
4---56
7# Paper Slide Deck Generator
8
9Transform academic papers and content into professional slide deck images with automatic figure extraction.
10
11## Usage
12
13```bash
14/paper-slide-deck path/to/paper.pdf
15/paper-slide-deck path/to/paper.pdf --style academic-paper
16/paper-slide-deck path/to/content.md --style sketch-notes
17/paper-slide-deck path/to/content.md --audience executives
18/paper-slide-deck path/to/content.md --lang zh
19/paper-slide-deck path/to/content.md --slides 10
20/paper-slide-deck path/to/content.md --outline-only
21/paper-slide-deck # Then paste content
22```
23
24## Setup (one-time)
25
26The TypeScript scripts (`merge-to-*`, `detect-figures`, `extract-figure`,
27`apply-template`) need Node dependencies. Install them once:
28
29```bash
30cd ${SKILL_DIR}/scripts && npm install
31```
32
33This installs `canvas`, `pdfjs-dist`, `pptxgenjs`, and `pdf-lib` (a `package-lock.json`
34pins versions). If a script exits with `missing Node dependency "<name>"`, run the
35command above. The Python generator (`generate-slides.py`) auto-installs `google-genai`
36on first run.
37
38**Also install PyMuPDF** (`pip install pymupdf`) — it is the reliable fallback for
39extracting figures from pages that embed bitmaps (X-rays, CAM heatmaps, photographs),
40where the `pdfjs` + `canvas` path in `extract-figure.ts` fails with
41`Error: Image or Canvas expected`. For medical-imaging papers this is the common case,
42not the exception, so treat PyMuPDF as required, not optional.
43
44### Image generation & no-API-key path
45
46Image generation needs either a `GOOGLE_API_KEY`/`GEMINI_API_KEY` (Gemini API) or the
47Gemini Web skill. **If no key and no web option is available, the skill still works in
48a degraded mode** — do not abort:
49
501. Run with `--outline-only` to produce the outline + prompts (no images).
512. For a source PDF, extract real figures/tables with `detect-figures.ts` +
52 `extract-figure.ts` + `apply-template.ts` (no API key needed — pure rendering).
533. Merge whatever slides exist (`extract`-sourced pages) into PPTX/PDF, and hand the
54 `prompts/` back to the user to generate images later when a key is available.
55
56## Script Directory
57
58**Important**: All scripts are located in the `scripts/` subdirectory of this skill.
59
60**Agent Execution Instructions**:
611. Determine this SKILL.md file's directory path as `SKILL_DIR`
622. Script path = `${SKILL_DIR}/scripts/<script-name>.ts`
633. Replace all `${SKILL_DIR}` in this document with the actual path
64
65**Script Reference**:
66| Script | Purpose |
67|--------|---------|
68| `scripts/generate-slides.py` | Generate AI slides via Gemini API (Python) |
69| `scripts/merge-to-pptx.ts` | Merge slides into PowerPoint |
70| `scripts/merge-to-pdf.ts` | Merge slides into PDF |
71| `scripts/detect-figures.ts` | Auto-detect figures/tables in PDF (heuristic; verify pages) |
72| `scripts/extract-figure.ts` | Render a full PDF page to PNG (optional `--crop`; PyMuPDF fallback) |
73| `scripts/apply-template.ts` | Apply figure container template |
74
75## Options
76
77| Option | Description |
78|--------|-------------|
79| `--style <name>` | Visual style (see Style Gallery) |
80| `--audience <type>` | Target audience: beginners, intermediate, experts, executives, general |
81| `--lang <code>` | Output language (en, zh, ja, etc.) |
82| `--slides <number>` | Target slide count |
83| `--outline-only` | Generate outline only, skip image generation |
84
85## Style Gallery
86
87| Style | Description | Best For |
88|-------|-------------|----------|
89| `academic-paper` | Clean professional, precise charts | Academic-style visuals, technical handouts (for a faithful *editable* talk use scholar-slides) |
90| `blueprint` (Default) | Technical schematics, grid texture | Architecture, system design |
91| `chalkboard` | Black chalkboard, colorful chalk | Education, tutorials, classroom |
92| `notion` | SaaS dashboard, card-based layouts | Product demos, SaaS, B2B |
93| `bold-editorial` | Magazine cover, bold typography, dark | Product launches, keynotes |
94| `corporate` | Navy/gold, structured layouts | Investor decks, proposals |
95| `dark-atmospheric` | Cinematic dark mode, glowing accents | Entertainment, gaming |
96| `editorial-infographic` | Magazine explainers, flat illustrations | Tech explainers, research |
97| `fantasy-animation` | Ghibli/Disney style, hand-drawn | Educational, storytelling |
98| `intuition-machine` | Technical briefing, bilingual labels | Technical docs, academic |
99| `minimal` | Ultra-clean, maximum whitespace | Executive briefings, premium |
100| `pixel-art` | Retro 8-bit, chunky pixels | Gaming, developer talks |
101| `scientific` | Academic diagrams, precise labeling | Biology, chemistry, medical |
102| `sketch-notes` | Hand-drawn, warm & friendly | Educational, tutorials |
103| `vector-illustration` | Flat vector, retro & cute | Creative, children's content |
104| `vintage` | Aged-paper, historical styling | Historical, heritage, biography |
105| `watercolor` | Hand-painted textures, natural warmth | Lifestyle, wellness, travel |
106
107## Auto Style Selection
108
109| Content Signals | Selected Style |
110|-----------------|----------------|
111| paper, thesis, defense, conference, ieee, acm, icml, neurips, cvpr, acl, aaai, iclr | `academic-paper` |
112| tutorial, learn, education, guide, intro, beginner | `sketch-notes` |
113| classroom, teaching, school, chalkboard, blackboard | `chalkboard` |
114| architecture, system, data, analysis, technical | `blueprint` |
115| creative, children, kids, cute, illustration | `vector-illustration` |
116| briefing, bilingual, infographic, concept | `intuition-machine` |
117| executive, minimal, clean, simple, elegant | `minimal` |
118| saas, product, dashboard, metrics, productivity | `notion` |
119| investor, quarterly, business, corporate, proposal | `corporate` |
120| launch, marketing, keynote, bold, impact, magazine | `bold-editorial` |
121| entertainment, music, gaming, creative, atmospheric | `dark-atmospheric` |
122| explainer, journalism, science communication | `editorial-infographic` |
123| story, fantasy, animation, magical, whimsical | `fantasy-animation` |
124| gaming, retro, pixel, developer, nostalgia | `pixel-art` |
125| biology, chemistry, medical, pathway, scientific | `scientific` |
126| history, heritage, vintage, expedition, historical | `vintage` |
127| lifestyle, wellness, travel, artistic, natural | `watercolor` |
128| Default | `blueprint` |
129
130> **Academic-signal caution**: When the content matches `academic-paper` signals (paper/thesis/neurips/cvpr/icml/…), this skill still bakes text into an image, so **equations, result tables, and exact numbers may be garbled**. Extract real figures/tables from the source PDF (`Source: extract`) rather than letting the model redraw them, and if the deck needs faithful, editable formulas/data, tell the user to use **scholar-slides** instead.
131
132## Layout Gallery
133
134Optional layout hints for individual slides. Specify in outline's `// LAYOUT` section.
135
136### Slide-Specific Layouts
137
138| Layout | Description | Best For |
139|--------|-------------|----------|
140| `title-hero` | Large centered title + subtitle | Cover slides, section breaks |
141| `quote-callout` | Featured quote with attribution | Testimonials, key insights |
142| `key-stat` | Single large number as focal point | Impact statistics, metrics |
143| `split-screen` | Half image, half text | Feature highlights, comparisons |
144| `icon-grid` | Grid of icons with labels | Features, capabilities, benefits |
145| `two-columns` | Content in balanced columns | Paired information, dual points |
146| `three-columns` | Content in three columns | Triple comparisons, categories |
147| `image-caption` | Full-bleed image + text overlay | Visual storytelling, emotional |
148| `agenda` | Numbered list with highlights | Session overview, roadmap |
149| `bullet-list` | Structured bullet points | Simple content, lists |
150
151### Infographic-Derived Layouts
152
153| Layout | Description | Best For |
154|--------|-------------|----------|
155| `linear-progression` | Sequential flow left-to-right | Timelines, step-by-step |
156| `binary-comparison` | Side-by-side A vs B | Before/after, pros-cons |
157| `comparison-matrix` | Multi-factor grid | Feature comparisons |
158| `hierarchical-layers` | Pyramid or stacked levels | Priority, importance |
159| `hub-spoke` | Central node with radiating items | Concept maps, ecosystems |
160| `bento-grid` | Varied-size tiles | Overview, summary |
161| `funnel` | Narrowing stages | Conversion, filtering |
162| `dashboard` | Metrics with charts/numbers | KPIs, data display |
163| `venn-diagram` | Overlapping circles | Relationships, intersections |
164| `circular-flow` | Continuous cycle | Recurring processes |
165| `winding-roadmap` | Curved path with milestones | Journey, timeline |
166| `tree-branching` | Parent-child hierarchy | Org charts, taxonomies |
167| `iceberg` | Visible vs hidden layers | Surface vs depth |
168| `bridge` | Gap with connection | Problem-solution |
169
170### Academic-Specific Layouts
171
172| Layout | Description | Best For |
173|--------|-------------|----------|
174| `paper-title` | Title, authors, affiliations, venue | Conference paper cover |
175| `outline-agenda` | Numbered section list with highlights | Talk structure overview |
176| `methods-diagram` | Central architecture/pipeline diagram | Methods, system design |
177| `results-chart` | Chart area + data annotations | Quantitative results |
178| `equation-focus` | Centered equation + variable definitions | Mathematical derivations |
179| `qualitative-grid` | 2x2 or 3x2 image comparison grid | Visual results, ablations |
180| `references-list` | Numbered citation list | Key references slide |
181| `contributions` | Numbered contribution points | Contributions summary |
182
183**Usage**: Add `Layout: <name>` in slide's `// LAYOUT` section to guide visual composition.
184
185## Design Philosophy
186
187This deck is designed for **reading and sharing**, not live presentation:
188- Each slide must be **self-explanatory** without verbal commentary
189- Structure content for **logical flow** when scrolling
190- Include **all necessary context** within each slide
191- Optimize for **social media sharing** and offline reading
192
193## File Management
194
195### Output Directory
196
197Each session creates an independent directory named by content slug:
198
199```
200slide-deck/{topic-slug}/
201├── source-{slug}.{ext} # Source files (text, images, etc.)
202├── outline.md
203├── outline-{style}.md # Style variant outlines
204├── prompts/
205│ └── 01-slide-cover.md, 02-slide-{slug}.md, ...
206├── 01-slide-cover.png, 02-slide-{slug}.png, ...
207├── {topic-slug}.pptx
208└── {topic-slug}.pdf
209```
210
211**Slug Generation**:
2121. Extract main topic from content (2-4 words, kebab-case)
2132. Example: "Introduction to Machine Learning" → `intro-machine-learning`
214
215### Conflict Resolution
216
217If `slide-deck/{topic-slug}/` already exists:
218- Append timestamp: `{topic-slug}-YYYYMMDD-HHMMSS`
219- Example: `intro-ml` exists → `intro-ml-20260118-143052`
220
221### Source Files
222
223Copy all sources with naming `source-{slug}.{ext}`:
224- `source-article.md` (main text content)
225- `source-diagram.png` (image from conversation)
226- `source-data.xlsx` (additional file)
227
228Multiple sources supported: text, images, files from conversation.
229
230## Workflow
231
232### Step 1: Analyze Content
233
2341. Save source content (if pasted, save as `source.md`)
2352. Follow `references/analysis-framework.md` for deep content analysis
2363. Determine style (use `--style` or auto-select from signals)
2374. Detect languages (source vs. user preference)
2385. Plan slide count (`--slides` or dynamic)
2396. **For academic papers (PDF with figures)**: Run automatic figure detection:
240 ```bash
241 npx -y bun ${SKILL_DIR}/scripts/detect-figures.ts --pdf source-paper.pdf --output figures.json
242 ```
243 This outputs a JSON file with all detected figures/tables, their page numbers, and captions.
244
245 **Caption detection is heuristic — verify, especially the first-page teaser.** The
246 line-anchored `Figure N` matcher reliably finds captions that sit on their own line
247 (single-column layouts), but **misses figures whose caption is interleaved with body
248 text on a two-column first page** — which is often the paper's most important
249 architecture/overview figure. After running detect-figures, cross-check the source's
250 `Figure 1` explicitly: if the paper's text references a `Figure N` that is absent from
251 `figures.json`, add it manually via an `// IMAGE_SOURCE` block and extract it with the
252 PyMuPDF fallback. Do not assume `figures.json` is complete.
253
254### Step 2: Generate Outline Variants
255
2561. Generate 3 style variant outlines based on content analysis
2572. Follow `references/outline-template.md` for structure
2583. **Auto-populate IMAGE_SOURCE** for academic papers:
259 - Read `figures.json` from Step 1
260 - Map figures to slides using rules in `references/analysis-framework.md` Section 8
261 - Automatically add `// IMAGE_SOURCE` blocks to appropriate slides:
262 - Architecture/pipeline figures → Methods slides (`Source: extract`)
263 - Results tables → Quantitative results slides (`Source: extract`)
264 - Comparison images → Qualitative results slides (`Source: extract`)
265 - Conceptual/simple diagrams → Leave for AI generation (`Source: generate` or omit)
2664. Save as `outline-{style}.md` for each variant
267
268### Step 3: User Confirmation
269
270**Single AskUserQuestion with all applicable options:**
271
272| Question | When to Ask |
273|----------|-------------|
274| Style variant | Always (3 options + custom) |
275| Language | Only if source ≠ user language |
276
277After selection:
278- Copy selected `outline-{style}.md` to `outline.md`
279- Regenerate in different language if requested
280- User may edit `outline.md` for fine-tuning
281
282If `--outline-only`, stop here.
283
284### Step 4: Generate Prompts
285
2861. Read `references/base-prompt.md`
2872. Combine with style instructions from outline
2883. Add slide-specific content
2894. If `Layout:` specified in outline, include layout guidance in prompt:
290 - Reference layout characteristics for image composition
291 - Example: `Layout: hub-spoke` → "Central concept in middle with related items radiating outward"
2925. Save to `prompts/` directory
293
294### Step 5: Image Generation Method Selection
295
296**Before generating images**, ask user to choose generation method:
297
298**Use AskUserQuestion** with options:
299
300| Option | Label | Description |
301|--------|-------|-------------|
302| 1 | **Gemini API (Recommended)** | Official Google API via Python. Requires GOOGLE_API_KEY env var. |
303| 2 | **Gemini Web (Browser-based)** | ⚠️ Uses reverse-engineered web API. No API key needed but may break. |
304
305**Based on selection:**
306
307#### Option 1: Gemini API (Python)
308
3091. **Verify API key**: Check `GOOGLE_API_KEY` or `GEMINI_API_KEY` environment variable
3102. **Run generation script**:
311 ```bash
312 python3 ${SKILL_DIR}/scripts/generate-slides.py <slide-deck-dir>
313 ```
314 The default model is `gemini-3-pro-image` (Nano Banana Pro, GA). Override with
315 `--model <id>` if needed. The older `gemini-3-pro-image-preview` id is deprecated.
316
317**Script Features**:
318- Auto-installs `google-genai` package if missing
319- Reads prompt files as `*.md` (or `*.txt`) from `prompts/`
320- **Errors out (non-zero) if no prompt files are found** — no silent "nothing to do"
321- Retry logic with exponential backoff (3 retries)
322- Sets `response_modalities=["IMAGE"]` so the model returns image parts
323- Skips already-generated slides (> 10KB, any image extension)
324- Writes each slide to the **deck root** (e.g. `01-slide-cover.png`), the same
325 place extracted-figure slides land — so one merge step picks up both
326- Saves with the **real** image extension (Gemini often returns JPEG even when
327 PNG is requested → saved as `.jpg`, never a mislabeled `.png`)
328- Supports custom model via `--model` flag
329
330**Troubleshooting**:
331- If server disconnection errors occur, script auto-retries
332- For persistent failures, re-run the script (it skips completed slides)
333- Check API quota if many failures occur
334
335#### Option 2: Gemini Web Skill
336
3371. **Consent Check**: Read consent file at:
338 - Windows: `$APPDATA/baoyu-skills/gemini-web/consent.json`
339 - macOS: `~/Library/Application Support/baoyu-skills/gemini-web/consent.json`
340 - Linux: `~/.local/share/baoyu-skills/gemini-web/consent.json`
341
3422. **If no consent or version mismatch**, display disclaimer and ask:
343 ```
344 ⚠️ DISCLAIMER: This uses a reverse-engineered Gemini Web API (NOT official).
345 Risks: May break anytime, no support, possible account risk.
346 ```
347
3483. **For each slide**, run:
349 ```bash
350 npx -y bun ${GEMINI_WEB_SKILL_DIR}/scripts/main.ts \
351 --promptfiles prompts/01-slide-cover.md \
352 --image 01-slide-cover.png \
353 --sessionId slides-{topic-slug}-{timestamp}
354 ```
355
356 Where `GEMINI_WEB_SKILL_DIR` = path to `baoyu-danger-gemini-web` skill directory.
357
3584. **Proxy support**: If user is in restricted network, prepend:
359 ```bash
360 HTTP_PROXY=http://127.0.0.1:7890 HTTPS_PROXY=http://127.0.0.1:7890
361 ```
362
363### Step 5.5: Process IMAGE_SOURCE (Automatic Figure Extraction)
364
365For academic presentations, IMAGE_SOURCE metadata was auto-populated in Step 2 based on figure detection from Step 1.
366
367**Automatic Execution**:
368
3691. **Parse outline** to identify slides with `Source: extract`
3702. **Create figures directory**: `mkdir -p figures`
3713. **For each extract slide**, automatically:
372 - Read the Figure number, Page, and Caption from metadata
373 - Run figure extraction script:
374 ```bash
375 npx -y bun ${SKILL_DIR}/scripts/extract-figure.ts \
376 --pdf source-paper.pdf \
377 --page <page-number> \
378 --output figures/figure-<N>.png
379 ```
380 **Note**: `extract-figure.ts` renders the **entire page** to a high-resolution
381 PNG — it does **not** auto-detect or crop a single figure's bounding box. On a
382 two-column page you will get both columns. To isolate one figure, either pass
383 `--crop "x,y,width,height"` (pixels in the rendered/scaled page) or open the
384 PNG, confirm it visually, and crop manually before applying the template.
385 - Run template application script:
386 ```bash
387 npx -y bun ${SKILL_DIR}/scripts/apply-template.ts \
388 --figure figures/figure-<N>.png \
389 --title "<slide-headline>" \
390 --caption "Figure <N>: <caption-text>" \
391 --output <NN>-slide-<slug>.png
392 ```
393 - Report: "Extracted: Figure N → slide NN"
394
3954. **For slides with `Source: generate`** (or no IMAGE_SOURCE):
396 - Proceed to Step 6 for AI generation
397
398**Note**: Source PDF must be saved as `source-paper.pdf` in output directory.
399
400**Troubleshooting**:
401- If figure detection missed a figure: manually add `// IMAGE_SOURCE` block to outline
402- If wrong figure mapped: edit the `Figure:` and `Page:` values in outline
403- If extraction fails: check PDF page number (1-indexed)
404
405**PyMuPDF Fallback for Page Extraction**:
406If `extract-figure.ts` fails with "Image or Canvas expected" error (common with complex PDFs), use PyMuPDF:
407```python
408import fitz
409doc = fitz.open("source-paper.pdf")
410page = doc[page_num - 1] # 0-indexed
411mat = fitz.Matrix(3, 3) # 3x scale for high resolution
412pix = page.get_pixmap(matrix=mat)
413pix.save(f"extracted/page-{page_num}.png")
414```
415Then apply template using `apply-template.ts`.
416
417### Step 6: Generate Images
418
4191. Use selected method from Step 5
4202. **Skip slides already processed in Step 5.5** (those with `Source: extract`)
4213. Generate session ID: `slides-{topic-slug}-{timestamp}`
4224. Generate each remaining slide with same session ID
4235. Report progress: "Generated X/N"
4246. Auto-retry once on generation failure
425
426### Step 6.5: Proofread Generated Images (Content Integrity)
427
428Text-to-image **bakes text into pixels and will garble spelling, math symbols, and
429numbers** — this is the single biggest risk of this skill. Do not ship unchecked.
430
431**For every generated slide** (especially any with equations, tables, key numbers,
432or non-Latin text), use `Read` to open the PNG and visually check:
433
4341. **Spelling / wording** — headline and body text match the outline, no invented or
435 mangled words.
4362. **Math & symbols** — equations, subscripts, Greek letters, operators are correct
437 (or absent). Assume the model got them wrong until you confirm otherwise.
4383. **Numbers & units** — any figure that carries data matches the source exactly.
439
440**If garbling is found:**
441- Regenerate that slide with a corrected/simplified prompt (spell risky terms
442 phonetically, reduce text density, move exact numbers to a caption). **Max 2 retries.**
443- If it still fails after 2 retries, **flag the slide `[CHECK]`** in the Step 8 summary
444 and recommend one of:
445 - Replace with an **extracted** figure/table from the source PDF (`Source: extract`), or
446 - **Simplify** the slide to remove the fragile text, or
447 - For a deck that genuinely needs faithful, editable formulas/data, switch to
448 **scholar-slides**.
449
450Never silently deliver a slide with garbled math or data — always surface it.
451
452### Step 7: Merge to PPTX and PDF
453
454```bash
455npx -y bun ${SKILL_DIR}/scripts/merge-to-pptx.ts <slide-deck-dir>
456npx -y bun ${SKILL_DIR}/scripts/merge-to-pdf.ts <slide-deck-dir>
457```
458
459### Step 8: Output Summary
460
461```
462Slide Deck Complete!
463
464Topic: [topic]
465Style: [style name]
466Location: [directory path]
467Slides: N total
468
469- 01-slide-cover.png ✓ Cover
470- 02-slide-intro.png ✓ Content
471- 04-slide-results.png ⚠ [CHECK] math/numbers — verify or use scholar-slides
472- ...
473- {NN}-slide-back-cover.png ✓ Back Cover
474
475Outline: outline.md
476PPTX: {topic-slug}.pptx
477PDF: {topic-slug}.pdf
478```
479
480List any `[CHECK]`-flagged slides (from Step 6.5) explicitly so the user knows which
481slides may contain garbled text/math/data and how to remediate them.
482
483## Slide Modification
484
485See `references/modification-guide.md` for:
486- Edit single slide workflow
487- Add new slide (with renumbering)
488- Delete slide (with renumbering)
489- File naming conventions
490
491## Image Generation Dependencies
492
493### Gemini API (Option 1 - Recommended)
494
495Requires:
496- `GOOGLE_API_KEY` or `GEMINI_API_KEY` environment variable
497- Python 3.8+ with pip
498- `google-genai` package (auto-installed by script)
499
500Model: `gemini-3-pro-image` (default; Nano Banana Pro, GA). The older
501`gemini-3-pro-image-preview` id is deprecated — override with `--model` only if needed.
502
503### Gemini Web Skill (Option 2)
504
505Requires:
506- `baoyu-danger-gemini-web` skill installed at `.claude/skills/baoyu-danger-gemini-web`
507- Google Chrome browser with logged-in Google account
508- User consent for reverse-engineered API disclaimer
509
510### PDF Figure Extraction
511
512Requires (install via `cd ${SKILL_DIR}/scripts && npm install`):
513- **Primary**: `pdfjs-dist` npm package (use legacy build for Node.js)
514- `canvas` npm package for extract-figure.ts / apply-template.ts
515- **Fallback**: `pymupdf` Python package (more reliable for complex PDFs)
516
517## References
518
519| File | Content |
520|------|---------|
521| `references/analysis-framework.md` | Deep content analysis for presentations |
522| `references/outline-template.md` | Outline structure and STYLE_INSTRUCTIONS format |
523| `references/modification-guide.md` | Edit, add, delete slide workflows |
524| `references/content-rules.md` | Content and style guidelines |
525| `references/base-prompt.md` | Base prompt for image generation |
526| `references/figure-container-template.md` | Visual specs for extracted figure containers |
527| `references/styles/<style>.md` | Full style specifications |
528
529## Notes
530
531### Image Generation
532
533- **Nano Banana Pro API**: Recommended. Stable, reliable, requires API key
534- **Gemini Web**: No API key needed, but uses reverse-engineered API with account risk
535- Generation time: 10-30 seconds per slide
536- Auto-retry once on generation failure
537- Maintain style consistency via session ID
538
539### Content Guidelines
540
541- Use stylized alternatives for sensitive public figures
542- Both methods use the same underlying Gemini model for image generation
543
544## Extension Support
545
546Custom styles and configurations via EXTEND.md.
547
548**Check paths** (priority order):
5491. `.paper-skills/paper-slide-deck/EXTEND.md` (project)
5502. `~/.paper-skills/paper-slide-deck/EXTEND.md` (user)
551
552If found, load before Step 1. Extension content overrides defaults.