The elephant in the room
In my last post I said I built my own CMS. It's time to fess up.
I have to come clean.
In the first post in this series, I wrote that the CMS I use now is “one I built myself, for exactly one user.”
The “one user” part is true. The “built myself” part needs a bit of an asterisk. Almost every line of code behind this site and its editor was written by Claude.
But why?!
It’s no secret that this personal blog fell into atrophy over the years. Work and life overtook whatever meager ambitions I had to be a blogger or a thought leader. When it came time to reconstitute this thing, I had a pretty strong vision, but I still didn’t have any more time than I used to.
Claude has nothing but time. The funny part? With Claude involved it turns out I didn’t need much time after all:
- Wednesday, September 30th. An empty static site, scaffolded on my Linux desktop.
- About an hour later. A complete Astro blog: Keystatic for editing, search, generated social images, RSS, light and dark modes. It worked. I threw it out the next morning.
- Thursday, October 1st. A content format spec, based on a design I’d mocked up in Claude Design.
- That evening. Home page, post pages, thoughts, feeds, an About page, and view transitions that morph the thumbnail into the hero photo.
- Later that night. Version one of the editor I’m typing into right now.
- Friday, October 2nd. The first real post, published from that editor.
So: a couple of days, from nothing to a designed, deployed blog with its own authoring app. The site and the editor are about 10,000 lines of source between them. I didn’t type most of them.
Somewhere in there, I posted a thought that pretty much sums up the experience: watching a machine churn through your job in seconds really does a number on the ol’ imposter syndrome.
So what did I do?
Mostly, I decided things. It’s actually not that surprising: as the core team leader of Concrete CMS I have been making decisions around software for many years, especially around code I didn’t write. That turns out to be most of the job.
I decided the content should be plain Markdown files in folders. I decided each post’s colors should come from its hero photo. I decided the first version wasn’t right, even though it worked, and started over. I decided we also needed a lightweight CMS “Studio” that could help me edit even when a Markdown editor wasn’t handy.
And I tested. A lot. The Safari bugs alone (a white flash between pages, a stutter after the photo animation) took a few rounds of “no, still broken, here’s what I see” before they were really fixed. None of that is typing. (Which is a pity, because that’s still a skill I’m good at.)
The editor has Claude in it, too
When I start a post, I can have it draft a title and description. It suggests alt text for photos. It can tighten, expand or rephrase a paragraph. And there’s a little robot in the corner of every post, which I named BeBot, that I can chat with about the draft. It proposes edits as diffs. It’s very good at fixing typos and grammar mistakes that I make when I’m frantically churning through a post.
And while we’re airing all of our dirtiest laundry: I like this. I like it a lot. It turns out that I really hate the imposing nature of a blank page. If I can have an LLM give me the world’s clunkiest first draft of something, I’ll take it. The earliest, firstest of passes on this topic came from Claude; I gave it the title and one sentence about what the post was about, and it read the first post, dug through the git history, and was off to the races. But what you’re reading now bears little resemblance to it.
Does it mean anything?
I’m not going to pretend I have this figured out. I lead an open source project whose whole reason to exist is helping people build websites, and I just built one in a day without really writing it.
What I know is that the site is better than anything I would have built by hand, because I wouldn’t have built anything by hand. I had years to do it and didn’t. The friction was the problem, and that friction is gone.
