TanStack Markdown separates parsing, rendering, and optional docs behavior so each cost can be imported and measured independently.
flowchart LR
M["Markdown source"] --> P["Parser"]
P --> A["Serializable AST"]
A --> H["HTML renderer"]
A --> R["React renderer"]
A --> C["JSON or content cache"]
E["Optional extensions"] --> P
E --> H
X["External highlighter"] --> H
X --> RThe parser never imports either renderer. The renderers never import a highlighter. The core never imports docs extensions.
The extension API handles the common need to add a docs block or derive metadata without paying for a general compiler pipeline. It intentionally does not implement async plugins, arbitrary virtual files, source maps, JSX evaluation, or cross-format compilation.
That boundary is the product: use a unified or MDX stack when those capabilities are central, and use TanStack Markdown when the controlled docs renderer is enough.
Every release preserves profile fixtures, established CommonMark matches, selected GFM examples, HTML/React parity, corpus determinism, resilience limits, bundle budgets, documentation coverage, typechecking, and production packaging.