Users don't run benchmarks. They tap something and decide, almost instantly, whether the app is quick or sluggish. That judgement is shaped less by how many milliseconds the server takes and more by what the screen does while it waits.
Respond to every touch, immediately
A button that changes the moment it is pressed feels fast even if the work behind it takes a second. A button that does nothing until the network replies feels broken. The rule is simple: acknowledge every touch at once — a pressed state, a ripple, a spinner in place of the label — then do the work.
Show something straight away
An empty screen with a spinner tells people to wait. A screen that already shows the layout — cached data from last time, or skeletons in the shape of the content — tells them it's nearly there. Keep the last good data on the device and refresh it quietly in the background.
Be optimistic
When someone likes a post, adds an item to a cart or marks a task done, update the screen first and sync after. Most requests succeed; for the few that fail, roll back clearly and explain why. It's one of the cheapest ways to make an app feel dramatically quicker.
// Optimistic update: change the UI first, reconcile after.
setCart((c) => [...c, item]);
try {
await api.cart.add(item.id);
} catch {
setCart((c) => c.filter((i) => i.id !== item.id));
toast("Couldn't add that item — please try again.");
}Send less over the wire
- Paginate long lists instead of loading everything at once.
- Serve images at the size the screen actually needs.
- Ask the API for the fields a screen uses, not the whole record.
- Prefetch the screen a user is most likely to open next.
Motion that explains
Good animation hides nothing — it shows where things came from and where they went. A card that expands into a detail screen keeps people oriented, so the transition itself feels like progress rather than a delay. Keep it short and purposeful, and never block input while it plays.
Fast isn't a number on a dashboard. It's the absence of the moment where someone wonders whether the app heard them.