Chapter 4 Migration

Usually it is easier to start a new website than migrating an old one to a new framework, but you may have to do it anyway because of the useful content on the old website that should not simply be discarded. A lazy solution is to leave the old website as is, start a new website with a new domain, and provide a link to the old website. This may be a hassle to your readers, and they may not be able to easily discover the gems that you created on your old website, so I recommend you to migrate your old posts and pages to the new website if possible.

This process may be easy or hard, depending on how complicated your old website is. The bad news is that there is unlikely to be a universal or magical solution, but I have provided some helper functions in blogdown as well as a Shiny application to assist you, which may make it a little easier for you to migrate from Jekyll and WordPress sites.

To give you an idea about the possible amount of work required, I can tell you that it took me a whole week (from the morning to midnight every day) to migrate several of my personal Jekyll-based websites to Hugo and blogdown. The complication in my case was not only Jekyll, but also the fact that I built several separate Jekyll websites (because I did not have a choice in Jekyll) and I wanted to unite them in the same repository. Now my two blogs (Chinese and English), the knitr (Xie 2017c) package documentation, and the animation package (Xie 2017a) documentation are maintained in the same repository: I have about 1000 pages on this website, most of which are blog posts. It used to take me more than 30 seconds to preview my blog in Jekyll, and now it only takes less than 2 seconds to build the site in Hugo.

Another complicated example is the website of Rob J Hyndman. He started his website in 1993 (12 years before me), and had accumulated a lot of content over the years. You can read the post for the stories about how he migrated his WordPress website to blogdown. The key is that you probably need a long international flight when you want to migrate a complicated website.

A simpler example is the Simply Statistics blog. Originally it was built on Jekyll39 and the source was hosted in the GitHub repository I volunteered to help them move to blogdown, and it took me about four hours. My time was mostly spent on cleaning up the YAML metadata of posts and tweaking the Hugo theme. They had about 1000 posts, which sounds like a lot, but the number does not really matter, because I wrote an R script to process all posts automatically. The new repository is at

If you do not really have too many pages (e.g., under 20), I recommend you to cut and paste them to Markdown files, because it may actually take longer to write a script to process these pages.

It is likely that some links will be broken after the migration because Hugo renders different links for your pages and posts. In that case, you may either fix the permanent links (e.g., by tweaking the slug of a post), or use 301 redirects (e.g., on Netlify).


Xie, Yihui. 2017c. Knitr: A General-Purpose Package for Dynamic Report Generation in R.

Xie, Yihui. 2017a. Animation: A Gallery of Animations in Statistics and Utilities to Create Animations.

  1. It was migrated from WordPress a few years ago. The WordPress site was actually migrated from an earlier Tumblr blog.