Blog Note: Part 6 - Blog migration underway (cont.)

This post combines the summary I provided to blog member activity in part 3 of this series with the notes I took last year while working through the initial steps of my Typepad to Ghost migration. As mentioned in part 5 of this series, my suspicions last year that Typepad would likely be sunsetted in the not too distant future proved to be accurate, albeit on a sooner than expected date of September 30, 2025.

In summary, the initial steps I performed can be outlined as follows. I needed to piece together these steps through research combined with trial and error, since I wasn't able to find comprehensive instructions anywhere. Some guides can be found out there, but most of these are outdated, cover only a subset of the work involved, or don't provide enough detail for some of the steps.

While I typically prefer programmatic solutions as a software engineer, I largely used user interfaces when performing these steps for this one-off migration that I don't plan to ever repeat. Ghost is open source and available to self host, but I chose to go with the hosted option. I may self host in the future, due to the increased flexibility this provides, as long as costs are manageable.

(1) Exported my blog from Typepad, which results in a text file.
(2) Created a Wordpress account with the "Creator" plan option, the minimum plan level needed to install plugins.
(3) Installed the "Movable Type and TypePad Importer" plugin via the Wordpress user interface.
(4) Imported the text file generated in step #1 to Wordpress using the plugin installed in step #3.
(4a) Unsuccessfully attempted tag migration with the "Taxonomy Converter".
(4b) Unsuccessfully attempted tag migration with the "Categories to Tags Converter Importer".
(5) Installed the official "Ghost" plugin via the Wordpress user interface.
(6) Exported my blog from Wordpress using the plugin installed in step #5.
(7) Imported the text file generated in step #6 via the "Universal Import" option in the Ghost user interface.
(7a) Assessed migrated posts in Ghost by comparing with posts in Typepad.
(7b) Modified unsatisfactorily migrated blog posts.
(8) Submitted a Typepad help desk ticket to get all of my images


(1) Exported my blog from Typepad, which results in a text file.

The default text file name for exported data is "Unnamed_Comet_Asset.txt", and is in Movable Type Import File (MTIF) file format, the only option when exporting a Typepad blog.


(2) Created a Wordpress account with the "Creator" plan option, the minimum plan level needed to install plugins.

Installed the "Movable Type and TypePad Importer" plugin via the Wordpress user interface. Prior to installation of all plugins, I upgraded to the Creator plan, the minimum plan level needed to install plugins. To avoid cost, I subsequently downgraded back to the Free plan before the trial period ended.


(3) Installed the "Movable Type and TypePad Importer" plugin via the Wordpress user interface.

(4) Imported the text file generated in step #1 to Wordpress using the plugin installed in step #3.

Imported data via the Wordpress user interface, by using the "Movable Type and TypePad Importer" option to "Run Importer", selecting the exported data file, and confirming blog post author. This import option is apparently listed by default before the aforementioned plugin is even installed, so initial Wordpress import attempts failed with file format errors. I discovered the plugin requirement while waiting for Wordpress support to respond to my successive assistance requests, and their unresponsiveness gave me one more reason to not host using Wordpress.


(4a) Unsuccessfully attempted tag migration with the "Taxonomy Converter".

Installed and ran the Ghost-recommended "Taxonomy Converter" plugin via the Wordpress user interface. Ghost doesn't have the concept of categories, just tags, so initial Ghost import attempts resulted in no blog post tags.

Note that the language used by the Wordpress ecosystem can be counter intuitive. A prime example being that the "Taxonomy Converter" plugin falls under import functionality, and "Run Importer" needs to be clicked to run it after the "Movable Type and TypePad Importer" has already been run. As such, the term "import" as used by Wordpress is a misnomer, bundling together all actions that process data exported from other products. From a data engineering perspective, these actions include extract as well as any transformations that need to be performed on the extracted data.

While the output of this plugin seemingly indicated success, however, the tags that were created and later imported to Ghost didn't actually attach to blog posts. As such, I don't think it's worth the hassle using this plugin unless a high number of categories needs to be converted, and in my case 19 categories can very quickly be manually created in Ghost.


(4b) Unsuccessfully attempted tag migration with the "Categories to Tags Converter Importer".

Installed and ran the Wordpress-recommended "Categories to Tags Converter Importer" plugin via the Wordpress user interface, to make another attempt at performing the prior step using a different plugin.

As shown by the earlier "Import" screenshot, this plugin instead gets listed as "Categories and Tags Converter". My initial searches for this plugin were unsuccessful because searches via the Wordpress user interface require exact patterns.

The below screenshot shows that this plugin is incorrectly referenced again when actually running it, in this case "Categories, Tags and Formats Converter". You should be aware of this when reviewing documentation, because this plugin can be referenced by any of these three names.

Unlike the "Taxonomy Converter" plugin, however, the "Categories to Tags Converter Importer" plugin didn't seem to do anything after several failed attempts, because tags didn't make it to Ghost.

I also came across yet another similarly sounding plugin called "Categories to Tags Converter", in the below screenshot. Because this plugin displays the same version number and "tested up to value", it appears to be the same as the "Categories to Tags Converter Importer" and so I didn't try it out.

Again, the language being used isn't consistent. Every plugin should have a unique name, and all Wordpress user interfaces and documentation should reference a given plugin with the same exact verbiage.

While I'm a longtime open source advocate, this set of plugins is another reminder that not all open source meets the same high standards.


