Arriving from another tool
From Jekyll
What statac import reads from a Jekyll site, and what each
part becomes.
What it reads
| Jekyll’s | In the new site |
|---|---|
_config.yml, _config.yaml or _config.toml, at the top |
Tells Statac the site is Jekyll’s. TOML is read as YAML is. |
The folder source names |
The only place the site is read from |
_posts/, at the top or in a folder |
content/posts/, each post named for the title part of its file’s name |
_drafts/ |
content/posts/, each post with draft: true |
A .md, .markdown or .html file with front matter, outside Jekyll’s own folders |
A page at the same place: about.md as content/about.md |
A folder collections names, such as _recipes/ |
content/recipes/, with draft: true on each page where Jekyll didn’t publish it |
| A file with no front matter | static/, at the same path |
YAML and JSON in _data/ |
data/. Any other file there is listed. |
_layouts/, _includes/, _sass/, _plugins/, and files with front matter that aren’t writing, such as a feed template |
Not converted, and listed once each |
The built output, where destination says, or _site/ |
Read, to check the old addresses |
Every page and post becomes a .md file; one written in HTML holds its
HTML. A page the templates made, such as an archive of the posts, isn’t
brought across, and the report names it.
A home page with writing of its own becomes content/index.md.
Otherwise the starter’s stays, naming only the folders of posts that
came across.
Settings
| Jekyll’s | Statac’s |
|---|---|
title |
title |
url and baseurl |
url, the whole address. Where url gives none, it is asked for, and baseurl is added to an answer with no path. |
lang or locale |
language, or en where neither is set |
timezone |
timezone, or none where it isn’t set |
paginate |
posts_per_page. On the home page it sets nothing. |
Each later page of the home page, wherever paginate_path put it: Jekyll’s own, /page2/, or /p2/, /page/2/ or /blog/page2/ |
A page at the top of content/, such as content/page2.md, redirecting to the posts’ page that holds the same posts, such as /posts/page/2/ |
jekyll-feed among the plugins: or gems: |
feed_ids_before, the day of the import, and feed_ids_from: jekyll, so feed readers see no old post as new |
A setting of your own, such as author |
A value of your own |
markdown, theme and every other setting with no equal |
Listed |
| Always | date_format, the shorter dates and a new feed_key. |
Front matter
| Jekyll’s | Statac’s |
|---|---|
No title |
The one Jekyll showed, made from the file’s name |
No date |
The day in the file’s name: 2026-10-04-post-1.md becomes post-1.md with date: 2026-10-04 |
published: false |
draft: true |
last_modified_at |
updated |
toc: true |
contents: true |
description, or else excerpt |
summary |
tags on one line, tags: rust go |
A list |
categories, category |
Tags, such as category_linux |
Another list, such as authors, or Categories with a capital |
A field of your own, making no tags |
permalink, redirect_from, redirect_to |
The same, as Addresses has them |
layout, and a page’s excerpt_separator |
Taken off |
yes |
true, as Jekyll read it |
"1984", "3.10" |
The same, quotes kept |
Jekyll read a date with seconds and no offset, written without quotes,
such as 2026-10-04 09:30:00, as UTC whatever the site’s time zone. It
is written 2026-10-04T09:30:00Z, the same moment. A date without
seconds, or in quotes, gets no Z.
Template tags
| Jekyll’s | Becomes |
|---|---|
{% highlight ruby linenos %} to {% endhighlight %} |
A fenced code block, ```ruby, with linenos dropped |
{% raw %}, {% endraw %} |
Taken out, inside code too, keeping what they held |
{% post_url 2026-10-04-post-1 %}, {% link about.md %} |
The page’s address, with the site’s path in front: /blog/2026/10/04/post-1.html under /blog. One naming no page is left, and listed. |
{{ site.baseurl }}, relative_url, absolute_url |
The address with the site’s path and no host: {{ "/photo-1.jpg" | relative_url }} under /blog is /blog/photo-1.jpg |
{{ site.url }} |
The site’s whole address, https://example.org/blog, or nothing before a / or another {{ |
{{ "text" }}, {{ page.title }} |
The text, or the value of a field of the page’s own front matter, inside code too. One through a filter, or naming anything else, is left, and listed. |
{% include note.html text="Note 1" %} |
@old_note(text='Note 1'), with snippets/old_note.html written to stand for it |
The site’s excerpt_separator |
<!--more-->, where it stands on a line of its own |
| Any other | Left as written, and listed at its line |
{{ site.baseurl }} or {{ site.url }} in front of post_url, link,
relative_url or absolute_url adds no second path.
In a code block or a code span, a template tag is left as written and
listed. Only raw and a template tag holding nothing but the page’s own
words are converted there.
What isn’t converted
- Markdown that Statac reads differently:
{: .class},{:toc}, and<div markdown="1">. Each is left as written, and listed. - A feed a template made. Where nothing in the new site stands at its
old address, the report lists it. A list’s
feed:line can put its feed there.
Jekyll’s ways
| Jekyll | What Statac does |
|---|---|
| Where Jekyll published each page | Works it out from the settings’ permalink and the page’s own, then keeps it |
A page a plugin made for a category or a tag, such as /categories/linux/, /category/linux.html or /tag/rust.html |
Finds it in the old built output, and sends its readers on to the tag’s page |
<pre>, <script>, <style> or <textarea> holding a blank line, or a {% highlight %}, straight after other HTML |
Puts a blank line before it, so the code stays code |
[label]: /address on the line after a footnote, [^1]: A note. |
Puts a blank line before it, so it stays a link definition and not more of the footnote |
| Maths | Jekyll set maths between $$ and $$ only: see other changes |
Where next?
- Arriving from another tool: addresses, dates, categories and the report, for every tool
- Addresses:
permalinkpatterns andredirect_from - Snippets: write the snippets that stand for includes
- Feeds: how old posts keep their ids
Something unclear or wrong? Open an issue on GitHub.