Moving a blog off WordPress is less work than the size of WordPress suggests. A personal blog is posts, pages, pictures and a set of addresses. WordPress will hand you the first three in one file, and the fourth is a list you can write down.

The part people get wrong is the addresses. Do the move carelessly and every link anyone ever made to your blog stops working on the day you switch. Do it properly and nobody notices anything except that the site got faster.

This guide covers the whole move. If you’re still deciding whether to make it, WordPress vs a static site weighs the two.

What you’re actually moving

ThingDoes it move?
Posts and pagesYes. They are in the export file.
Categories and tagsYes.
PhotosYes, but not in the export file. See Step 2.
Your addressesYes, if you plan for them. See Step 5.
CommentsThey are in the export, but a static site has nowhere to put new ones.
Search, contact formsNo. They need a replacement. See Step 6.
Your theme and pluginsNo. You choose a new design.

Step 1: Export your content

In WordPress, go to Tools → Export, leave All content selected, and choose Download Export File. You get one XML file, in a format called WXR.

It is the same on WordPress.com. A very large site there is sent as a zip of several files by email instead.

The file holds your posts, pages, comments, categories, tags, custom fields and menus. It does not hold your theme, your plugins or their settings.

Step 2: Understand where the photos are

This is the surprise. The export file doesn’t contain your photos. It contains the address of each one. Whatever imports the file has to go and fetch the pictures from your old site.

So keep the old site online until the import has finished. If you cancel the hosting first, the pictures are gone and the import has nothing to download.

On WordPress.com you can also download the media library as a single archive from Tools → Export Media Files, on sites without plugins. It is worth doing as a backup either way.

Open Settings → Permalinks and note which structure the blog uses. It decides what every one of your addresses looks like.

StructureAn address looks like
Plain/?p=123
Day and name/2026/10/02/sample-post/
Month and name/2026/10/sample-post/
Numeric/archives/123
Post name/sample-post/

Four of these are paths, and a static site can answer a path. Plain is not. It is a question mark and a number, answered by WordPress’s database, and a static host has no way to tell ?p=123 from ?p=124. If your blog uses Plain addresses, those links can’t be kept, whatever tool you use.

Step 4: Import into your new home

Where the posts go is up to you: a static site generator such as Hugo or Jekyll, or an app that builds the site for you. Most can read a WXR file, directly or through a converter. The best way to self-host a personal blog compares the options.

Whatever you use, check four things afterwards.

Step 5: Keep the old addresses working

Keep the same domain. That is the single most important decision in the whole move. A link to yourblog.com/2019/05/a-post/ can only be rescued if you still control yourblog.com.

Then one of two things is true for each post.

The new address is the same as the old one. Nothing to do.

The new address is different. You need a redirect from the old to the new. Google’s own guidance is to use a permanent, server-side redirect wherever you can. How you make one depends on the host.

HostHow to redirect
NetlifyA _redirects file with one rule per line: /old-path /new-path 301.
Cloudflare PagesThe same file. Write the 301 explicitly, because the default there is a temporary redirect. A site can have up to 2,000 plain rules.
Your own serverA rule in the server’s configuration, such as nginx’s return 301.
A host with no redirect featureA small page at the old address containing an instant “meta refresh” to the new one. Google says it treats an instant meta refresh as a permanent redirect.

Leave the redirects in place for at least a year. In practice, leave them for ever. They cost nothing.

Step 6: Replace the parts that needed a server

A static site has no code running on the server, so three things need a different answer.

Comments. The old comments are history; decide whether to keep them as part of each post’s text or let them go. For new conversation, many personal blogs now use a “reply by email” link, which arrives in private and attracts no spam.

Search. A small script and an index on your own site can search a few hundred posts instantly, with no server. Search on a static site explains how.

Contact forms. A mailto: link is the simplest replacement. If you need a real form, a form-handling service will take the submissions.

Step 7: Switch over

  1. Publish the new site somewhere temporary and click through it.
  2. Test a handful of old addresses, especially your most-linked posts.
  3. Point the domain at the new host.
  4. Leave the old WordPress site reachable at a spare address for a few weeks, in case you find something missing.

Because the domain hasn’t changed, there is nothing to tell search engines. They will simply find faster pages at the addresses they already know.

Where Selfish fits

Selfish is a native app for iPhone, iPad and Mac that builds a static site and publishes it to hosting you control. It imports the WordPress export file directly.

Nothing is published until you have read it through. It is on the App Store as a one-time purchase, at a £3.99 introductory price, rising to £9.99 in December. Import a site covers the import step by step, and Selfish vs WordPress.com is the honest comparison.