Markdown with an exit strategy.
Parse once into a plain, serializable tree. Inspect it, cache it, index it, or render it as HTML, React, or Octane without carrying a content framework through the rest of your app.
3.0 ThousandTotal Downloads391Weekly Downloads2GitHub Stars---
title: Ship the docs
---
# One source
Parse it once. Render it
where the product needs it.
- cache the tree
- index the text
- choose a rendererParsing does not trap your content inside a renderer. The public tree is ordinary data, so the expensive decision can happen once while every downstream use stays cheap and predictable.
Technical docs need a known vocabulary, not an open-ended compiler platform. New syntax has to justify its bytes, its ambiguity, and its long-term maintenance cost.
Current CommonMark example accounting. Full conformance is explicitly not the goal; the supported docs profile is.
Raw HTML starts escaped, executable URL schemes are stripped, and text, attributes, and code are encoded at render time. The parser is also tested against malformed and adversarial input as part of its normal release gates.
Split entry points keep the parser, renderers, framework adapters, and docs extensions independent. Import the layer the page needs.
Gzip sizes from the project benchmark report. Package scopes and feature sets are not equivalent.
Code fences carry language and metadata. An explicit highlighter can render them later, so the core never silently imports a grammar engine. The same boundary works with your own highlighter or TanStack Highlight.
Tiny, synchronous highlighting for the code fences your document model already understands.
Syntax fixtures, renderer parity, deterministic corpus checks, size budgets, and resilience limits ship with the library—not as an afterthought.
Keep the source. Own the model.