I finally did it.

I moved my blog off of Wordpress. It's running on a Go server on a small Digital Ocean droplet.

Why now? Because side projects are fun again. I'm excited about software engineering for the first time in about 15 years. Agentic coding is so new and unsolved! And even better, now I get to make political statements just by saying which agent I use. What a time to be alive.

Oh sure, I've had a lot of fun coding in that time. I've gotten excited about a lot of problems. But it was never software engineering itself. And side projects eventually burned me out. Especially once my toddler was born. I don't want to pick up a project, fight exhaustion, hit a weird error, and yak shave for an hour while hoping that I have fun tomorrow at least.

But wow, Claude[0] really fixed that. I'm not new to Claude or Agents; I've used some version of Copilot/Cursor/Claude at work since Copilot first came out, and I've been using agents for about a year at work. But work's different than side projects. At work, I can't vomit out 30,000 lines of code and hold it up and ask, "Is this anything?" But I now regularly do this at home as part of exploring how far we can push the tools.

And you know what? It's amazing for dad side project time. It can meet me wherever I am.

Is my wife walking to the store with our daughter? That's 20 minutes, I can write a prompt and let it churn once they come back.

Am I exhausted after both my daughter and my pager wake me up? I can just click through my project and whine about the parts I don't like, and Claude will dutifully fix it all. Or maybe I can just vibecode a huge project with the goal of learning something.

Do I have a few hours? Great, let's really bend this codebase to my will. I'm going to micromanage this to within an inch of its life.

And one of the famous slogans from "The Mythical Man Month" was "Build one to throw away." I.E. you should invest time to prototype before building the final system. Claude really changes the cost dynamics; you can build a prototype, prototype a second approach, prototype a third approach, refine the third prototype, and then the production system is within a stone's throw.

The actual Wordpress port

I've wanted to move onto a VPS ever since the Wordpress drama happened years ago. But the juice never seemed worth the squeeze. I mean, I had fewer than 30 blog posts on this blog and just a couple of pages. Why bother, right?

But I first signed up for the Claude Pro account, and I tried thinking about projects that I might be able to one-shot within its narrow token budget. The blog port was a natural fit.

So I wondered if I should just convert the posts to Markdown and host them on Github pages or similar. But I liked the idea of being able to have dynamic server-based content[1].

Overall, I tried to one-shot the port at least 15 times.

In the beginning, I gave it really simple prompts. Basically, "Port www.bitlog.com" to a Golang server with Markdown files storing content." These failed horribly! They'd just make a basic Go server and a few fake posts.

Next, I prodded it to download the content. It would try for a while but I would eventually run out of context. I tried asking it to make a tool to scrape each page, but it tapped out and asked me to export the XML instead.

So I downloaded the XML dump and started telling it, "The XML dump of a Wordpress install is in this directory." And my prompt grew and grew with each telling. So many things needed to be fixed. It linked to images on my remote server instead of hosting them. Pages included Wordpress styling. Opus 4.6's first attempt rendered completely blank pages.

At some point, I started experimenting with subagents and immediately started running out of tokens. This was the point where I upgraded to a Max subscription. That's how they get you and it worked. Well played Anthropic.

I then was looking for a Beads alternative and found beans. I liked the idea of beads. I just wanted an implementation that... evolved a bit slower. Beans was another increase in power. My current experiments involve subagent teams, which are producing mixed results.

But eventually, I wrote this prompt, and I looked over the output. I realized, "This version has a lot of problems, but this is close enough. I can productionize this."

Refining the output

I started comparing the local markup with my Wordpress server. It skipped a bunch of meta tags like OG tags, Twitter markup tags. I made a lot of changes to the visual design (graphic design is my passion), information architecture, etc. This kind of work was great when I was exhausted; I could just whine to it about not liking how the header was styled and it would go and fix it for me.

Then I started asking it to e.g. find accessibility issues. And it came up with some good ones, and suggested good things like having a "skip to content" element. And I noticed something funny! Whenever I commanded it to generate a list of issues that included severity, it would generate a list with 1-3 severe issues, 3ish medium issues, and 3ish low-severity issues. I find that I had to specify what I mean by "severe" for it to generate an honest list; like, "Judge all issues relative to a "severe" flaw that would render the site completely inoperable, like a focus trap."

Deploying

I created a Digital Ocean droplet, pointed DNS at it, and set up SSH keys so that SSH commands would work without needing in-band authentication. And then I told Claude that I wanted to set up Ansible and a reverse proxy, harden the server, etc. It churned for about 15 minutes, and at the end of it my blog post was deployed and all the configs were right.

And then I had to talk Claude off the ledge. Something about its environment was preventing it from seeing the page on HTTPS. I could access it just fine over both HTTP and HTTPS. And then we were live!

Conclusion

I converted a blog from Wordpress to my own Golang server, even though I don't have much time. I am excited about software engineering itself for the first time in 15 years. I have my own theories about how the profession will evolve over the next 5 years[2], which will be the subject of my next blog post.

First, obviously this took longer than doing it myself, given the number of iterations it took. However, Claude could work when I couldn't. It's indefatigable! On nights that I was too tired to code, but didn't want to play a video game, I could just whine to Claude and it would fix the problems I saw.

It was also a playground for a while. Almost a "code kata," except I wasn't trying to execute a perfect form. I was just walking down a well-worn path, seeing what happened each time I changed a variable or three.

But I did it. I deployed it. I'm happy with the results. And now I'm curious how far I can take this. Can I host my own email server?

Footnotes

[0] You can substitute your favorite agent here.

[1] To be clear, I never will have dynamic server-based content. But man, I love the idea.

[2] TL;DR: We need to become product managers before product managers become coders.