Streaming response
The model can send ordinary Markdown as it thinks.
- completed blocks stay stable
- unfinished markers stay out of the way
- React and HTML stay in sync
const text = responseSoFar
return render(text)Unsafe links stay text-only
Markdown with an exit strategy.
Parse documents or accumulated AI output into a plain, serializable tree. Inspect it, cache it, index it, or render it as HTML, React, or Octane.
---
title: Ship the docs
---
# One source
Parse it **once**. Render it where the product needs it.
- cache the tree
- index the text
- choose a rendererThe durable layer
Parsing does not trap content inside a renderer. Edit the source and inspect the serializable tree, deterministic HTML, or React output.
{
"type": "root",
"frontmatter": "title: Durable content",
"children": [
{
"type": "heading",
"depth": 1,
"id": "one-source-many-destinations",
"children": [
{
"type": "text",
"value": "One source, many destinations"
}
]
},
{
"type": "paragraph",
"children": [
{
"type": "text",
"value": "Parse the document "
},
{
"type": "strong",
"children": [
{
"type": "text",
"value": "once"
}
]
},
{
"type": "text",
"value": ", then keep the tree."
}
]
},
{
"type": "list",
"ordered": false,
"items": [
{
"type": "listItem",
"children": [
{
"type": "paragraph",
"children": [
{
"type": "text",
"value": "cache it at the edge"
}
]
}
]
},
{
"type": "listItem",
"children": [
{
"type": "paragraph",
"children": [
{
"type": "text",
"value": "index its text"
}
]
}
]
},
{
"type": "listItem",
"children": [
{
"type": "paragraph",
"children": [
{
"type": "text",
"value": "render it with React or HTML"
}
]
}
]
}
]
},
{
"type": "blockquote",
"children": [
{
"type": "paragraph",
"children": [
{
"type": "text",
"value": "The renderer can change. The document does not."
}
]
}
]
}
]
}Accumulated AI responses
Append each chunk and pass the complete string through Markdown. The optional streaming profile reparses synchronously, with no incremental state to coordinate or recover.
# Streaming response
The model can send **ordinary Markdown** as it thinks.
- completed blocks stay stable
- unfinished markers stay out of the way
- React and HTML stay in sync
```ts
const text = responseSoFar
return render(text)
```
[Unsafe links stay text-only](javascript:alert("nope"))The model can send ordinary Markdown as it thinks.
const text = responseSoFar
return render(text)Unsafe links stay text-only
A deliberate profile
Technical docs need a known vocabulary, not an open-ended compiler platform. New syntax has to justify its bytes, ambiguity, and maintenance cost.
Boundary behavior
Raw HTML starts escaped, executable URL schemes are stripped, and text, attributes, and code are encoded at render time.
<script>alert("not today")</script>
[Run code](javascript:alert("nope"))
**Trusted Markdown still renders.**<p><script>alert("not today")</script></p>
<p>Run code</p>
<p><strong>Trusted Markdown still renders.</strong></p>Size ledger
Split entry points keep the parser, renderers, framework adapters, and docs extensions independent. Import only the layer the page needs.
Content, then color
Code fences carry language and metadata. An explicit highlighter renders them later, so the core never silently imports a grammar engine.
Companion, not dependency
Synchronous highlighting for the code fences the document model already understands.
Explore HighlightSponsors get special perks like private discord channels, priority issue requests, and direct support!