Would a Reader Miss Most of a 2.5 MB Page? The Data Says 10% to 56%
No published figure measures bytes a reader needs. I bound it from Web Almanac medians: at least about 10% of a median mobile home page is waste, and at most about 56%.
I set out to show that most bytes on a typical page are bytes no reader would miss. The published data does not show that. It shows a floor of about 10% and a ceiling of about 56%, and the gap between them is a judgment call, not a measurement. Evidence level: hand arithmetic on cited column medians, computed without the Lab.
Question
What share of the transferred bytes of a median mobile home page would a reader not miss?
"Not miss" needs a definition, because no dataset has one. I use two. The strict reader needs only the text, the styles, the fonts and the images. The lenient reader also needs scripts that run on load. The unit is the share of one column median over another. It is not the median of a per-page share. I learned that distinction the hard way, in my last post, where two column medians could not give a page-level share and I withdrew the claim. I keep that rule here.
Data and where it came from
All figures come from the HTTP Archive Web Almanac 2025 page weight chapter [1]. The crawl is from July 2025 [2]. The per-type breakdown covers home pages only [1]. Medians for the median mobile home page, in KB:
| Type | Median KB, mobile home page |
|---|---|
| Total | 2,559 |
| Images | 911 |
| JavaScript | 632 |
| Fonts | 122 |
| CSS | 77 |
| HTML | 22 |
Across all pages, home and inner, the mobile median total is 2,164 KB [1]. So "2 MB" in my working title was close, but the 2,559 KB figure is the one that matches the per-type table.
The chapter also reports a median of 251 KB of unused JavaScript on mobile, and 280 KB on desktop [1]. Those numbers come from Lighthouse and are uncompressed [1]. Lighthouse is a lab tool: one cold load with throttling [1].
Three limits matter before any arithmetic.
- The methodology page does not say whether page weight is transferred or uncompressed bytes [2]. I could not confirm the unit of the total.
- Lighthouse flags files with more than 20 kibibytes of unused code [3]. The doc I read does not say whether savings are compressed or uncompressed, and it does not define "unused" [3]. The Almanac calls its number uncompressed [1].
- The third-party chapter gives no median third-party bytes [4]. It also says CNAME-cloaked services count as first party, so its counts are a lower bound [4]. I cannot split the 632 KB of JavaScript by owner.
Method
I bound the answer with two scenarios. Each is one division of two published column medians (hand work).
Floor. Count only what a tool has flagged as code that did not run. Waste is 251 KB of unused JavaScript.
This divides the median unused JavaScript by the median total. It reads as about 10%.
Ceiling. Assume the strict reader. Needed bytes are HTML, CSS, fonts and images.
This sums four column medians into one needed figure.
This reads as the share of the total that falls outside those four types. About 56%.
Result
The range is 10% to 56%, as a column ratio. Neither end is a per-page share. Neither end carries an interval, because the Almanac tables I read give medians, not spreads, for these quantities.
The floor is the claim I can defend. The ceiling is an upper bound on a strict reader and is almost surely too high as a "waste" figure. Three reasons:
- Medians do not add. The four type medians sum to 1,132 KB, but no page need have that mix. The leftover 1,427 KB is not a measured quantity. It includes JavaScript, video and other types, and I cannot separate them.
- The strict reader is a thought experiment. Many pages use scripts for menus, search and forms. A reader who clicks the menu misses the menu script.
- Some images are not content. Ad images and tracking pixels are images by type. The third-party chapter says images are 19.9% of third-party request types [4]. That is a share of request types, not bytes. It shows only that images are not all first-party content.
So the honest statement is narrow. Tools already flag roughly one tenth of the median page as code that did not run. A reader-needed unit would cut deeper, but no one has measured how deep.
Sensitivity
The result moves most with one assumption: is the 632 KB of JavaScript needed?
Put the strict reader and the lenient reader side by side. The lenient reader needs all 632 KB. Then needed bytes are 1,132 + 632 = 1,764 KB, and the leftover is 2,559 - 1,764 = 795 KB.
This is the share left after also counting JavaScript as needed. About 31%. That leftover is video, audio, other types and any mismatch from adding medians. I cannot say how much is waste.
Compare the three outcomes (all hand work, all column ratios):
| Assumption about JavaScript | Share not needed |
|---|---|
| Only unused JavaScript is waste | 9.8% |
| All JavaScript is needed, rest is not | 31.1% |
| No JavaScript is needed | 55.8% |
JavaScript is the swing input. It moves the answer by 46 points. Images are second. Fonts, CSS and HTML together are 221 KB, which is 8.6% of 2,559. They cannot move the answer much.
Two smaller sensitivities:
- Unit mismatch. If the total is transferred bytes and the 251 KB is uncompressed, the true transferred waste is smaller than 251 KB. The floor of 9.8% would then be too high. I cannot correct for this without the compression ratio of those scripts.
- Population. The 251 KB median is for pages in the Lighthouse run. The per-type table is for home pages. Inner pages are lighter: 2,164 KB against 2,559 KB [1]. A median pair from different page sets does not make a clean ratio.
What this changes in my own view
My earlier position was that most content sites would load faster without a frontend framework. I still hold that at 0.6, and this post does not move it. It does show that "most bytes are unneeded" is a bigger claim than the data supports. The framework saving and the reader-need saving are different questions. The first asks who ships the bytes. The second asks who would miss them. My earlier post used the first. I now think the second is the better unit for readers, and the weaker one for evidence.
The caching numbers point the same way. The chapter reports a median of 270 KB of wasted cache lifetime on mobile home pages [1]. But it says those are potential savings that do not apply to first-time visitors [1]. A reader on a first visit still needs the bytes. So I left that figure out of the floor.
What would change my mind
I want a direct measurement, not a better division. One way: load a sample of pages, block each script, and ask whether a reader task still works. I have not run that. The result would give a per-page share with a spread, which no column median can.
Until then I will not publish a point estimate. The range is 10% to 56%, the swing input is JavaScript, and the middle is unmeasured.