Skip to content

Skills · converters

md-to-pptx

Turn an existing Markdown document (a status report, runbook, review or notes) into a PowerPoint deck (.pptx) that opens without a repair prompt, with nothing to install. Each heading becomes a slide, lists keep their nesting, tables become real PowerPoint tables, images are embedded, and comments become speaker notes. A section too long for one slide is split onto "continued" slides instead of shrinking the text, and the reply names every split, everything dropped, and any speaker note that would go out with the file. Use when the user says "turn this markdown into slides", "make this report a PowerPoint", "convert the .md to pptx", "I need this as a deck for Thursday", or "export these notes to PowerPoint".

Pack convertersTier lightJob Get a draft ready to shipv0.1.3

npx skilldrop-cli install md-to-pptx
Other ways to install

With the sibling skills it hands off to:

npx skilldrop-cli install md-to-pptx --with-related

The whole pack it belongs to:

npx skilldrop-cli install --pack converters

By hand, from a clone of the repo:

cp -R packs/converters/skills/md-to-pptx ~/.claude/skills/

In Claude Code, with the converters plugin installed, invoke it as:

/converters:md-to-pptx

Try it

A realistic prompt from the skill's acceptance evals:

turn status-report.md into slides for Thursday's steering group, I'll present it and then email the deck round afterwards

What a good result looks like

Example output

Kestrel Support: weekly review · the skill's own worked example, source

Worked example

title: Kestrel Support weekly review date: Week 41


This week

  • 1,006 tickets opened, 1,041 closed
  • Median first response: 2.8 hours (target 4)
  • Backlog down to 233 from 268
  • Chat hand-off rule live for the billing queue

Notes: lead with the backlog, it's the number the ops director watches.

Tickets by week

Tickets opened per week, weeks 37 to 41

Queue health

QueueOpenOldest (days)Owner
Billing619Ruth
Accounts486Dev
Integrations7214Ana
Hardware returns5211Sam

Follow-ups

Carried over

  • Weekend rota for November still not agreed; Ruth to bring two options to the next review
    • Option A keeps the current four-person rota and adds an on-call fifth person for peaks
    • Option B moves to two-person weekend shifts with a Monday catch-up block
  • The integrations backlog has grown three weeks in a row; Ana asked for one more engineer from the platform team for two sprints
  • Hardware returns are waiting on the courier contract renewal, which procurement owns

New

  • Customer survey goes out on 3 November to everyone with a ticket closed in October
  • The billing macro library needs a review before the price change on 1 December
  • Two new starters join on 10 November and need shadowing slots on every queue
  • Knowledge base articles for the new export feature are still in draft, owner to be agreed

How it's checked

Measured against plain Claude Code (2026-10-23): it met 60% of its checks, against 55% without it, and a blind judge preferred it. How skills are checked

55 assertions across 7 acceptance evals, and 10 trigger queries. Every skill's checks

