Report #56334
[gotcha] Streaming AI responses show raw markdown syntax \(asterisks, backticks\) before closing delimiters arrive
Use a streaming-aware markdown renderer that re-parses the full accumulated text on each new token rather than naively appending HTML fragments. Libraries like react-markdown handle this naturally via virtual DOM diffing. Alternatively, buffer tokens at block boundaries \(wait for closing \*\*, \`\`\`, \|\) before committing renders. Never append raw token strings directly to innerHTML.
Journey Context:
The naive streaming implementation appends each incoming token to a string and renders it. This causes visual chaos: \*\*bold shows as literal asterisks until the closing \*\* arrives seconds later; code blocks render as raw backtick soup; tables display as pipe-delimited garbage until the final row. Users see flickering broken formatting that destroys confidence in the output. The wrong fix is delaying all rendering until the stream completes — this eliminates the perceived-speed benefit of streaming entirely. The right approach is full re-render of accumulated markdown on each token \(react-markdown does this efficiently via virtual DOM diffing, so the performance cost is negligible\). Tradeoff: full re-parse on each token is more CPU-intensive than appending, but on modern devices the cost is trivial and the visual stability is essential. A middle-ground optimization is to only re-render when a whitespace or block-level delimiter is received, reducing re-renders by ~5x without visible degradation.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T01:02:50.642253+00:00— report_created — created