"The top-line takeaway is chilling: sites that are explicitly designed as SPAs, and which have intentionally opted in to metrics measurement around soft-navigations are seeing one (1) soft-navigation for every full page load on average."

Amazing research and analysis as always from @slightlyoff https://infrequently.org/2025/11/performance-inequality-gap-2026/

The Performance Inequality Gap, 2026

Embedded in this year's network and device estimates is hopeful news about the trajectory of devices and networks. It has never been easier to deliver pages quickly, but we are not collectively hitting the mark. Indeed, the latest CrUX data shows not even half of origins have passing Core Web Vitals scores for mobile users. Browsers will need to provide stronger incentives. This will be unpopular, but it is clearly necessary.

Alex Russell

@slightlyoff Frankly I'm skeptical of _all_ claims of SPA superiority:

- Paying for slow initial load is amortized across subsequent soft navs
- Soft navs are faster than hard navs
- Any of this is worth breaking the back button

You can always point to one SPA where it works, but in aggregate it doesn't seem to be working.

@nolan @slightlyoff back in 2020 I briefly worked at a web publishing concern that decided that doing everything as an SPA was good for performance and every time they ran into a performance issue their fix was to put more and more stuff into the initial preload, inlined into the response payload, which eventually bloated it to the point that every initial web request was multiple megabytes of uncacheable, un-CDN-able garbage. *Everything* was inlined, including CSS, images, and the site nav.
@nolan @slightlyoff They hired me for my web performance expertise but refused to actually listen to any of my advice whatsoever, and they were *proud* of this mess. Which was also impossible to debug because the “microservices” were anything but, and even spinning up a “minimal” server to render a single page took 32GB of RAM and multiple disparate software stacks written in a mess of C#, Python 2, nodejs, and React
@nolan @slightlyoff and of course nothing worked on Firefox
@fluffy @slightlyoff When people do things "for performance" but don't have numbers I'm always skeptical

@nolan Yeah in this case they were doing it as "best practices" and couldn't actually justify it at all aside from vague handwaves about how much the page-to-page transitions were sped up slightly, but like, y'know what else would have sped page-to-page transitions up? not delivering 2.5MB per initial pageview.

They also got super mad at Twitter for no longer unfurling the URL cards and one of them called them on the phone to angrily yell at them and I'm like, hey, what the fuck man?

@nolan Anyway the place was a disaster and I left after just a few months. There were *so* many problems and the tech stack was only one of them.
@nolan @slightlyoff like any design pattern, there is a place for SPAs. but it's not a very big place
@nolan Can you point out one SPA where it actually works well indeed? I'm always so frustrated by GitHub, where even on a WiFi network it's often faster to right-click and open in a new tab.

@tomayac @nolan I can't demonstrate it but I used to work on an internal tool that worked very well as a SPA. Every user was on a fast PC with a fast connection, so initial load times were almost instant (and the time to load the working dataset an order of magnitude higher), and we saved a lot of developer resources that way.

Now I can't point out one that's generally available and meant to be used on mobile phones. I don't think it's commercially viable to build that.

@eseilt @tomayac @nolan I work in edtech and our users, students and teachers, click through a lot of content and assessments and exam pages in a single session.

HOWEVER, what we currently have leaves a lot to be desired.

One specific issue is bundles being bigger initial load time is naturally slow. Now think about a class room full of students trying to load that up at the same time. It's very easy to bottleneck even a modest connection.

"But we have a service worker that caches it", except because of our amazing* developer practices we are doing several releases a day which invalidates the clients caches...

@xssfox @tomayac @nolan yeah, caching of app bundles is definitely not a thing in 2025. You only get that for stale apps that don't see active development.

But to be fair, the same is true for SPAs - "it's in the cache" is an argument from the days when development happened slower and unencrypted HTTP was in use.

I'm not saying SPA is a great idea for all internal use cases, for sure. Just that it can sometimes work out.

