Skip to content

Ecosystem ​

Everything that speaks Carve, grouped by role. All of it lives under the markup-carve organization. For live corpus conformance numbers of the reference parsers, see Implementation Comparison.

Parsers ​

The engines that turn Carve source into an AST and HTML. Conformance is measured against the shared spec corpus; the bar for "a Carve implementation" is Tier-1 core (native syntax) - see Build Your Own Implementation.

ProjectLanguageStatus
carve-jsTypeScriptReference implementation. Tier-1 corpus passing.
carve-rsRustParser + HTML renderer with a carve CLI. Tier-1 corpus passing.
carve-phpPHPForked from djot-php; Carve syntax implemented, corpus passing. Powers the PHP sandbox and wp-carve.
carve-wasmWASMBrowser/Node bindings for carve-rs. Early.

Language bindings ​

Higher-level bindings and satellite packages that wrap one of the engine implementations.

A binding over carve-rs exposes the complete core output surface: HTML, Markdown, plain text, ANSI, canonical Carve, and the published AST. Importers are optional, but each binding declares every HTML, Markdown, Djot, and BBCode importer as either implemented or out of scope. The machine-readable declaration in resources/binding-contract.json checks that the required output set is exact, that every importer has exactly one declaration, and that both kinds of declaration hold against the source each binding ships: a declared importer names a real export, and an out-of-scope entry survives only while nothing in the binding's own sources names that format.

ProjectLanguageNotes
carve-goGoPure-Go module via wazero + WASI over carve-rs.
carve-pyPythonPyO3 bindings over carve-rs. Enables MkDocs, Pelican, and other Python pipelines.
carve-rbRubyNative gem via magnus over carve-rs.
carve-componentsReact / VueUI components for rendering Carve markup in the browser.
carve-wysiwygTypeScriptWYSIWYG editor / live sandbox (Tiptap + carve-grammars).
carve-cssCSSShared styles for semantic Carve HTML such as admonitions and tabs.

Editor support ​

Syntax highlighting, structural editing, and diagnostics inside editors.

ProjectTargetStatus
vscode-carveVS CodeHighlighting, snippets, live preview.
emacs-carveEmacsMajor mode for .crv files.
vim-carveVim / NeovimSyntax highlighting + tree-sitter grammar.
sublime-carveSublime TextSyntax package for .crv files.
sublime-carve-lspSublime TextLSP helper package - diagnostics, hover and symbols via the Carve language server.
helix-carveHelixEditor support for Carve.
intellij-carveJetBrains IDEsHighlighting, live preview, and export for IntelliJ, PhpStorm, etc.
zed-carveZedEditor support.
tree-sitter-carveTree-sitterGrammar for highlighting and structural editing.
highlightjs-carveHighlight.jsSyntax grammar for highlighted Carve source.
pygments-carvePygmentsLexer for Python documentation and highlighting tools.
rouge-carveRougeLexer coloring Carve source wherever Rouge highlights.
carve-lspLSPLanguage server - syntax diagnostics, Djot/Markdown collision hints. Early.

Copying a Carve document ​

An integration that puts Carve source on the clipboard carries it as text/x-carve (CARVE-P9-071), next to a text/plain flavor for targets that know no Carve. Browser and Electron hosts must write it as web text/x-carve: the unprefixed type fails only when the write runs, so await navigator.clipboard.write and report its rejection, or a copy that put nothing on the clipboard looks like success.

Framework integrations ​

Carve embedded in another tool or framework.

