Comparison ¶
This table is a hand-maintained snapshot, last checked on 2026-08-03, not a benchmark. Every project here moves faster than a table written by hand, so treat a cell as a claim about that date and check the source before relying on it. Check the project docs directly: VitePress, Docusaurus, Astro Starlight, and Material for MkDocs. Corrections are welcome in an issue.
| Capability | CarvePress | VitePress | Docusaurus | Astro Starlight | MkDocs Material |
|---|---|---|---|---|---|
| Markup language | Carve .crv. | Markdown compiled as Vue components. | Markdown and MDX. | Markdown and MDX by default; Markdoc can be added. | Markdown. |
| Client framework in output | No client framework; small scripts for search, nav, copy, outline, and playground when used. | Vue-powered site; VitePress documents static HTML first visit and SPA navigation after hydration. | React-based site. | Astro output; UI islands are available through Astro integrations. | Static MkDocs output with theme JavaScript for features. |
| Dev server | Yes, carve-press dev. | Yes, Vite dev server. | Yes. | Yes, Astro dev server. | Yes, mkdocs serve. |
| Built-in search | Yes, MiniSearch index. | Local MiniSearch or Algolia DocSearch. | Commonly Algolia through theme config; local search requires plugin choices. | Pagefind is the default search provider. | Built-in client-side search enabled by default. |
| i18n | Prefix locales and switcher; no translation extraction tooling. | Built-in locale config. | Built-in localization workflow. | Built-in i18n configuration. | Theme translations and a language selector; separate builds per language. |
| Blog | Built-in generated listing, tags, and feed. | Possible with custom theme/data loading, not a default docs feature. | Built-in blog. | Through Astro content collections or a community plugin. | Built-in blog plugin. |
| Doc versioning | Not built in. | Not a primary built-in feature. | Built-in docs versioning CLI and routes. | Not a primary built-in feature. | Through the separate mike tool, not the theme itself. |
| Code-block affordances | Shiki, titles, copy, line numbers, hl, notation diff/focus/error/highlight, code groups. | Strong Markdown code-block support with Shiki and VitePress extensions. | Strong code-block support in MDX/Prism ecosystem. | Expressive Code enabled by default. | Strong code annotations, copy, highlighting, and content tabs. |
| Build-time link validation | Internal links, nav, sidebar, page nav, and Carve crossrefs are fatal by default. | ignoreDeadLinks defaults to false, so dead links fail by default. | onBrokenLinks defaults to throw in production builds; Markdown link handling is configurable. | Not documented as a built-in equivalent. | Not documented as a built-in; available through plugins. |
| Live source/render compare | Built-in ::: compare. | Not a documented default capability. | Not a documented default capability. | Not a documented default capability. | Not a documented default capability. |
llms.txt | Built-in extension. | Their own docs publish one; generating it for your site is not a documented default. | Not documented as a default. | Not documented as a default. | Not documented as a default. |
| Redirects for a renamed page | Built in: redirects map plus redirectFrom on the page, emitting a meta-refresh stub with a canonical link and a _redirects file. | Not built in; an open feature request. Hand-written stubs or host rules. | Official plugin-client-redirects writes redirecting pages at build time. | Astro’s redirects config emits meta-refresh pages in a static build; adapters write host config instead. | Not in the theme itself; a community plugin covers it. |
| Redirect validation | Targets must resolve to a real route, a source may not collide with a page, and a source may not escape the output directory. | n/a | Not documented as validated against the route table. | Not documented as validated against the route table. | n/a |
| Rename detection | Built in: a committed routes.json, and a route that disappears without a redirect fails the build. | Not documented. | Not documented. | Not documented. | Not documented. |
| Route rewrites (publish a page at a different URL) | rewrites, exact paths or a directory pattern. | rewrites, object or function, with pattern support. | slug frontmatter and plugin routing. | slug frontmatter. | Plugin-based URL handling. |
| Ecosystem size | Early and small. | Larger Vite and Vue ecosystem. | Larger React and plugin ecosystem. | Larger Astro integration ecosystem. | Larger Python and MkDocs plugin ecosystem. |
| Component islands | Mount points hydrated by modules the site supplies, with a static fallback; no framework is bundled. | Vue components in Markdown. | React components in MDX. | Astro islands and integrations. | Markdown plus theme/plugin extensions; not an islands-first model. |
Where CarvePress is ahead ¶
- Nothing to lose a URL silently. A page that disappears fails the build unless something redirects the old route, and every redirect target is checked against the real route table. The other generators here can emit redirects; none of them documents a check that notices a URL went missing in the first place. This is the one capability with no equivalent in the table.
- Redirects declared on the page that replaced the old one.
redirectFromtravels with the page and is deleted with it. A central map is fine for a handful of legacy URLs and nobody ever prunes it. The idea is borrowed from Jekyll’sjekyll-redirect-from. - Validation as the default, not a lint step. Internal links, nav and sidebar entries,
prevandnextoverrides, cross-references, and redirect targets all fail the build, and every failure of a kind is reported at once rather than one build cycle at a time. - Source and rendered output in the same block.
::: comparerenders a Carve fence beside the HTML it produces, so a syntax page cannot drift from the engine. - Static output with no client framework. HTML, CSS, and four small scripts. The Carve engine reaches the browser only on pages that embed a live playground.
Where CarvePress is behind ¶
- No doc versioning, where Docusaurus has it in core.
- No plugin ecosystem worth the name yet, and islands are mount points rather than components written inline in the page, which is what Vue-in-Markdown or MDX give you.
- No translation workflow beyond prefix locales and a label map.
Last updated