WordPress has served me well since 2008. But after 12 years with Matt Mullenweg, it feels like it’s time to look at some WordPress alternatives.

In my early days of writing stuff on the web, I created static HTML files. My college gaming site adventure, The Strategy Shine, was just a bunch of raw HTML files. No separation of content and presentation, no templating, and no dynamic content whatsoever. Making a site-wide change meant doing an advanced search and replace on all the HTML files, and then uploading everything to the server with FTP.

On my first proper personal site, I used the original open source weblogging tool, Greymatter. The Perl CGI-script generated static HTML files, and allowed for a certain separation of content and presentations. After using Greymatter for a while, I made my own, very simple, CMS - Bugger - for blogging. Written in PHP and using a database to store data, Bugger lived for a few years until I finally made the move to WordPress in 2008.

There is a lot of hate for WordPress going around, but personally I like it a lot. WordPress is used by more than 30% of the top 10 million websites, and I suspect that much of the hate comes from the fact that it’s the market leader in its segment. WordPress has also received a lot of bad publicity for being a wide open door for hackers. While this was the case a few years ago, it has become a lot better now, but because of its large user base and plugin architecture WordPress is still a very popular target for hackers.

But even though I like WordPress, the time has come to try something else. A lot of things have happened in the CMS space in the last 12 years, and the engineer in me wants to have a go at something new and fresh.

Feature Requirements

My feature requirements for a new CMS are many, and very much influenced by the current WordPress features:

  • Backing up everything (content, media, metadata, etc.) have to be either automatic out of the box, or easy to automate.
  • I need separation of content and presentation so it’s easy to change the look and feel of the site, preferably with 3rd party themes.
  • The CMS have to be extendable to make it easy to add missing features.
  • It has to be possible to embed other code on the pages generated by the CMS.
  • Upgrading to a new version should not require a master’s degree in computer science.
  • The CMS has to be open source.
  • The CMS has to respect people’s privacy, i.e. not share data without the user’s permission.
  • I’ll need a comment feature. There are not many comments on this site, but there is some discussion, typically in the How To posts.
  • The CMS has to be written in a programming language I either know already, or in a language I think is useful for me to learn.
  • The CMS has to be actively maintained, and have an active online community. I’ll probably need a lot of help, and there is no better place to get that than an online community.
  • Everything has to be hostable on my own server.
  • SEO is important. Most of my visitors come from search engine results, so generating good SEO metadata and site maps are critical.
  • In general, working with the CMS should be as hassle free as possible. Maintaining the site should not be a second job!

I don’t think I’ll find a CMS that will support all of this - unless I decide to just stick with WordPress - so I’m willing to let some of the features slide if necessary.

Home Grown or Third Party?

If I had all the time in the world, I’d create a new CMS from scratch and cover all my requirements perfectly. But time is a limited commodity, and I’d prefer to spend it on other things, like creating content.

Luckily, many people with a lot of time on their hands have made it their mission to create high quality content management systems. The challenge is that way too many people have done this. The CMS market is practically overflowing with solutions of every shape and size.

To try to get an overview of the software that’s currently out there, I turned to What CMS, a site that keeps track of nearly 500 different content management systems. The data from the site didn’t help me much, though. It showed that WordPress is the market leader by a very wide margin - which I already knew - and that there are a lot of commercial, enterprise grade software available that I’ve never heard of and will never use.

So instead I did a DuckDuckGo-search for “wordpress alternatives” and started looking at the search results.

Let’s get cracking.

Ghost

Ghost is a free and open source blogging platform written in JavaScript. The idea for the Ghost platform was first written about at the start of November 2012, in a blog post by project founder John O’Nolan, the former deputy lead for the WordPress User Interface team, after becoming frustrated with the complexity of using WordPress as a blog rather than a content management system.

I tried Ghost back in 2016, and found that it wasn’t for me at the time. But a lot has happened since then. Ghost 3.0 was recently released, and it has received rave reviews across the board. One of the main shortcomings back in 2016 was the lack of a proper tool to convert all my WordPress content to Ghost. With the most recent of Ghost, however, a revamped version of their WordPress migration plugin was also released, and it looks promising.

Ghost with its default theme.
Ghost with its default theme.

Ghost’s feature index covers most of my feature requirements, but two important things are missing. There is no such things plugins for Ghost, and it doesn’t support comments. The former probably won’t be a major issue since Ghost is open source. I can modify the code, although that could raise some issues whenever I want to upgrade Ghost.

The missing comments feature is a bit a problem, though. It’s possible to use a service like Disqus, but hell will freeze twice over before I give a third party content from my site. Alternatively, I can use an open source comment solution like Isso or Valine, but it seems like a lot of hops to jump through.

Ghost administration home.
Ghost administration home.

WriteFreely

