ADR-008 — Docs engine: MDX frameworks vs mkdocs-material
Status: Accepted — adopt Rspress as the MDX docs engine going forward; retain mkdocs-material for existing projects (backwards-compatible, not worth porting). Two skills route by config file.
Date: 2026-06-25
Context:
Existing docs (this repo included) run on mkdocs-material (Python, plain Markdown, GitHub Pages). The goal: gain MDX — Markdown plus JSX, so docs can render interactive React components inline — without a forced migration of every existing project. MDX requires a JavaScript static-site generator, so this is a choice of engine going forward, not a rip-and-replace.
Decision:
Adopt Rspress as the MDX docs engine. New docs (or any project that wants interactive components) use Rspress; existing mkdocs sites stay on mkdocs — there's no value in porting them, and both coexist happily. Which engine a given repo uses is detected from its config files, and the two Claude skills route accordingly:
mkdocs.ymlpresent →documentationskill (mkdocs-material).rspress.config.*present →mdx-documentationskill (Rspress).- New/greenfield docs → pick Rspress for MDX, mkdocs for plain Markdown (ask the user if unspecified).
Of the MDX frameworks, Rspress was the clear pick: it's the only one that keeps a good authoring loop (see below). Astro Starlight and Docusaurus were both rejected.
What we did (concise)
- Built a full Astro Starlight spike — ported all 33 pages, Mermaid, a real React component (
mdx-site/, parked on themdxbranch). - Hit a string of friction (below), the worst being no search in the dev server.
- Ran head-to-head spikes of Rspress and Docusaurus, porting the same real pages, scored on the axis that actually matters for an authoring workflow: does search work while you edit?
- Concluded: Rspress is the best MDX engine (adopt it); mkdocs stays the no-fuss option for plain docs and all existing projects.
The four-way comparison
The deciding axis was dev-time search. mkdocs serve gives live-reload and search in one command. Of the MDX engines, only Rspress matches that; Starlight and Docusaurus only build the search index at build time, so the edit loop has no search. For docs you edit constantly, that's a real regression — and it ruled out both Starlight and Docusaurus.
Custom code / maintenance each engine required
This is the honest cost — what we had to write/configure to get each working on our content:
The Mermaid story — not a deciding factor (correcting the earlier draft)
An earlier version of this ADR treated Mermaid as a Starlight dealbreaker. That was wrong. What actually happened: Astro 7's new markdown processor ("satteri") briefly ignored rehype plugins, breaking the astro-mermaid plugin, and a client-side workaround was written. But astro-mermaid 2.1.0 fixed satteri compatibility upstream, so on the current latest stack Mermaid works with no workaround. The episode is a good illustration of JS-ecosystem version coupling (a major bump broke a plugin; the ecosystem then self-healed) — but Mermaid itself was not a reason to reject any engine. The real reasons were dev-time search and maintenance weight/coupling.
So what
Rspress is adopted for MDX docs; mkdocs-material is retained for existing projects. No big-bang migration — the two coexist and the right skill is chosen per-repo from its config files (rspress.config.* → mdx-documentation; mkdocs.yml → documentation). Reach for Rspress when you want interactive React components (it uniquely keeps live dev search among MDX engines, resolves .md links, and needs the least custom CSS); reach for mkdocs for plain Markdown and anything already on it (lowest friction, nothing to port). Do not use Starlight (no dev search, most CSS) or Docusaurus (heaviest, also no dev search). The mdx-documentation skill carries the validated Rspress setup and the one-off migration transform.

