Every AI product has the same awkward moment: the user asks for something real, the model starts working, and the UI has nothing honest to say. So it improvises. A spinner. A skeleton. A progress bar that lies. Three dots that bounce forever.
Users do not hate waiting. They hate opaque waiting. When latency has no readable mind behind it, people assume the product is stuck, hallucinating, or ignoring them.
What “waiting UI” usually means today
Most teams reuse patterns invented for file uploads and page loads:
- Spinners — motion without meaning. They say “busy,” not “thinking about your request.”
- Skeleton screens — great for layout paint; weak for generative work with unknown shape.
- Fake progress — accelerates until 90%, then stalls. Trust evaporates the second time it happens.
- “Generating…” copy — text-only status that feels like a system log, not a presence.
Those patterns were designed for deterministic jobs. Generative AI is stochastic, variable-length, and often multi-step. The UI needs a mind, not a throbber.
The trust gap during latency
In user research across chat and agent products, the failure mode is rarely “the answer was slow.” It is “I could not tell if anything was happening.” That gap is where people refresh, abandon, or paste the same prompt twice.
If your product goes quiet while the model works, users invent a worse story than the truth.
Good waiting UI answers three questions without a paragraph of help text:
- Are you alive?
- Are you working on my thing?
- Can I interrupt or redirect you?
A better model: four readable states
Instead of one generic “loading,” map the AI’s public mind to four states people already understand from conversation:
- Idle — present, not working.
- Listening — taking input / attending.
- Thinking — computing, retrieving, planning.
- Talking — streaming or delivering a reply.
That is the design premise behind Glim: one shared state machine, many creature bodies, zero dependency bloat. The companion does not replace your chat transcript — it gives the corner of the screen a presence people can read at a glance.
What to ship this week
- Replace orphan spinners next to AI actions with an explicit state.
- Drive that state from real events (request start, first token, complete, error).
- Keep motion calm; reserve spikes for acknowledgments.
- Offer a free, offline path so builders can try before buying a kit.
If you want the shortest path: download the starter on getglim.dev or npm i @axaylabs/glim, mount a free creature, and wire setState('thinking') to your fetch lifecycle.
Try Glim free. Offline starter + MIT creatures. No fake checkout.