Our review
Renders assistant messages as markdown in assistant-ui using MarkdownTextPrimitive, with support for syntax highlighting, KaTeX math, Mermaid diagrams, and streaming via plugins and memoized components.
Strengths
- Provides a complete setup for markdown rendering in assistant-ui, including code highlighting, LaTeX, and Mermaid diagrams.
- Covers both MarkdownTextPrimitive and StreamdownTextPrimitive, offering a batteries-included alternative with block streaming.
- Includes practical gotchas for common issues like missing styles, stream-triggered Mermaid parsing, and incorrect wiring.
Limitations
- Requires additional packages and configuration for highlighting and math; these are not bundled by default.
- Some APIs are unstable (e.g., unstable_memoizeMarkdownComponents) and may change.
- The skill is specific to assistant-ui and React, not applicable to other frameworks.
Use when building an assistant chat UI in React and needing to display model output as formatted markdown with code, math, or diagrams.
Avoid when you need a framework-agnostic markdown renderer or when your project does not use assistant-ui.
Security analysis
SafeThe skill provides documentation and code examples for rendering markdown in assistant-ui. It does not instruct destructive, exfiltrating, or obfuscated actions. No tools are declared, and the content is purely educational/instructional for UI configuration.
No concerns found
Examples
Wire up MarkdownTextPrimitive in my assistant-ui app so that model responses render as markdown with GitHub-flavored markdown (remark-gfm) and syntax highlighting using react-shiki.Configure my assistant-ui markdown component to render LaTeX math with KaTeX and Mermaid diagrams, but gate the Mermaid rendering on stream completion to avoid partial diagram errors.In my assistant-ui chat, the text parts show as raw plain text instead of formatted markdown. Why? Show me the correct MessagePrimitive.Parts wiring and how to use MarkdownTextPrimitive.name: markdown description: "Render and customize assistant message text as markdown in assistant-ui. Use when displaying model output as formatted markdown with MarkdownTextPrimitive from @assistant-ui/react-markdown wired into the MessagePrimitive.Parts text branch, configuring remarkPlugins (remark-gfm, remark-math) and rehypePlugins (rehype-katex), or memoizing components with unstable_memoizeMarkdownComponents. Covers code-block syntax highlighting via react-shiki or react-syntax-highlighter registered as SyntaxHighlighter in components/componentsByLanguage, LaTeX math rendering with KaTeX, Mermaid diagrams gated on stream completion, custom math delimiters via preprocess, and the StreamdownTextPrimitive alternative from @assistant-ui/react-streamdown with built-in Shiki/KaTeX/Mermaid and block streaming. For general chat UI composition route to primitives." license: MIT
assistant-ui Markdown
Always consult assistant-ui.com/llms.txt for the latest API.
Render and customize assistant message text as markdown with MarkdownTextPrimitive from @assistant-ui/react-markdown, wired into the MessagePrimitive.Parts text branch.
References
- ./references/markdown-text.md -- MarkdownTextPrimitive setup
- ./references/syntax-highlighting.md -- code highlighting (react-shiki / react-syntax-highlighter)
- ./references/latex-mermaid.md -- LaTeX and Mermaid
- ./references/streamdown.md -- StreamdownTextPrimitive alternative
Orientation
MarkdownTextPrimitive renders one text part as markdown. The registry component (npx assistant-ui@latest add markdown-text) generates components/assistant-ui/markdown-text.tsx, which exports a memoized MarkdownText built on the primitive plus a defaultComponents map from unstable_memoizeMarkdownComponents. Render MarkdownText from the text branch of MessagePrimitive.Parts.
import "@assistant-ui/react-markdown/styles/dot.css";
import { MarkdownTextPrimitive } from "@assistant-ui/react-markdown";
import { MessagePrimitive } from "@assistant-ui/react";
import remarkGfm from "remark-gfm";
import { memo } from "react";
const MarkdownTextImpl = () => (
<MarkdownTextPrimitive
remarkPlugins={[remarkGfm]}
className="aui-md"
components={defaultComponents}
/>
);
export const MarkdownText = memo(MarkdownTextImpl);
<MessagePrimitive.Parts>
{({ part }) => (part.type === "text" ? <MarkdownText /> : null)}
</MessagePrimitive.Parts>;
Add highlighting, math, or diagrams by extending the same primitive: rehypePlugins for KaTeX, componentsByLanguage for a per-language SyntaxHighlighter (Mermaid, diff), and preprocess to normalize raw text before parsing. See the references for each. For a batteries-included alternative with built-in Shiki, KaTeX, Mermaid, and block streaming, swap in StreamdownTextPrimitive from @assistant-ui/react-streamdown.
Common Gotchas
- Nothing renders / plain text shows. The
textbranch must returnMarkdownText; returning<p>{part.text}</p>bypasses markdown entirely. - No syntax highlighting. Highlighting is not bundled. Register a
SyntaxHighlighterindefaultComponents(react-shiki recommended) per the syntax-highlighting reference. - KaTeX has no styling. Import
katex/dist/katex.min.cssonce at the app root;rehypeKatexonly emits markup. - Mermaid parses partial diagrams while streaming. Gate rendering on stream completion (the reference uses
useAuiStateto detect the closing fence) instead of rendering every delta. - Memoization export name. The package exports
unstable_memoizeMarkdownComponents; the generated file aliases it tomemoizeMarkdownComponents. - Unstyled by default. The
aui-mdclass andstyles/dot.cssprovide base styling; add your own Tailwind/CSS otherwise.
Related Skills
- primitives -- general UI composition (
ThreadPrimitive,ComposerPrimitive,MessagePrimitive.Parts) for assembling the message and the rest of the chat surface around the markdown text branch.
Next.js App Router Expert
Development
A skill that turns Claude into a Next.js App Router expert.
README Generator
Development
Creates professional and comprehensive README.md files for your projects.
API Documentation Writer
Development
Generates comprehensive API documentation in OpenAPI/Swagger format.