First Impressions of Ghost(Pro)

Ghost is a wonderful publishing platform but I wish it didn't offload so many features to developers and end-users.

Updated: 04 February 2022

Writing this review made me realise that there were too many niggles with Ghost to continue using it. The format that the content was stored and exported in was the final confirmation that migrating (again!) was the right move.

I tried a few options including building my own Ghost-clone using Swift and Vapor, Publish which is a Swift-based SSG1, the veteran Statamic and finally settled on the Rust-based SSG Zola once more. I really wanted each of them to work, but on balance Zola gave me the most “out of the box” and the least compromises.

There are things I miss about Ghost, and I think it has it’s place, but I’m very happy with my new website built with Zola…for now! 🤣

I’ve just completed my 14 day trial of Ghost(Pro), and paid for my first month of the hosted service so I thought I’d jot down some first impressions.

What’s my background?

I think it’s important to provide some context when talking about a product or service. Much of what we can buy these days is so good that a review is more about communicating whether a particular item suits your needs rather than objectively being good or bad.

So… I’ve worked as a web developer for the past 8 years but want to step away from it (professionally) to spend more time with a camera. I have the knowledge to build something like Ghost from scratch but am reluctant to spend the time to do so.

Over the years I’d estimate that I’ve evaluated Ghost and it’s hosted service Ghost(Pro) no less than a dozen times for my own website as well as others. Each time it’s never quite been the right tool for the job, mostly due to needing additional data structures attached to each post.

Now that I’m looking to spend less time in front of a code editor I thought I’d opt for something a little less DIY. My existing site was built with a Rust-based static site generator called Zola which was very, very good; but I wanted something that made writing photo stories straightforward. I wanted to concentrate on the content, not the development of the website.

What I like about Ghost

Themes

I looked at Wordpress, Ghost and Squarespace but have a rocky history with Wordpress and Squarespace. Theme development is not easy for either and despite wanting to limit my development time, I knew I’d want to tweak my site. Ghost is a sweet-spot here as the official and paid themes are very good, and custom themes and the development environment required is straightforward.

Doing a quick performance audit of a few of the official themes I was impressed. There are things I would improve on (more later) but they set a high bar for performance (SEO, speed, experience, etc).

I opted for some slight changes to one of the official themes for now, but because the documentation is good and the data structure limited; building a custom, ground-up theme is not out of the question if I find myself with a spare weekend.

Editor

Photostories are going to be a major feature of this site, so building them needed to be friction-free. I found iterating on photo stories with a static site generator tiresome, and wanted a more visual editor. If I were to build my own content management system then Ghost’s editor would be my yardstick for the authoring experience.

Building articles with an engaging mixture of words and images is a breeze and encourages experimentation and play. The other “cards” like Bookmarks and YouTube and Twitter embeds have already proved useful too.

Platform

The big selling point was that Ghost(Pro) is a managed platform whilst still being open source and having a self-hosted alternative if I ever wanted it. Squarespace offers the “platform” but migration is notoriously hard.

I could easily set up Ghost on a series of Digital Ocean droplets with a managed database and load balancer — it’s well within my skill set — but I simply didn’t want to if I didn’t have to. The cost for this setup is about equivalent to the second cheapest Ghost(Pro) tier, but a second, third and fourth site on my own infrastructure would essentially be free. That is until you consider the time required to setup and maintain them all!

I keep coming back to where I want to be spending my time: taking photos and editing them into compelling stories. Debugging servers isn’t part of that. I’ll likely be setting up more sites in the near future and I’ll likely use Ghost(Pro) again. Each site incurring additional costs means that each needs to justify it’s existence because even if hosting is unlimited, my time is not.

What I don’t like about Ghost

This is going to sound very negative, but please remember I’m trying to find faults and using all my experience as a web developer to do so. I still opted for Ghost(Pro) despite these points.

Pricing

I know the lowest tier at $11 per month is relatively new, but I really hate custom themes being gated behind the higher tier at $31 per month. That’s a huge jump! I understand differentiating tiers on staff users and number of members as that relates to scale and thus the cost to run, and in turn the value of the site. Making custom themes an upsell is intentional hobbling of the software and just feels like a money grab. Even if you have to make the lowest tier $15 per month to make the numbers add up, include custom themes across the board.

