Streaming is a UX decision you keep making by accident
Token streaming makes chat feel alive and dashboards feel broken. Where streaming earns its complexity and where buffering is the adult choice.
cat contents.txt
Streaming got grandfathered into every LLM feature because chat had it and chat came first. So now I watch dashboards assemble themselves word by word like a ransom note, JSON payloads render half-parsed, and a "generate report" button produce three paragraphs that rewrite themselves. Streaming is a presentation choice. Choose it.

when streaming earns its keep
Conversation, obviously: perceived latency drops enormously when the first token arrives in half a second, and server-sent events remain the boring, correct transport for it. Long-form drafting, where the user reads along and can abort early. Agent progress, where "what is it doing" matters more than the final artifact. The common thread: a human is watching text be text.
when buffering is the adult choice
Structured output. Streaming half a JSON object is streaming a syntax error; if you must show progress, stream a status field, not the payload. Anything you validate before showing (see contracts): validation needs the whole thing, so the stream buys nothing but flicker. Short responses where the full answer lands in under a second anyway. And any UI where text replacing itself reads as glitch, which is most UIs that aren't chat.
the architecture tax nobody mentions
A streaming path is a second code path. Retries mid-stream, partial output on disconnect, token-level rate limits, load balancer timeouts tuned for long-lived connections: all of it exists only because you stream. Pay that tax where a human is actually watching. Everywhere else, buffer, validate, render once, and enjoy being the only feature on the page that never flickers.
the middle path most features actually want
Half my "should this stream" debates end at neither option: they end at staged rendering. Buffer the model output, but stream STATUS, "searching your documents", "found 12, reading 3", "drafting". The user gets the psychological payoff of progress, the payload arrives validated and whole, and the status events are trivial to produce because your agent loop already knows what step it is on. It is the airport departures board pattern: nobody needs to watch the plane taxi in real time, they need credible evidence that something is happening and an honest estimate of when it stops. Cheap to build, ages well, and no ransom notes.
tags: #streaming #ux #api