Use file-to-markdown
Convert a Word document, PowerPoint deck, Excel workbook, web page, CSV, JSON, text file, email (.eml or Outlook .msg) or PDF into clean Markdown
Convert a Word document, PowerPoint deck, Excel workbook, web page, CSV, JSON, text file, email (.eml or Outlook .msg) or PDF into clean Markdown. It keeps headings, lists, tables, links, bold and italic, slide titles and speaker notes. It saves embedded images beside the Markdown and links them, shows tracked changes as pending rather than accepted, and reports everything else it dropped (charts, comments, formulas), so the content can be read, reviewed or fed to another skill.
Reach for it when the user hands over a .docx, .pptx, .xlsx, .html, .csv, .json, .eml, .msg or .pdf and says "read this", "turn this into markdown", "extract the text", or wants it critiqued or briefed.
Install it
npx skilldrop-cli install file-to-markdown # Claude Code, your user folder
npx skilldrop-cli install file-to-markdown --project # Claude Code, this repo
npx skilldrop-cli install file-to-markdown --ide cursor # or kiro, codex, antigravity, copilot
It is part of the Converters pack: --pack converters installs it with its neighbours.
It ships scripts, so it needs Python 3 (standard library only, nothing to install). What they may touch is declared in its manifest.
Ask for it
Say it the way you would to a colleague. Requests like these route to it:
- "turn this Outlook .msg email into markdown so I can paste it into the ticket"
- "Convert this Word doc to markdown"
- "Extract the text and tables from budget.xlsx so you can read it"
- "Here's the deck as a pptx, pull out the slide text and speaker notes"
- "Turn this saved HTML page into clean markdown"
Requests like these belong to a different skill, so it shouldn't answer them:
- "Convert my markdown notes into a .docx for the client"
- "Make an HTML version of README.md I can email"
- "Here's a messy Slack thread, turn it into a brief for the design doc"
If another skill answers instead, ask for this one by name: "use file-to-markdown".
Check what you get
A good result:
- Structure survives. A heading in the source is a heading in the Markdown, a list is a list, a table is a table. Not a wall of paragraphs.
- Losses are stated, with counts. "2 charts, 1 comment and 14 formulas are not in this", never silence.
- Nothing is added. The Markdown holds only what the file holds: no summaries, no invented headings, no filled-in empty cells.
- Speaker notes stay attached to their slide, because that is often where the real argument is.
- Numbers are copied as stored. No rounding, no currency symbols added; dates converted only when the cell is formatted as a date.
- Images come through as files. An embedded image is saved and linked where it sat, with its alt text, not reduced to a caption.
- Tracked changes stay pending. They are marked, counted and said to be unaccepted; only one the user or a comment settles is applied, and the reply says so.
- A contradiction isn't pasted silently. Both figures are named, and a deliverable meant for pasting leaves it out or marks it.
- Inferred structure is flagged. When headings come from font size instead of styles, the reply says to check the levels.
See a worked example
Use something else when
- Going the other way, Markdown to Word; use
md-to-docx - Markdown tables into a workbook; use
md-to-xlsx - Messy notes, a Slack thread or a transcript that are already text; use
brief-intakedirectly - A document that is already Markdown and needs reviewing; use
doc-critiquedirectly
Next
- SKILL.md, the instructions the agent reads
- Its page on the site
- Related: brief-intake, doc-critique, md-to-docx, md-to-xlsx