What the output must do
  • Writes a .pptx whose slides follow the document's sections in order (title, Summary, Milestones, Defect burn-down, Risks and issues, Decisions needed, Next two weeks) and says it was checked by reopening the file, without claiming checks that were not run
  • The long Risks and issues section continues on a 'Risks and issues (continued)' slide at full text size instead of shrinking, and the reply says so
  • The milestones are a real PowerPoint table with all five rows, and the owners, dates and statuses exactly as in the file
  • The defect burn-down chart is embedded on its slide
  • The two notes comments become speaker notes on their slides (Summary, and the Risks slides) rather than slide text
  • It warns that the speaker note on the Risks slides mentions the Pellow Freight penalty clause and legal review, and that this note goes out to everyone the deck is emailed to, without deleting the note itself
  • It does not invent content: no agenda, summary, 'Next steps' or 'Questions?' slide, and no dates, owners or figures that are not in status-report.md
  • The reply opens with the file and slide count, is a few lines long, and does not mention scripts, skill names or file paths from the skill
  • Saves the pasted text to a Markdown file and produces a .pptx with a title slide and one slide each for Where we are, Survey results and Ask (plus any continued slide)
  • The three Notes: paragraphs end up as speaker notes on their own slides and do not appear as slide text
  • Survey results is a real PowerPoint table with all twelve depots, the access point numbers right-aligned, and every value as written
  • Says the coverage heatmap is a web link that was not embedded, and asks for a local copy or says what appears in its place
  • Points out that '9 of 12 depots surveyed' does not match the table, which shows 10 depots as Done, and does not change either figure
  • It does not invent content: no agenda, summary or 'Questions?' slide, and no numbers, dates or sites that are not in the pasted text
  • Delivers the file without asking questions first, in a short reply in plain words
  • Writes a 4:3 .pptx with the headings in Georgia and body text in Arial from brand.json
  • Reports that the accent colour '#F2A5' in brand.json is not a valid colour and that a default was used, rather than silently applying or replacing it
  • Points out that the start-of-shift checks jump from 7 to 9 in the source, so the slides number them in sequence and 'go back to step 9' now points at a different check; it does not invent a step 8 or quietly renumber the reference
  • The thirteen checks continue on a '(continued)' slide with the numbering carrying on, at full text size, and the reply says the section was split
  • Deals with the Mermaid flowchart: renders it to an image and embeds it, or says plainly that it appears as code text
  • The footnote 'Near misses count as incidents' is folded into the text rather than dropped silently, and the retired paper-form HTML block is either rewritten as text or reported as dropped
  • It does not add steps, times, sites or slides that are not in night-shift-induction.md
  • The reply is short, leads with the file, and does not mention scripts, skill names or the skill's file paths
  • Produces a .pptx file in the working directory built from qbr-q3.md
  • Does not quietly ship the HTML comment's internal note (7% renewal floor, 11% margin, 'Dana to confirm') to the client: either the .pptx has no speaker note or slide text containing it, or the reply names that note as going out with the file and says to remove it before emailing Harlow
  • The reply says the 12-item 'Risks and mitigations' section was split across more than one slide (continued slides) rather than squeezed onto one
  • The reply says charts/cost-per-shipment.png is missing from the folder and was not embedded, naming that file
  • The .pptx embeds charts/ontime.png as an image (a media file present in the package)
  • The .pptx contains the lane table as a real table with all 9 lanes, Columbus to Atlanta through Cincinnati to Memphis, and their figures as in the source (e.g. Toledo to Milwaukee 91.7)
  • Invents nothing that is not in qbr-q3.md: no extra lanes, figures, risks, owners, dates or slides of made-up content
  • Answers the request directly: hands over the deck with a short reply naming the file and the things the sender must know before emailing it, not a long tutorial on how to build slides
  • Produces a .pptx file in the working directory
  • The .pptx has 5 slides (or 6 where the reply says the extra one is a title slide), with topic titles the agent chose because the notes have no headings, rather than one slide per paragraph or a single wall of text
  • Uses the current figures from the 20 Oct meeting: go-live 1 December and budget $52,000; the superseded $48,000 / 17 November from the pasted 13 Oct section are not presented as current, and the reply says that pasted section was left out (or flags it)
  • Leaves Marco's private aside (his dad's surgery) out of every slide and speaker note in the .pptx, and the reply says it was left out or flags it
  • Keeps the action items with their owners and dates as written: Sanna demo by 13 Nov, Dev archive rule with legal by 30 Oct, Ruth training rooms week of 23 Nov
  • Presents the undecided points as open, not as decisions: the 6-versus-12-month read-only question and the archive-older-than-2-years idea
  • Invents nothing that is not in vendor-sync-notes.md: no new numbers, people, dates, risks or recommendations
  • Answers the request directly with a short reply naming the file and slide count, suited to a casual 'nothing fancy' ask
  • Produces a single .pptx file that unzips to a valid package: [Content_Types].xml, ppt/presentation.xml, and one ppt/slides/slideN.xml for each heading in the report (title plus Summary, Milestones, Risks, Burn-up, Budget, Workstream updates, Next steps), plus any continued slides; no package was installed and no network was used to build it.
  • The Milestones table is a real PowerPoint table: its slide XML contains an <a:tbl> with 4 <a:gridCol> and 5 <a:tr> rows (header plus the four milestones), with cell text such as 'Priya Lindqvist' and 'Moved to 13 Nov' intact, not a picture or tab-separated text.
  • The Risks slide keeps the nesting: the three top-level risks sit at the first level and their four sub-points (e.g. '212 open items, down from 640 in August') are marked as a deeper level (a:pPr lvl="1" or equivalent), not flattened.
  • The reply warns, before the file goes to Pellworth, that the HTML comment in the Budget section ('contractor spend is actually 14% over plan ... Do not raise with Pellworth') would ship as a speaker note in a file emailed to the client, and either leaves it out of the notes or clearly asks the user before including it; it does not silently put it into ppt/notesSlides/.
  • The reply states that img/burnup.png does not exist in the folder, so the Burn-up chart could not be embedded, and names what took its place (alt text, placeholder, or nothing); it does not draw, fabricate, or reference a non-existent image in ppt/media/.
  • The 20-bullet 'Workstream updates' section is split across two or more slides whose titles mark the continuation (e.g. 'Workstream updates (continued)'), with all 20 bullets present across them and no shrunk font (no normAutofit fontScale or reduced sz used to cram them); the reply names this split.
  • Invents nothing not in the source: every name, date and figure in the deck and reply (e.g. £1.18m, £1.65m, £1.62m, 212, 640, DEF-311, 4 Dec) comes from q3-status-report.md, and no new slides such as an agenda, RAG chart, or 'Questions?' slide with made-up content are added.
  • Answers the actual request directly: gives the path to the finished .pptx and a short list of the split, the dropped image and the speaker-note warning, without a long tutorial on PowerPoint or a menu of alternative approaches.
  • Finds and converts runbooks/db-failover.md without asking which file is meant, and produces a .pptx that unzips to a valid package with ppt/presentation.xml and one ppt/slides/slideN.xml per heading (plus continued slides).
  • Embeds runbooks/diagrams/topology.png by resolving the image path relative to the Markdown file's folder (runbooks/), not the working directory: the package has an image under ppt/media/ referenced from the Topology slide's .rels file, and an <p:pic> on that slide.
  • The YAML front matter (title, owner, last_reviewed, on_call_rota) is not rendered as slide body text; no slide shows 'owner: platform-ops' or the '---' delimiters as content.
  • The reply says the mermaid block on the Topology slide was not rendered as a diagram (it was either kept as code text or dropped) and names it, rather than leaving the team to find raw 'graph LR' text unexplained or silently losing it.
  • If the 14-step Procedure is split across slides, the continued slide keeps the original numbering (picks up at the right step, e.g. via startAt in a:buAutoNum or literal step numbers) instead of restarting at 1, and step 7's two sub-points stay nested under step 7; the reply names any split.
  • The reply points out that the TODO comment, which says step 9 (restart pgbouncer) is wrong for the v14 cluster, has become a speaker note on the Procedure slide, and flags it as something to settle before walking the team through step 9, since the slide body still shows the old instruction.
  • Code is kept verbatim in a monospace font: the psql command and 'export PGPASSWORD=<set-from-vault>' appear exactly as written, with the placeholder left as a placeholder and no real-looking password, host or command invented or 'corrected'.
  • Invents nothing: no steps, hosts, thresholds or owners that are not in db-failover.md (e.g. the 2 minutes, 30 seconds and 15 minutes figures are unchanged), and the reply is short enough for someone with an hour to go: the file path plus a few lines on the split, the mermaid block and the step-9 note.
When it should and shouldn't activate

Should activate:

  • turn this markdown status report into slides for Thursday
  • Convert runbook.md to a pptx
  • Can you make my meeting notes in notes.md into a PowerPoint? Keep the tables as tables
  • Export docs/q3-review.md as a PowerPoint deck with our brand.json fonts and colours
  • I need this README as slides, nothing fancy, one slide per section

Should leave to another skill:

  • Build an investor pitch deck from these bullet points, with charts and our corporate template
  • Outline the slides for my architecture review next week: what should each slide say?
  • Convert this markdown report to a Word document legal can track changes in
  • Turn the .pptx the client sent back into markdown
  • Make the markdown onboarding guide a single HTML page I can email

Related skills

brand-kit, file-to-markdown, md-to-docx, slide-outliner

Source

SKILL.md · the whole folder on GitHub.