An LLM doesn't produce an answer in one shot — it predicts the next token in sequence. Streaming just pipes that process straight to the screen, so the server side is fairly simple: Server-Sent Events or a chunked HTTP response. The client keeps appending each arriving piece to the end of the existing text.
The payoff is perceived speed. Total response time is unchanged, but the moment the first token arrives (TTFT, time to first token) tells the user something is already happening, and reading along as it grows makes the wait feel shorter than it is. A blinking caret (▍) exists because plain text alone can't signal "not finished yet."
While markdown is mid-stream, a list or code block can briefly render unclosed — the parser re-renders incomplete markdown on every chunk, so pick a renderer that doesn't flicker or jump the layout. And if the user has scrolled up to read something earlier, arriving tokens shouldn't force the view back down.
When to use
Make it the default for any conversational UI whose answers run more than a sentence or two. For very short answers or ones that render straight into structured UI, the typing effect can feel out of place.