Markstream React
Use this skill when the host app is React or Next and the task is to wire Markstream safely.
Workflow
- Confirm the repo is React, Next, or another React-based host.
- Install
markstream-reactplus only the requested optional peers. - Import
markstream-react/index.cssfrom the app shell or client entry. - Start with
content.- For streaming or high-frequency AI output, keep
contentand use built-in smooth streaming first.smoothStreaming="auto"is the default and activates whentypewriter={true}ormaxLiveNodes <= 0.typewriteronly controls the blinking cursor and defaults tofalse.fadecontrols node enter and streamed-text fade animations and defaults totrue.
- Streaming vs recovering history: in chat UIs the same renderer starts streaming and later switches to history when
final={true}.- Streaming:
smoothStreaming="auto",fade={false},typewriter={true}. Smooth pacing handles gradual appearance; fade would flicker. - Recovering history:
smoothStreaming={false},fade={true},typewriter={false}. Content is already complete — pacing would slow it down, but fade gives a polished entry animation. - Dynamic switch:
smoothStreaming={isStreaming ? 'auto' : false},fade={!isStreaming}.
- Streaming:
- Move to
nodes+finalonly for worker-preparsed content, shared AST stores, or custom AST control. - Remember that
htmlPolicynow defaults tosafe, and Mermaid strict mode is on by default throughmermaidProps.
- For streaming or high-frequency AI output, keep
- Respect SSR boundaries in Next.
- Prefer
use client, dynamic imports withssr: false, or other client-only boundaries when browser-only peers are involved.
- Prefer
- Use scoped Markstream overrides before custom parser work.
- Validate with the smallest useful dev, build, or typecheck command.
Default Decisions
- Renderer wiring first, migration cleanup second.
- If the repo already uses
react-markdown, pair this skill withmarkstream-migration. - Prefer
contentwith built-in smooth streaming for most AI chat / token streaming surfaces. - Streaming vs recovering history: when a chat message transitions from streaming to history (e.g.
finalbecomestrue), switch props dynamically —smoothStreaming="auto",fade={false}for streaming;smoothStreaming={false},fade={true}for history. Seedocs/guide/ai-chat-streaming.mdfor full examples. - Move to
nodesonly when another layer owns parsing or AST transforms. - Prefer the smallest client-only boundary that solves the SSR issue.
- Avoid
smoothStreaming={true}for first-screen SSR content unless intentionally starting from blank; auto mode uses the mounted gate. - Keep
htmlPolicy="safe"and Mermaid strict mode unless the request is preserving trusted legacy rendering. - If a trusted surface needs older behavior, use
htmlPolicy="trusted"andmermaidProps={{ isStrict: false }}only on that surface and explain why.
Useful Doc Targets
docs/guide/react-quick-start.mddocs/guide/react-installation.mddocs/guide/react-markdown-migration.mddocs/guide/component-overrides.md