Finally! My new website is ready.

What’s New?

A new, minimal design! No more WordPress. The layout is responsive and looks good on everything from the 4” iPhones to a desktop.

The RSS feed and Feedly subscription link work again.

Discussions on Hacker News and Reddit are automatically discovered, linked from each post, and indexed via hackernews and reddit tags.

Pages load in under 100 milliseconds from near the data center and half a second from Europe.

Sadly, a casuality of migrating to a static site is losing the ability to post comments.

Most importantly, now that I’m proud of the site, I am motivated to start writing again. That’s the theory anyway!


My first website was hand-authored in Netscape Composer and Notepad. Maroon text on a tiled wood texture, hosted by our local dial-up ISP.

My second was a cgi-bin program written in C that parsed text files and produced HTML, hosted by a friend’s university server. I don’t recommend making websites in C.

My third was split. Project pages and release notes were rendered with some custom PHP and hosted from my apartment on the domain Essays and personal updates went on my LiveJournal.

As IMVU and I became more well-known, my posts started to appear on social media and LiveJournal became embarrassing. So I bought, did a proper site design, and set up WordPress.

Ten years later with a house and three kids I just can’t deal with the maintenance overhead for WordPress, PHP, and MySQL. Even beyond maintenance, WordPress started to feel stifling. Pages loaded slowly. The layout and style were hard to tweak. The latest themes were meh. The spam detection was flaky. I couldn’t easily batch updates across all posts. It looked like crap on mobile. The RSS feed had stopped updating and I couldn’t figure out why.

So here we are! Back to a static site. This time powered by Jekyll and a bunch of Python scripts. Time is a river and history repeats.

The Migration

I wrote a Python script to dump the WordPress database into a JSON file.

I then wrote a one-time migration script which took all of the WordPress posts and pages and converted them to Jekyll with appropriate YAML front matter. WordPress comments are placed in a list in the front matter which the Liquid template renders.

Afterwards, on every build of the website, a post-processing script searches Hacker News and Reddit for links and places them into a list in the post’s front matter, which the corresponding liquid template can render.

One challenge with manipulating the front matter is preserving ordering on the keys (or at least avoiding non-determinism). It’s possible to override pyyaml so it uses OrderedDict for mappings.

I wrote a pile of automated tests to verify none of the WordPress links were broken, driven primarily by top hits to the access log and external links known to Google’s Search Console.

Writing these tests was worth it - some links had broken because of inconsistent time zone handling in the source data, moving a post’s permalink to the next or previous day. I told Jekyll to pretend the site is specified in America/Chicago time zone which everything. :P

Finally, sudo apt remove libapache2-mod-php mysql-server php-mysql. 🎉

I’m sure there are still bugs. If you notice anything, please let me know!