Migrating from blogdown/Hugo to jekylldown + al-folio

al-folio is the de-facto reference theme for academic sites – publications generated from BibTeX, news, CV, and teaching pages as structured data. Hugo has no equivalent, which is the main reason to move a blogdown site to Jekyll. This vignette walks through that migration with jekylldown, keeping your posts in R Markdown throughout.

al-folio is the vignette’s focus, but migrate_hugo() targets any of the supported themes – theme = "chirpy", "minimal-mistakes" or "minima" work the same way, with pages, navigation, avatar and social profiles placed in each theme’s own convention (Chirpy _tabs/, Minimal Mistakes _pages/ + _data/navigation.yml + the author: sidebar, …). Steps 1, 2 and 4 apply to all of them; step 3 is al-folio-specific.

Before you start

  1. Work on a copy. migrate_hugo() never writes into the source site, but be conservative anyway: leave your production repository untouched until the new site builds and looks right.
  2. Diagnose your toolchain:
jekylldown::check()

A local Ruby/Jekyll is optional for this migration: knitting posts only needs R, and al-folio ships GitHub Actions workflows that build the site remotely. You only need Jekyll (plus bundle_install(), below) for local previews.

Step 1 – convert the site

library(jekylldown)

migrate_hugo(
  from  = "path/to/my-hugo-site",     # blogdown/Hugo site (read-only)
  to    = "path/to/my-new-site",      # created; must not exist yet
  theme = "al-folio",                 # fetched from GitHub (network needed)
  only_referenced = TRUE,             # skip static files nothing links to
  publications = "bib",               # the default; papers.bib from the DOIs (see below)
  theme_color = "red"                 # al-folio accent color (see below)
)

The Hugo config (config.toml/.yaml) is read first and drives the migration. What gets converted automatically:

The report printed at the end lists what is left: posts with remaining shortcodes and content not referenced by the Hugo menu (dead pages, custom layouts/) – review that list before assuming it can be dropped.

Step 2 – review the posts

Knit everything (no Jekyll needed) and read the output:

build_site("path/to/my-new-site", local_jekyll = FALSE)

Things worth checking in _posts/*.md:

Step 3 – adapt the al-folio configuration

migrate_hugo() fills in your identity (name, url, description) but al-folio’s rich _config.yml deserves a pass by hand:

Known al-folio gotchas

Verified with al-folio as of September 2026:

Step 4 – preview locally (optional)

al-folio manages its plugins with Bundler, so install its gems once into jekylldown’s isolated environment with bundle_install("path/to/my-new-site"), then serve:

serve_site("path/to/my-new-site")
# ... edit _source/*.Rmd; saving re-knits and reloads the browser
stop_server("path/to/my-new-site")

After bundle_install(), build_site() and serve_site() automatically use bundle exec jekyll, so the theme’s plugins are found.

Step 5 – deploy on GitHub Pages

  1. Create a repository named youruser.github.io and push the new site to it (including _source/ – it is excluded from the Jekyll build but belongs in version control).
  2. In the repository settings, enable GitHub Pages with GitHub Actions as the source: al-folio’s bundled workflow (.github/workflows/deploy.yml) builds and publishes the site on every push.
  3. Your R workflow from then on: new_post("Title", dir = site), write, build_site(site) (or just knit via build_site(site, local_jekyll = FALSE)), commit, push. No more two-repository setup as with blogdown – the source and the built site live in one repo, built remotely.

Migration checklist

mirror server hosted at Truenetwork, Russian Federation.