On Migrating WordPress Content to Ghost

Moving content from one platform to another isn’t easy. And it shouldn’t be that way.

The problem: I want to migrate a few dozens of posts from my Numeric Citizen Blog to my other website, Numeric Citizen Introspection, hosted on Ghost. Easy, right? Think again. The Ghost migrator plugin doesn’t support posts selection; it’s an all or nothing tool. How can I migrate a subset of my posts in that context? By assigning a specific category to each post, I can use the WordPress export tool to export these posts. Next, those posts can then be imported into an empty WordPress instance. From there, I could use the Ghost Migrator plugin. The issue is that I don’t have an empty WordPress instance sitting idle. Using WordPress.com, I cannot install the plugin in a free instance (it’s part of a Business plan, which I subscribe to for my main blog). The solution, was to use my Synology NAS to install an empty WordPress instance locally and proceed from there. Let’s see what the workflow looks like.

1. Turn off post update in the WP to Buffer Pro plugin to prevent flooding your Buffer queue
2. On the source WordPress instance, update posts category that you want to export
3. Install the “Export media with selected content” plugin (which is needed to export images as well as text content)
4. Export content to an XML file with the plugin
5. Install WordPress on Synology NAS with all required dependancies
6. Configure a WordPress website that will be used to host exported content in transit to Ghost
7. Install “Export media with selected content” in Synology WordPress instance (not really required)
8. Install the Ghost Migrator plugin
9. Delete the default post and unneeded page from the WordPress instance, as well as any images from the media library.
10. For each post to export, add the export category of your choice (in my case it was “PhotoLegend”.)
11. Export posts using these options from the WordPress Tools menu

WordPress export with selected content plugin in action.

12. Switch to the WordPress instance running on the Synology NAS
13. Select Import from the Tools menu
14. Select the XML file created from the Export step earlier
15. Set the author for the imported posts

WordPress import plugin in action.

16. Set the Download and import file attachments to bring in images
17. Click Submit and wait for the process to complete (it takes some time, depending on the number of posts and images to import)
18. Verify if all posts are listed in the Posts section (check creation date, author, etc.)
19. Check for Media Library to verify if images are imported
20. Open a few posts to see if content is correctly formatted
21. Edit posts with back links or other elements that need to be updated before importing content into Ghost
22. Edit tags according to the destination website requirements
23. Edit post slug and post title according to destination website requirements
24. Export using Ghost Migrator plugin, select the JSON format since ZipArchive module isn’t installed with this version of WordPress and PHP

Ghost Migrator plugin is pretty limited in functionality.

25. Import JSON file created in the previous step
26. Check for imported posts issues. This is where I hit the wall. Missing photos, content imported as HTML blocs, etc. Not great at all.

Images are missing in imported post.

Posts from WordPress are imported in HTML block in Ghost which is not good.

27. Turn back on the WP to Buffer Pro Post Update option

This workflow doesn’t meet the goal of migrating WordPress content to Ghost. I ended up deleting the posts on the source WordPress instance and kept a copy of them on my Synology instead. I don’t know what I’ll do eventually with these “archived” posts.

Observations

Some observations are in order. This whole story brought many observations that I think you should consider if you’re attempting something similar.

  • The Ghost Migrator plugin is very limited, which make it hard to build an optimal migration workflow.
  • Images migration is close to impossible or very unreliable, forcing to use a manual export and import process.
  • Image optimization plugins on WordPress could make the migration harder than necessary.
  • Website optimization plugins on WordPress could add tags that are probably hindering the migration process.
  • Ghost import feature is still a work in progress can there is no way to select which post to import after reading the JSON file.
  • Testing the migration with a single post would most likely help identify issues faster, instead of importing all the content on the first try.
  • It doesn’t help to convert the WordPress post to use the block editor before exporting the content.
  • Migration efforts are time-consuming, making sure the content still has value to your reader is a good idea. I ended up deleting my 23 posts after spending hours of migration efforts. The positive side of this story is that I learned quite a lot.
  • Even if I couldn’t use the ZIP file for the Ghost Migrator plugin, I don’t think it would have made a difference in the migration quality. I tried to add ZIP Archive to the PHP installation, but the WordPress installation within my Synology NAS is hard to customize. After spending a few hours trying, I dropped the ball.
  • Data portability is really an issue these days. Even with export or import plugins exist, there are other problems that are inherent to each platform or CMS.

One thing that I gained from this experience is that by using WordPress on my Synology NAS, I can export content from my online WordPress to my Synology NAS for archiving purposes. That’s cool. Other than that, the problem of data mobility across content platform is real.

