How to use
- Paste the Markdown into the left box. The preview on the right shows headings, bold, lists, tables, code and links as you type.
- Click Download .docx (or press Ctrl+Enter in the input box).
- Open the downloaded file directly in Word, LibreOffice, or drag it into Google Docs / drive.google.com to open it there: no copy-paste step, no intermediate format.
- Need it on the clipboard instead of as a file? The companion Markdown to Google Docs tool pastes formatted text directly into an already-open document.
A file, not a paste
Most "Markdown to Word" tools on the web actually convert to HTML and rely on your browser's or Word's own paste-formatting to turn that into something Word-shaped once you paste it in, which works, but only inside a document you already have open. This tool builds the .docxfile itself: a ZIP archive of WordprocessingML XML, the exact format Word saves, assembled entirely in your browser with no external library and no server round trip.
Example
The sample Markdown below converts to a 17.7 KB .docx, 103 words,1 headings, 3 lists and 1 table across real Word styles and elements:
Deploy checklist
Run the full test suite before tagging a release: npm test takes about two minutes.
- Bump the version in
package.json - Update the changelog
- Group entries under Added, Changed and Fixed
- Link each entry to its pull request
- Tag and push:
git tag v2.4.0 && git push --tags
| Environment | URL | Owner |
|---|---|---|
| Staging | https://staging.example.com | Priya |
| Production | https://example.com | Marco |
Production deploys happen only between 09:00 and 16:00 UTC.
npm run build && npm run deploy -- --env production
- ☑ Smoke test passed
- ☐ Release notes sent to #announcements
Options explained
- Load sample fills the input with the Markdown shown above, so there's something to try immediately.
- Clear empties the input and resets the preview.
- Download .docx builds the file fresh from the current Markdown and saves it; there is no separate "convert" step, since the preview already reflects exactly what will download.
Edge cases and common errors
- Images become a labelled link, not an embedded picture.
produces a hyperlink reading "[Image: alt text]" rather than the actual picture. Embedding a fetched image as a real Word media part is real added scope (a network fetch, format sniffing, a relationship and drawing XML per image) that this pass didn't take on. If you need the image itself in the document, add it in Word after downloading. - Nested numbered lists restart correctly. See the FAQ: this is the one thing most hand-rolled Word generators get wrong (verified here with a dedicated test for exactly that case).
- Footnotes, definition lists and Markdown extensions outside GitHub-flavored Markdown (the same engine Markdown to Google Docsand Markdown to Plain Text use) are not recognised: headings, paragraphs, bold/italic/strikethrough/code, links, lists (including task list checkboxes), block quotes, fenced code blocks, tables and horizontal rules all convert; anything else is treated as plain text.
- Empty input still downloads a valid, openable file rather than erroring (a blank one-page document, the same as opening Word and saving immediately).
- Nothing is kept after you close the tab. The file exists only as long as your browser holds it in memory before the download completes; reload the page and it's gone, the same as every other tool on this site.
Do the same thing in code
# Python (python-docx, a third-party library: pip install python-docx)
from docx import Document
doc = Document()
doc.add_heading("Title", level=1)
doc.add_paragraph("Some text.")
doc.save("out.docx")
// This tool takes a different approach on purpose: no dependency, built by hand
// as a ZIP of WordprocessingML XML (see src/lib/markdown-to-docx.ts in the repo),
// so it runs entirely client-side with nothing to install.Already have the result in a document rather than Markdown? Google Docs to Markdownconverts the other way. Need the formatted text on your clipboard instead of a file? Markdown to Google Docs is the paste-first version of this same conversion.