Install any skill in seconds. Free to start, no credit card required.
Get Started Free →asgeirtj/export-as-pptx-editable
Native text & shapes — editable in PowerPoint
Passed 11 of 18 test cases with the skill, and 3 of 18 without it.
and 12 more in the full report
11 fixed3 passed either way7 still failing1 broke
Tokens, turns and time describe resource use, not a dollar price.
One of 10 test cases the skill fixed. Same model, same prompt, with and without the skill.
Our HTML deck contains speaker notes stored inside <script type="application/json" id="speaker-notes">. Where in the gen_pptx JSON parameters should I paste this JSON array so speaker notes get attached to slides in the PPTX?
| Checked | Without skill | With skill |
|---|---|---|
| Explains that speaker notes are parsed automatically from the script block without passing them in gen_pptx parameters. | Missed | Passed |
The instructions your model reads when the skill loads.
Export an HTML slide deck to a .pptx with native PowerPoint objects (editable text, shapes, images). One gen_pptx tool call does everything: capture, font handling, generation, download.
read_file the HTML to find: the slide selector, how to navigate (function name? class toggle?), what fonts it uses, whether there's a scaling wrapper.show_to_user the deck so it's in the user's preview.gen_pptx with the inputs below.{
"width": 1920, "height": 1080, // CSS px — match the deck's slide size
"slides": [ // one entry per slide, in order
{ "showJs": "goToSlide(0)", "selector": ".slide.active" },
{ "showJs": "goToSlide(1)", "selector": ".slide.active" }
// For decks where all slides are in DOM at once and you don't need to navigate:
// { "selector": ".slide:nth-child(1)" }, { "selector": ".slide:nth-child(2)" }
],
"hideSelectors": [".nav", ".progress", "[data-omelette-chrome]", "[data-noncommentable]"],
// If the deck wraps slides in a transform:scale() container, name it here.
// gen_pptx clears the transform AND forces width/height onto this element.
"resetTransformSelector": ".slide-container",
// Font handling — pick ONE strategy based on the directive at the bottom.
// Substitution happens BEFORE capture so layout reflows correctly.
"googleFontImports": ["Poppins", "Lora"],
"fontSwaps": [{ "from": "BrandSans", "to": "Poppins" }],
// Or fontSwaps: [{from:"BrandSans", to:"Arial"}] for web-safe.
// Or omit both to keep brand fonts as-is.
"filename": "my-deck"
}
If — and only if — the user asked for Google Slides, also pass "offer_google_slides": true: the export dialog gains a 'Send to Google Slides' button, and the upload happens only if they click it.
slides[].showJs runs inside the iframe as a sync expression — don't await. If your deck's nav function is async, call it without await; the per-slide delay (default 600ms) covers the transition. Bump delay for decks with longer CSS transitions.
test cases passed, vs 3 / 18 without
Published skills whose descriptions closely match this one, with their headline benchmark lift.
More skills from the same source and nearby in the registry, with their headline benchmark lift.