Static Sites, Revisited
Why I moved this blog back to a fully static build after two years of chasing server-rendered features.
A slightly-too-honest log of what I'm building, why it's taking longer than planned, and what I learned anyway.
Why I moved this blog back to a fully static build after two years of chasing server-rendered features.
A slow leak in a Node worker, the wrong assumptions that hid it, and what finally found it.
What changed after I started publishing drafts instead of waiting for finished thoughts.
Small, deliberate changes to a workflow I use twelve hours a day.
A year-end look back at which weekend projects survived contact with daily use, and which quietly died.
Reworking the tag pages taught me more about the site's actual shape than writing the posts did.
A small Node script that walks every post and flags broken links before a reader finds them first.
A CLS regression that never appeared on desktop, traced back to a font fallback with different metrics.
Forty lines of vanilla JS and an IntersectionObserver instead of reaching for a plugin.
A build script got 40% slower after I 'optimized' it with worker threads, and what that taught me about profiling first.
Every few months I consider adding a visit counter, and every few months I remember why I don't.
Wiring Lighthouse CI into the pipeline so a performance regression fails the build instead of getting noticed later.
How a package.json with thirty scripts got refactored down to five I can actually remember.
Going through every transition on the site one by one to check it actually respects prefers-reduced-motion.
Swapping a media-query hack for a container query solved a card layout bug I'd been patching around for months.
A Zod schema catching a malformed frontmatter date before it ever reached a reader.
Writing out cache-control rules for a static site forced me to actually understand what they do.
A regression I'd been guessing at for a week, solved by finally trusting the tool built for exactly this.
Self-hosting two font families cut a render-blocking request and a chunk of layout shift in one afternoon.
What I learned falling down the astro:transitions rabbit hole trying to get one cross-fade to feel right.
A flaky accessibility test, a race condition in a fade transition, and the fix that was one attribute long.
Three small bugs in a feed nobody complained about, found only because I finally opened it in a real reader.
How a two-line 'does the page load' check turned into a Playwright suite I actually trust.
Ripping out a hand-rolled image resizing script in favor of Astro's built-in `<Image />` component.