Help us improve
Share bugs, ideas, or general feedback.
From obsidian-vault-agent
Creates slide presentations from topics, URLs, PDFs, git repos, or vault notes. Handles research, synthesis, outlining, and editing existing decks. Default output is reveal.js HTML; pptx available on request.
npx claudepluginhub tuan3w/obsidian-vault-agent --plugin obsidian-vault-agentHow this skill is triggered — by the user, by Claude, or both
Slash command
/obsidian-vault-agent:slide-maker <topic, URLs, file paths, or vault notes><topic, URLs, file paths, or vault notes>This skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
<Purpose>
Generates self-contained HTML slide decks from briefs, notes, or topics. Supports 13 layouts, 8 style presets, inline editing, and PDF export.
Generates self-contained HTML or React slide decks for fullscreen presentations from ideas, outlines, existing content, or documents.
Orchestrates presentation creation from content planning to format-specific generation (HTML slides or PPTX). Invokes html-slides or pptx-slides skills for final output.
Share bugs, ideas, or general feedback.
<Use_When>
<Do_Not_Use_When>
Create workspace + output directories at the start of every session:
mkdir -p temp/slides/research temp/slides/images notes/slides
Final output always goes to notes/slides/<presentation-name>.html (or
.pptx). Images used by the presentation are copied to
notes/slides/images/. The temp/slides/ workspace is for intermediate files
only.
Parse $ARGUMENTS and any user context. Classify each input:
| Input type | Detection | Strategy |
|---|---|---|
| URL | starts with http(s):// | WebFetch + download images |
| Git repo | github.com or git URL | clone to temp, read key files |
| .pdf extension | Read tool (for local) or download | |
| Vault note | (Type) Name or [[wikilink]] | Read via MCP or Read tool |
| Existing slides (.html) | .html extension | Editing mode |
| Existing slides (.pptx) | .pptx extension | Delegate to pptx skill |
| Raw topic | none of the above | WebSearch + WebFetch |
Auto-detect research depth:
Present what was detected:
Detected sources:
1. [URL] blog post — will fetch + extract
2. [URL] paper PDF — will download and read
3. "transformer architecture" — will web search
Mode: thorough (3 sources → parallel research)
Proceeding to research...
Don't wait for confirmation unless something is ambiguous.
Before researching, understand what the user actually needs. Ask up to 5 focused questions in a single message. Adapt questions to what's already known — skip anything the user already specified.
Questions to consider (pick the ones that aren't already answered):
How to ask — be conversational, not interrogation-style:
Before I start researching, a few quick questions so I build the right deck:
1. What's this for — conference talk, team meeting, class?
2. Who's the audience? What do they already know about [topic]?
3. What language should the slides be in?
4. Any specific angle — what should the audience walk away remembering?
5. Style preference — formal/minimal, bold/visual, dark/light theme?
(Skip any that don't apply — I'll use sensible defaults)
After the user responds, synthesize their answers into a creative brief
that guides all downstream stages. Save it to temp/slides/brief.md:
# Creative Brief
**Topic**: [topic]
**Goal**: [what this presentation accomplishes]
**Audience**: [who, what they know, what they care about]
**Language**: [language for slide content]
**Key takeaway**: [the ONE thing the audience should remember]
**Tone**: [formal / casual / technical / storytelling / provocative]
**Style direction**: [dark/light, color mood, density level]
**Emphasis**: [specific aspects to highlight]
**Skip**: [anything the user explicitly wants to avoid]
**Format**: [reveal.js HTML / pptx]
**Duration**: [if mentioned — affects slide count]
Palette selection: Based on the brief, choose a palette from the Design Principles table (or craft a custom one). The palette should feel designed for THIS topic and THIS audience — not generic. Include your palette choice and reasoning in the brief.
Skip this stage when:
Then proceed to research with the brief guiding what to look for.
Read the agent definition:
Read("${CLAUDE_SKILL_DIR}/agents/source-researcher.md")
Spawn one source-researcher agent per source, all in parallel in a single
message. Each agent:
temp/slides/research/source-NN-slug.mdtemp/slides/images/Agent(
model="sonnet",
prompt="You are Source Researcher. Follow these instructions:
[INSERT FULL CONTENT OF agents/source-researcher.md]
SOURCE: [url/path/topic]
SOURCE_NUMBER: [NN]
OUTPUT_FILE: temp/slides/research/source-NN-slug.md
IMAGES_DIR: temp/slides/images/
Research this source and write findings to the output file.
Return only a 3-5 sentence summary."
)
If a source fails, continue with what succeeded — note the failure.
For raw topics with no other sources, spawn one agent that does WebSearch (2-3 queries) + WebFetch (top 3 results).
Skip agents. Do inline research:
temp/slides/images/temp/slides/research/source-01-topic.mdDuring research (both modes), download diagrams, charts, and screenshots that
could enhance slides. Skip decorative/stock images. Save to
temp/slides/images/ with descriptive names.
curl -sL "IMAGE_URL" -o temp/slides/images/descriptive-name.png
Read all research files from disk:
Glob(pattern="temp/slides/research/*.md")
# Then Read each file
Read the creative brief from temp/slides/brief.md — use it to guide content
selection, ordering, emphasis, language, and tone.
Build a slide outline. Present it to the user:
## Slide Outline
**Title**: [Presentation Title — in the brief's language]
**Audience**: [from brief]
**Language**: [from brief]
**Tone**: [from brief]
**Palette**: [from brief — name + hex values]
**Key takeaway**: [the ONE thing from the brief]
**Slides**: ~[N] slides
---
1. **Title Slide** — [title + subtitle]
2. **[Insight headline, not label]** — [2-3 key points] | Layout: [type]
3. **[Insight headline]** — [key points] | Image: [image-name.png]
4. ...
N. **Closing / Key Takeaways** — [summary points]
Headline rule: every slide headline should be an insight ("Attention is $O(n^2)$ — that's the bottleneck"), not a label ("Attention Mechanism").
ALWAYS wait for user approval before proceeding to Stage 4.
The user may:
Save the approved outline to temp/slides/outline.md.
Read the agent definition and template:
Read("${CLAUDE_SKILL_DIR}/agents/slide-writer.md")
Read("${CLAUDE_SKILL_DIR}/references/reveal-template.html")
Launch the slide-writer agent:
Agent(
model="sonnet",
prompt="You are Slide Writer. Follow these instructions:
[INSERT FULL CONTENT OF agents/slide-writer.md]
CREATIVE BRIEF:
[content of temp/slides/brief.md]
OUTLINE:
[approved outline from temp/slides/outline.md]
RESEARCH FILES (read each for detailed content):
[list of temp/slides/research/*.md paths]
IMAGE FILES AVAILABLE:
[list of temp/slides/images/* paths]
TEMPLATE:
[reveal-template.html content]
OUTPUT_FILE: temp/slides/output.html
Build the presentation following the brief's language, tone, palette,
and audience direction. Write the HTML to the output file."
)
Option 1 — Convert from HTML (preferred, faster): First create the reveal.js HTML (Path A), then convert to pptx:
npx --yes -p pptxgenjs node "${CLAUDE_SKILL_DIR}/scripts/html2pptx.js" notes/slides/name.html notes/slides/name.pptx
This preserves palette, layouts, and content from the HTML. Review the output and fix any issues.
Option 2 — Direct pptx creation (for complex cases):
Delegate to the pptx skill at .agents/skills/pptx/. Pass:
Delegate to pptx skill's unpack/edit/pack workflow.
After the slide-writer agent finishes:
# Generate a slug from the presentation title
SLUG="presentation-name" # kebab-case from title
cp temp/slides/output.html "notes/slides/${SLUG}.html"
# Copy any images referenced by the presentation
cp -r temp/slides/images/ "notes/slides/images/" 2>/dev/null || true
Presentation created: notes/slides/[name].html
Open in your browser to preview (File → Open or drag into browser).
Let me know if you'd like any changes — I can edit individual slides,
adjust colors, reorder, add/remove content.
Need PowerPoint? I can export to .pptx too.
For iteration:
notes/slides/[name].html<Design_Principles> Borrowed from the pptx skill — apply to ALL slide formats.
Pick a palette that matches the topic. Don't default to generic blue.
| Theme | Primary | Secondary | Accent |
|---|---|---|---|
| Midnight Executive | #1E2761 (navy) | #CADCFC (ice blue) | #FFFFFF (white) |
| Forest & Moss | #2C5F2D (forest) | #97BC62 (moss) | #F5F5F5 (cream) |
| Coral Energy | #F96167 (coral) | #F9E795 (gold) | #2F3C7E (navy) |
| Warm Terracotta | #B85042 (terracotta) | #E7E8D1 (sand) | #A7BEAE (sage) |
| Ocean Gradient | #065A82 (deep blue) | #1C7293 (teal) | #21295C (midnight) |
| Charcoal Minimal | #36454F (charcoal) | #F2F2F2 (off-white) | #212121 (black) |
| Teal Trust | #028090 (teal) | #00A896 (seafoam) | #02C39A (mint) |
| Berry & Cream | #6D2E46 (berry) | #A26769 (dusty rose) | #ECE2D0 (cream) |
| Cherry Bold | #990011 (cherry) | #FCF6F5 (off-white) | #2F3C7E (navy) |
<Tool_Usage>
User: ทำสไลด์จาก [url1] [url2] [url3] กับ (Paper) Scaling Laws
<Escalation_And_Stop_Conditions>
$ARGUMENTS