Parse and render Markdown anywhere with one JavaScript library for HTML, ANSI, Vue, React, Svelte and Angular, plus plugins and streaming.
Comark supports CommonMark and GFM, then parses them into a compact, serializable document at build time, runtime, or during a stream. Use the same document across renderers, or extend the syntax with readable components and attributes when you need richer content.
# Regular Markdown
With a custom component:
::alert{type="warning"}
This is **Markdown** inside your own component.
::
- Runtime parsing:
parseMarkdown(markdown)is a pure function returning a compact, serializable Markdown document. 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 HTML, ANSI, Vue, React, Svelte, and Angular. 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 document (
['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.
The component and attribute syntax builds on five years of production use in MDC. Read Why Comark for the full story.
npm install comarkimport{parseMarkdown}from'comark'consttree=awaitparseMarkdown('# 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 { Markdown } from'@comark/vue'importmath, { Math } from'@comark/vue/plugins/math'const chatMessage =...</script>
<template>
<Markdown :components="{ Math }" :plugins="[math()]">{{ chatMessage }}</Markdown>
</template>npm install @comark/react kateximport{Markdown}from'@comark/react'importmath,{Math}from'@comark/react/plugins/math'functionApp(){constchatMessage= ...
return<Markdowncomponents={{ Math }}plugins={[math()]}>{chatMessage}</Markdown>}npm install @comark/svelte katex<scriptlang="ts">import { Markdown } from'@comark/svelte'importmath, { Math } from'@comark/svelte/plugins/math'const chatMessage =...</script>
<Markdownvalue={chatMessage} components={{ math: Math }} plugins={[math()]} />npm install @comark/angular kateximport{Component}from'@angular/core'import{Markdown}from'@comark/angular'importmath,{Math}from'@comark/angular/plugins/math'
@Component({selector: 'app-chat',standalone: true,imports: [Markdown],template: `<comark-markdown [value]="chatMessage" [components]="{ Math }" [plugins]="[math()]" />`,})exportclassChatComponent{chatMessage= ...
}npm install @comark/htmlimport{renderHtml}from'@comark/html'constchatMessage= ...
consthtml=awaitrenderHtml(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.
