Khalid / Migrate
Move your blog to Khalid. Keep your slugs and map every old address.
Khalid imports from WordPress, Ghost, Medium, Substack and folders of Markdown files. A dry run shows what would come in before anything is written. Pick the guide for your old platform.
Free and open source. Every command here was run with Khalid 1.3.2.
khalid --site blog import wordpress export.xml --dry-run
Pick your old platform.
Every command in these guides was run with Khalid 1.3.2 against the sample exports in Khalid's source code, and each guide shows what it printed.
Move from WordPress
The XML export file, plus the Redirection plugin's rules. Reads SEO titles and descriptions from Yoast, Rank Math, All in One SEO and SEOPress.
Move from Ghost
The export.json file from Ghost Admin. Members-only, scheduled and draft posts come in as drafts.
Move from Medium
The archive Medium sends you. Old medium.com addresses cannot redirect, so Khalid lists them for you.
Move from Substack
The posts.csv file and posts folder. Paid posts stay for signed-in members.
Every move has the same five steps.
Whatever the old platform, the guides follow this order.
Export from the old platform
Each guide shows where the export is. Khalid reads the file. It never logs in to your old blog.
Run a dry run
Add --dry-run. Khalid lists what would come in, what would stay behind and why, and writes nothing.
Import
Run the same command without --dry-run. Each post keeps its slug and its date.
Check the addresses
Every old address that moves gets a 301 redirect, and the full list goes into one file you can keep.
Check the blog
Run the linter, build and audit. Then add the sitemap in Google Search Console.
A folder of Markdown files.
Khalid also imports a folder of Markdown files with front matter on top, as Hugo, Jekyll, Astro and Eleventy keep a blog. It reads the title, date, slug, description and draft fields under the names those tools use.
Strapi. A Strapi blog can move this way too. Export each post as a Markdown file with its title, date and slug in the front matter, then run khalid import markdown on the folder. Khalid does not read Strapi's JSON files, so a folder of JSON alone imports nothing.
khalid --site blog import markdown strapi-export --old-site https://www.example.com --dry-run
This is a dry run: nothing was written.
Coming in: 1 post, 0 pages and 0 drafts.
Slugs kept: 1.
Old addresses mapped: 1, of which 1 move and 0 stay the same.
Left out: 0.
Files that could not come in: 0.
Files that could not be read: 0.
Questions about moving to Khalid.
Can't find the answer? Email us.
Which blogs can Khalid import?
WordPress, Ghost, Medium, Substack and folders of Markdown files, such as a Hugo, Jekyll, Astro or Eleventy blog. Each has its own guide, except Markdown, which is covered on this page.
Does the import change anything on my old blog?
No. Khalid reads the export file you give it. It never logs in to your old blog and never changes it.
What does a dry run do?
It says what would come in, what would stay behind and why, and how many old addresses it would map. It writes nothing. Run the same command without --dry-run to import.
Will my old links still work?
Each post keeps its slug, and every old address that moves gets a 301 redirect to the new one. Khalid answers the addresses inside the blog's folder. Old addresses outside it reach your main site first, so you add those to its redirect rules from the file the import writes. Medium and Substack addresses cannot redirect, because those platforms do not send readers on.
Can I move a Strapi blog to Khalid?
Yes, as a folder of Markdown files. Export each post as a Markdown file with its title, date and slug in the front matter, then run khalid import markdown on the folder. Khalid does not read Strapi's JSON files directly.
Bring the posts. Keep the addresses.
Move your blog to Khalid.
Free and open source. Start with the dry run: it writes nothing.