Install
$ agentstack add skill-jtsternberg-claude-plugins-export-presentation ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Export Presentation
Export HTML slide presentations (built with slides-presentation) to PDF or PNG screenshots using browser automation.
Workflow
Step 1: Detect Browser Automation Tool
Check for available browser tools in this priority order. Use the first one found and read its reference doc for tool-specific commands:
| Priority | Tool | How to detect | Reference | |----------|------|---------------|-----------| | 1 | agent-browser CLI | which agent-browser | [references/browser-agent-browser.md](references/browser-agent-browser.md) | | 2 | Claude in Chrome MCP | MCP tools mcp__claude-in-chrome__* available | [references/browser-claude-in-chrome.md](references/browser-claude-in-chrome.md) | | 3 | Playwright | which playwright or npx playwright --version, or MCP tools available | [references/browser-playwright.md](references/browser-playwright.md) | | 4 | Chrome DevTools MCP | MCP tools mcp__chrome-devtools__* available | [references/browser-chrome-devtools.md](references/browser-chrome-devtools.md) |
If no browser tool is found, stop and tell the user which tools are supported with links to install them. Recommend agent-browser as the simplest option.
Read the reference doc for the detected tool before proceeding — it contains the exact commands for navigation, screenshots, and viewport configuration.
Step 2: Preflight Checks
Before starting the (slow) screenshot loop, validate everything upfront:
- Input exists — verify the HTML file path or URL is accessible
- Slide count — parse the HTML for
data-slideattributes to count slides. If nodata-slideattributes found, warn the user this may not be a slides-presentation deck - PDF assembler (if PDF mode) — check availability in order:
python3 -c "import img2pdf"(preferred — lossless PNG embedding)which magickorwhich convert(ImageMagick fallback)- If neither available, warn and suggest installing:
pip install img2pdf
- Output path — verify the target directory is writable
For PDF assembly details, see [references/pdf-assembly.md](references/pdf-assembly.md).
Step 3: Resolve URL
If given a URL: Use it directly. Skip to Step 4.
If given a file path: Start a local HTTP server automatically:
bash scripts/serve-local.sh /path/to/presentation.html
The script outputs the URL and PID. Use the URL for browser navigation. The PID is needed for cleanup in Step 7.
Step 4: Count Slides
Read the HTML file and count data-slide attributes:
grep -c 'data-slide=' presentation.html
Or parse more precisely for data-slide="N" to get the exact count. Slides are zero-indexed (data-slide="0" through data-slide="N-1"), so slide count = max index + 1.
Step 5: Navigate and Screenshot
Using the detected browser tool's commands (from its reference doc):
- Set viewport to
1920x1080(16:9, matching presentation aspect ratio) - Open the URL in the browser
- Wait 2 seconds after page load for fonts and JavaScript to initialize
- Create a screenshots directory (e.g.,
screenshots/in the output location) - Screenshot the first slide as
slide-01.png - For each remaining slide:
- Press
ArrowRightto advance - Wait
0.5sfor the CSS transition to complete - Screenshot as
slide-NN.png(zero-padded, 1-indexed filenames)
Report progress as you go (e.g., "Captured slide 5 of 20").
Step 6: Assemble Output
PDF mode (default):
Assemble all screenshots into a single PDF. See [references/pdf-assembly.md](references/pdf-assembly.md) for the exact commands.
Output filename: .pdf in the same directory as the HTML file (or current directory if URL input).
Images-only mode:
If the user requested images only, skip PDF assembly. The screenshots directory is the final output.
Step 7: Clean Up
- Stop the local server if one was started in Step 3 (kill the PID)
- Remove temporary screenshots if PDF mode (they're embedded in the PDF now)
- Report results — print the output path and a summary:
`` Exported 20 slides to presentation.pdf ``
Limitations
- Designed for HTML presentations built with the
slides-presentationtemplate (usesdata-slideattributes for navigation) - Requires a browser automation tool — see Step 1 for supported options
- External fonts (Google Fonts) require internet connectivity during export
- Future: PPTX export, reveal.js support, partial slide range export
Utility Scripts
scripts/serve-local.sh— Starts a local HTTP server bound to127.0.0.1on an available port. Outputs the full URL and server PID. Serves from the directory containing the HTML file.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: jtsternberg
- Source: jtsternberg/claude-plugins
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.