(5) Installed the official "Ghost" plugin via the Wordpress user interface.

(6) Exported my blog from Wordpress using the plugin installed in step #5.

Installed and ran the official "Ghost" plugin via the Wordpress user interface.

The below screenshot shows that this plugin provides the option to export blog posts in Ghost compatible format as either a ZIP or JSON file with the file name "wp_ghost_export". This screen is accessible via the menu entry labeled "Export to Ghost" which is added following installation of this plugin, despite the fact that a separate "Export" entry separately exists further up the menu. As with import functionality, all export functionality should also arguably be centralized.

Now, I know some might discover a Ghost post entitled "Migrating from WordPress" that purportedly explains all of the steps that I'm outlining here, but unfortunately, it contains misinformation.


(7) Imported the text file generated in step #6 via the "Universal Import" option in the Ghost user interface.

Ran "Universal Import" via the Ghost user interface, which can be found under "Import/Export" in the settings menu.

Ghost user interface labeling can be just as challenging to follow as Wordpress. In this case, "Import/Export" actually points to "Migration Tools". Interestingly, the Ghost documentation at the aforementioned location indicates that this functionality exists under the "Labs" menu item further below, but this is incorrect.

After running "Universal Import", an import confirmation email gets sent to the email address you registered for your Ghost account, and blog posts subsequently become available via the Ghost user interface. Note that the domain name referenced in the below screenshot was assigned by Ghost, and I plan to reconfigure after-the-fact with two of the twelve domains I currently own, erikgfesser.com and erikonsoftware.com,

As seen in the below screenshot, a "#wordpress" tag will be automatically applied to all imported blog posts (the most recently published blog post shown here doesn't have this tag because it was created in Ghost, not Wordpress / Typepad).


(7a) Assessed migrated posts in Ghost by comparing with posts in Typepad.

Most blog posts were satisfactorily migrated, but it took me some time to get comfortable with the look-and-feel of posts. As shown in the below screenshot, I've been using the "Three Column" layout offered out-of-the-box by Typepad.

A plethora of themes are available for Ghost, and I chose to implement the free theme closest to the "Three Column" layout offered out-of-the-box by Typepad, called "Journal".

The below screenshots demonstrate the similarity between "Three Column" and "Journal", with the following key differences (apart from "Journal" being a cleaner, modern look-and-feel).

    • When visiting the landing page in Ghost, only the first few lines of a given blog post is displayed, and no images. I had Typepad configured to display the full content of my most recent 20 posts, which obviously forces more content to load, but also displays content that visitors might not otherwise go out of their way to see.
    • When visiting an individual blog post in Ghost, only the central column of the original Typepad post is displayed: no "Categories", no "Recent Comments", and no "Archives". "Categories" in Typepad are called "Topics" in Ghost, based on tags (more language usage inconsistency). Note that the number of "Issues" (blog posts) shown for each "Topic" in the below Ghost screenshot is limited to the most recent 10% of posts dating back to mid-2022, so this metric knowingly doesn't match the output of the "Categories to Tags Converter Importer" shown earlier in this post.

All of this said, keep in mind that because the "Journal" theme is open source, I could download the code from Github and make modifications to more closely match the look-and-feel of the original "Three Column" layout as some others have done, but my initial goal is to sunset Typepad as quickly as possible.


(7b) Modified unsatisfactorily migrated blog posts.

As mentioned in my earlier blog post, my goal is to prioritize cleaning up any formatting issues of the most recent 10% of posts dating back to mid-2022, addressing the remainder as a subsequent step following migration.

However, I came to realize following the initial migration that some issues go beyond formatting, and my goal is to address all of these before sunsetting Typepad, regardless of whether these pertain to the most recent 10% of posts.

The following are some key issues / challenges:

    • Typepad posts are in HTML format, in contrast with Ghost posts which make use of Lexical format (formerly Mobiledoc); from the perspective of corresponding post URLs, this is a matter of a trailing ".html" extension versus a trailing "/"
    • Typepad post URLs are prefixed with "/{yyyy}/{mm}/" whereas Ghost post URLs don't contain prefixes, although migrated post URLs appear to remain intact apart from this prefix and the aforementioned trailer
    • Typepad posts are created using rich text or HTML, in contrast with Ghost posts which are created using editor cards; when initially creating an HTML card, rich text can be used, but any subsequent editing requires HTML
    • Any images contained in Ghost posts migrated from Typepad continue to point to the original Typepad locations, so Typepad posts cannot be sunsetted until the images are separately migrated; one way to handle this situation is to host images separately from blog posts, but doing so arguably leads to multiple platform dependencies; when a given image is collocated in Ghost, however, an image card needs to be created separately from the corresponding HTML, unlike Typepad which uses HTML throughout
    • A small subset of Typepad posts migrated to Ghost display very poorly in the Ghost editor, making subsequent editing tedious, although the formatting of published posts remains largely intact

(8) Submitted a Typepad help desk ticket to get all of my images

Refer to part 5 of this series.


As I worked through this migration, I must say that I haven't been 100% sold on Ghost, despite Jack Dorsey's endorsement: "For those of you on Substack: why not use Ghost instead? Is the payment you get from Substack greater than the freedom Ghost would provide?"

Gatsby seems like a viable alternative, per some relatable reviews here and here, but Gatsby Cloud free plans are being discontinued, and paid plans are just too expensive.

Subscribe to Erik on Software

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
jamie@example.com
Subscribe