I have recently migrated my (this) blog out of Medium because of several reasons. While I have covered each of these reasons, with details, in a different blog post, this post is about one of the technical problems with the migration itself.
The new platform where I have migrated my blog is Hugo. Hugo is a static site generator written in Go and is amazingly fast. It also supports markdown content files similar to many other static site generators.
The first thing that came to my mind before migrating my blog from Medium to Hugo was the export and import of content (posts). Medium supports export of content in HTML only (sigh). When you export your content from Medium, you get HTML files for everything — posts (stories), people and tags you are following, highlights, etc. etc.
See the image above, that’s what I got when I exported my Medium content through the settings page. Each of those directories has HTML files in it. I was really surprised that in this world of web2 (almost web3) when the primary ways of data exchange are JSON, YAML, XML, etc., why on Earth is Medium exporting content in HTML. Anyway, drama aside, my issue was that the exported data was in HTML and the import was needed in markdown.
So, I built a tool to convert exported HTML Medium posts/stories into Jekyll/Hugo compatible markdown.
medium-2-md (yeah, that’s what I’m calling it) is a simple CLI tool which takes a directory containing Medium posts’ HTML files (or a single post URL) and converts them into markdown. Not only that, but it also adds a rich front matter to these converted markdown files so that they can be directly used in Jekyll or Hugo.
The CLI tool is written with node.js. It expects the input HTML files to have the same tags and attributes as the files contained in the posts directory shown in the picture above. That way it is able to extract all the information needed for the front matter.
It has not been tested for general purpose HTML to markdown conversion; it is only suitable for HTML files exported from Medium stories/posts.
medium-2-md is available as an npm package so that it can be easily downloaded and used without the need of going through the code. All you need to do is download and install it (globally) and then use it directly from the command line. Follow the steps listed below to use medium-2-md.
Step 1: Export and extract your Medium posts from your Medium account.
- Go to https://medium.com/me/settings and scroll to
Download your information. Click the download button. This will give you a
medium-export.ziparchive containing all your Medium content.
- Extract the .zip archive downloaded in the previous step. It will have a sub-directory called
- Copy the path of this
Step 2: Install node.js and medium-2-md on your system.
- Download and Install node.js -
- Install medium-2-md package -
npm i -g medium-2-md.
-g flag means that you are installing the package globally. It is essential in order to use the package directly from the command prompt/terminal.
Step 3: Run the following command to convert all your Medium posts (HTML) to markdown files.
medium-2-md convertLocal '<path of the posts directory>' -df
That’s it. The output markdown files will be stored in a sub-directory called
Convert from post URL
The CLI tool can also be used to convert a single Medium post from it’s url. It requires an additional parameter
-o for output directory where the converted markdown file can be written. To convert a Medium post to markdown from it’s url, run the following command after installing the npm package,
medium-2-md convertUrl '<url of the Medium post>' -o '<path of output directory>' -f
The converted markdown files will also have front matter which will have the title, description, published date and canonical URL of the original Medium post/story.
More details about the package are available in the readme file at the medium-2-md GitHub repository.
This tool helped save a lot of time when I was converting all my stories/posts to markdown. I tested the converted markdown in a test Hugo site and it worked like a charm. All previous posts in this blog were converted to markdown using medium-2-md.
A couple of things that we need to take care manually are code fences and tags. There is no tag related information in the exported Medium files. The code fences are also exported as plain text and the markdown conversion ignores them too.
Give it a try and feel free to provide your feedback using the issue tracker on the GitHub repository - https://github.com/gautamdhameja/medium-2-md.