Today’s internet is generally divided into four highly unbalanced chunks–corporate websites that host most of our user-generated content (Facebook, Youtube, Pinterest, Medium, Reddit, etc.), corporate websites that have endlessly gamed Google to push their pages to the top of nearly every search (Amazon, Buzzfeed, The Food Network, Gizmodo, etc.), super clean tech blogs that recently announced a migration to some trendy static platform (“How I accelerated my site and became a better person with Github Pages and Jekyll”), and sites like mine. Those sites that are still stuck on some creaky old CMS hosted by scammers in Utah whose web maesters are probably too unsophisticated to figure out how to get one of those little lock icons in the corner of the browser’s address bar (but damn it I do have the lock!). A few months ago, I desperately wanted out of this category.
I started ddmckinnon.com in 2013 while finishing up my PhD with the primary goal of owning the first Google search position for my own name, which I have done and not done at various points based on the vagaries of Google’s algorithm. Back then, I knew next to nothing about the internet aside from it seemed important to have a website. To add to my ignorance, the idea of blogging was in a dark age. The great civilizations of Geocities and Blogger had fallen into disrepair and the current renaissance driven by AWS, GitHub Pages, Jekyll, and backlash against big tech was still beyond the horizon.
Given the combined state of my knowledge and the blogosphere, I decided to build my website with WordPress and host it on Bluehost, the cheapest option available at the time. With $2.99/month and raw determination, I was going to make it to the top of Google!
Fast forward six years and the internet has changed dramatically. Inexpensive cloud services like AWS S3, which launched about a year before I did, are now widespread and well-documented. GitHub has empowered all users to create a static personal site for free. New blogging software like Jekkyl and Hugo dramatically reduces the complexity of publishing. And the world isn’t afraid to share the superiority of these new options. Like vegans at dinner, nearly every good blog I read proclaims the magic of leaving some five-year-old platform and host and getting onto the new new thing.
I felt the pressure. And my Bluehost contract is coming up for renewal. I was committed. I was going to do it. I was going to migrate off of my embarrassing WordPress blog and move to something fast and sexy.
Several options for static blogs exist and I evaluated all of them. My goal was to decrease the load time of ddmckinnon.com from 2 s to 0.5 s and to stop paying Bluehost a now-usurious $7/month. Looking back, I have no idea how I became fixated on these two given that my dear readership has never complained about load time and I am fortunate to regard $7/month as rounding error, but I digress.
As I saw it, there were two general paths to enlightenment: create a static copy of my WordPress site or migrate my WordPress site to a new platform like Jekyll. Either of these options routes could be hosted for free on Github Pages or for essentially free on AWS S3. I will spend the rest of this blog post describing why you shouldn’t do either if you have a big, content-heavy blog like mine.
The first option was greatly appealing. My current WordPress site lives on a thinking machine somewhere in a data center in Utah. Every time you visit, a server runs a bit of php code that generates html pages that your browser turns into nicely human-readable blog posts. Wouldn’t it be faster to cut out the middle man and serve the HTML pages directly? Or couldn’t we do even better by cutting the data center out entirely and serving these static assets (html, js, and media) through a CDN located in close geographic proximity to the website visitor? To get there, I would just have to save every HTML page that was rendered by my site, download all of the images, package them up nicely, and upload them to one of these static hosting options. And I wouldn’t even have to do steps 1-3. The team at Simply Static has written a nice tool to take care of all of this.
What’s the catch? There are two. The first is straightforward. For a fairly complex blog like mine (~100 posts, lots of internal links, lots of images), the static structure ends up including nearly 10k files. This means that regenerating and refreshing the static site takes quite some time. With this approach, I would have to regenerate the entire site after every edit and re-upload a fresh new copy after every post. This may not sound like a big deal, but spending an extra hour regenerating, debugging, and reuploading every time I wanted to fix a typo would be a total non-starter. In addition, the most appealing hosting situation, GitHub Pages, which is free and fast, limits blogs to 1 GB and a capped but undisclosed number of files.
The second catch is more fatal. To continue blogging and generating these static pages, I would have to keep WordPress running somewhere. The most logical place is on my local machine using some kind of server virtualization like MAMP. This is a great idea in principle and was inspired entirely by the good Hywel Llewellyn. Running WordPress locally gives the web maester access to an incredible community of plugins and templates and a great CMS with none of the WordPress downsides related to security, speed, maintenance, and spam. However, I could not possibly recommend going down this route. WordPress is really not designed to run locally, MAMP and phpMyAdmin are a total pain to configure, and the internet is riddled with unanswered questions on Stack Overflow regarding issues with this type of workflow. I encountered everything from missing an SSL cert for localhost to struggling to correct seven different kinds of broken relative links to digging through mySQL to correct redirects imposed by plugins. It was not fun. In addition, if you elect to spend the time to get this working, you become 100% reliant on the creators of Simply Static to continue maintaining their software, which you need to generate a fresh copy of your site every time you make an edit. If that team decides to quit, you will be debugging their php rather than writing blog posts or riding your bike.
However, I was loving the pain and continued debugging until I had my MAMP system running and I was able to properly generate a static copy of my site. Ecstatic, I created an S3 bucket, uploaded my pages, and navigated straight to Pingdom.com to run a speed test. I couldn’t believe my eyes when I saw the results.
Migrating to a static site shaved a measly .4 s off my load time relative to the ancient Bluehost servers when fetched from San Francisco and actually degraded performance when fetched from more distant lands. In addition, the size of the site increased because WordPress automatically does smart things like minifying javascript, pushing static content to CDNs, and creating cached versions of pages to bypass that whole rendering process I described earlier. This means that after spending months unintentionally becoming a WordPress/MAMP whisperer, I created a workflow that was infinitely more complex and did not meaningfully increase site performance. Darn.
Undeterred, I moved on to my second option: migrating from WordPress to a more modern platform like Jekyll. WordPress development feels like it has stalled and a migration to Jekyll would be a bet on the future. At this point, I knew that this project would be a ton of work, but I was ready to at least explore the option.
My exploration began well enough. I generated a Jekyll version of my site in a single command using the native Jekyll importer, picked a theme, and started clicking through a local copy. It didn’t take me long to notice dozens of broken links, issues, global redirects, and other weirdness that would take significant development effort to fix.
In addition, I started learning about the SEO implications of significantly modifying site structure. I get around 1,000 visitors per month to my website and most come from Google. Over the years, Google has learned to trust the way my site is structured and dramatically changing that structure can incur major SEO penalties, to say nothing of the inevitable broken links and redirects that come with this process. Part of the reason I enjoy blogging is hearing from random readers and spending my time repairing SEO vs. blogging did not seem like a good tradeoff.
To make matters worse, the native Jekyll importer does not convert the posts to markdown, Jekyll’s native blogging language. It merely pulls a copy of the static html files, while really don’t play well with the Jekyll blogging software. Big pages like some of my posts were full of weird formatting errors that only a devoted masochist would enjoy fixing.
I knew was faced with another dead end, so I attempted one final effort. Ben Balter has written a nice package that is supposed to generate nice markdown files, but it totally choked on a site as large as mine. Every time I ran the software, I encountered a new issue or edge-case. As I debugged, I started creating some test posts in Jekyll to get a feeling for the platform. It is fast and clean and everything it’s promised to be, but the functionality is super limited. I suppose this represents the other side of the same coin. If I wanted a Jekyll set-up that would automatically generate thumbnails, give me a nice search bar, and let me easily add 360 photos and maps, I would essentially have to rebuild all of the complexity of WordPress and recreate the whole problem I was trying to solve.
So I stopped. I said enough was enough and assembled this post to let the world know that a special place still exists for WordPress. ddmckinnon.com may be a little slow and clunky, but old Ironsides just keeps serving content and lets me spend time writing rather than monkeying around with the latest thing. In addition, as much as I make fun of Bluehost and the spam they push on their customers, they have really great customer service over chat. I will be happy to fork over another $252 in a few months when my three-year contract comes up for renewal and proudly keep blogging on WordPress…at least until the next new thing arrives.