Ninety kilobytes
The home page's script budget, taken apart module by module
The Always Risk On home page can load 66.7 KB of gzipped JavaScript against a budget of 90 KB, and GSAP is 26.5 KB of that. GSAP and its Flip plugin load only when a reader goes to commit to a path or flip the positions view.
Home page JS66.7 KB
The game and the prize
The Always Risk On home page does a lot for a front page. A Monte Carlo fan runs behind the wordmark, a split-flap board turns over the latest notes, a switch flips the whole site between risk off and risk on, and a commit button makes the letters ride one surviving path, animated with GSAP. All of it has to fit in 90 KB of gzipped JavaScript, every script and lazy chunk the page can load, because the spec says so and the build fails if it doesn’t.
The prize is a page whose title paints first on a mid-range phone. The wordmark is the largest thing on screen, so it is what the browser times as the page’s main paint, and the fan boots after that paint so it never delays it.
The naive estimate
The spec added the parts up before any code existed and came to 72.3 KB, GSAP and Flip included. That left room, and it looked like the budget would never be the problem.
Then the first measurements from the budgets gate came back much lower than that, and lower felt like good news. It wasn’t. The gate was missing things.
The descent
The budgets gate follows every import from a page, lazy ones included, and adds up the gzipped size of every file it reaches. It found every import written with quotes. Vite writes the lazy import for the commit code with backticks, and the gate’s pattern only read quotes, so the commit code, GSAP and Flip never made it into the home page’s total.
Found it on 30 September while measuring the numbers for this piece. Fixed the pattern, added a test for a backtick import, and the home page came in at 66.7 KB.
The fix broke something else straight away. The not-found page has a fan too, a dead one that can never commit, but it shared its script with the live hero, and that script named the commit code. With the pattern fixed the gate counted GSAP on a page that can never load it, and pushed the not-found page over the 60 KB budget every page outside the home page and the write-ups gets. Now only the live hero registers the commit code, and the not-found page is back to 20.9 KB.
Taken apart module by module, the home page looks like this.
GSAP is 26.5 KB and Flip is 9.0 KB. They load on first intent, when the pointer enters the commit cell, when keyboard focus reaches it, when you click it or press C, or when you flip the positions view. Under reduced motion GSAP never loads at all, because the commit cuts to its end state instead of animating. The commit code itself is 2.9 KB and everything else on the page is 28.4 KB, the fan, the wordmark, the board, the switch and the subscribe form included.
The obvious cut is to drop GSAP and write the commit animation by hand. I did the math on it. Dropping GSAP and Flip saves 26.5 KB and 9.0 KB for a reader who commits, and saves nothing at all for a reader who doesn’t, because that reader never downloads them. The saving only exists for the people who asked for the animation, so GSAP stays, lazy. GSAP is very good at moving letters onto a path, and hats off to it, the commit would not look like that without Flip.
Receipts
The home page can load 66.7 KB against a budget of 90 KB, measured over the production build with every lazy chunk followed.
The write-up pages sit well under their own budget.
The edge, or its honest absence
There is room left, and the honest reading is that the largest single module the home page can load is GSAP, which only loads for the readers who ask for it. A reader who lands, reads the wordmark and scrolls to a write-up downloads at most the 28.4 KB of everything else, and never GSAP, Flip or the commit code.
The measure has one hole it cannot close. It reads the build, so if Cloudflare’s analytics script is switched on, Cloudflare adds it outside the build and the gate cannot count it. The spec’s estimate counted it and the gate does not.
What carries forward
The budgets gate, with the backtick fix and its test, runs on every build and fails any page over its budget. The facts script behind this site’s numbers now splits the home page into parts from the same import graph, so this piece’s figures come from the gate’s own walk and not a separate count.
The cost
A pattern fix, a new test and one small component to move the commit loader into the live hero. Real-browser timing of the main paint under a throttled phone profile is parked until after launch, so the page weight is measured and the paint time is not.
To check it yourself, open alwaysriskon.com with the browser’s network panel filtered to JS and add up the transferred sizes. Then press C, watch GSAP and Flip arrive, and add them too. The browser shows what Cloudflare actually sent, compressed its own way and with headers included, so expect a total close to these figures and not the same to the decimal.
Check it yourself
- JavaScript the home page can load, gzip
- 66.7 KBmeasured on the production build, every script and lazy chunk the page can load, as of 30 Sept 2026
- Home page budget
- 90 KBmeasured on spec section 9, the budget every build is held to, as of 30 Sept 2026
- Check the weight
- 66.7 KBOpen alwaysriskon.com with the browser's network panel, filter to JS, and add up the transferred sizes, then press C to load the lazy commit code.