My Blogger Workflow as of 2021-12

My previous blogger workflow update was in March 2021. Quite many things have happened since then. It’s time for another update. Buckle up because this is a big one, and enjoy the ride!

My blogger workflow as of 2021-12.

What’s in

For 2021, I was expecting a year without many changes to my blogger workflow, and yet, I was in for quite a few surprises.

  • Probably some of the most important additions this year are Toggl, Timery, and Focused Work to track my time while creating content (consider bookmarking and reading “Why and How I’m Tracking Time With Toggl” if you want to know all the details.) Tracking my time does take some time, but I like the results.
  • Hello Ghost (again)! I started experimenting with Ghost during the 14-day trial period, during which all features were available for testing. I started building automation with the Zapier integration. After the trial period ended, the integration with Zapier stopped working for some reason. I quickly found out that many features like custom themes, custom integrations, and commenting support are only available with certain subscription tiers. Commenting on each blog post isn’t available by default unless I’m on the Creator tier and customize one of the provided themes. To use Commento, I needed an API key, as well as a custom theme and a custom integration. And moreover, a custom version of Casper with some script invocation was added to enable Commento integration. Forking such a built-in theme requires staying in sync with the official theme, as Ghost updates them from time to time to benefit from all Ghost’s additions. Finally, I visited Google Search Console to add my Ghost website for better SEO management and optimizations. I became a subscriber at the entry-level tier for $9 per month, but I quickly realized that the $25 was the one I needed (consider bookmarking and reading “Moving From Substack to Ghost–My Experience” for more details.)
  • iPadOS 15 introduced support for Safari extensions. Working on the iPad now feels less and less a compromise, as Grammarly support and many other extensions are now available. For people depending on the iPad, it is a much-welcomed addition. Unexpectedly, in 2021, my workflow shifted towards the MacBook Air (read “Coming Out of a Rabbit Hole and Buying Two MacBook Air”).
  • Pocket made a comeback in addition to Readwise (consider bookmarking and read “Instapaper vs Pocket — Which Read Later Service Is Better for Me”). Pocket is well-known and doesn’t need much introduction. According to Readwise website: “Readwise makes it easy to revisit and learn from your ebook & article highlights.” Resurfacing previously highlighted text snippets is fun and helps build a lasting memory of past readings. I added Readwise as a source to my weekly newsletter built using Mailbrew.
  • Using the Readwise sharing feature to repost quotes on Twitter is handy. I don’t use it too often, though.

Sharing a Readwise highlight.

  • WordPress plugin: I’m using the paid version of “WB to Buffer” for reposting previously published posts to Buffer. With another WordPress plugin named “Feedzy” it imports RSS feeds from Substack and Microblog and creates “Also on my …” type of blog posts automatically. It didn’t generate much traction and added too much noise to my original content feed. This was disabled after a few months when I moved out of Substack.
  • I unexpectedly started using Matter when Matter officially became public. Matter seems to have gained some traction over Pocket as the best read-later service. Compared to Pocket, it creates great link posts that can be saved or shared online, just like Readwise and Pocket.
  • I became a subscriber of Typefully (typefully.com), a web application for writing threads on Twitter. Some features of Typefully are similar to Buffer’s, like being able to schedule tweets. I use it to write threads to complement some of my articles. The latest example of things to watch in 2022. Finally, Typefully brings great engagement analytics.

Typefully analytics.

What’s out

  • My experience with HEY World didn’t last long. I’ve been moving out of HEY World to go to Substack for my Friday Notes* and Photo Legend* Series (consider bookmarking and reading “Migrating My Content From Hey World to Substack”). I can say the same thing about my Substack experience. These services, while attractive, didn’t stick in my workflow.
  • HEY is no longer on the workflow diagram. HEY doesn’t really contribute to my blogger workflow. Most of my readings don’t happen there anyway, even if HEY provides newsletters dedicated feed, one of the tent pole features of the mail client.
  • As mentioned earlier, Substack is out. The popularity of a platform doesn’t guarantee the popularity of your content.
  • I closed my Telegram account. Read more here to learn why. I’m contemplating Signals instead.
  • WordPress Plugin: Coblock was disabled to remove overhead in webpage processing. It didn’t make a difference, though.

In progress

  • I do spend more time maintaining my digital garden in Craft all year long. You can find a lot of stuff in there.
  • I’m still trying to figure out how to use Apple’s Quick Notes feature in iPadOS 15 and macOS Monterey. I may end up having no use for this after all, which is too bad because, on paper, the idea is cool.
  • I’m always thinking about using Apple’s Reminders in my workflow. Reminders have improved quite a lot over the years, but occasionally, I think Craft could take over if table support was better (sorting, tagging, etc.). The more things I’ll do with Craft, the more synergy it creates. I’ll watch Craft’s evolution in 2022, and maybe make a move.

