Gone is the only size the base of the pyramid accepts
After the first optimization pass, this site scored 97 and still shipped 113 KB of JavaScript to power a sticky header. The second pass asked four questions of every byte, in order: does it need to exist, block, run, weigh this much. The answers took first paint from 0.6 to 0.4 seconds.
- Page JavaScript: 113 KB to 1.6 KB — by deletion
- The preloader: JavaScript whose job was hiding the page
- Render-blocking CSS: 37.8 KB to 18.2 KB on a second diet
- The 377 KB favicon and other quiet embarrassments
- 28 third-party cookies an article page didn't need
Abstract: The first optimization pass took this site from 69 to 97 by making every asset smaller. This second pass got first paint from 0.6 to 0.4 seconds by asking a different question — not “how small can this be?” but “why is this here?” The method is one hierarchy, asked of every byte in order: does it need to exist, does it need to block, does it need to run, does it need to weigh this much. Page JavaScript went from 113 KB to 1.6 KB. Almost none of it was compressed. It was deleted.
The first article in this series ended with a warning box: subtract first, compress second. Then it spent five sections compressing. This article is what happened when the site finally took its own advice — and the model that made the advice usable: a hierarchy of needs for the browser, four questions asked of every byte, from the base of the pyramid up. Compression lives at the top of that pyramid. Deletion is the base. You cannot fix the top while standing on a broken base.
1. The Plateau at 97
After the workout, the score said 97 and the site felt finished. Every remaining audit item promised two kilobytes here, a font hint there. Optimizing harder produced nothing you could feel — the needle had stopped answering.
The tell was sitting in plain sight, in the request list rather than the audit: 113 KB of gzipped JavaScript on every page. jQuery. Bootstrap’s JS. GSAP with three plugins. A smooth-scrolling library. An animation-on-scroll library. All of it minified, bundled, content-hashed, cached immutably — first-pass engineering at its most diligent.
Nobody had asked what it was for. The honest answer: a sticky header, a hamburger menu, and a preloader animation. The template came with the libraries, so the libraries stayed, and the first pass — which only knew how to make things smaller — dutifully compressed them.
A 97 with 113 KB of JavaScript is not an optimized site. It is a well-compressed one.
2. The Pyramid
The second pass needed a model, not more tricks. This is the one that worked — four questions, asked of every request on the page, strictly in order:
| Level | The question | What it found on this site | Verdict |
|---|---|---|---|
| exist | Should this byte be here at all? | 113 KB of framework JS serving a header and a menu; a preloader whose job was to hide the page | delete |
| block | Must it block the first paint? | CSS carrying rules for carousels and lightboxes no article renders; fonts discovered two hops deep | reorder, preload |
| run | Must it execute, here, on this page? | An ads tag loading on every page when only one page can convert | scope it |
| weigh | Is it the size of the job? | A portrait downloaded twice, a 39 KB logo displayed at 42 px, a 377 KB favicon | right-size |
The order is the whole method. Each level only makes sense for bytes that survived the level below it — there is no point right-sizing an image that should not exist, and no point deferring a script you could delete.
And yet nearly everyone, this site included, works top-down. Compression feels like engineering. Deletion feels like admitting a mistake. The second pass mostly consisted of admitting mistakes in dependency form.
3. Level One: Does It Need to Exist?
Here is what an article page on this site loaded before and after the base of the pyramid was asked its question:
before the second pass after
---------------------- -----
html 7 KB html 7 KB
site.css 38 KB site-lite.css 18 KB
site-core.js 113 KB (deleted)
jquery -> 60 lines of vanilla JS, inline
bootstrap bundle -> one 20-line modal shim
gsap + 3 plugins -> (nothing needed it)
lenis smooth scroll -> css scroll-behavior
wow.js animations -> (nothing used it)
meanmenu mobile nav -> (it had never run)
preloader overlay ~1.2 s (deleted)
gdpr consent 2 KB 2 KB, deferred
The preloader deserves its own sentence, because it is the purest specimen of a level-one failure: JavaScript whose entire job was to hide the page. The content sat behind an overlay until 113 KB parsed and an animation played. Deleting it improved perceived speed more than any compression in the first pass — and no compression-minded audit would ever have suggested it, because you cannot compress your way to gone.
Deletion also found a bug that optimization never would. The mobile hamburger menu had been
display:none since the template shipped, and nothing in the JavaScript ever showed it —
phones simply had no navigation. Every audit scored that dead code clean. It took removing the
menu library to notice the menu had never worked; the vanilla replacement is the first version
that opens.
Dead code audits clean. That is what makes it dangerous.
4. Levels Two and Three: Block and Run
What survives level one gets the next questions, and the answers here are deliberately boring.
The render-blocking stylesheet went on a second diet — from 37.8 KB to 18.2 KB gzipped — not through better minification but by purging it against what these pages actually render. The first diet removed unused frameworks; the second removed the template’s own leftovers: carousels, lightboxes, odometers, a select-box skin, all styling nothing.
Fonts were being discovered two hops deep: HTML, then CSS, then the font files. Three preload tags for the three families visible above the fold collapsed that to one round trip. Text now paints at 0.4 seconds.
None of this is clever. It is bookkeeping. The cleverness budget was spent at level one, where it belongs — a page that ships 1.6 KB of JavaScript does not need sophisticated strategies for scheduling the JavaScript it no longer has.
The trap, second edition: deletion needs a verification step that compression never did. Removing code that toggles a class is how you find out what the class did. After every deletion, drive the page like a visitor: open the menu, submit the form, scroll, tab through it. The build passing is not the page working.
5. The Top of the Pyramid: Weight, and Other People’s Freight
Only now — with existence, blocking, and execution settled — do the classic image tactics from the first article apply. And asked honestly, the weight question still found things the first pass had missed.
The hero portrait was being downloaded twice. The page carries a mobile copy and a desktop copy
of the same <picture>, one of them always hidden — and display:none hides pixels, not
network requests. Both copies were marked high priority. Each now resolves to an inline empty
SVG at the breakpoint where it is hidden; one portrait loads per visitor, and a new 288-pixel
variant means the desktop one arrives as 19 KB instead of 68.
The logo was a 39 KB, 300-pixel image displayed at 42 pixels. The favicon — the little tab icon — pointed at the full 377 KB logo PNG, downloaded by every first-time visitor. It is now 2.5 KB. Every site has one embarrassment of exactly this shape. It hides in plain sight because no audit weighs what it never occurs to anyone to question.
The same question applies to bytes that work for someone else. The Google Ads tag loaded on every page, but a conversion can only happen on one — the homepage, where the contact form and the CV live. On an article page, its pings shipped 28 third-party cookie sends to Google and measured nothing in return. The tag now loads only where it can do its job. Parsimony toward your visitors’ data is not just hygiene; it is the same honesty the rest of the pyramid enforces.
Curated Source
Nothing Left to Take Away
The line is so right that the internet keeps reassigning it — most often to Picasso, whose own version was blunter: art is the elimination of the unnecessary. Either phrasing is a level-one sentiment. Neither says anything about compression.
"Perfection is finally attained not when there is no longer anything to add, but when there is no longer anything to take away."Source and context
6. Running the Pyramid on Any Site
The method transfers because it needs no tooling beyond DevTools and no context beyond your own page. The walk:
/ weigh \ is it the right size? -> right-size it
/ run \ must it execute here? -> scope or defer it
/ block \ must it block paint? -> reorder, preload
/ exist \ should it be here? -> delete it
----------------------------------------------
ask from the base up: a byte only earns the
next question by surviving the one below it
Open the network panel. List every request the page makes — all of them, including the ones you stopped seeing years ago. Ask the four questions in order, base first, of each. Measure after each level, not after each tweak; per-tweak measurement is how you end up polishing things that should not exist. Stop when a level answers “yes, honestly” for everything that remains.
The discipline is refusing to skip level one. It is the least pleasant level — every deletion is a small admission that the byte should never have shipped — and it is where the entire second pass lived.
7. Closing
The board after the second pass, same site, same design: page JavaScript 113 KB to 1.6 KB. Render-blocking CSS 37.8 KB to 18.2 KB. First paint 0.6 to 0.4 seconds. And the numbers no scoreboard shows: zero third-party cookies on every article, one preloader gone, one hamburger menu working for the first time.
The first pass made everything smaller. The second made some things gone — and gone, it turns out, is the only size the base of the pyramid accepts. A top score was never at the top of the pyramid. It is what the pyramid looks like from above, when every level holds.