Zine 0.12.0

birdculture1 pts0 comments

Devlog<br>- Zine

Zine

Devlog

About<br>This is a non-exhaustive, curated list of changes meant to help users quickly see what has improved since they last checked.<br>You can subscribe to this page via RSS.<br>UPGRADING SAFELY<br>Upgrading Zine can change how your website is rendered because of bugs or breaking changes. Reading the changelog helps you prepare, but to fully ascertain that your website looks as expected, I recommend following this procedure:<br>zine release -o old       (with old Zine)<br>zine release -o new       (with new Zine)<br>diff -ru new old<br>At this point is up to you to decide if any change in the diff is desireable or not. If you see a change that is not mentioned in the changelog, it might be the result of a bug, in which case a reproducible bug report would be appreciated.<br>More examples of useful diffing commandsNormal diffing is line based, but occasionally you will want to find more easily which word has changed within a line.<br>This command highlights individual words:<br>git diff --word-diff=color --no-index new old<br>This command highlights individual characters, useful for quickly detecting whitespace changes:<br>git diff --no-index --word-diff-regex=. new old

Changes

new-forum

2026-07-09

To give more space to requests for help, and to start disentangling Zine discussion from Discord, I created a new Discourse forum that I invite Zine users to join both to offer and receive help using Zine, and to discuss static sites in general.<br>https://zine.discourse.group

v0.12.0

2026-06-29

This release contains a few new features and one big breaking change.<br>The Zine server now works with Firefox<br>I finally tracked down and solved the issue that would cause Firefox to stop loading pages from the development webserver if you “clicked around” too much. Turns out I forgot to flush, and Firefox forgot to kill half-upgraded websocket connections on page reload (firefox bug report).<br>You can now add directories to static assets<br>Tired of having to list all your fonts one by one in static_assets?<br>You can now put them in a fonts directory and just add that to your config file. Or you could just create assets/static and use that as a convention that is not limited to just fonts.<br>I’m also pretty proud of my implementation of this feature. Without some care it’s easy to make this feature computationally more hungry than it needs to be.<br>Also note that Zine will complain if the same file ends up being included twice (either directly or via directory inclusion). This is done to make sure you don’t end up in the situation where you think you removed a file from static assets, but in reality it’s still being installed because of a second reference.<br>The Zine config file now supports custom fields<br>The new zine.ziggy definition allows you to specify a .custom Ziggy Dictionary that you can access via $site.custom. See below in the upgrade guide section how that looks like.<br>Codeberg Pages<br>The docs now contain a page dedicated to deploying to Codeberg Pages, for those who might be interested.<br>Setup Zine Version 2<br>The GitHub / Codeberg kristoff-it/setup-zine@v1 action required you to specify which version of Zine to fetch, but the new Ziggy config file features a zine_version field that should now be considered the authoritative source of truth for which version of Zine your website requires.<br>Update your CI scripts to use kristoff-it/setup-zine@v2 and remove the input setting to enjoy a more seamless experience.<br>Note that now Zine will complain about versions not matching between the website config file and the Zine executable version.<br>SuperHTML Scripty changes!<br>Added $page.subpagesByAuthor() and $page.subpagesByTag(), which will allow you to, well, find all subpages of a given section that have the requested author and tag, respectively. It was already possible to manually iterate subpages and filter them on this property, but the builtin functions can consult an index, offering better performance. The -byAuthor variant of these functions relies on a Ziggy frontmatter change explained in the frontmatter upgrade section further ahead in this changelog entry.

Added $page.leaves() which returns a (flat) list of non-section pages in the subtree of the target section page. It accepts an optional argument to limit the length of the iteration. This function is useful to show the latest entries in a structured section.

Removed the ability to pass arguments to $site.pages(), which allowed you to iterate over a list of known pages. It was originally created to simplify running the same html snippet over a list of manually selected pages, but it’s fully replaceable by looping over a Ziggy array defined in the frontmatter.<br>Old:<br>ul :loop="$site.pages('foo', 'bar')"><br>li :text="$loop.it.title">li><br>ul>

New:<br>ul :loop="$page.custom.get('menu-entries')"><br>li :text="$site.page($loop.it).title">li><br>ul>

You can now pass multiple arguments to $site.page, which will become components to compose the final path used to find the target page. This means that...

zine page pages diff file section

Related Articles