In the startup world it’s a (very true) cliché that people wear many hats. The nice thing about growth in that world is that as people join you get to distribute those hats. We figured other companies might be going down a similar road and that sharing our journey would be useful.
A few years ago when the Daily team needed a way to create and maintain www.daily.co, Webflow was the obvious choice. It had rich, immediate tools to design and publish. Additionally it had a CMS to manage the more data-driven side of things. That’s why the Daily blog was built using Webflow CMS – it was there and it worked really well for us.
Earlier in 2019, Daily shifted to be an API-first product. We hired more people who were specifically focused on technical content (more hats!). With that came more complex blog posts, which include more sample code. We struggled to manage multiple posts in various states of completion and our bespoke syntax highlighting was starting to show its age.
We needed a blogging platform that wouldn’t create friction for us at the last possible stage (publishing).
Options, so many options…
Choosing a publishing platform in 2020 can be a bit daunting. Do you go with something tried and true such as Wordpress? Or perhaps jump on the headless bandwagon driven by something like Contentful? Maybe something a bit more focused like Ghost?
Once you’ve made that decision you have to figure out how to host and deploy it.
Consider the following questions:
- Do you self-host?
- Maybe a managed service?
- How will you handle custom development?
- What about CI/CD?
All of these things were considerations in our selection process. Ultimately, we chose to strike a balance between flexibility and opinionatedness (that’s a word, right?).
So what was the decision? (in case you didn't read the headline)
Ghost! At our current stage it ticked most, if not all, of the boxes:
- A platform built from the ground up for blogging/publishing
- SEO first
- Open Source
- Easily customizable
- Managed hosting, but also easy to self-host
- Monolithic today, headless when we need it (via REST API)
- Excellent suite of integrations
- Good local dev experience (Ghost CLI)
- Great editor and easy to use admin panel
In short, it was the right balance of out-of-box features and customization which accelerate out work as a team.
A few notes on the other options we considered
Wordpress has made strides to modernize with Gutenberg and their REST API, but it still felt a little too monolithic. Going fully headless meant rolling our own data model and creating a custom frontend. That felt a little too far in the opposite direction. Ghost sat right in the goldilocks zone of just opinionated enough but with the flexibility and simplicity to paint outside the lines when we decided we needed to.
Migration and Implementation
The migration of the blog posts from Webflow CMS to Ghost was relatively straightforward, at least from an outside perspective. The issues we faced were specific to our Webflow CMS implementation. Since we stored content as a mix of HTML and markdown, it first had to be transformed entirely into either one (we chose HTML). After that it was just a matter of putting the data in the format that Ghost needed for import.
Once we had a reliable set of data to work with, the next order of business was some theme development. Ghost makes local development extremely easy using
ghost install local from the Ghost CLI. Since we didn’t need a full copy of Ghost (including the server code, we’re using Ghost Pro, so this is taken care of), we just needed to create a repo with our theme. To make the theme repo play nice with the local development version of Ghost, you just need to make sure you create a symlink from the theme folder repo into
To deploy our theme to our account on Ghost Pro, we use Ghost’s own Deploy Theme Github Action. In addition to the deployment itself, the Action is also responsible for building the theme assets and validating the theme (using gscan).
Our hybrid approach
Due to the fact that we needed Ghost (daily.co/blog) and Webflow (www.daily.co) to coexist, we added some special configuration to support this. As the rest of our infrastructure is hosted on AWS it made sense to use Cloudfront. In particular, we have two origins in our CloudFront distribution, with path-based routing to direct the traffic for each request to the correct origin. For this to work with Ghost, you need to use their subdirectory option. In Webflow you need to set up a custom subdomain and a corresponding CNAME record that points to it. You can read more here.
So what’s next?
On the theme side of things we’ve already made a few enhancements. We recently released an updated blog homepage. It includes custom sections that highlight Featured and Must Read articles as well as showing Tags and Categories.
We also added a simple search feature based on a fork of the ghost-finder plugin. The initial reason for the fork was to add mark.js support. Eventually we hope to add the ability to search more than titles, and remove the moment.js dependency since it is nearing end-of-life.
If you’re considering a migration of publishing platforms (or even starting fresh!) and have a similar set of needs, we highly recommend that you consider Ghost. It strikes an excellent balance between out of the box features and flexibility. Finally, we still have lots of love for Webflow! It powers the rest of our marketing site and remains an excellent choice depending on your needs.