Building this blog with an AI pair
This site is about four hours old. I built it with an AI coding assistant sitting in the terminal next to me, and the experience was different enough from what I expected that it seemed worth writing down while it’s fresh.
The short version: the speed is real, but it isn’t the interesting part.
The boring parts evaporated
Scaffolding an Astro project, wiring up Biome, swapping the package manager to pnpm, configuring content collections with a typed schema — this is maybe an hour of work I’ve done a dozen times and enjoy less each time. It took a few minutes, and I didn’t have to hold any of it in my head.
The same went for the mechanical half of design work. “Move the whole thing to Tailwind” is a genuinely tedious refactor: every component’s scoped styles have to become utility classes, the design tokens need somewhere to live, and the rendered Markdown needs its browser defaults put back because Preflight strips them. It came back done, with the computed styles measured against the old ones to prove nothing had shifted. That verification step is the thing I’d have skipped if I’d done it by hand, and it’s exactly where I’d have introduced a regression.
The parts that needed watching
Two moments stand out, and neither was a hallucination.
The first: Biome only parses the frontmatter of .astro files, not the
template. So it flagged around thirty “unused imports” that were all being used
in markup it couldn’t see — and it marked every one of them as safely
auto-fixable. Running the formatter with --write would have cheerfully deleted
every import in the project and broken the entire site. The tooling was wrong,
confidently, in a way that looked like a clean lint report right up until it
wasn’t.
The second was subtler. Post dates were rendering a day early — 2024-06-19
showing up as “Jun 18”. YAML parses a date-only value at local midnight, and
formatting it back in UTC drags it backwards for anyone west of Greenwich. It’s
a classic, it’s invisible in the timezone you develop in, and I’d have shipped
it.
What strikes me about both is that they’re the kind of bug you only catch by actually looking at the output. Not by reading the diff.
The habit that changed my mind
Late in the session I said the body text felt uncomfortable to read, which is about as vague as feedback gets. I expected the usual — bump the font size a couple of pixels, see if it feels better.
Instead it went and measured. Crimson Text has an x-height of 0.424em against Inter’s 0.546em, which means it renders about twenty percent smaller than the sans-serif at the same nominal size. My prose was set at 19px, so optically it was sitting at around 14.7px — smaller than the navigation menu wrapped around it. And in a 624px column that was running past seventy characters per line, comfortably over the point where your eye starts losing its place on the return sweep.
Both problems had the same fix, because larger type shortens the measure. 22px put the optical size at the equivalent of 17px Inter — matching the chrome exactly, not overshooting it — and dropped the line length into the low sixties.
I’ve been doing this long enough to know those rules exist. I have never once opened a console and measured the x-height of a typeface I was using. The assistant did it because measuring is cheap for it, and being cheap is what made it happen at all.
Where that leaves me
I don’t think this replaces knowing what you’re doing. Every single decision that mattered — minimal and typographic, archive on the homepage, serif for reading and sans for the interface, no borders — was mine, and the times I gave a vague instruction I got back something plausible that wasn’t quite what I meant. Taste doesn’t delegate.
But the gap between “I have an opinion about this” and “the opinion is implemented, verified, and documented” got much smaller. That gap is where most of my side projects have historically gone to die.
There’s still a placeholder GitHub URL in the config and an About page written in an approximation of my voice that I need to rewrite. Some things you have to do yourself.