All research
experiment
Latency budgets for interfaces that feel instant
A practical set of per-interaction time budgets, and what we give up to hold them. Measured on the products in this lab rather than borrowed from a 1968 paper.
- performance
- interface
- engineering
We hold four budgets: 16ms for anything attached to a pointer, 100ms for a state change, 300ms for a navigation, and 1s for work that had to leave the machine. Past 1s, we show progress rather than a spinner, because a spinner is an apology and progress is information.
What we trade
Holding these budgets costs us features. Server-side personalisation on first paint, heavy client-side routing, and most third-party scripts are simply excluded. The budget is the constraint the design works inside, not a target we optimise toward afterwards.
// The rule we actually apply in review:
// if an interaction cannot meet its budget, the interaction changes —
// not the budget.
const BUDGETS_MS = {
pointerBound: 16,
stateChange: 100,
navigation: 300,
network: 1000,
} as const;More research
- Spacing intervals at topic level, not card levelAn in-progress evaluation of scheduling review by topic mastery rather than per-item, using StudyFlow's early cohort data.
- Attribution is not accuracyGrounded generation systems are routinely evaluated as if faithfulness to retrieved text were the same thing as being right. It is not. We separate the two and show where the confusion costs you.