Tech Talk DC has migrated to Ghost. There were several factors behind this decision. While WordPress is feature-rich and has great community provided plug-ins, it is also unnecessarily complex and is slow.

Bloat and Lock-in

By moving Tech Talk DC to Ghost, I'll be losing some functionality, such as live blogging, integration or various plug-ins that have been used in some of the blog posts to render them nicely. These plug-ins pile on over time, they create ugly dependencies, but most importantly every plug-in added slows everything else down by a little.

I'll be bringing Disqus back and fix display issues in specific posts over time. However, the fact that I must edit old posts highlights one of the reasons for moving, vendor lock-in. Ghost posts are pure markdown, so they're portable to any current or future blogging platform.


Hosting WordPress is expensive. I've been using Blue Host at a cost of $155 a year to host Tech Talk DC. Even though I pay for the high cost, because of the aforementioned bloat the blog runs very slowly. I can host Ghost on any server that can run Node.js and it is super fast. This is important because of all the mobile users out there.

I've chosen Digital Ocean as my hosting platform. For $60 a year I can run an Ubuntu server that can not only serve my Ghost blog, but also some of my other websites like The JavaScript Promise and not break a sweat.

How to Migrate

There are many migration strategies as there are stars in the sky. I'll document what worked for me.

  1. Install the Ghost plug-in to your WordPress site.
  2. Under Tools menu, select Export to Ghost
  3. Follow the instructions diligently :)
  4. Export images to Cloudinary
  5. Set-up Ghost on your local machine
  • Note: This requires familiarity with Node.js, if you're not a developer, you can purchase hosting from Ghost directly.
  1. Import content using sqlite3
  • Note: I've tried PostgreSql as well, but importing content never really worked with it. I went to great lengths to try different strategies like exporting SQL scripts out of sqlite and importing them into postgre. I even manually sliced and diced the import json file and tried the import that way manually fixing errors, but it never really fully worked against a postgre target.
  1. Push your code to GitHub or BitBucket
  2. Set up a Digital Ocean droplet
  • Note: Here I wanted to go fancy and leverage Docker. There's an official Ghost docker image. There's one based on Alpine linux with a tiny footprint. My initial idea was that I can isolate all my different sites as containers on my droplet. Initially I chose CoreOS as my OS, because it has a small footprint and pre-configured to host Docker containers. I failed. There were too many cryptic errors that was taking forever to overcome. Instead I went with an Ubuntu Node image. I intentionally didn't pick the Ubuntu Ghost image to avoid dealing with configuration I didn't understand. I ssh'ed into the server, used git to load my code, struggled with Ghost's config.js until I found the magical combination.
  1. Start up your Node app(s) using nodemon, do the port/DNS song and dance and hook things up with your domain name
  • Note: If you want to setup multiple domains and multiple sites, in addition to ensuring your Node.js applications starting back up along side your server, check out this blog.
  1. Configure Mailgun


Configuring Ghost on your own is not for the faint of heart. Expect a lot of banging of head to wall. But if you can overcome the issues, you'll end up with a simple, fast blogging, nay hosting platform of your own to host many Node.js apps in a $5 a month droplet.