Ghost hits 1.0: Reflections on three years of Ghost blogging

In September 2013, after years of light blogging with Jekyll via Octopress, I switched to a very sexy-looking new blogging platform called Ghost. Ghost was written with Node.JS and promised to be fast and efficient, with a minimalist writing interface and a slick looking dashboard.

I wrote up the platform in a quick article for Ars shortly after the public beta became available. The new and shiny had won me over, and I ditched Octopress and converted everything to Ghost.

But development took far longer than anyone anticipated. Essential blog features like post scheduling lagged; others, like customizable excerpts or the ability to center images without resorting to manual HTML and CSS entry still haven’t shown up. And that slick dashboard? Canceled.

The Ghost dashboard that was promised but never happened.

Life with pre-1.0 Ghost

Coming from a static site generator made even the early Ghost betas feel luxurious—there were actual settings that weren’t in a config file! But after the honeymoon period wore off, I found myself looking enviably at WordPress (which I’m in 10+ hours a day because we use it at Ars). Ghost was nice, but decidedly barebones—and the total lack of image formatting options made it hugely problematic for me to try to shift my wife’s blog over onto Ghost, since she wants WYSIWYG image layout tools.

Then there was Ghost’s update procedure—an involved procedure requiring you to download a tarball and then manually copy files from it into your live site’s working directories. Ghost is also completely stupid when it comes to working intelligently with any kind of caching layer—creating or updating posts requires screwing around with Varnish bans (and Cloudflare purges, if you’re using Cloudflare).

But moving blogging software again would be a pain in the ass, and in spite of the annoyances, there was some cachet with having your blog on self-hosted Ghost. It stuck out in a way that self-hosted WordPress didn’t, and it was sometimes a point of pride to be different. The much-ballyhooed dashboard’s failure to launch didn’t bother me overmuch as I still had Piwik to fall back on, and for almost three years I made do with Ghost. If I’d been blogging more, perhaps I would have switched over to WordPress, but I wasn’t, and I didn’t.

Life with post-1.0 Ghost

Ghost soft-launched 1.0 last Friday, holding their release post until almost a full week had passed. From a user’s perspective things are still pretty similar—the editor has a lot of visual improvements and there’s now a night mode, which I like very much:

Writing this post in Ghost

But the backend is drastically changed. Gone is the clunky manual process for updating and the need to screw around with npm. In its place is a lovely command line tool called Ghost-CLI that handles all of that for you. Updating Ghost now requires just a single command:

$ sudo ghost update
✔ Checking for latest Ghost version
✔ Downloading and updating Ghost to v1.1.0
Running sudo command: systemctl stop ghost-bigdinosaur-org
✔ Stopping Ghost
✔ Linking latest Ghost and recording versions
Running sudo command: -E -u ghost /usr/local/lib/node_modules/ghost-cli/node_modules/.bin/knex-migrator-migrate --init --mgpath /var/www-ghost/current
[2017-07-29 10:42:28] INFO Finished database migration! 
✔ Running database migrations
✔ Validating config
Running sudo command: systemctl start ghost-bigdinosaur-org
✔ Restarting Ghost

The majority of the changes appear minor unless you read the development blog; at that point, it becomes obvious how much of a change Ghost has undergone.

Living with Ghost now for the past week has been a very different experience, since the application now behaves as a proper systemd citizen on Ubuntu server and can update itself. From this admin’s perspective, Ghost is finally the blogging app that I wanted it to be three years ago.

But is it better than WordPress or Jekyll?

That’s impossible to say, since “better” means something different to everyone. But I’ll list Ghost 1.0’s downsides first:

  • Ghost still remains blissfully unaware of—and unable to interact with—any caching layer, either on- or off-box
  • Ghost has no two-factor authentication option
  • Ghost has no image layout tools at all—your image is going to show up left-aligned unless you manually define some classes in CSS and manually enter some HTML into the edit window for each picture.
  • Ghost still lacks any kind of support for many basic necessities required for professional writing, including:
    • Image captioning (though you can DIY this with more custom CSS and HTML)
    • Pullquotes (again, DIY-able with custom CSS and HTML)
    • Variable-length excerpts
    • Pagination & multi-page posts

Additionally—at least for now—Ghost has no usable plugin system and no plugin library. You can download a bunch of similar-looking themes all day long, but there’s nothing like WordPress’s extensive plugin library; extending Ghost’s functionality requires coding stuff yourself.

The lack of plugins isn’t necessarily a bad thing, since that same enormous library of plugins is most of what gives WordPress a reputation for being about as secure as a broken sieve. Ghost doens’t have that problem—not yet, at least.

Where Ghost wins, though, is in simplicity and focus. It’s not as cut-down as Jekyll and it will never be as fast, since Jekyll blogs are purely static assets with no dynamic generation, but Jekyll also has no real interface—you do your blogging with an external composer of your choice. Ghost’s 1.0 editor is just a joy to work with—it’s almost as sexy as Dillinger, and Dillinger is mighty fine.

Comparing Ghost to WordPress is like comparing Sublime or Notepad++ to Microsoft Word—or perhaps like comparing vim to emacs. WordPress is dripping with features and has extensibility out the wazoo—but unless you’re a huge business using WP as a CMS, you’ll never use the majority of WP’s features and you’ll never have to touch its extensibility beyond maybe installing a 2FA plugin. Ghost, on the other hand, has (most of) what normal writers and code-bloggers need (well, with the exception of syntax highlighting, but that’s easily added).

Recall also that WordPress has moved a large number of vital functions into its pervasive Jetpack plugin; if you’re self-hosting WordPress and want basics like being able to edit your posts in Markdown, you’ll have to install and connect Jetpack, which ties your site in to and opts you in to data collection and other WP-provided services you may not want. Ghost’s ties back to its creators are somewhat more minimal.

For now, I’m staying

I like Ghost. I’m used to Ghost. I work with WordPress every day for work, and I’m also self-hosting a WordPress-based site on this web server, so I’m very familiar with what WordPress offers at all levels, from the casual author’s perspective all the way to the system administrator’s perspective. WordPress is perfectly fine, but I prefer Ghost for my own use—even if I wish it had some more writer-friendly features. If I were blogging more regularly and with more contributors, I’d likely consider switching to WordPress, but I’m not, so I’m not.

And more to the point, I’m already here. Migrations are a pain in the ass.