Things to improve

  • Adding text clipping in Craft would be so helpful. There are shortcuts that work with Craft that do just that, but I don’t find the experience very satisfying.
  • Speaking of Apple’s Shortcuts, I do find more use cases for them to speed up a few key tasks, like setting up my work session after logging into my account on macOS.
  • Templates in Craft to kickstart the creation of a new article would be very handy. It is expected in 2022, in an upcoming update in 2022 or via an extension.
  • As much as I would like to see the addition of tags in Craft, implementing this feature could be tricky. Where should we be able to tag things? In a page’s properties, inline in the page’s content?
  • I have to work on my reading workflow and decide what I’m going to do with Pocket, Readwise and Matter. Pocket will probably go as it is entirely covered with Matter.

Miscellaneous

  • My usage of ** Craft ** has significantly increased this year. It is becoming my second brain (Fun fact: find out the name of my MacBook Air). Lately, I decided to use the Craft calendaring feature to prepare a weekly plan containing my content creation objectives. As the week progresses, I keep it up-to-date and check items off the list. It’s a satisfying experience, trust me.
  • I’m still using Notion to keep my old data and connect Matter to Notion to save my reading highlights automatically. As soon as a Craft extension allows me to pump my data out of Notion, I might be done with Notion once and for all. Notion is not shown on my workflow diagram but will be in an upcoming post covering my reading workflow.
  • Twitter Revue: I had a Revue account before Twitter bought them. Now that it is integrated into their platform, I experimented with it (read a sample issue here). I love Twitter Revue, but I have yet to find a unique and useful use case for it. I currently have five subscribers.
  • Furthermore, I should consider closing my Flipboard account. I never go there; it’s not what it used to be, and I don’t get any traffic from this platform.
  • Google News, where I cross-post my main blog content, could also go down the drain. I don’t get any traction there.
  • Finally, Tumblr is another place where I cross-post content. Tumblr has become a ghost town in recent years, and it doesn’t help at all. Even if cross-posting is done automatically using WordPress’ built-in feature, I should consider stopping using this platform.
  • In my previous workflow update, I considered moving my Photo Legend Series to Hey, which I did for a short while. Now, it is hosted on Ghost, along with my Friday Notes Series and monthly newsletter. I like consolidating stuff sporadically.
  • Since getting a MacBook Air, my iPad Pro usage significantly dropped. The Mac is the power user tool. I cannot be as productive on an iPad.
  • I worked a lot on my WordPress blog to improve its score on Google’s PageSpeed Insights, as documented here. Did it make a difference? According to my blog visitor statistics, the answer is no. Here is a strange thing: if I run PageSpeed tests twice in a row, the final score is quite different. Usually, the second try gives much better results. How much trust should I put in these results? Another observation: my score for this blog, a static website, is the worst. Is Blot hosted on a low-end performance tier in the cloud?
  • I’ve been using Commento with Blot to add comments support on this blog. I never got a single comment! It’s a high price to pay for a service that nobody takes advantage of. Maybe it will be a better fit with my newsletter website on Ghost? Time will tell.
  • IFTTT still plays an important role in my publishing workflow as it works with Buffer to help me control the cross-posting flow. Each day, I spend some time managing the Buffer queue to spread out posts to be published. I also use IFTTT to cross-post anything I post on Reddit to my Twitter channel on Buffer. Buffer has a new calendar view that helps you see a timeline overview of all future publishing. Buffer isn’t cheap, but I like what it does for me. Cross-posting content does help create traffic and improves engagement.

Well, that was a long one. I want to walk you through my reading workflow for an upcoming article. I read a lot of stuff online, and many applications and services are involved here. Reading is the source of my inspiration for most of my work as a content creator. I think there are some interesting things to write about. Stay tuned, and see you in 2022.

Using the iPad for Editing Blot Posts With a Git Client

Editing new content from the iPad for this blog poses some challenges.

I started writing this post using my iPad, Working Copy and Textastic1. The file was initially created within Working Copy’s sandbox, but I fetched content from the Blot Git repo to store the most recent changes locally on my iPad.

As with every app on the iPad, Working Copy runs within its sandbox. When cloning the Blot repo locally, files were placed in the application’s sandbox, which is inaccessible outside the iPad2. Ulysses uses external folders, so I can point it to my iCloud Drive, where I stored the cloned repo with Nova. Only Textastic can edit files with Working Copy’s sandbox.