@eseilt @tomayac @nolan I did have a bit of a cursed thought about our very specific edtech use case in which we could use webrtc to distribute content between students on the same network/school...
@xssfox @tomayac @nolan slightly modified bittorrent client in WASM. It's not overengineering if it solves* a real* problem!
@nolan @tomayac stack overflow
@Synchro @nolan Based on some quick testing, Stack Overflow is an MPA. For me, it navigates to a new document for each major view change, like jumping to another question.
@tomayac @nolan it's true that it's more like a collection of SPAs, but the main question page (I'd guess it's probably >90% of their usage) is an enormously capable SPA in its own right. I've been impressed by its ability to cope with multiple simultaneous editing sessions on the same page, live comment updates, voting, etc, without missing a beat. What's more impressive is it's been doing it for years! It was good while it lasted...
@tomayac @nolan What about Gmail?
@ben @nolan Gmail is indeed a good example, and so is WhatsApp Web. I really wonder why GitHub's is so bad.
@tomayac @ben Gmail is exactly what I was going to say FWIW. Google Maps and Netflix work too.

@nolan @tomayac @ben A while ago there was a theory that people would only voluntarily install apps from entities they interacted with on a near-daily basis, such as their banks. Everyone and their dog kept pushing their apps, though, and I'm not sure how consumers feel about apps nowadays.

This SPA discussion is the exact counterpart of that app theory in the web space. Companies force their poorly thought-out SPAs on all consumers .. and I'm not sure how they feel about websites nowadays.

@ppk @tomayac @ben One thing I find ironic about this is that the whole SPA craze was driven by app-envy, and yet I don't think anyone would argue that the average SPA has eclipsed the average native app yet.

Part of it I think is that web developers didn't adjust their other habits – storing all data in memory instead of disk, doing all work on the main thread instead of web/service workers, not testing on real mobile devices, etc.

@ppk @tomayac @ben BTW Rich Harris' talk from PerfNow this year made one of the best cases I've seen for the SPA side. (Wish I had been there!) I think if I could paraphrase his argument, it's that SPAs have a high "ceiling," so we shouldn't dismiss them for the low "floor" we tend to see in practice. I'm pessimistic, but I'm glad folks like him are still pushing on this.
@nolan @tomayac @ben Wouldn't the same go for an app? Very useful if you interact often, but a bit of a dud if you just need it once?
@ppk @tomayac @ben Unless you think the upfront costs aren't really that high (e.g. for a Svelte app). I don't want to put words in his mouth, though.
@tomayac @nolan I'm pretty sure Gmail focuses on an interaction-to-visual-update metric. I wonder if GitHub is tracking and managing to something similar. SPA metrics seem less standardized?
@ben @tomayac There have been efforts to standardize, yeah, although I think you do also need something like interaction-to-visual-update to capture non-nav interactions (opening a modal, opening a tooltip, etc.): https://developer.chrome.com/docs/web-platform/soft-navigations-experiment
Experimenting with measuring soft navigations  |  Web Platform  |  Chrome for Developers

The Chrome team is working on better measuring so-called soft navigations used by Single Page Applications and a new API is now available behind a flag to allow sites to experiment with this too.

Chrome for Developers

@tomayac @nolan

I would say any application where the user keeps it open for a longer period of time. So messaging apps, email, social networks, etc

@tomayac @nolan I wrote a meal leftovers tracking app as an SPA. It responds instantly to navigations from list view to detail to edit views, which is fantastic because I use it while cleaning things in the kitchen and if I have to wait any time at all I will probably find it frustrating and stop using it. I would not want to endure a network request between each nav.

Of course it’s a tiny trivial app, but to me it’s a good example of something that works well as an SPA.

https://leftovers.olivierforget.net/

Leftovers Dropserver app

@nolan @slightlyoff Actually, I think SPAs are really good for workplace applications, where most users will load up and use throughout the day. Where you do get some benefit - and users will learn to start it up and then get a cuppa.

But for public sites? No thank you. For user apps where most people will load as necessary - once a day or less - they are a pain.

And yes, the web is slower these days. I despair.

@SteveClough @nolan @slightlyoff (Actually) I still disagree, as a user of what feels like dozen of these things. Every one was developed like it's the centre of the universe. If your entire job was to use this one SPA... it would still be inconsistent and hard to keep on top of not least because the barrier to developers messing with core behaviour, let alone functionality, is so low.

On the rest - well, we're in agreement!

@gra @nolan @slightlyoff I feel this is actually a bigger problem that UI design has gone down the plughole in the last few years.

Given that I finished my PhD on UX - that is frustrating for me.

I think any application that is pretending to be everything is bad design. So many bad designs around.

@SteveClough @nolan @slightlyoff Thoroughly agree. From experience, there always have been lots of bad designs of course, since the beginning. But there's so much freedom and diversity in the ways they can be bad, now!