A professional publication where there is likely a lot of content needs good search and it’s currently absent on Ghost. The options are:

  1. Google’s URL scoped search. Functional but not a great experience.
  2. Libraries like LunrJS which use Ghost’s API to build a client-side index. A good experience when content is minimal, but limited by a client’s local storage and an extremely inefficient way of doing things.
  3. Offloading search to Algolia. The best experience and technical solution but requires additional (complex) setup and (possible) expense.

None of these appeal, but I’ll likely opt for Algolia as I know Lunr works best when the index is prebuilt rather than created on the fly. I’ve used Algolia before when building Bikesoup and it got pretty messy, but the webhooks that Ghost provide in some Netlify functions look simple enough to setup.

Ghost says that they would prefer to concentrate on the core competencies of the software, but I feel that search is pretty fundamental once sites reach a certain size.

I think a “quick-win” would be for Ghost to build a Lunr compatible index server side and offer that through an API endpoint. The search still happens on the client, but at least the index doesn’t have to be built there which is the more costly part of this method.

Code Highlighting

I was surprised and disappointed when I found out my code snippets weren’t syntax highlighted and that the recommended solution was a client side library called Prism. Considering that Ghost runs on a Javascript stack server side I would like to see Prism used there instead.

Membership

I think a lot of people were disappointed when Ghost shifted towards membership-sites rather than just being an exceptional publishing platform. I’m on the fence as I can see a future where I use the membership feature to support my work. That said — much like the search, and the syntax highlighting — I’d like to see more done server side.

Rather than loading almost 500KB on every page for the “Portal” I’d like to see proper pages for signup, login and account management instead. There’s no reason these couldn’t be themable, but I guess these files being absent in older themes was why client side JS was chosen instead.

Fixed data structure

Having a fixed data structure was always the deal breaker every time I evaluated Ghost previously. There is almost always a piece of data that should be separate from the content. The tags will get you quite a long way with distinguishing content into collections, but it doesn’t help with assigning each post something like a location (lat & lng) or dates other than the publish date.

Even providing a customisable JSON object would be a big help. It would require the theme being used to know which key in the object to use, and content editors would need to be diligent in using it correctly, but it could broaden Ghost’s use significantly.

Routing

The dynamic routes and redirects feature is very useful, but I’d like to see a web editor for these settings, rather than downloading, modifying and uploading a YAML file.

jQuery

I’m getting picky now, but I’d like to see the official themes use vanilla javascript rather than rely on jQuery. Whilst it doesn’t do any harm, straight JS is good enough to use without libraries and should be the example being set.

The commonality in what I don’t like

You’ll notice almost all of my complaints are features being offloaded from the core software server side to additional client side javascript. This is code that the developers building themes have to maintain and the end-user has to run on their device. When a company offers a premium publishing platform — say that fast three times whilst drunk! — the features to support that platform should be built in. There’s a little too much “draw the rest of the owl” with their current approach to be considered “premium”.

Meme of how to draw an owl

My gut feeling is that Ghost built a reusable content API and then always opted to lean on that rather than incorporating new features behind the API. Whether this choice was in the pursuit of code reuse, speed of development or concerns over their backend’s performance — I don’t know. Their stack wouldn’t have been my first choice, and I do wonder whether they painted themselves into a corner with it.

Conclusion

Despite my gripes I very much like Ghost and the hosted Ghost(Pro) service. It offers exactly what I want from my website right now and I can see it being a good choice for some other sites that I’ll be building for friends and family in the near future.

I’m enjoying just publishing articles and photo stories without too much temptation to fiddle with my site.

If I were to build my own version of Ghost, I’d have to spend months of development time to reach something remotely like feature parity and would be on the hook for ongoing development, hosting and support. Ghost lets me distance myself from development whilst still putting all my experience to good use.

That said, I’m not ruling out building my own from scratch as the pain points I’ve listed probably aren’t going away anytime soon and might get more pronounced the longer I use the software — search in particular. I normally opt for an annual plan on subscription software as I don’t hate my money, but here I’ve opted for the monthly because I simply don’t know how I’ll feel about Ghost in the future.

I’ll update this post, or write another once I’ve been using Ghost for a while longer.

Footnotes

1

SSG = static site generator

Originally written: