Migrate from Jekyll

How to move a Jekyll site to Project Broadsheet, including front matter conversion, Liquid-to-Markdown rewrites, image migration, and redirect setup.

Migration Updated April 18, 2026 v1.0.0

Jekyll and Project Broadsheet share the same core philosophy: Markdown files, YAML front matter, and a build step that generates static HTML. The migration is largely a search-and-replace exercise with a few structural differences to account for.

Step 1. Find your content

Jekyll keeps posts in _posts/ with filenames like 2024-01-15-my-post.md. Count what you have:

ls _posts/ | wc -l

Pages and custom collections live in their own directories. Focus on _posts/ first; migrate custom collections after posts are working.

Step 2. Strip the date from filenames

Jekyll encodes the date in the filename (2024-01-15-my-post.md). Project Broadsheet uses the date front matter field and a plain filename (my-post.md).

Rename in bulk:

for f in _posts/*.md; do
  name=$(basename "$f" | sed 's/^[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}-//')
  cp "$f" "src/content/news/$name"
done

Adjust the target folder (news) to match your chosen section.

Step 3. Map front matter fields

Most Jekyll front matter carries over directly:

JekyllProject BroadsheetNotes
titletitleSame
datedateSame (YYYY-MM-DD)
tagstagsSame
categoriessectionUse one value matching a section slug
layout(not needed)Inherited from the section folder's .json
permalinkpermalinkSame syntax
published: falsedraft: trueRename the field
authorauthorMust be a slug in authors.js
excerptexcerptSame

Remove Jekyll-only fields (layout: post, published, category) that have no Project Broadsheet equivalent.

Step 4. Replace Liquid tags

Jekyll uses Liquid templating in Markdown body content. Project Broadsheet does not process Liquid in content files. Common replacements:

Jekyll Liquid tagReplacement
highlight/endhighlight tagsFenced code block with language identifier
link tagPlain relative link: [About](/about/)
site.baseurl variable/assets/img/ (bare path)
include tag![alt](/assets/img/…) standard Markdown image
raw/endraw tagsRemove them; the Markdown body is not Liquid-processed

Search for remaining Liquid tags after migration:

grep -rn "liquid" src/content/

Step 5. Move images

Jekyll images typically live in assets/ or images/. Copy them to src/assets/img/migrated/ and update all image paths in the Markdown:

sed -i 's|/assets/images/|/assets/img/migrated/|g' src/content/news/*.md

Step 6. Preserve URLs with redirects

Jekyll's default post URL is /year/month/day/slug/. Project Broadsheet uses /{section}/slug/. Add a _redirects file:

/2024/01/15/my-post/ /news/my-post/ 301

Generate from your _posts/ filenames:

ls _posts/*.md | while read f; do
  slug=$(basename "$f" .md | sed 's/^[0-9-]*//')
  date=$(basename "$f" | grep -o '^[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}' | tr '-' '/')
  echo "/$date/$slug/ /news/$slug/ 301"
done

Would you rather hand this off?

The migration service handles the full process: automated conversion, image rehosting, redirect map, and a quality pass. Book a call.

What to do next

Still need help?

Browse Support for community channels and paid support options, or book a call if you'd like me to set it up for you.