Writing with Textastic and publishing with Working Copy feels geeky compared to a workflow based solely on Ulysses. It is geeky because I have to think about what I’m doing in regard to my local repo being up to date with the remote one. I must remember that after pushing this article on Blot, I’ll have to do a fetch when I go back to editing on the Mac. I’m not certain that I like this dance. Textastic is good, but not as a writing application like Ulysses. The former is more directed to developers, while the latter is for writers.

Textastic on the left, Working Copy on the right.

Make no mistake, this isn’t a review of Working Copy. Read this excellent review from MacStories instead. MacStories likes it because it enables better group collaboration. It sounds overkill for me since I’m alone editing my website. Working Copy can work in conjunction with Textastic. After re-reading their review of Working Copy3, I found out that, in fact, I could have replicated a similar setup to the one on my Mac: using Working Copy to edit the local repo of this blog sitting on iCloud Drive (instead of Working Copy’s sandbox)4. In that case, I would use Ulysses to edit files as usual, and Working Copy, you see them as uncommitted changes.

If I don’t redo my setup on the iPad5, compared to using Nova on the Mac, I find this to be much less intuitive. Maybe I should focus on using Ulysses everywhere for my writing needs and use the Mac to push content on my Blot blog. It’s not a big deal, and Numeric Citizen I/O is not a place where I’ll publish as often as on, say, Micro.blog. Having to sit in front of the Mac for the final posting isn’t a big deal.

One last thing: Working Copy wouldn’t be needed if my Git usage was limited to GitHub. Blot, on which Numeric Citizen I/O is hosted, uses its Git server, which requires me to use a Git client capable of connecting to it. I didn’t find a way to do this with the official GitHub client.

I’m still undecided about what to do to enable my iPad to edit this blog. My mobile needs are quite low as the pandemic continues, limiting our travel possibilities.


  1. This post wasn’t published from the iPad, after all. When I was ready to publish, I found out that the git push feature of Working Copy was only available to paying users. I chose to copy & paste content from Textastic to Ulysses and publish, as usual, using Nova on the Mac. ↩︎

  2. They are made available to other apps on the iPad, though. Files.app get’s a storage provider when Working Copy is installed. That’s how Textastic can edit Working Copy files. ↩︎

  3. Version 3.6 at the time. The current release is 4.5.9. ↩︎

  4. I tried using the “Setup synced directory” feature by pointing the Git-managed directory sitting on my iCloud Drive. Working Copy gave me a big warning of an unsupported configuration. I’m not sure what to think of this. There is the “Add folder” option, but it is only available to pro users. ↩︎

  5. I need the pro version to do this. ↩︎

Documenting Blog Changes

Using Git instead of Dropbox for Blot content syncing provides an unexpected benefit.

As I recently wrote, Blot supports two mechanisms for synchronizing content from my Mac to the web: Dropbox or Git. I chose Git. As I write this, I’m still testing Nova as the Git front-end (I’m a GUI type of guy). One of the great benefits of using Git is the built-in history of commits that is at the core of any Git repo. As shown below, as I push updates to my Blot-based website, I make sure to write a short comment in the commit action to document the commit action. I think this is an important asset in managing a blog and owning its content.

Commit history to the blog report using Nova

A better view at the GIT panel in Nova:

Nova GIT panel with commit message area

Archiving my Content from Micro.blog to GitHub

Micro.blog allows for archiving all content to GitHub. Here is why I did it.

This blog post is about explaining a Micro.blog allowing me to archive all my blog posts, including images and why I do it.

First, you must know that Micro.blog already provides an archiving feature of all blog posts to the Internet web archive. You can find mine here. I think it is important because in our society, the durability of the numerical artifacts we create is far from guaranteed. Saving my blog posts outside of Micro.blog is one way to prevent my content from vanishing if something really bad happens to Micro.blog.

Micro.blog feature to archive my blog posts to a GitHub repo

I wanted to go further, though. This is where Github comes in. First, I needed to create a new repo: numericcitizien-archives. Next, by using the built-in feature of Micro.blog to archive blog posts to the newly created GitHub repo. Enabling it is super simple from the design page settings. Once done and after waiting for about a week, I could see my content from my GitHub account. You can find it here: https://github.com/jfmartin67/numericcitizen-archives.

Now that my Github repo has a copy of my blog content hosted on Micro.blog, I can use a Git client like Nova on the Mac to clone this repo to my local machine. The archive feature of Micro.blog creates a big index file in HTML format that I can then open in Safari. It’s really nice.