Write Markdown. Ship one file that just opens.
mdhtml builds a self-contained .md.html document: the canonical
Markdown source lives inside it, byte for byte. Readers get a rendered page
with navigation, themes, copy, and download — no server, no network, no
build step, opened straight from disk.
# scaffold, build, verify — three commands npx mdhtml new brief --template spec npx mdhtml build brief.md npx mdhtml check brief.md
Five canonical documents, five different looks
Same format, five very different shapes — a résumé, an OKR deck, an API
spec, a recipe, and a short story — each with its own custom theme:
colors, type, spacing, even component styling, all overridable per
document. Every one below is a real .md.html file: open
it, resize the window, try it offline.
Meridian API specification
Dark, monospace-forward theme with hash-prefixed headings — tables, code, cards, and timeline containers rendered like a code editor.
Open example → Beacon · presentation2026 Q3 OKR review
Bold, rounded dashboard theme — big shadows, a warm gradient headline, and stat/bar components that read at a glance.
Open example → Folio · fictionThe bell that did not ring
Sepia literary theme — serif type, a drop cap on the opening line, and a curly-quote epigraph.
Open example → Ledger · résuméAlex Rivera — Product Engineer
Flat, sharp-cornered executive theme — small-caps section labels and an amber rule, built from key-value containers.
Open example → Hearth · recipeWeeknight chickpea curry
Warm, rounded cookbook theme — dashed borders and numbered circle badges on the steps container.
Open example →Bonus: a real one
Everything above is synthetic by design (see below). This one isn't — it's the author's own CV, same format, a sixth theme.
Why a single file
Portable by construction
Fonts, styles, runtime, and assets are embedded. A finished document makes zero network requests — it works from a USB stick as well as it works on the web.
Lossless round-trip
The canonical Markdown source travels inside the HTML, verbatim.
mdhtml extract always recovers exactly what the
author wrote.
Degrades honestly
No JavaScript? The document still renders as readable prose. Unknown container syntax degrades to plain text instead of silently breaking.