I have had an online presence since the mid-1990's and always have tried to make it as professional and usable as possible. In the early days, it was raw HTML editing at the command line, and then various different content management systems and tools came and went. In the early 2000's, a plethora of solutions were all competing against each other - Drupal, Joomla and WordPress to name a few.
I tried many of them, but for the majority of the 2000's and as late as 2018 I used WordPress as my primary platform. Along the way, I tried some managed services such as Squarespace and a few others, and migrated between running WordPress myself on a self-hosted server, and later virtual machines, and even went to managed WordPress hosting companies including WPEngine, Kinsta, Pantheon, Flywheel, and Pressidium.
About once a year, I would go out and look at alternative ways of running WordPress, and I moved between self hosting and managed WordPress hosting more times than I care to count.
In 2013 I remember seeing lots of excitement around Ghost, but it definitely looked like it needed a year or two to mature before I could use it. In 2016 I checked it out again, but there were too many things that kept me stuck in the WordPress world, even though I probably didn't need them.
Ghosts features have always impressed me - they are clearly targeting bloggers and writers, and intending on making a well thought out product specifically for that market from the beginning. But more importantly is how the company and product are set up:
We set Ghost up as non-profit foundation so that it would always be true to its users, rather than shareholders or investors. Our legal constitution ensures that the company can never be bought or sold, and one hundred percent of our revenue is reinvested into the product and the community.
That is pretty rare to find in today's world of technical software, and is a breath of fresh air. I want to support a company that invests it's revenue into the product and community, and can't be sold off for profit and turned into something different.
In late 2017 I decided to convert my site to Ghost and see if I could make it work. The export process from WordPress to Ghost was not seamless, and required a lot of sed and awk scripts (my language of choice, don't judge) to fix weird HTML that came out of WordPress, but after a few days of futzing, and a lot of copy and paste to move metadata and tags between one and the other, the site was ready.
I ran the site for a couple of weeks on Ghost, while keeping WordPress ready to take back over. I didn't change/add any content, and just watched stats and SEO rankings. Surprisingly, both went up, and people commented on the speed of the site. SEO in particular really surprised me - even after investing tons of time with a particular WordPress plugin, and over a year of continued effort there, Ghost helped increase my SEO rankings for some key pages without me doing much other than ensuring accurate metadata was typed in.
But there were still some unfinished things that caused my workflow to suffer. Image management was pretty limited which meant that Ghost served out the same size image to every client, regardless of their screen size. This caused a lot of complaints since I tend to take decent sized pictures of my installation and projects, and mobile clients were suffering. There were also a few other missing things that made my workflow a lot more complicated.
So I moved back to WordPress, and back to my own self-run server.
Then in mid-2018 Ghost released version 2.0 and it looked really, really appealing. I was having the usual performance issues with WordPress, and had continued to tweak, change, update, reduce plugins, and do the usual dance to try to make it better.
One of the most exciting additions in 2018 to Ghost was automatic image optimization, which came out in September. This is still something you have to install a plugin and pay an extra fee for with WordPress, in almost all cases. I was very excited with this addition, as making my images as optimized as possible was another manual task I did myself.
But what really pushed me to seriously consider Ghost and start the review process again was the release in December 2018 that included automatic responsive image thumbnails. This was a feature that had been requested for quite some time, and I had experienced performance issues prior in my 2017 attempt to use Ghost.
It was time to really look at why I wasn't on Ghost...
The true costs of WordPress...
Finally, in early 2019, I sat down and did a deep look at what I really needed WordPress for. I wasn't plugin-heavy, and tried to only install things I really absolutely needed. Still, I needed one or two caching plugins, a security plugin (Wordfence), various other security plugins to protect things, spam protection plugin, Yoast SEO Pro, stats plugin, and more. All told I had about 20 plugins, which is not that many compared to average WordPress sites that I have helped administer in the last 5+ years.
Still, the admin interface was frustratingly slow while editing or updating content. The site loaded for end users at an OK speed, but it still wasn't super fast. And this was after having chosen a very lite and optimized theme in GeneratePress, adding Autoptimize to deal with CSS and JS stuff, Redis server-side caching, and a number of other performance tweaks.
What really got me was the cost. To run the server monthly:
- $40 - server at Linode with backups
- $12 - server management software (SpinupWP / ServerPilot)
- $5 - AWS S3 storage costs for offsite backups
A total of around $57 which could easily have been more during months with traffic spikes, where I needed to increase the CPU/RAM for the server.
But that wasn't the worst of it - it was when I sat down and figured out the costs of the plugins and services I needed just to keep the site running and secure:
- $90 - firewall / WAF
- $60 - image optimization service
- $108 - related posts service
- $199 - page builder
- $60 - comment spam service
- $25 - Amazon advertising plugin
- $67 - SEO plugin
And the list went on with smaller items. This is a yearly cost of $609, or a monthly additional cost of $51. That pushes our monthly total up to $108.
Even if we throw out the Amazon plugin, related posts, and page builder that's an additional $277 which is $23 more a month, or a total of $80 per month.
That might not sound like a lot, but that is if we are only looking at these costs. How much is my time worth, having to mess around with plugins constantly when they require updates (daily!) and then respond quickly to software upgrades with WordPress, always waiting for conflicts with my theme, plugin, or something else to happen.
Even with my conservative numbers above, I would guess I was spending between $100-300 a month in my time dealing with the site. Now we're getting up there!
WordPress is definitely an entire ecosystem and industry, and there is nothing wrong with it - it gave me many years of service, and I appreciate it's amazing flexibility, but I was tired of spending my time and money on it when I wanted to be writing.
Migrating to Ghost
I had learned from my attempt in 2017 that moving to Ghost required some manual steps. I had kept some of my hacky scripts, and dug those up for the big migration.
Note that the Ghost team are working on a simpler way to migrate from other blog platforms. I would check out the Ghost Forum for more information.
The other challenge was that the export from WordPress was meant to be imported into a 1.x version of Ghost, when their current version, and version on their Ghost(pro) hosted service, was 2.x. So the import process was a bit longer:
- Install 1.x version of Ghost on a VM on Linode
- Run Category to Tag converter - I used categories in WordPress for several major jumping off pages, and Ghost only supports tags.
- Export from WordPress using Ghost plugin exporter
- Export CSV of redirects from WordPress/NGINX
- Mangle with Steve's scripts, removing cruft from WordPress, changing image captions, changing
/wp-content/uploadspath for images to
- Import into Ghost 1.x on VM
- Copy/paste metadata & excerpt from WordPress to Ghost, and validate the tags for each post/page - time consuming!
- Review each post/page for really crappy WordPress leftover cruft such as Amazon ads plugins which embedded horrible HTML directly in the posts.
- Upgrade VM to Ghost 2.x
- Create redirects.json file from redirects exported from WordPress
- Run ghost-purge-images to get rid of thousands of WordPress generated image files.
- Export Ghost JSON data from self hosted VM, import into Ghost(pro) instance.
- Send zipped file of images to Ghost(pro) support so they can upload them.
- Switch CloudFlare (which I already used) to Ghost(pro) instance name, wait for SSL cert to be generated, done!
It was far easier for me to edit markdown in the 1.x version of Ghost, which is how my WordPress posts were exported/converted. The newer editor (Koenig) in Ghost 2.x requires several clicks to get into a markdown card, and with the amount of editing I was doing for each page, this made the process much faster.
In addition, I highly recommend any WordPress user takes a look at ghost-purge-images by David Burgos from Ghostboard.io. This is a fantastic bit of code that goes through all images in your Ghost install, and will purge the thousands of thumbnails that WordPress themes and plugins generate.
My site had around 16,000 images before I ran ghost-purge-images, and it cleaned up around 14,000 of those images! I went from about 5GB of images to 400MB - quite a nice reduction.
So, the migration process wasn't a single click, but it did force me to re-visit all of my content and make sure my SEO and metadata were written correctly, and I was happy with the result.
There were some additional items that weren't directly related to the import that I did:
Casper theme customization - I really like the Casper theme - the layout, cards, and overall look and feel. I customized the colors, header, footer, and tweaked a bunch of other smaller things. I also added my Disqus comment settings to make sure those came over from WordPress. I used Grant Winney's page on building on top of Casper to ensure I can always get the newest versions of the Casper theme easily.
Code Injection for fonts and colors - rather than customize the Casper theme colors, I have chosen to use the Ghost code injection feature to set my colors and fonts for as much as possible. I also use it for analytics.
Things I miss...
Page builders / landing pages - I would really like to be able to create custom laid out pages, but there is really no way to do this with the editor in Ghost without using raw HTML.
Themes - this is sort of a love/hate thing - there are so many unique themes to choose from in the WordPress world, and I am not an HTML coder. I love being able to use things like GeneratePress and the Customizer in WordPress to setup the exact fonts, colors, and layout I want. But you can spend so much time messing with this stuff, and that is the hate part. Plus, don't even ask me how much money I have spent on themes over the years.
I chose to fork a version of Casper, Ghost's primary theme, and modify it to match my style. I'm still working on it longer term, but it does require a bit more time than WordPress.
So far, the top things I've seen from moving are:
Speed - holy crap Ghost is fast! I've always seen this posted by others, and even in my testing it has been fast, but you really don't appreciate it until you use it daily for a while. Even users have been commenting that the site seems much, much faster.
Focus - I'm not updating plugins, worrying about security holes in PHP, or messing around with other aspects of the system. I just write. Which I am far better at than managing servers.
Simplicity - things just work - the editor doesn't freak out, I can just write, uploads happen quickly, posts show up right away, etc. etc.
Editor - the editor is also very focused, and I find it much easier to write in. It is also very easy to add different types of content with tiles - images, twitter cards, etc. - without weird editor funkiness that is common in WordPress. It just works.
Zapier integration - I wasn't expecting this to be a big deal, but I really like the integrations that Ghost has helped publish into Zapier. I have an email newsletter, and allowing folks to sign up with the native Ghost subscription dialogs looks far more professional.
I've also connected various activities with Slack, which I use extensively at work and personally, to notify me of new comments, subscribers, and more. I'm sure some of this could have been done with WordPress, but Ghost makes it easy.
Real people - I love Ghost(pro) support - there is a real person at the other end, and they answer your questions very quickly. Yes, you can get this from a managed WordPress host, but their answers are usually "it's a bad plugin" or "you should hire a developer to fix that". With Ghost(pro), you're talking to the people who make the product - and they want you to be happy. It is a refreshing change!
Ghost(pro) - I like having my site on a managed service that is not complicated and doesn't require tons of plugins or extra cruft to get it to work right. And it is run by the people who make the product. And most importantly, I am sending my money to the company that makes the product, and they are investing what is left over from operational costs in the continued development of the product. That is cool!
I'm very interested in dynamic routes, but I am not 100% sure how I could benefit from them. I am hoping to explore that in the next few months when I have time.
I'd like to learn more about creating custom pages, using loops to display different content, and generally customizing the fork of Casper to make my version a bit more unique. I definitely do not want to stray too far from it's roots, as I think it is a very beautiful and fast theme, and I would like to be as current as possible.
I've been using Ghost(pro) for a few months now, and haven't missed WordPress at any point. Most importantly, I want to write more, publish more, and focus more on that part of my online journey, and Ghost is making that super easy!