Export you can trust: markdown, HTML and PDF, in your browser
An export button is a promise about leaving. Nex keeps it without uploading your private pages anywhere to be converted.
Every notes app has an export button and most of them are fine. The differences only show up in the two places nobody checks until they matter: what happens to pages you never opened, and where the conversion actually runs.
It walks the stored document, not the screen
The obvious way to export a page is to read what is on screen. It is also wrong, and the failure is specific: it only works for pages that have been rendered. Export a page with forty subpages and thirty-nine of them have never been mounted in the browser. A DOM-based exporter either comes back with one page of content or has to silently mount and scrape each one.
Nex serialises the stored document — the same JSON the editor reads — so a subtree exports identically whether you opened it or not. Every block type has a case, and anything a format cannot carry degrades to a visible line saying so. A whiteboard in a markdown file becomes (Whiteboard — open the page in Nex to view it.) rather than a gap you notice six months later.
Nothing is uploaded to be converted
Markdown and HTML are produced in your browser. PDF goes through the browser’s own print pipeline in an offscreen iframe. Nothing is posted to a conversion service, which means a private page stays private during the one operation people assume is safe because it feels like saving a file.
This is not difficult, it is just a decision. A server-side renderer is the easier build and it produces a nicer PDF. It also means every export is a copy of your document sitting in someone else’s process, however briefly. We would rather have the slightly plainer PDF.
Multiple pages come down as a zip, written by hand
Exporting a subtree produces a zip. The zip writer is about a hundred lines in the codebase — store-only, no compression — rather than a compression library in the bundle.
That is a deliberately unfashionable choice and the arithmetic is straightforward. A zip library is tens of kilobytes shipped to every visitor, including everyone who never exports anything, to save some percentage of the size of a download that happens once a year and is mostly text. Store-only zip is a well-specified format that every operating system opens. The hundred lines were cheaper than the dependency, in every sense that matters after the first day.
What good markdown means here
A few details that only show up when you open the file somewhere else: checklists come out as - [x] so they stay checklists; callouts become blockquotes with the emoji kept, because the emoji was half the meaning; a page link becomes [[Page name]], the convention Obsidian and others already understand; columns are flattened, because faking them with a table would make the text unreadable in every editor that opened it; and characters that would otherwise become markup are escaped, but only where they would — a hyphen mid-sentence is a hyphen, and escaping it litters the file with backslashes.
Page properties export as labelled lines. If a block holds nothing but the live dates, it exports as nothing at all rather than an empty stub — an export should not contain the outline of something that had no content in it.
Why this matters more than it sounds
An export button is the only credible answer to “what happens if I want to leave”, and the answer is only as good as the file. A markdown export that loses your checklists, drops your nested pages and renders your callouts as bare text is technically an export and practically a hostage situation.
The point of doing it properly is that you should not have to think about this at all when you start writing. That is the whole feature: nothing to worry about later.