A document engine for technical publishing

TanStackMarkdown

alpha

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
Read the syntax profile
4.6 KB parser0 runtime dependencies1 public AST
article.mddocument / 017
---
title: Ship the docs
---

# One source

Parse it once. Render it
where the product needs it.

- cache the tree
- index the text
- choose a renderer
root {
frontmatter · object
heading · depth: 1
text · One source
paragraph · 2 children
list · 3 items
}
HTMLReactOctane
The durable layer

The AST is the product.

Parsing 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.

Document
type: root
children: Node[]
metadata: serializable
HTML
render on the server
React
render as components
Octane
render in Glimmer
JSON
cache, inspect, index
A deliberate profile

It does less Markdown on purpose.

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.

287 / 652

Current CommonMark example accounting. Full conformance is explicitly not the goal; the supported docs profile is.

Inside the profile
  • Headings and emphasis
  • Lists and task lists
  • Tables and footnotes
  • Fenced code with metadata
  • Links, images, and references
  • Frontmatter
Outside the contract
  • Every CommonMark edge case
  • Arbitrary async plugin chains
  • MDX or JSX evaluation
  • A bundled highlighter
  • A general HTML sanitizer
Boundary behavior

Unsafe surprises are opt-in.

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.

Raw HTML escaped unless enabled
Executable URLs stripped
Text and attributes encoded
Malformed input bounded and tested
Size ledger

A parser should not outweigh the page.

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.

TanStack parser4.6 KB
marked12.5 KB
unified stack36.8 KB
markdown-it52.7 KB
6.4 KB
HTML renderer
6.3 KB
React adapter
6.3 KB
Octane adapter
2.4 KB
docs preset
Content, then color

Syntax highlighting stays outside the parser.

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.

callouts · 0.4 KBdocs preset · 2.4 KBheading collection
Companion, not dependency
TanStackHighlight

Tiny, synchronous highlighting for the code fences your document model already understands.

Explore Highlight
Open source, in public

A small document contract deserves careful stewardship.

Syntax fixtures, renderer parity, deterministic corpus checks, size budgets, and resilience limits ship with the library—not as an afterthought.

Partners

Gold
CodeRabbit
Cloudflare
Lovable
Netlify
Railway
Silver
WorkOS
OpenRouter
AG Grid
SerpApi
Clerk
Bronze
Unkey
Prisma
Electric
Sentry
Markdown You?
We're looking for TanStack Markdown Partners to join our mission! Partner with us to push the boundaries of TanStack Markdown and build amazing things together.
Let's chat

GitHub Sponsors

Keep the source. Own the model.

Build your document pipeline on plain data.

Start with the parser