Notion to Markdown Docs
Notion's “Export → Markdown & CSV” gives you a .zip that is technically Markdown but practically broken: every filename carries a 32-character page id, subpages sit in hash-named folders, and every internal link and image points at those hashed paths. This tool reads that .zip in your browser, strips the hashes, rewrites the links and images to the clean paths, preserves your images, and hands back a cleaned .zip, nothing is uploaded.
What Notion's export gets wrong
When you export a Notion workspace as Markdown, each page becomes a file named like Project Plan a1b2c3…d4e5.md, the trailing 32-hex string is the page's internal id. Pages with subpages also get a sibling folder of the same hashed name holding the children, and images live inside those folders. Notion then writes every internal link and image reference using those hashed, URL-encoded paths.
- Cluttered filenames, every file and folder ends in a long hash.
- Broken-looking links,
[Sub](Project%20Plan%20a1b2…/Child%20f6a7….md) instead of [Sub](Project Plan/Child.md).
- Hard to browse, the hashes make the folder tree unreadable in any editor or static-site generator.
What this tool fixes clean
It produces a cleaned .zip that mirrors your workspace structure with:
- De-hashed names,
Project Plan a1b2…d4e5.md → Project Plan.md, folders too.
- Rewritten internal links: every link between pages is repointed to the clean path, so cross-references keep working.
- Preserved, re-linked images, image files are copied byte-for-byte and their references updated. Broken images are the #1 migration complaint; they survive here.
- A file/folder that share a name coexist correctly, a page
Notes.md and its subpage folder Notes/ both keep the name Notes, exactly as Notion intends.
Tip: drop the .zip exactly as Notion gave it to you, don't unzip it first. The tool needs the whole archive to rebuild the link graph.
Databases & what's preserved as-is
Notion databases export as a .csv plus a folder of one Markdown file per row (each row is itself a page with body content). This tool de-hashes and re-links those files but keeps them as files: it does not flatten a database into a single Markdown table, because that would silently drop each row's body content. If you want a database as a Markdown table, run the exported .csv through our CSV to Markdown tool.
A worked example: before and after clean
Here is a small workspace, one page with a subpage and an image, exactly as Notion exports it:
Export-3f9a2b7c/
├── Project Plan 4f3a9c81b2de4a6f8e01c9d7b5a3f2e8.md
└── Project Plan 4f3a9c81b2de4a6f8e01c9d7b5a3f2e8/
├── Kickoff Notes 7e2d5b91a4c8f0632db1e9a7c5f4b8d2.md
└── diagram.png
Inside Project Plan ….md, the link to the subpage reads [Kickoff Notes](Project%20Plan%204f3a…f2e8/Kickoff%20Notes%207e2d…b8d2.md). After cleaning, the same workspace is:
Export-3f9a2b7c/
├── Project Plan.md
└── Project Plan/
├── Kickoff Notes.md
└── diagram.png
and the link is simply [Kickoff Notes](Project%20Plan/Kickoff%20Notes.md), the clean path with only the standard space-encoding that Markdown links require. Every page, folder, link, and image reference in the archive gets the same treatment, so the whole tree is readable and the cross-references still resolve.
Other Notion export quirks worth knowing
The hashed filenames are the loudest problem, but Notion's Markdown export has a few more habits you will notice in the cleaned files. These are properties of the export itself, not bugs in the cleanup:
- Callouts become blockquotes. A callout block exports as a
> quote with its emoji kept as the first character, which is a reasonable plain-Markdown stand-in.
- Toggles flatten into lists. Toggle blocks export as list items with their hidden content indented beneath them, so nothing is lost, but nothing folds either.
- Equations stay LaTeX. Inline and block equations export as
$…$ and $$…$$; most Markdown renderers with math support display them directly.
- Column layouts collapse. Side-by-side columns export as one vertical sequence; the visual layout is a Notion feature, not a Markdown one.
- Database row pages carry a property header. Each row's Markdown file begins with a plain-text list of its database properties before the body content.
Knowing these up front saves the "did the converter break my page?" moment: the words are all there, some of Notion's presentation simply has no Markdown equivalent.
Where the cleaned export goes next
Because the cleaned files use standard relative links, they work anywhere Markdown does: an Obsidian vault, a Git repository, a static-site generator's content folder, or a documentation wiki. Typical next steps with the rest of iLoveMD, all equally local:
Privacy & limits
The entire conversion runs in your browser via a vendored copy of JSZip: your export is never uploaded, and no part of it is sent to a server or any third party. Images are processed in memory and written straight back into the cleaned .zip.
- Size limit: 50 MB for the input .zip (a safe ceiling for in-browser processing). Larger workspaces are rejected with a clear message rather than risking a browser crash.
- Not a Notion export? If the .zip has no hashed Notion filenames, the tool tells you instead of touching your files.
- Works offline once the page and (on first use) the JSZip library have loaded.