Arriving from another tool
From Eleventy
What statac import reads from an Eleventy site, and what
each part becomes.
What it reads
| Eleventy’s | In the new site |
|---|---|
.eleventy.js, eleventy.config.js, .mjs or .cjs, or a package.json that names @11ty/eleventy among what it needs |
Tells Statac the site is Eleventy’s, and holds the settings. |
Each .md file in the input folder |
The same place under content/ |
An .html page |
A Markdown file holding its HTML |
A page in a template language, such as .njk, .liquid, .webc or .11ty.js, or one looping over the old site’s pages |
Not brought across, and named under “Pages made by templates”. One that only shows such a loop, inside {% raw %}, comes across. |
The includes and data folders, node_modules/, the built output, and what .eleventyignore and .gitignore leave out |
Not read as pages |
| JSON and YAML in the data folder | data/ |
A folder’s posts.json or posts.11tydata.json, or a page’s post-1.11tydata.json |
pages. lines in the folder’s own page, as below |
What the settings copy with addPassthroughCopy |
static/, at the address it had |
| A file beside a page that the page’s writing names | Beside the page |
A _redirects file |
Each page’s redirect_from |
The built output, _site/ or where the settings’ dir says |
Read, to check the old addresses |
A symbolic link may also lead to a plain folder outside the input folder, as Eleventy read it.
A folder where every page has permalink: false and none has a title
holds parts of other pages, such as a post’s comments. Statac leaves it
behind, and lists it under “Not converted”. A file with
permalink: false anywhere else, or with a title, comes across as a
draft.
What Statac reads in the settings
Note:
An Eleventy site’s settings are a program, and Statac runs none of it.
It reads the file’s text for the plain forms most sites write, a value
in quotes or true or false, and the report notes each thing it
took from there and each it assumed.
| What | Read from | Where nothing is found |
|---|---|---|
| The folders | dir: { input, output, includes, data }, or dir: { input } where the file says const input = "src" once |
., _site, _includes and _data |
| What is copied as it is | addPassthroughCopy("..."), or an object of such names |
|
| Markdown’s ways | breaks: true, linkify: true, html and the plugin markdown-it-attrs, or, where the settings file holds none, a file it fetches by a path, as import x from "./config/markdown.js" |
|
| Where an excerpt ends | excerpt_separator, which becomes <!--more--> |
|
| The writing’s template language | markdownTemplateEngine |
Liquid |
The site’s path, pathPrefix, is read too, and written in front of each
address the url filter gave: see template tags. The
settings give no whole address, so Statac asks for it,
and adds the path to an answer that has none: https://example.org
gives url: https://example.org/blog. Where the answer is Enter, those
links are broken until you add the whole address with its path to
statac.yaml.
Everything else the settings do, such as filters, plugins and data made
by code, is listed by name under “Settings Statac didn’t read”.
Eleventy keeps no title or language: the new site’s title is made from
the old folder’s name and its language is en, for you to put right.
The timezone is UTC, as Eleventy read a date without an offset.
Front matter
| Eleventy’s | Statac’s |
|---|---|
title, date, tags, draft |
The same, tags as a list |
description |
summary, where the page has none |
updated, modified, lastmod |
updated |
permalink |
The page’s address, as below |
permalink: false |
draft: true |
categories, a list or one name |
Tags, such as category_linux |
A date of Last Modified, Created, git Last Modified or git Created |
Taken off, and listed |
No date, and no day in the file’s name |
The first day in its path, as in 2026-01-02-post-1/index.md |
eleventyNavigation, eleventyComputed and Eleventy’s other words with no equal |
Fields of your own, each listed |
layout |
Taken off, and counted |
templateEngineOverride |
Taken off, once the writing is read in its language |
Front matter in JSON, after ---json |
Read |
Front matter in JavaScript, after ---js |
Listed: the page comes across without it |
| A control character in a value | Taken out, and counted |
posts/2026-10-04-post-1.md becomes content/posts/post-1.md, with a
permalink keeping the address Eleventy gave it:
---
title: Post 1
date: 2026-10-04
permalink: /posts/2026-10-04-post-1/
---
Values handed down
posts/posts.json:
{ "layout": "post.njk", "tags": "posts", "author": "Name" }
becomes tags: [posts] on each post and, in content/posts/index.md, a
line that hands it down:
pages.author: Name
Tags gather from every level, as Eleventy gathered them. A field Statac
keeps for each page, such as title, or one in a folder with no page of
its own, is written on each page. Data written as JavaScript,
.11tydata.js, is listed.
Template tags
The writing’s template tags are read as Liquid, or as Nunjucks where the settings say.
| Eleventy’s | Becomes |
|---|---|
An address in quotes, single or double, through the url filter alone: {{ "/about/" | url }} |
The address with the site’s path in front: /blog/about/ where the settings say pathPrefix: "/blog/". A whole address is written as itself. A name not in quotes, as {{ page.url | url }}, or url followed by another filter is left as written, and listed. |
raw, highlight and an include |
The same as from Jekyll |
One of the site’s own, such as {% image "photo-1.jpg", "A photo" %} |
A snippet call by its own name, @image('photo-1.jpg', 'A photo'). One around writing, up to its {% endnote %}, becomes a call that wraps it. |
@image here is the old site’s name, not one of Statac’s: its snippet
shows nothing until you write it.
What isn’t converted
Where the settings’ Markdown had:
| Setting | What Statac does |
|---|---|
breaks: true |
Ends each line inside a paragraph with a backslash, A line\. Lists’ own lines, code and HTML are left as they are. |
markdown-it-attrs |
Lists each {.class} |
linkify: true |
Lists each address written bare without www. or http, such as example.org, which Statac doesn’t link |
| HTML turned off | Lists each place HTML is written |
Eleventy’s ways
A page’s address is worked out by Eleventy’s rules: its folders and its
name, /posts/post-1/, or its folder’s where the file is index.md or
named as its folder. A permalink holding template tags is worked out
where it uses only page.fileSlug, page.filePathStem, page.date
through Liquid’s date filter, the page’s own fields, and the filters
slugify and slug: on Post 1, dated 2026-01-02,
permalink: "/{{ page.date | date: '%Y' }}/{{ title | slugify }}/"
becomes
permalink: /2026/post-1/
| Eleventy | What Statac does |
|---|---|
Any other permalink holding template tags |
Lists it. The page stays at Statac’s own address. |
A permalink with no ending, /about, a file of that name to Eleventy |
Publishes the page at /about/, and lists it |
A data file that is a program, such as _data/eleventyComputed.js or posts.11tydata.js, naming permalink |
Lists it. The pages take the address Eleventy gives a file by its name. |
A page a template made, in a folder whose data gives a permalink |
Lists no old address for it: find where the old site published it |
| Category pages | Finds them in the old built output, or, with none, where a template makes one page for each of collections.categories, as permalink: "categories/{{ category | slugify }}/". Through a filter of the site’s own, they can’t be known. |
A package in package.json with katex, mathjax, texmath or markdown-it-math in its name |
Takes it that the old site set maths |
Where next?
- Arriving from another tool: addresses, dates, categories and the report, for every tool
- Front matter: how
pages.lines hand values down - Addresses:
permalinkpatterns andredirect_from - Snippets: write the snippets that stand for the site’s own template tags
Something unclear or wrong? Open an issue on GitHub.