The Markdown engine for the modern web. One parser, every renderer: Vue, React, Svelte, Angular, HTML and ANSI, with components, plugins and streaming.
Comark (Components in Markdown) extends standard Markdown with component syntax that stays plain text. No build step: parse at runtime or build time, on the server or in the browser, and render the same content anywhere.
# Regular Markdown
With a custom component:
::alert{type="warning"}
This is **Markdown** inside your own component.
::
- Runtime parsing:
parse(markdown)is a pure function returning a compact AST. Content from a database, CMS, or LLM is live the moment it is saved. No rebuild, no redeploy. (Comark vs MDX) - Streaming built in: auto-close completes unterminated syntax (
**bold, open code fences, half-open components) so AI output renders correctly at every frame. - One parser, every renderer: the same source renders to Vue, React, Svelte, Angular, Nuxt, HTML strings, and ANSI terminal output. Your content outlasts your framework.
- Still just Markdown: full CommonMark + GFM, frontmatter, and
{.class}attributes on native elements. Components are opt-in syntax, not a new language. - Plugin ecosystem: Shiki highlighting, KaTeX math, Mermaid diagrams, TOC, alerts, footnotes and more, plus compatibility with existing markdown-it plugins.
- Decoupled parse & render: parse once on the server, send the serializable AST (
['tag', props, ...children]) to the client, render without re-parsing. - Fast: built on markdown-exit, a TypeScript rewrite of markdown-it, with full TypeScript support.
Built on five years of MDC, the parser behind Nuxt Content. Read Why Comark for the full story.
npm install comarkimport { parse } from 'comark'
const tree = await parse('# Hello **World**')
// { nodes: [['h1', { id: 'hello' }, 'Hello ', ['strong', {}, 'World']]], frontmatter: {}, meta: {} }Then pick a renderer:
npm install @comark/vue katex<script setup lang="ts">
import { Comark } from '@comark/vue'
import math, { Math } from '@comark/vue/plugins/math'
const chatMessage = ...
</script>
<template>
<Comark :components="{ Math }" :plugins="[math()]">{{ chatMessage }}</Comark>
</template>npm install @comark/react kateximport { Comark } from '@comark/react'
import math, { Math } from '@comark/react/plugins/math'
function App() {
const chatMessage = ...
return <Comark components={{ Math }} plugins={[math()]}>{chatMessage}</Comark>
}npm install @comark/svelte katex<script lang="ts">
import { Comark } from '@comark/svelte'
import math, { Math } from '@comark/svelte/plugins/math'
const chatMessage = ...
</script>
<Comark markdown={chatMessage} components={{ math: Math }} plugins={[math()]} />npm install @comark/angular kateximport { Component } from '@angular/core'
import { ComarkComponent } from '@comark/angular'
import math, { Math } from '@comark/angular/plugins/math'
@Component({
selector: 'app-chat',
standalone: true,
imports: [ComarkComponent],
template: `<comark [markdown]="chatMessage" [components]="{ Math }" [plugins]="[math()]" />`,
})
export class ChatComponent {
chatMessage = ...
}npm install @comark/htmlimport { render } from '@comark/html'
const chatMessage = ...
const html = await render(chatMessage)| Package | Description |
|---|---|
comark |
Core parser, AST utilities, plugins |
@comark/vue |
Vue 3 renderer |
@comark/react |
React renderer (Next.js, Server Components) |
@comark/svelte |
Svelte 5 renderer |
@comark/angular |
Angular renderer |
@comark/nuxt |
Nuxt module with auto-imports |
@comark/html |
HTML string renderer |
@comark/ansi |
ANSI terminal renderer |
Coding agents can install the Comark skill from the docs site:
npx skills add https://comark.devSee Installation on comark.dev for details.
Made with ❤️
Published under MIT License.
