Borrowed from messaging apps. It's such a well-learned signal in chat UIs that it reads as "something is coming" without any label. In LLM chat, it fills the gap between the request being received and the model actually starting to generate the first token.
It comes before streaming, not alongside it — the typing indicator is a placeholder for "no text exists yet," and the instant the first token lands, the dots are swapped for streaming text. If that handoff isn't smooth (dots vanish, a blank beat appears), it reads as a stall, so keep the dots and the text in the same bubble with no layout jump between them.
If the dots sit alone for more than a few seconds, people start suspecting it's stuck. Past that point it's better to hand off to a "thinking" label or a step list — see thinking-indicator and agent-status.
When to use
Good when the first token is typically 1–3 seconds away. For longer waits — tool calls, file analysis — showing what is actually happening builds more trust than dots alone.