WriteFreely is free and open source software for starting a minimalist, federated blog. It’s stubbornly focused on being a truly simple blogging platform, doing more than other platforms to help you focus, write, and publish your thoughts.

When it comes to distraction-free writing, WriteFreely does that very well. The lightweight editor is pared down to let you do just one thing: write. It doesn’t throw notifications or statistics in your face, and it aims to be as unobtrusive as possible, like writing on a plain piece of paper.

The WriteFreely distraction-free editor.
The WriteFreely distraction-free editor.

WriteFreely is lightweight and simple, but I get the feeling it might be too simple. As an example, there is no support for uploading images if you’re hosting the platform yourself. Instead, you have to upload the right size images to somewhere, and then link to them in your post.

Grav

Grav is a modern open source flat-file CMS. The origins of Grav come from the developer’s personal desire to work with an open source platform that focused on speed and simplicity, rather than an abundance of built-in features that come at the expense of complexity.

The core of Grav is built around the concept of folders and markdown files for content. These folders and files are automatically compiled into HTML and cached for performance. Its pages are accessible via URLs that directly relate to the folder structure that underpins the whole CMS. By rendering the pages with Twig Templates, you have complete control over how your site looks, with virtually no limitations.

The Grav admin plugin dashboard.
The Grav admin plugin dashboard.

Part of the flexibility comes from Grav’s simple, but powerful, taxonomy functionality that lets you create relationships between pages. Another key part of this flexibility is the plugin architecture that exists throughout the entire platform to allow you to interact and modify pretty much any part of Grav as needed.

Grav surely has a lot going for it, and it checks off pretty much every box in my feature requirements list. I also really like the flat-file architecture, as opposed to using a database for content storage.

But I’ll probably give Grav the thumbs down because it’s written in PHP. PHP is not really a language I see myself using anywhere else except for tinkering with Grav. Since WordPress is also written in PHP, I’ve had my fair share of that over the last 12 years.

Strapi

Strapi is an open source headless CMS, and according to the Strapi website, front-end developers love it. I’m primarily a back-end developer myself, but I’d benefit from getting some experience with front-end development as well.

That Strapi is a headless CMS means that it only provides the content component and focuses entirely on the administrative interface for content creators. It comes with a rich Markdown editor - built for authoring all types of content: text, images, snippets, quotes and more.

The Strapi content manager.
The Strapi content manager.

If I was looking for a very flexible solution to build up customized content types, Strapi would probably have been a perfect match. But I don’t really need the flexibility that Strapi provides since a blog post - my blog posts at least - is pretty basic in terms of what they contain. I use less than 5% of the various blocks provided by WordPress' Gutenberg editor, for instance.

That Strapi comes without any themes or front-end templates is also an issue. Sure, I can create a front-end from scratch, but that also means I have to implement things like proper SEO support myself, which is not something I want to spend time on.

Static Site Generators

What is a static site generator, and how does it differ from a CMS?

StaticGen has a good explanation: The typical CMS driven website works by building each page on-demand, fetching content from a database and running it through a template engine. This means each page is assembled from templates and content on each request to the server.

For most sites this is completely unnecessary overhead and only adds complexity, performance problems and security issues. After all, by far the most websites only change when the content authors or their design team makes changes.

A Static Site Generator takes a different approach and generates all the pages of the website once when there’s actually changes to the site. This means there’s no moving parts in the deployed website. Caching gets much easier, performance goes up and static sites are far more secure.

Using a static site generator will probably mean the end of visual editing like in WordPress' Gutenberg. But that’s not a big issue. I’m a programmer, and used to text and notation - and I assume things can be previewed somehow.

There are many popular static site generators available, like Next.js, GatsbyJS, Hugo, and Nuxt.js. As you can probably guess from their names, most of them are written in JavaScript. Even if JavaScript is proper train wreck of a programming language, this is not necessarily a bad thing. I could need more JavaScript experience.

A website built with Hugo.
A website built with Hugo.

Final Thoughts

Of the four content management systems I looked at, Ghost is the one that shows the most promise. WriteFreely is Fediverse friendly, but a bit too lightweight. Grav’s flat file structure is very appealing, but that it’s written in PHP makes it a no-go. And Strapi’s lack of anything front-end related creates more problems for me than it solves.

After looking at static site generators, however, it feels like a CMS might not be the only answer to my needs. Using a static site generator can perhaps be just as good, and the number of static site generators available are enormous. Many of them use Markdown as the data storage format, which is great because it means that moving from one static site generator to another doesn’t involve converting all the posts from one data format to another.

But before I commit to a new CMS or a static site generator, I need to take some of them for a proper test drive. From the CMS camp, I’ll have a closer look at Ghost. Next.js, GatsbyJS, Hugo, and Nuxt.js all look like static site generators I should test - probably in separate blog posts.

Stay tuned!