A few days ago I decided to start my blog using Ghost and their provided hosting. It was very easy to get started and set up - including my custom domain coderose.io and backed by Cloudflare. Here I want to share my way of configuring everything which may help you to get your own blog up and running. Please note that I did not create my own installation somewhere but used their provided hosting Ghost(Pro).

Why Ghost not WordPress?

I had tried WordPress before and... just did not like it. What I needed was an (almost) bare-bones platform to create posts and a few separate pages - like my about page - combined with simple sharing and comment integration. And if I wanted to I should be able to customize everything to my liking theme wise - which definitely is a lot more painful with WordPress than Ghost as it turns out. Of course, WordPress has gazillions of plugins, extensions, and what not to choose from and extend your site - but I just don't need it and thus got stuck with Ghost. The original pointer to use Ghost came from one of the talks[1] by Troy Hunt.

Last but not least - why use Ghost(Pro) which costs per month? I do like Ghost - it is a very nice piece of software and open source. And to pay back to the developers and having them deal with server administration, availability, backup, etc. is definitely worth the money (from my point of view).

Step 1: Get Ghost

The obvious first step is to get your own Ghost account. Head over to ghost.org and find that green Test it out button as shown below.

Getting started with Ghost

After entering your account details including mail, username, and password, you can choose your blog's name and will then immediately have your first Ghost blog ready to go. Before having to pay anything you will be able to try it out for free for 14 days prior to subscribing.

Ghost also has a nice user tour highlighting their functions which I'd definitely advise to follow - you will recognize those items easily as blue pulsating dots.

Step 2: Dress your Ghost

Maybe one of the most difficult decisions is deciding how to dress your Ghost, i.e. choosing the right theme. While the default Casper theme is really nice (as compared to the default WordPress ones), it was not the right fit for me. Leaning on to a more clean and lightweight design I finally found the theme I'm currently using: Eston by mikedidthis. In general Themeforest has a great collection of free and premium themes to choose from.

Ghost themes on Themeforest

The only problem I had was that the theme itself had not yet been updated to the latest Ghost version that is being hosted by ghost.org. I made the changes myself, customized a few things, and got it running. After that I contacted @mikedidthis who provides great support for his themes and sent him my patches.

Last, upload your custom logo and publication icon which will be used as a favicon for your site. That being done, you should be ready to configure your custom domain.

Step 3: Name your Ghost

There are plenty of providers out there where you can get your own custom domain. Since I was looking for a custom .io domain my German provider I typically use was out - they do not provide this TLD. My choice was to use Namecheap because friends of mine had good experiences with it in the past.


Make sure that the CNAME of your domain points to the URL of your Ghost blog - e.g. yourblog.ghost.io. There is a good description of what to set by Ghost directly.

Whatever you use - due to our setup of Cloudflare later, I would recommend not trying out whether your domain works right now. Your DNS cache will get populated with the resolved address and if (like me) you can't clear your local cache (my router doesn't let me) you need to wait maybe half an hour until the TTL expires.

Once you got the domain registered, head back to the admin panel of your blog located at https://my.ghost.org. Log in and click Owner on the right side of your blog entry which will open a dropdown. There choose Domain and you will be taken to a page where you can enter the full domain you created before (see the linked documentation).

Below the Custom Domain input is also the checkbox to force SSL everywhere - we will activate this later.

Step 4: Activate Flares

The final step I took was to get Cloudflare for my domain in order to have a great CDN deliver my content around the world as well as enable easy use of SSL everywhere without having to think about renewing my certificate and keeping track of everything. It also provides some analytics out of the box so at first there is no need for Google Analytics.

Registering your domain with Cloudflare is very easy - create an account on their website and they immediately ask for it to be added to your account. DNS settings are detected automatically - that's why you should wait a few minutes after having configured your DNS created in step 2. Thus Cloudflare picks up everything by itself and there is no need for manual changes. Also you can verify again whether all expected DNS settings are present since Cloudflare shows a handy overview.

Once your site is added an SSL certificate is also generated automatically. In the SSL section of the crypto settings it tells you when the certificate is ready to be used. For me it took around one hour to be completed.

Cloudflare SSL Settings

As soon as it's active I recommend setting Always use HTTPS in Cloudflare (just scroll down on the page) as seen below. Furthermore activate the aforementioned option in your Ghost admin panel to use SSL everywhere.

Cloudflare enforce SSL everywhere


That's it! Your blog should now be fully up and running with complete SSL, protected behind Cloudflare caching your traffic around the world and providing a fast user experience. In total I would say it took me around five to six hours of work until everything was completed - despite doing everything for the first time (no Ghost, no Namecheap, no Cloudflare before).

Let me know if this helped you out or how your experience of getting started with Ghost has been!

  1. Hack your Career - definitely watch this great talk by Troy Hunt ↩︎