streamdown

Implement, configure, and customize Streamdown — a streaming-optimized React Markdown renderer with syntax highlighting, Mermaid diagrams, math rendering, and CJK support. Use when working with Streamdown setup, configuration, plugins, styling, security, or integration with AI streaming (e.g., Verce

By vercel · 2,869 installs

npx skills add vercel/streamdown --skill streamdown

Source repository · Upstream listing

Streamdown Streaming optimized React Markdown renderer. Drop in replacement for react markdown with built in streaming support, security, and interactive controls. Quick Setup 1. Install Optional plugins (install only what's needed): 2. Configure Tailwind CSS (Required) This is the most commonly missed step. Streamdown uses Tailwind for styling and the dist files must be scanned. Tailwind v4 — add to globals.css : Add plugin @source lines only for packages you have installed (omitting uninstalled plugins avoids Tailwind errors). See plugin pages for exact paths: Code: @source "../node modules/@streamdown/code/dist/ .js"; CJK: @source "../node modules/@streamdown/cjk/dist/ .js"; Math: @source "../node modules/@streamdown/math/dist/ .js"; Mermaid: @source "../node modules/@streamdown/mermaid/dist/ .js"; Tailwind v3 — add to tailwind.config.js : 3. Basic Usage 4. With AI Streaming (Vercel AI SDK) 5. Static Mode (Blogs, Docs) Key Props Prop Type Default Purpose children string — Markdown content mode "streaming" \ "static" "streaming" Rendering mode plugins { code?, mermaid?, math?, cjk? } — Feature plugins isAnimating boolean false Streaming indicator caret "block" \ "circle" — Cursor style components Components — Custom element overrides controls boolean \ object true Interactive buttons; download: { filename } sets custom download names linkSafety LinkSafetyConfig { enabled: true } Link confirmation modal shikiTheme [light, dark] ['github light', 'github dark'] Code themes className string — Container class allowedElements string[] all Tag names to allow disallowedElements string[] [] Tag names to disallow allowElement AllowElement — Custom element filter unwrapDisallowed boolean false Keep children of disallowed elements skipHtml boolean false Ignore raw HTML urlTransform UrlTransform defaultUrlTransform Transform/sanitize URLs For full API reference, see [references/api.md](references/api.md). Plugin Quick Reference Plugin Package Purpose Code @streamdown/code Syntax highlighting (Shiki, 200+ languages) Mermaid @streamdown/mermaid Diagrams (flowcharts, sequence, etc.) Math @streamdown/math LaTeX via KaTeX (requires CSS import) CJK @streamdown/cjk Chinese/Japanese/Korean text support Math requires CSS: For plugin configuration details, see [references/plugins.md](references/plugins.md). References Use these for deeper implementation details: [references/api.md](references/api.md) — Complete props, types, and interfaces [references/plugins.md](references/plugins.md) — Plugin setup, configuration, and customization [references/styling.md](references/styling.md) — CSS variables, data attributes, custom components, theme examples [references/security.md](references/security.md) — Hardening, link safety, custom HTML tags, production config [references/features.md](references/features.md) — Carets, remend, static mode, controls, GFM, memoization, troubleshooting Example Configurations Copy and adapt from assets/examples/ : [basic streaming.tsx](assets/examples/basic streaming.tsx) — Minimal AI chat with Vercel AI SDK [with caret.tsx](assets/examples/with caret.tsx) — Streaming with block caret cursor [full featured.tsx](assets/examples/full featured.tsx) — All plugins, carets, link safety, controls [static mode.tsx](assets/examples/static mode.tsx) — Blog/docs rendering [custom security.tsx](assets/examples/custom security.tsx) — Strict security for AI content Common Gotchas 1. Tailwind styles missing — Add @source directive or content entry for node modules/streamdown/dist/ .js 2. Math not rendering — Import katex/dist/katex.min.css 3. Caret not showing — Both caret prop AND isAnimating={true} are required 4. Copy buttons during streaming — Disabled automatically when isAnimating={true} 5. Link safety modal appearing — Enabled by default; disable with linkSafety={{ enabled: false }} 6. Shiki warning in Next.js — Install shiki explicitly, add to transpilePackages 7. allowedTags not working — Only works with default rehype plugins 8. Math uses $$ not $ — Single dollar is disabled by default to avoid currency conflicts