mitchell@localhost:~$ cat ./blog/two-nights-of-an-agent-maintaining-my-site.mdx

Two nights of an agent maintaining my site found things I'd stopped seeing

A discontinued runtime, 98 MB of dead assets, and a duplicated element that broke keyboard navigation. None of it was hard to find. It just needed someone to look with a checklist and no attachment to how the site got that way.

· 2 min readagentsnextjsa11yworkflow

I handed my personal site to an agent on Friday. The rules were short: audit, open issues for real problems, at most three PRs a night, nothing merges without me, and never close an issue. Two nights in, here's what it actually found — and the part I didn't expect.

Night one

The production build had been failing because Vercel was pinned to Node 20, a runtime Vercel discontinued. Not a code bug — a setting I hadn't looked at in a long time. The agent found it, pinned engines.node to 24 in the repo, and opened the fix with a CI workflow and an AGENTS.md so the next run had rules to follow.

Same night: a build fix with input validation on the contact form, an SEO baseline (sitemap, robots, OG image, Person JSON-LD), and a copy sweep that turned three competing headlines into one h1. Four PRs, all merged, production green.

Night two

public/ was 115 MB. Thirty-seven megabytes of fonts nothing referenced and five audio tracks nobody played. After the cleanup PR: 17 MB.

It also found that the AudioPlayer component was mounted twice — once in the layout, once on the page — so there were two <audio> elements and every control appeared twice in the tab order, with the keyboard reaching the hidden one first. A screen-reader user would have hit that on the first Tab. It had been shipping that way, and I hadn't noticed because I don't navigate my own site with a keyboard.

Then it built /blog: MDX, listing, RSS, per-post OG images. One real engineering detour: next-mdx-remote won't prerender under Next 15 with React 18, because Next externalizes it and it renders against node_modules/react instead of the App Router's vendored copy. Compiling with @mdx-js/mdx inside the app bundle works. That reason is now a comment in the code, not a Slack message that evaporates.

The part I didn't expect

The most valuable output wasn't the code. It was the audit. A discontinued runtime, 98 MB of dead assets, a duplicated element that broke keyboard navigation — none of that is hard to find. It just requires someone to look with a checklist and no attachment to how the site got that way. An agent has both.

The constraint that made it work

Three PRs a night, PR-only, human merges. On night two it hit the cap and parked the fourth item as a written draft instead of opening a sloppy PR. That cap is the feature. Autonomy isn't what makes an agent useful on a codebase you care about; a contract you can audit the next morning is.

Next: the first of my overnight multi-agent systems goes public, with a README that reads as a case study instead of a feature list.