Anthropic has written up how it made the core experience of claude.ai and the Claude desktop app roughly three times faster in a two-week sprint in August. The post went up on its engineering blog on Tuesday. The most honest line is the first one: users had been telling them it was slow, and they were right.
The numbers
The team measured four journeys covering 95% of user activity, split across thirteen distinct measurements between web and desktop. At the 75th percentile, from real user monitoring, August 13 against August 27:
- claude.ai in the browser, fresh load to a typeable page: 3,085 to 550 milliseconds
- Desktop app, cold start: 6,310 to 3,328 milliseconds
- Starting a new Claude Code session: 837 to 347 milliseconds
- Loading a Claude Cowork cloud session: 2,566 to 728 milliseconds
- Sending a message in Cowork, client-side share: 928 to 48 milliseconds
Across all thirteen, the geometric mean is 3.1x. Anthropic estimates that saves tens of thousands of user-hours of waiting every day.
How they worked
The whole sprint ran out of one Slack channel, with Claude in every thread. They used Claude Tag in beta, running an internal research model roughly comparable to Opus 5.5. Claude found bottlenecks, built benchmarks, shipped improvements and watched every deploy. The humans set goals, made tradeoffs and approved every change. It added up to more than three thousand merged changes, with no rollback and no customer-facing incident.
The planned list of about twenty projects was largely done by day three: twelve of thirteen targets hit. The wins are concrete. A static composer is now baked into the HTML so you can type while React is still initialising. The desktop shell’s main process got a precompiled V8 code cache. The composer stays mounted between conversations, sessions prefetch on hover, and the sidebar re-renders 90% less often.
The real trick was the metric
Wall-clock time is what users feel, but it’s too noisy for a CI gate. So the team went looking for deterministic numbers: instruction counts under Valgrind with node --predictable, V8 call counts, React commits, style recalculations, DOM mutations. Every new benchmark had two jobs — a number Claude could move in the lab, and a ratchet in CI that only goes down. Benchmarks that didn’t track real latency were thrown out.
Claude proved the point on two hot paths. Assembling a conversation’s message tree spent a quarter of its instructions on megamorphic dictionary lookups resolving the same message ID three times: instructions down 48%, wall-clock down 78%. The scanner for status lines in Claude Code output needed a cheap first-character check before the regex: down 31% and 44%. Both counts were checked in as ratchets, with a daily job lowering the ceiling whenever the number drops.
Measuring is step one now, not step zero
The sentence the whole post turns on sits in the middle: as soon as Claude has a number to beat, it can start optimising. Adding a metric used to mean instrument, wait, read the data, then understand. Now it’s where the climb starts.
You can take that home without Anthropic’s infrastructure. If you have an agent that runs for hours, the expensive question is no longer “how do I make this faster” but “how would I know that it got faster”. The rest is hill climbing.