Automate the grunt work of making research presentations — discovers experiments from git/output folders, collects images and metrics, and organizes them into slides. Creates a slide-by-slide script for user approval, then generates slide markdown and editable PPTX.
From results-to-slidesnpx claudepluginhub saidwivedi/research-skills --plugin results-to-slidesThis skill uses the workspace's default tool permissions.
README.mdbackgrounds/slide_bg_dark.pngbackgrounds/slide_bg_light.pngbackgrounds/slide_bg_warm.pnggenerate_background.pymd_to_pptx.pyrender_diagram.jsslide_reference.mdtheme.cssGuides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Details PluginEval's skill quality evaluation: 3 layers (static, LLM judge), 10 dimensions, rubrics, formulas, anti-patterns, badges. Use to interpret scores, improve triggering, calibrate thresholds.
Discover experiments, collect images/metrics, organize into slides. You provide the story — this skill handles the grunt work. Output: slide markdown + editable PPTX.
Maximize use of the Agent tool. Whenever you have 2+ independent tasks, launch parallel agents.
${CLAUDE_SKILL_DIR}${CLAUDE_SKILL_DIR}/md_to_pptx.py${CLAUDE_SKILL_DIR}/backgrounds/${CLAUDE_SKILL_DIR}/theme.cssThe user provides: /results-to-slides START_DATE END_DATE
Arguments come as $ARGUMENTS containing two MMDD date strings (e.g., 0301 0308).
Parse the dates:
$0 = start date (MMDD), $1 = end date (MMDD)find bounds)If no arguments provided, use AskUserQuestion:
Output directory: presentation/YYYY_MM_DD/ using the end date.
Ask all preferences upfront before discovery, in a SINGLE AskUserQuestion call:
| Choice | Background file | --theme flag |
|---|---|---|
| Light | slide_bg_light.png | light |
| Warm | slide_bg_warm.png | light |
| Dark | slide_bg_dark.png | dark |
Do NOT ask for slide count. Generate as many slides as the content needs — images drive the count, not a preset number.
Scan project docs (CLAUDE.md, README.md, memory files, docs/) to understand:
presentation/ directory for prior slide decks to recap)If no research goal found, use AskUserQuestion:
Use this context internally for smart organization (grouping, filtering, prioritization). Do NOT let it leak into slide text.
Use ALL methods — each catches things the others miss.
git log --after="YYYY-MM-DD_START" --before="YYYY-MM-DD_END+1" --oneline --stat
Extract: commit messages (often contain results), files changed, dates.
find . -maxdepth 2 -type d -newermt "YYYY-MM-DD_START" ! -newermt "YYYY-MM-DD_END+1" 2>/dev/null | sort
Also check: outputs/, results/, experiments/, runs/, logs/, checkpoints/.
Do NOT assume MMDD_ naming — use modification time as primary signal.
For each folder: list contents, look for metrics files (metrics.json, *.pkl, scores.txt,
*.log) and images (*.png, *.jpg, *.gif).
find . -name "*.py" -newermt "YYYY-MM-DD_START" ! -newermt "YYYY-MM-DD_END+1" 2>/dev/null | grep -v __pycache__ | sort
Also check .sh scripts. Read the code to understand what each experiment does — folder
names are opaque, scripts tell you everything.
Collect FAR more images than you think you need. This is the most important discovery step.
plt.savefig(...), Image.save(...), cv2.imwrite(...) callsbaseline.*, best_*.*, comparison.*, grid.*, eval*.*.mp4, .avi, .mov — the converter embeds them as playable mediacols-2, 2 → cols-2, 3 → cols-3, 4 → cols-4Cross-reference git commits ↔ output folders ↔ scripts. Build:
DATE | EXPERIMENT_NAME | SCRIPT | OUTPUT_FOLDER | KEY_RESULT | IMAGES
For slides explaining concepts, pipelines, or architectures — create diagrams.
# One-time setup: cd /tmp && npm install puppeteer
node ${CLAUDE_SKILL_DIR}/render_diagram.js input.html output.png [--width 1200] [--scale 2]
Order slides chronologically — the audience follows the story of discovery.
Every slide in the outline must have one of: [IMG], [DIAGRAM], [TABLE], [DATASET].
If a slide has none, merge it into an adjacent slide or add a visual.
cols-4 grids
of baseline | method variants. Pick diverse examples — don't repeat the same prompt.
Annotate failures: "(no change)", "(worse)", "(baseline better)".Each experiment slide contains:
Generate a structured outline:
SLIDE SCRIPT
============
Slide 1: Title
Type: Title (lead)
Heading: [Project Name — Weekly Update]
Subtitle: [Date range, N experiments]
Chips: [N slides], [date range], [key topics]
Visual: [HERO_IMG]
Slide 2: [Experiment Name]
Type: Content
Heading: [What was done: key metric]
Bullets:
- [Configuration detail]
- [Result metric]
Visual: [IMG] path/to/image.png | [DIAGRAM] pipeline | [TABLE] | [DATASET]
Grid: cols-[2/3/4]
Every slide MUST have a Visual field. Flag any slide without one.
Use AskUserQuestion:
For per-slide review, use AskUserQuestion per slide with options: "Approve", "Edit", "Remove".
mkdir -p presentation/YYYY_MM_DD
cp ${CLAUDE_SKILL_DIR}/theme.css presentation/YYYY_MM_DD/
cp ${CLAUDE_SKILL_DIR}/backgrounds/CHOSEN_BG.png presentation/YYYY_MM_DD/slide_bg.png
Write to presentation/YYYY_MM_DD/slides.md.
Use ONLY elements from slide_reference.md. The PPTX converter only understands those specific HTML elements.
File header:
---
theme: notebook-status
paginate: true
size: 16:9
html: true
---
Slide separator: --- on its own line.
Element order (strict, top to bottom): heading → bullets (max 3, prefer 2) → table → images (always last).
Banned elements on content slides: chips, split layout, arch-box, stat cards, eyebrow, decision card, timeline. Chips are ONLY allowed on the title (lead) slide.
Do NOT generate: next steps slides, takeaway slides, or any slide requiring editorial interpretation.
Headings: factual label of experiment + result. "ResNet-50 on ImageNet: 76.1% Top-1" not "ResNet-50 Is the Clear Winner".
Bullets: facts only. Max 3 per slide (prefer 2 — more space for images). Keep short.
Table slides: NO bullets. One context line above the table instead. Max 5 rows.
Formatting: **bold** for key numbers and method names. `code` for technical identifiers.
Image captions: terse identifiers, not sentences. Use <strong> for scores.
Image paths: relative to project root. Converter resolves via --base-dir.
Title slide hero image: The title slide can include a cols-2 image grid below the chips.
One visual concept per slide — never mix grid types or have multiple unrelated sections.
Image-to-claim consistency: If a slide mentions a specific example, the images on that slide MUST show that exact example. Verify image filenames match the described content.
When uncertain about an experiment's purpose, present observable facts and let the user interpret. Do NOT guess intent.
python ${CLAUDE_SKILL_DIR}/md_to_pptx.py \
--input presentation/YYYY_MM_DD/slides.md \
--output presentation/YYYY_MM_DD/slides.pptx \
--bg-image presentation/YYYY_MM_DD/slide_bg.png \
--theme light \
--base-dir .
Use --theme dark for dark background. Use --theme light for light and warm.
If python-pptx is missing: check conda/mamba environments, CLAUDE.md, or ask the user.
Presentation generated!
Markdown: presentation/YYYY_MM_DD/slides.md
PPTX: presentation/YYYY_MM_DD/slides.pptx
Slides: [count]
Open in PowerPoint or LibreOffice Impress to edit further.