AgentStack
Browse Sign in
Browse Why AgentStack Sell Docs
Sign in
SKILL verified MIT Self-run

Pptx To Slide Md

skill-assaftzurel-assaf-agent-skills-pptx-to-slide-md · by AssafTzurEl

>-

No reviews yet
0 installs
33 views
0.0% view→install

Install

$ agentstack add skill-assaftzurel-assaf-agent-skills-pptx-to-slide-md

✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.

Security review

✓ Passed

No 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.

View the full security report →

Verified badge

Passed review? Show it. Paste this badge into your README, it links to the public security report.

AgentStack Verified badge Links to your public security report.
[![AgentStack Verified](https://agentstack.voostack.com/badges/verified.svg)](https://agentstack.voostack.com/security/report/skill-assaftzurel-assaf-agent-skills-pptx-to-slide-md)

Reliability & compatibility

Security review passed
0 installs to date
no reviews yet
2mo ago

Declared compatibility

Claude CodeClaude Desktop

Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.

Preview Execution monitoring

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 →
Are you the author of Pptx To Slide Md? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

PPTX → slide-Markdown

Convert an existing .pptx back into the plain-text format the user writes slides in, so a finished deck becomes editable source again.

Target format

One block per slide. --- separates slides; === separates slide content from speaker notes. Presenter instructions (images, animations, demos) live in [brackets] inside the content area. If the deck has sections, each section begins with a [Section N: Section Name] label before the first slide in that section.

[Section 1: Introduction]

[Slide 1]

# Slide Title

Slide content in markdown: bullets, numbered lists, tables, **bold**, *italic*, ~~strikethrough~~, [links](url).

[image: assets/slide3_img1.png — "alt text"]

[animation — 2 click steps:
  click 1: entrance of "First point"
  click 2: entrance of "Second point"]

===

**Speaker Notes:**

Notes in markdown.

---

[Slide 2]

# Next Slide Title

...

===

**Speaker Notes:**

*(none)*

Each slide is preceded by a [Slide N] label (N is the slide's position in the deck, so a subset extraction keeps the original numbers). --- separates slides and === separates content from notes, as before.

Blank lines between elements ensure Markdown viewers render each block as a separate paragraph rather than collapsing consecutive lines into soft-wrapped text.

The user also uses [^] inside speaker notes to mark a click. See the note on animations below for why extraction puts animation detail in the content area rather than fabricating [^] positions in the notes.

How to run it

The work is done by scripts/extract.py (uses python-pptx, already available).

python scripts/extract.py  -o 

Options:

  • -o, --output — output path (default: .md in the cwd).
  • --slides — subset to extract, e.g. --slides 3-20 or --slides 1,4,7-9

(1-based; default: all). Numbers in [Slide N] stay absolute.

  • --images-dir DIR — where to write extracted images (default:

_images/ next to the output file).

  • --no-images — don't write image files; still emit [image: filename] inline.

After running, read the output file and make it available to the user. Surface the generated .md (and the images folder) using whatever file-sharing mechanism your runtime offers — a file preview or attachment if one exists, otherwise point the user to the output path. Don't paste a huge deck inline if it's long — write the file and show a representative excerpt.

What gets extracted

  • Title# Heading (from the slide's title placeholder).
  • Body text → bullets by indent level (-, nested with two spaces),

numbered lists for auto-numbered paragraphs, plain paragraphs when a paragraph has no bullet. Run formatting becomes **bold**, *italic*, ***both***, ~~strikethrough~~, and [text](url) for hyperlinks. Adjacent runs with the same formatting are merged; soft line breaks within a paragraph become spaces.

  • Tables → Markdown tables (pipes inside cells are escaped).
  • Images → extracted to the images folder and referenced as

[image: — ""] (alt text included when the shape has it).

  • Charts[chart: — ""] (not the underlying data).
  • SmartArt / diagrams[SmartArt/diagram — text: ...] when text is

reachable, otherwise a note that the text isn't extractable.

  • Speaker notes → Markdown under **Speaker Notes:** (*(none)* if empty).
  • Animations → best-effort, see below.
  • Hidden slides → flagged with [hidden slide].
  • Sections[Section N: Name] emitted before the first slide of each

section (only when the deck actually uses sections).

  • Grouped shapes are walked recursively; shapes keep document order, with the

title hoisted to the top.

Animations — what is and isn't recoverable

PowerPoint stores animations as a time-node tree (`) that python-pptx` does not expose, so the script parses the raw slide XML. Be honest with the user about the boundaries:

  • Reliable: the number of click-advance steps, and which shape/paragraph

each step reveals (the script maps the animated paragraph range back to its text). Build-by-paragraph reveals (one bullet per click) come through.

  • Reliable: the effect category — entrance, exit, emphasis, motion path.
  • Not reported: the specific effect name (Fade vs. Wipe vs. Fly-In). The

preset-ID → name mapping is version-dependent and easy to get wrong, so the script deliberately reports only the category rather than guessing.

  • By design: animation detail goes in a [animation — …] block in the

content area (matching the user's convention that presenter instructions live in brackets). The script does not insert [^] click markers into the notes, because where each click belongs in the authored notes prose is not stored in the file and can't be reconstructed faithfully. If the user wants [^] markers in the notes, offer to add them using the click count as a guide.

  • If timing XML is present but can't be parsed, the slide gets

[animation present — could not parse (…)] instead of failing.

Build sequences across slides (always surface these)

Decks often split one idea across several consecutive slides: a list that grows one bullet per slide, or a fixed background with different things overlaid. The script flags runs of consecutive slides that share a title and prints them to stderr under BUILD SEQUENCES DETECTED, classifying each as either an additive build or a shared base with changing overlays.

Always extract these as separate slides (one block each, as normal) — do not merge them automatically. But after extraction, tell the user which sequences were detected and offer to compact each into a single slide with the build expressed as progressive-disclosure instructions and [^] click markers in the notes. Only compact if the user agrees. This applies to additive lists, overlay-style sequences, and restyled finales (e.g. a slide that repeats the previous one with text struck through).

Optional follow-ups

  • Describe images: if your runtime can view images, open the extracted image

files and, if the user wants, replace [image: file] with a short description.

  • Verify a tricky deck: if the output looks off (e.g. a text box that should

be a heading came through as a bullet, or vice-versa), the slide XML can be inspected directly; bullet detection relies on explicit buNone/buChar/ buAutoNum formatting and falls back to "body placeholders bullet, everything else is plain", which is a heuristic, not a guarantee.

Edge cases worth knowing

  • Embedded media, OLE objects, and equations are not extracted (only noted if

they carry text).

  • Merged table cells repeat their content per the underlying model.
  • A slide with no title placeholder is emitted as # (Slide N — untitled).

Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet, be the first.

Versions

  • v0.1.0 Imported from the upstream source.