Hi <<First Name>>,
I'm writing this with one eye on the calendar, because performance.now() is just a few weeks away! (More on that below.) In the meantime, this month's roundup has a little bit of everything – big data, big wins, and a few cautionary tales:
- A brand-new open dataset with billions of real-user measurements
- A candid panel on the future of user-focused observability
- How "speed" plugins hack Lighthouse scores (without making anything faster)
- How claude.ai got 3x faster in two weeks
- How Poptin cut INP by 57% across thousands of Shopify stores
- Everything you need to know about lazy loading
- Why your RUM data needs more context
- And something just for fun at the end :)
If you have any questions or feedback, I'd love to hear from you. And if you have any great resources you think belong in the next edition of this newsletter, please send them my way!
Until next month,
Tammy
@tammyeverts
|
|
|
How fast is the web? Explore billions of real-user measurements with BEACON
This is the kind of thing that makes my data-loving heart flutter. Ryan Townsend and Nic Jansma introduce BEACON, a new open dataset from Cloudflare with billions of anonymized RUM measurements from 10,000 of the largest sites on its network, updated daily in BigQuery and published as full histograms (so you're not stuck with P75).
The early findings are fascinating: iOS isn't always faster, soft navigations are 2-3x faster than hard ones, and – surprise! – downloading the LCP resource is usually NOT the bottleneck. Discovering it sooner and unblocking its render are the bigger opportunities.
|
|
|
Video: The future of user-focused observability
Full disclosure: I co-hosted this panel with Cliff Crocker, so I'm biased. But my bias is well founded! Annie Sullivan (Google), Alex Russell (Microsoft Edge) and Paul Calvano (Etsy) covered a LOT of ground in an hour:
- Lessons from six-plus years of Core Web Vitals
- The widening performance inequality gap
- Why P75 is a floor, not a ceiling
- What web folks can learn from mobile culture
- What AI agents mean for measuring user experience
I'm working on a blog post that rounds up the highlights and takeaways, which will be published soon. (I couldn't quite get it out the door in time for this newsletter – sorry!) In the meantime, the full video and transcript are well worth your time.
|
|
|
Front-End Checklist
You might know David Dias's Front-End Checklist from its GitHub days (it's been around since 2017). It's now grown into a proper site with 350+ rules across performance, accessibility, SEO, security and more, plus curated checklists like "Performance Quick Wins" and a handy pre-launch checklist. There's also an MCP server, so you can plug the same rules into Claude, Cursor, and other AI tools for code reviews.
|
|
|
The mirage of fast websites: How Lighthouse scores get hacked
Martin Michálek digs into "one-click speed" plugins that boost Lighthouse scores by deferring ALL JavaScript until the first user interaction (which Lighthouse never makes), and even some that appear to detect testing tools. When Martin's colleague Michal Matuška turned off one of these plugins on a client's site, the Lighthouse score dropped from 95 to about 60 – and Core Web Vitals barely budged. TLDR: Lighthouse is a great diagnostic tool and a terrible goal!
|
|
|
How we made claude.ai 3x faster in two weeks
I've read a LOT of performance case studies, and this one is unlike any of them. Raymond Wang, Sam Attard and Isaac G. describe a two-week sprint where Anthropic ran its performance work out of one Slack channel, with Claude finding bottlenecks, building benchmarks, and shipping fixes while humans approved every change. At P75, time to a typeable page on claude.ai dropped from 3.1 seconds to 0.55 seconds. Wow.
My favourite bits are pure performance fundamentals:
- Measuring something makes it tractable
- CLS can say "good" while users see jank
- Guardrails matter (as do em dashes, apparently)
|
|
|
Join us at performance.now() in Amsterdam!
performance.now() is happening November 19-20 in Amsterdam (at our new venue, the Oosterkerk) and as co-chair, I'm so proud of this year's lineup!
Pat Meenan, Harry Roberts, Tim Vereecke, Aleth Gueguen, Cliff Crocker, Scott Jehl, Jeremy Keith, Martin Michálek, Tim Kadlec, Max Inden, Risko Ruus, Stéphanie Walter and I – plus a mystery speaker (!!) – will be covering everything from web compression, HTTP/3, going beyond P75, Core Mobile Vitals, performance as a design problem, and selling performance inside your org, with Robin Marx and Jason Pamental as MCs.
It's a single-track conference, so everyone sees every talk and then talks about them together over coffee. Get your tickets here, or catch the live stream.
|
|
|
Arriving early? Come to performance.sync()!
If you're coming to performance.now() and getting into Amsterdam a day early, come along to performance.sync. It's the official pre-conference meetup on the evening of November 18, sponsored by Mozilla and hosted by Dave Hunt. Expect short talks from performance folks (to be announced), then drinks, snacks, and lots of time to hang out. More than 80 people have already registered, so don't wait too long!
|
|
|
Case study: How Poptin improved storefront responsiveness for thousands of Shopify merchants
I love a good third-party case study, and this one from Estela Franco at Shopify shows what happens when platforms and vendors actually work together.
Shopify's Web Performance team traced a ~900ms long task to synchronous XMLHttpRequests in the Poptin popup app's script – running on every page load, whether or not a popup was even configured.
After Poptin switched to async requests and deferred initialization, P75 INP across thousands of stores dropped 57% (from 280ms to 120ms). Reminder: An app doesn't have to be visible to hurt your users!
|
|
|
Lazy loading images and media: How far ahead browsers fetch
Lazy loading is just one HTML attribute, and yet we keep finding new ways to get it wrong. This guide from Ben Schwarz covers what you can lazy load (now including video and audio in Chrome), how differently each browser decides how far ahead to fetch, and where to use lazy, eager, and fetchpriority. One stat that made me wince: 17% of pages lazy-load their LCP image, which delayed the hero image by 262ms in Ben's test on fast 4G.
|
|
|
I guess I'm using WebP now?
This honest post from Gavin Anderegg made me LOL for real. After 20+ years of JPEGs, PNGs and SVGs, Gavin has come around to WebP – not because Lighthouse nagged him, but because his new image editor makes it easy (and the files really are smaller). It's a great reminder that best practices only get adopted when the tooling makes them painless. Here's hoping AVIF and JPEG XL get there faster than WebP's 15 years!
|
|
|
RUM needs more than a percentile
SpeedCurve RUM users, take note... Harry Roberts introduces LUX Sidecar, a small, independent plugin that runs alongside SpeedCurve's lux.js agent to capture extra context like round-trip time, cache state, protocol, service worker involvement and bfcache use.
As Harry points out, your P75 can tell you that something moved, but not why – and context is what helps you get there. I also like his advice to start with a question your current dashboard can't answer, rather than switching on everything just because you can.
|
|
|
Just for fun: Page Rage
Ever been so frustrated by a slow, janky, pop-up-riddled web page that you wanted to blow it up? Now you can! Page Rage, created by Alex Reardon, is a free game that lets you destroy any web page with a jetpack-wearing pixel-art soldier – via a browser extension or on pre-made pages like "Pain Mail" and "The Daily Dread." I won't tell you which sites I tested it on first. ;)
|
|
|
|