Performance, in public
This site claims performance as a specialty, so its own numbers are public: the measured weight of the home page as served, the budget that CI enforces on every push, and a changelog of what changed — including the embarrassing parts. Methodology and a guided tour live in How This Site Loads in Under One Second.
Scoreboard
measured 2026-09-01 · gzip, as served · home route
| Metric | Measured | Budget | Status |
|---|---|---|---|
| First-load JavaScript | 106.8 kB | ≤ 120 kB | PASS |
| HTML document | 17.1 kB | ≤ 40 kB | PASS |
| Stylesheet | 12.2 kB | ≤ 20 kB | PASS |
| Images on the home page | 170.4 kB | ≤ 300 kB | PASS |
| Render-blocking requests | 1 (the stylesheet) | ≤ 1 | PASS |
| Third-party requests before paint | 0 | 0 | PASS |
An honest caveat: ~102 kB of the JavaScript is the Next.js 15 App Router framework baseline (React, router, hydration). The parts I control add 5 kB on top. A zero-hydration rewrite would drop the floor to ~10 kB — it's on the roadmap as an experiment.
How it's enforced
- Every push runs a CI workflow that rebuilds the site, re-measures every number above from the actual export, and fails the build if a budget is exceeded.
- Lighthouse runs against the static export with assertions on performance, accessibility, SEO, CLS, and total blocking time.
- Telemetry: a ~3 kB first-party beacon reports anonymous LCP, INP, and CLS — that's the field data behind future case studies. Google Analytics also runs, loaded
afterInteractiveso it stays off the critical path. It is by some distance the heaviest thing this site ships, and the honest trade for knowing which articles people actually read; the numbers above measure the critical path, which it deliberately sits outside of.
Performance changelog
Wins and regressions both — publishing only the wins is marketing, not engineering.
2026-08-16
Removed the animation library entirely (scroll effects now CSS-driven), rebuilt the shell as server components.
first-load JS down again; runtime animation JS: 0
2026-08-16
Killed the effect stack: full-viewport canvas glitch hero, tsparticles titles, animated SVG card borders, 96-image marquee, a universal `* { transition }` rule, and 8 infinite-loop animations in the theme toggle.
first-load JS 173 → 157 kB; continuous rAF/canvas cost → 0
2026-08-16
Re-encoded six project screenshots from raw PNG to display-sized WebP at build time.
16.2 MB → 167 kB (−99%)