ProjectHostStatus
mkdocs-carveMkDocsPlugin: renders .crv pages in MkDocs documentation sites.
jekyll-carveJekyllConverter plugin for .crv pages.
eleventy-carveEleventy (11ty)Plugin for processing Carve source files.
astro-carveAstroIntegration for importing .crv pages.
hugo-carveHugoPreprocessor that converts .crv content to HTML, via carve-go.
docusaurus-carveDocusaurusDocs plugin: converts .crv pages and delegates routes, sidebars, and metadata to Docusaurus.
webpack-loader-carvewebpack / Next.jsBuild-time loader for importing .crv as rendered HTML modules.
obsidian-carveObsidianCommunity plugin with source and reading views for .crv notes.
symfony-carveSymfonyBundle to render Carve markup to HTML via carve-php.
symfony-carve-demoSymfonyDemo app for the symfony-carve bundle.
laravel-carveLaravelIntegration with Blade directives, services, validation, and caching.
laravel-carve-demoLaravelRunnable app demonstrating every feature of laravel-carve.
shopware-carveShopware 6Twig filters, CMS element, product/category fields, admin live preview, mail, and a CLI.
wp-carveWordPressPlugin on the carve-php engine - live preview, multi-format paste, REST API.
carve-grammarsTiptapEditor kit and Carve serializer.
vite-plugin-carveViteImport .crv documents as rendered HTML. Early.
carve-pressStatic sitesCarve-native static site generator.
zensical-carveZensicalCarve integration for Zensical documentation sites.

PDF / output ​

Render Carve documents to formats beyond HTML.

ProjectOutputNotes
carve-pdfPDFRender .crv documents to clean, paginated PDFs.
carve-hexapdfPDFCarve to PDF via the pure-Ruby HexaPDF engine (over carve-lang / carve-rb).
pandoc-carveLaTeX, Typst, DOCX, PDF, ...Carve AST to Pandoc JSON bridge; reaches every pandoc writer and makes {=latex}-style raw spans fire.
carve-silePDFSILE input support for typesetting Carve documents.
pdf-to-carveCarve sourceExtract PDF text and layout into validated .crv documents.

Format bridges ​

Conversions between the Carve AST and another document model, in both directions. These are keyed by bridge rather than by repository, because one of them lives inside an engine rather than in a package of its own. Why the boundary sits at the AST, and what a bridge owes its caller: Format bridges.

BridgeModelRuntimeCarve to itIt to Carve
pandoc-carvePandoc ASTNode + pandoc✅ every pandoc writer✅ everything pandoc reads
carve-grammarsProseMirror / TiptapNode✅ carveToProseMirror✅ serializeToCarve
carve-phpProseMirror / TiptapPHP✅ ProseMirrorRenderer✅ ProseMirrorToCarve

The same editor model is reached from two runtimes on purpose: an editor needs the model in whatever runtime the application already has. The carve-php pair is what lets a Tiptap editor in the browser and PHP rendering in a queue worker share one stored document with no Node runtime anywhere in the pipeline. carve-grammars owns the shared CarveKit schema and the name map both sides read.

carve-js and carve-rs have no bridge of their own; their prosemirror HTML import adapter is a different job at a different stage.

Extensions ​

Opt-in extensions that add non-core syntax.

ProjectTargetNotes
carve-php-media-embedcarve-phpEmbeds audio and video through dereuromark/media-embed.
carve-php-chatcarve-phpRenders Carve to chat-platform markup (WhatsApp, Slack, Telegram, Discord) via data-driven flavor definitions.

Benchmarks ​

ProjectDescription
carve-benchCross-engine render performance benchmarks (carve-js / carve-php / carve-rs).

AI / agent tooling ​

Skills and servers that let AI coding agents author, validate and convert Carve.

ProjectTargetStatus
carve-skillClaude Code / agentsAuthoring skill - a syntax card, the Markdown/Djot trap list, and a carve lint validation loop so agents write valid .crv the first time.
carve-mcpMCP clientsLocal stdio server exposing the carve-js linter, formatter, renderers, AST, HTML/Markdown/Djot import and concise authoring resources. No filesystem or network access by default. Not yet published - run from source.

Resources ​

ProjectDescription
awesome-carveCurated list of Carve tools, libraries, and resources.
homebrew-carveHomebrew tap for installing Carve tools.
PHP SandboxPowerful live sandbox on the carve-php engine - explore syntax and extensions, inspect output, and share snippets via pastebin-style links.

Building something new? See Build Your Own Implementation. External tools are welcome in awesome-carve even if they do not live in the org.

Released under the MIT License.