<rss version="2.0">
 <channel>
  <title>Zine Changelog</title>
  <link>https://zine-ssg.io/</link>
  <description>Curated list of changes to Zine</description>
  <generator>Zine -- https://zine-ssg.io</generator>
  <language>en-us</language>
  <lastBuildDate>Thu, 23 Jul 2026 12:54:28 +0000</lastBuildDate>
  
   
  
   
    <item>
     <pubDate>Sun, 19 Jul 2026 00:00:00 +0000</pubDate>
     <link>https://zine-ssg.io/log/#v0.13.0</link>
     <guid>https://zine-ssg.io/log/#v0.13.0</guid>
     <title>v0.13.0</title>
     <description>&lt;div id=&quot;v0.13.0&quot;&gt;&lt;p&gt;&lt;strong&gt;This release contains schema changes, make sure to run &lt;code&gt;zine install-schemas&lt;/code&gt; after upgrading&lt;/strong&gt;.&lt;/p&gt;&lt;h3&gt;Breaking changes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;The config file &lt;code&gt;auto_target_blank&lt;/code&gt; setting has moved under the new &lt;code&gt;supermd&lt;/code&gt; field, as there are now more supermd rendering settings you can tweak.&lt;/p&gt;&lt;p&gt;Before:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;ziggy&quot;&gt;.&lt;span class=&quot;field&quot;&gt;zine_version&lt;/span&gt; &lt;span class=&quot;punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;0.12.0&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
.&lt;span class=&quot;field&quot;&gt;auto_target_blank&lt;/span&gt; &lt;span class=&quot;punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant_builtin_boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;comment_line&quot;&gt;// ...
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;ziggy&quot;&gt;.&lt;span class=&quot;field&quot;&gt;zine_version&lt;/span&gt; &lt;span class=&quot;punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;0.12.0&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
.&lt;span class=&quot;field&quot;&gt;supermd&lt;/span&gt; &lt;span class=&quot;punctuation&quot;&gt;=&lt;/span&gt; .&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt;
    .&lt;span class=&quot;field&quot;&gt;auto_target_blank&lt;/span&gt; &lt;span class=&quot;punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant_builtin_boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;comment_line&quot;&gt;// ...
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;The fontmatter &lt;code&gt;skip_subdir&lt;/code&gt; setting has been deleted (it never did anything).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Starting now, &lt;span class=&quot;important &quot;&gt;SuperMD documents don’t allow heading level skips anymore&lt;/span&gt;. If you have a ‘#’ heading followed by ‘###’, you will now get a build error. Releated to this, SuperMD documents now must start with heading level 1 (’#’). If you were deliberately starting at ‘##’ to render &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt; headings, the aforementioned &lt;code&gt;supermd&lt;/code&gt; field in ‘zine.ziggy’ has &lt;code&gt;headings_h2&lt;/code&gt; which, when set to &lt;code&gt;true&lt;/code&gt;, will render level 1 headings as &lt;code&gt;h2&lt;/code&gt; and so forth. &lt;strong&gt;Note that sectioned content (&lt;code&gt;$section&lt;/code&gt;) is exempt from this check for now.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;My recommendation for upgrading is to first understand if you were defaulting to starting each document from ‘##’. If so, then you probably want to set &lt;code&gt;headings_h2&lt;/code&gt; in ‘zine.ziggy’ and you will want to shave off one heading level from all your files. Here’s a one liner that can help with that (&lt;strong&gt;make sure to have commited all pending changes before running it!&lt;/strong&gt;):&lt;/p&gt;&lt;p&gt;Linux &amp; Mac:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;sh&quot;&gt;&lt;span class=&quot;constant function&quot;&gt;find&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;-name&lt;/span&gt; &lt;span class=&quot;string constant&quot;&gt;&amp;quot;*.smd&amp;quot;&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;-type&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;f&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;-exec&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;perl&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;-pi&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;string constant&quot;&gt;&amp;apos;s/^#//&amp;apos;&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;{}&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;+&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Windows:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;powershell&quot;&gt;&lt;span class=&quot;function&quot;&gt;Get-ChildItem&lt;/span&gt; -Recurse -Filter *.smd | &lt;span class=&quot;function&quot;&gt;%&lt;/span&gt; { &lt;span class=&quot;variable&quot;&gt;$p&lt;/span&gt;=&lt;span class=&quot;assignvalue variable&quot;&gt;$_&lt;/span&gt;&lt;span class=&quot;assignvalue&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;property assignvalue&quot;&gt;FullName&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;variable&quot;&gt;$c&lt;/span&gt;=&lt;span class=&quot;assignvalue&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;type assignvalue&quot;&gt;IO.File&lt;/span&gt;&lt;span class=&quot;assignvalue&quot;&gt;]::&lt;/span&gt;&lt;span class=&quot;assignvalue function&quot;&gt;ReadAllText&lt;/span&gt;&lt;span class=&quot;assignvalue&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;assignvalue variable&quot;&gt;$p&lt;/span&gt;&lt;span class=&quot;assignvalue&quot;&gt;,[&lt;/span&gt;&lt;span class=&quot;type assignvalue&quot;&gt;Text.Encoding&lt;/span&gt;&lt;span class=&quot;assignvalue&quot;&gt;]::&lt;/span&gt;&lt;span class=&quot;property assignvalue&quot;&gt;UTF8&lt;/span&gt;&lt;span class=&quot;assignvalue&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;;&lt;/span&gt; [&lt;span class=&quot;type&quot;&gt;IO.File&lt;/span&gt;]::&lt;span class=&quot;function&quot;&gt;WriteAllText&lt;/span&gt;(&lt;span class=&quot;variable&quot;&gt;$p&lt;/span&gt;,(&lt;span class=&quot;variable&quot;&gt;$c&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;-replace&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;apos;(?m)^#&amp;apos;&lt;/span&gt;,&lt;span class=&quot;string&quot;&gt;&amp;apos;&amp;apos;&lt;/span&gt;),[&lt;span class=&quot;type&quot;&gt;Text.Encoding&lt;/span&gt;]::&lt;span class=&quot;property&quot;&gt;UTF8&lt;/span&gt;) }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After running the command, make sure to audit the resulting diff for errors.&lt;/p&gt;&lt;p&gt;For everybody else nothing should change, except maybe discovering that you occasionally skipped a heading level by mistake. I found a few instances of that when upgrading my own websites.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;New features!&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;SuperMD errors have greatly improved. Techatrix started the work in &lt;a href=&quot;https://github.com/kristoff-it/zine/pull/239&quot; target=&quot;_blank&quot;&gt;#239&lt;/a&gt; and coincidentally soon after I pushed the work further because I wanted the new “skipped heading level” errors to not be confusing.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;In SuperHTML, &lt;code&gt;$build.development&lt;/code&gt; is true when the build is being served by the Zine live server&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;In SuperHTML, &lt;code&gt;$site.index()&lt;/code&gt; returns the root index page (aka the homepage) of a site. It’s the same as &lt;code&gt;$site.page(&amp;apos;&amp;apos;)&lt;/code&gt; but it’s clearer for a reader what your intent was.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;You can now specify &lt;code&gt;forbid_subsections&lt;/code&gt; in the frontmatter of a &lt;strong&gt;&lt;code&gt;index.smd&lt;/code&gt; file&lt;/strong&gt;. When set to true, no child page can use the &lt;code&gt;foo/index.smd&lt;/code&gt; naming style as that would define a subsection. Users will be prompted to name the file &lt;code&gt;foo.smd&lt;/code&gt;. This setting is useful to guarantee that &lt;code&gt;$page.leaves()&lt;/code&gt; doesn’t skip pages that were meant to be leaves.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Bugfixes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Last release announced &lt;code&gt;$site.custom&lt;/code&gt; but a bug prevented scripty from being able to access that data, sorry!&lt;/li&gt;&lt;li&gt;&lt;code&gt;auto_target_blank&lt;/code&gt; was a bit too eager and ended up adding the attirbute to all links when set to &lt;code&gt;true&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;SuperHTML would crash when trying to put &lt;code&gt;:text&lt;/code&gt; into a self-closing XML element.&lt;/li&gt;&lt;li&gt;The live development server would fail to serve the livereloading JS and websocket endpoints when a &lt;code&gt;url_path_prefix&lt;/code&gt; was defined.&lt;/li&gt;&lt;li&gt;Using Zine from a &lt;code&gt;build.zig&lt;/code&gt; would cause Zine to try to parse your Git tags, this was caused by a piece of build functionality that helped me remember to properly create tags and update my zon file when releasing Zine. It’s now disabled when using Zine as a dependency.&lt;/li&gt;&lt;li&gt;A bug prevented &lt;code&gt;[](#foo)&lt;/code&gt; refs to be validated, you might find new broken deep links after this update.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description>
    </item>
   
  
   
    <item>
     <pubDate>Thu, 09 Jul 2026 00:00:00 +0000</pubDate>
     <link>https://zine-ssg.io/log/#new-forum</link>
     <guid>https://zine-ssg.io/log/#new-forum</guid>
     <title>new-forum</title>
     <description>&lt;div id=&quot;new-forum&quot;&gt;&lt;p&gt;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.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://zine.discourse.group&quot; target=&quot;_blank&quot;&gt;https://zine.discourse.group&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</description>
    </item>
   
  
   
    <item>
     <pubDate>Mon, 29 Jun 2026 00:00:00 +0000</pubDate>
     <link>https://zine-ssg.io/log/#v0.12.0</link>
     <guid>https://zine-ssg.io/log/#v0.12.0</guid>
     <title>v0.12.0</title>
     <description>&lt;div id=&quot;v0.12.0&quot;&gt;&lt;p&gt; This release contains a few new features and one big breaking change.&lt;/p&gt;&lt;h3&gt;The Zine server now works with Firefox&lt;/h3&gt;&lt;p&gt;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 (&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=2051402&quot; target=&quot;_blank&quot;&gt;firefox bug report&lt;/a&gt;).&lt;/p&gt;&lt;h3&gt;You can now add directories to static assets&lt;/h3&gt;&lt;p&gt;Tired of having to list all your fonts one by one in &lt;code&gt;static_assets&lt;/code&gt;?&lt;/p&gt;&lt;p&gt;You can now put them in a &lt;code&gt;fonts&lt;/code&gt; directory and just add that to your config file. Or you could just create &lt;code&gt;assets/static&lt;/code&gt; and use that as a convention that is not limited to just fonts.&lt;/p&gt;&lt;p&gt;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.&lt;/p&gt;&lt;p&gt;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.&lt;/p&gt;&lt;h3&gt;The Zine config file now supports custom fields&lt;/h3&gt;&lt;p&gt;The new &lt;code&gt;zine.ziggy&lt;/code&gt; definition allows you to specify a &lt;code&gt;.custom&lt;/code&gt; Ziggy Dictionary that you can access via &lt;code&gt;$site.custom&lt;/code&gt;. See below in the upgrade guide section how that looks like.&lt;/p&gt;&lt;h3&gt;Codeberg Pages&lt;/h3&gt;&lt;p&gt;The docs now contain a page dedicated to deploying to Codeberg Pages, for those who might be interested.&lt;/p&gt;&lt;h3&gt;Setup Zine Version 2&lt;/h3&gt;&lt;p&gt;The GitHub / Codeberg &lt;code&gt;kristoff-it/setup-zine@v1&lt;/code&gt; action required you to specify which version of Zine to fetch, but the new Ziggy config file features a &lt;code&gt;zine_version&lt;/code&gt; field that should now be considered the authoritative source of truth for which version of Zine your website requires.&lt;/p&gt;&lt;p&gt;Update your CI scripts to use &lt;code&gt;kristoff-it/setup-zine@v2&lt;/code&gt; and remove the input setting to enjoy a more seamless experience.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Note that now Zine will complain about versions not matching between the website config file and the Zine executable version.&lt;/strong&gt;&lt;/p&gt;&lt;h3&gt;SuperHTML Scripty changes!&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Added &lt;code&gt;$page.subpagesByAuthor()&lt;/code&gt; and &lt;code&gt;$page.subpagesByTag()&lt;/code&gt;, which will allow you to, well, find all subpages of a given section that have the requested author and tag, respectively. &lt;strong&gt;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.&lt;/strong&gt; The -&lt;code&gt;byAuthor&lt;/code&gt; variant of these functions relies on a Ziggy frontmatter change explained in the frontmatter upgrade section further ahead in this changelog entry.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Added &lt;code&gt;$page.leaves()&lt;/code&gt; which returns a (flat) list of &lt;strong&gt;non-section&lt;/strong&gt; 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.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Removed the ability to pass arguments to &lt;code&gt;$site.pages()&lt;/code&gt;, 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.&lt;/p&gt;&lt;p&gt;Old:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;superhtml&quot;&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag special&quot;&gt;ul&lt;/span&gt; &lt;span class=&quot;error attribute&quot;&gt;:loop&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;string markup_link_url&quot;&gt;$site.pages(&amp;apos;foo&amp;apos;, &amp;apos;bar&amp;apos;)&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;punctuation_bracket&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag special&quot;&gt;li&lt;/span&gt; &lt;span class=&quot;error attribute&quot;&gt;:text&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;$loop.it.title&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag special&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;punctuation_bracket&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag special&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;New:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;superhtml&quot;&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag special&quot;&gt;ul&lt;/span&gt; &lt;span class=&quot;error attribute&quot;&gt;:loop&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;string markup_link_url&quot;&gt;$page.custom.get(&amp;apos;menu-entries&amp;apos;)&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;punctuation_bracket&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag special&quot;&gt;li&lt;/span&gt; &lt;span class=&quot;error attribute&quot;&gt;:text&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;$site.page($loop.it).title&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag special&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;punctuation_bracket&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag special&quot;&gt;ul&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;You can now pass multiple arguments to &lt;code&gt;$site.page&lt;/code&gt;, which will become components to compose the final path used to find the target page. This means that the following invocations are equivalent:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;$site.page(&amp;apos;foo/bar/baz&amp;apos;)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;$site.page(&amp;apos;foo&amp;apos;, &amp;apos;bar/baz&amp;apos;)&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This can be useful when part of your path is fixed while part is parametrized:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;$site.page(&amp;apos;speakers&amp;apos;, $page.authors.at(0))
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The SuperHTML Scripty reference now uses slightly different syntax to refer to arrays. Previously &lt;code&gt;[String]&lt;/code&gt; was notation for an array of strings, while now it’s &lt;code&gt;[]String&lt;/code&gt;, in order to more closely mirror the new &lt;a href=&quot;https://ziggy-lang.io/docs/builtin-types/&quot; target=&quot;_blank&quot;&gt;Ziggy Schema syntax&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Variadic function arguments are still specified as &lt;code&gt;[String...]&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;span class=&quot;important &quot;&gt;New Ziggy Upgrade Guide&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://ziggy-lang.io&quot; target=&quot;_blank&quot;&gt;Ziggy&lt;/a&gt; is the data serialization language used in the Zine config file (&lt;code&gt;zine.ziggy&lt;/code&gt;) and the frontmatter in SuperMD files. &lt;strong&gt;Up until recently it was probably the weakest point of Zine but, after giving it some love, I’m happy to say that this is not the case anymore.&lt;/strong&gt; Unfortunately this comes at the cost of some breaking changes, for which I do apologize. I tried to put all breaking changes that I could think of in this release, in order to leave users alone for a while once they’re done upgrading.&lt;/p&gt;&lt;p&gt;Some Ziggy syntax changed, but most importantly both parser and surrounding tooling has matured a lot which enables pushing past previous &lt;em&gt;cul de sac&lt;/em&gt;s.&lt;/p&gt;&lt;h4&gt;&lt;span class=&quot;important &quot;&gt;Better error messages&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;If you ever wrote a bad date, you probably saw this misleading error message:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;content/index.smd:3:9:
    .date = @date(&amp;quot;1990-01-1T00:00:00&amp;quot;),
            ^
syntax error: &amp;apos;@&amp;apos;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This is now:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;content/index.smd:3:9: error: unable to parse date: InvalidCharacter
|    .date = .date(&amp;quot;1990-01-1T00:00:00&amp;quot;),
|            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Unfortunately Zine is not yet able to tell you that there’s a missing digit in the day section of the date, but it’s on my pile of TODOs to eventually take direct control over date parsing and provide even better diagnostics.&lt;/p&gt;&lt;h4&gt;&lt;span class=&quot;important &quot;&gt;In-editor schema intelligence!&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;&lt;video loop autoplay controls&gt;
&lt;source src=&quot;/log/ziggy2026.mp4&quot;&gt;
&lt;/video&gt;&lt;/p&gt;&lt;p&gt;Looking at the usual suspects (other SSGs), I believe this is currently a unique feature of Zine. To unlock this ability:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span class=&quot;important &quot;&gt;Your editor must be configured to launch the Ziggy LSP for &lt;code&gt;.ziggy&lt;/code&gt;, &lt;code&gt;.ziggy-schema&lt;/code&gt; and &lt;code&gt;.smd&lt;/code&gt; files.&lt;/span&gt; In the future SuperMD will have a dedicated LSP but for now the Ziggy one will offer frontmatter support.&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;important &quot;&gt;You must have the correct Ziggy Schema files installed in your Zine website.&lt;/span&gt; Those files contain the schema definition for the Zine config file (&lt;code&gt;zine.ziggy&lt;/code&gt;) and SuperMD frontmatter. Use &lt;code&gt;zine install-schemas&lt;/code&gt; to have Zine automatically place up-to-date copies of those files at the right locations (also &lt;code&gt;zine init&lt;/code&gt; will now generate a project with those files already in place). Note that &lt;code&gt;install-schemas&lt;/code&gt; requires you to update your &lt;code&gt;zine.ziggy&lt;/code&gt; config file first.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;It’s not pictured in the video, but &lt;code&gt;zine.ziggy&lt;/code&gt; also has in-editor support now. The Ziggy LSP is not yet at the same level of polish of, say, the SuperHTML one, but it will be improved over time.&lt;/p&gt;&lt;h4&gt;&lt;span class=&quot;important &quot;&gt;Upgrading your website&lt;/span&gt;&lt;/h4&gt;&lt;p&gt;Ziggy Document syntax changed slightly, checkout &lt;a href=&quot;https://ziggy-lang.io&quot; target=&quot;_blank&quot;&gt;the official docs&lt;/a&gt; for the full list of changes. The ones that Zine users care the most about are the following two:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;@foo&lt;/code&gt; literals are gone.&lt;/li&gt;&lt;li&gt;Structs don’t have names anymore.&lt;/li&gt;&lt;li&gt;Both of the above have been functionally replaced by the newly introduced tagged unions.&lt;/li&gt;&lt;li&gt;Structs now have a leading dot like in Zig, so&lt;br&gt;&lt;code&gt;{ .foo = true }&lt;/code&gt; becomes &lt;code&gt;.{ .foo = true }&lt;/code&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Lastly be aware that &lt;strong&gt;you can omit every struct field&lt;/strong&gt; that in their Ziggy Schema definition is:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;an optional (leading &lt;code&gt;?&lt;/code&gt; in the type expression)&lt;/li&gt;&lt;li&gt;a slice (leading &lt;code&gt;[]&lt;/code&gt; in the type expression)&lt;/li&gt;&lt;li&gt;a dictionary (leading &lt;code&gt;{:}&lt;/code&gt; in the type expression)&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;Upgrading your &lt;code&gt;zine.ziggy&lt;/code&gt;&lt;/h5&gt;&lt;p&gt;Before:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;Site {
  // ...
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;After:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;ziggy&quot;&gt;.&lt;span class=&quot;field&quot;&gt;zine_version&lt;/span&gt; &lt;span class=&quot;punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;0.12.0&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
.&lt;span class=&quot;field&quot;&gt;site&lt;/span&gt; &lt;span class=&quot;punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;.simple&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;.&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;comment_line&quot;&gt;// &amp;lt;-- note the dot!
&lt;/span&gt;  &lt;span class=&quot;comment_line&quot;&gt;// ...
&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The contents of &lt;code&gt;.simple&lt;/code&gt; should remain the same as they were before.&lt;/p&gt;&lt;p&gt;If you have a multilingual website:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;ziggy&quot;&gt;.&lt;span class=&quot;field&quot;&gt;zine_version&lt;/span&gt; &lt;span class=&quot;punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;0.12.0&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
.&lt;span class=&quot;field&quot;&gt;site&lt;/span&gt; &lt;span class=&quot;punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;.multilingual&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;.&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;comment_line&quot;&gt;// &amp;lt;-- note the dot!
&lt;/span&gt;  &lt;span class=&quot;comment_line&quot;&gt;// ...
&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this case as well the contents of &lt;code&gt;.simple&lt;/code&gt; should be the structurally the same &lt;strong&gt;but beware that nested structs (e.g. &lt;code&gt;Locale&lt;/code&gt;s), will now need a leading dot.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;As a reminder, &lt;span class=&quot;important &quot;&gt;you can now also define custom properties in your config file, which become accessible via &lt;code&gt;$site.custom&lt;/code&gt;&lt;/span&gt;:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;ziggy&quot;&gt;.&lt;span class=&quot;field&quot;&gt;zine_version&lt;/span&gt; &lt;span class=&quot;punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;0.12.0&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
.&lt;span class=&quot;field&quot;&gt;site&lt;/span&gt; &lt;span class=&quot;punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;.simple&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;.&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;comment_line&quot;&gt;// &amp;lt;-- note the dot!
&lt;/span&gt;  &lt;span class=&quot;comment_line&quot;&gt;// ...
&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
.&lt;span class=&quot;field&quot;&gt;custom&lt;/span&gt; &lt;span class=&quot;punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;comment_line&quot;&gt;// &amp;lt;-- dicts have no dot!
&lt;/span&gt;  &lt;span class=&quot;string&quot;&gt;&amp;quot;my&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;punctuation_bracket&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;custom&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;values!&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After fixing your &lt;code&gt;zine.ziggy&lt;/code&gt;, it’s a good idea to run &lt;code&gt;zine install-schemas&lt;/code&gt;.&lt;/p&gt;&lt;div class=&quot;block warning&quot;&gt;&lt;h1&gt;BREAKING CHANGE&lt;/h1&gt;&lt;p&gt;The new Zine config file schema has a new setting: &lt;code&gt;auto_target_blank&lt;/code&gt; which defines wheder external links generated by SuperMD should have a target blank attribute by default or not.&lt;/p&gt;&lt;p&gt;Zine previously defaulted to adding these attributes automatically while now they are turned off by default. Define the setting to true if you want to preserve the previous behavior.&lt;/p&gt;&lt;p&gt;Note that you can always override this setting for each link by using explicit Scripty syntax when defining the link:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;md&quot;&gt;[my link]($link.url(https://example.com).new(true))
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;h5&gt;Upgrading your frontmatters&lt;/h5&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;@date&lt;/code&gt; has been replaced by &lt;code&gt;.date&lt;/code&gt; and &lt;code&gt;.unix&lt;/code&gt; (which accepts a unix timestamp instead of a string)&lt;/li&gt;&lt;li&gt;&lt;code&gt;.author&lt;/code&gt; has been replaced by &lt;code&gt;.authors&lt;/code&gt; which can be omitted and accepts a list of strings&lt;/li&gt;&lt;li&gt;Just like for the config file, structs now need a leading dot, which will affect you if:&lt;ul&gt;&lt;li&gt;did not use braceless top-level syntax for your frontmatter&lt;/li&gt;&lt;li&gt;define &lt;code&gt;alternatives&lt;/code&gt; as each is a struct&lt;/li&gt;&lt;li&gt;used struct syntax inside of your &lt;code&gt;custom&lt;/code&gt; data dictionary&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Some previously mandatory fields have now become optional, see the frontmatter Ziggy Schema for more info (it’s also present in the SuperMD section of the Zine docs).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In short, this is what it looks like.&lt;/p&gt;&lt;p&gt;Before:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;---
.title = &amp;quot;Home&amp;quot;,
.date = @date(&amp;quot;2018-07-06T00:00:00&amp;quot;),
.description = &amp;quot;&amp;quot;,
.author = &amp;quot;Loris Cro&amp;quot;,
.layout = &amp;quot;index.shtml&amp;quot;,
.alternatives = [{ 
    .name = &amp;quot;rss&amp;quot;,
    .layout = &amp;quot;rss.xml&amp;quot;, 
    .output = &amp;quot;/index.xml&amp;quot;,
}],
---
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;After:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;ziggy&quot;&gt;&lt;span class=&quot;error&quot;&gt;---&lt;/span&gt;
.&lt;span class=&quot;field&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;Home&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
.&lt;span class=&quot;field&quot;&gt;date&lt;/span&gt; &lt;span class=&quot;punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;.date&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;2018-07-06T00:00:00&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
.&lt;span class=&quot;field&quot;&gt;layout&lt;/span&gt; &lt;span class=&quot;punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;index.shtml&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
.&lt;span class=&quot;field&quot;&gt;alternatives&lt;/span&gt; &lt;span class=&quot;punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;punctuation_bracket&quot;&gt;[&lt;/span&gt;.&lt;span class=&quot;punctuation_bracket&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;comment_line&quot;&gt;// &amp;lt;-- note the dot!
&lt;/span&gt;    .&lt;span class=&quot;field&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;rss&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
    .&lt;span class=&quot;field&quot;&gt;layout&lt;/span&gt; &lt;span class=&quot;punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;rss.xml&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt; 
    .&lt;span class=&quot;field&quot;&gt;output&lt;/span&gt; &lt;span class=&quot;punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;/index.xml&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;punctuation_bracket&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;error&quot;&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For the &lt;code&gt;.author&lt;/code&gt; field my recommendation is to hardcode the author name in the template for personal websites where the author is essentially always the same person. The new &lt;code&gt;.authors&lt;/code&gt; field accepts a list of strings for cases where your have more complex needs.&lt;/p&gt;&lt;p&gt;In case that you do have more complex author management needs, don’t forget that you can use entries in the &lt;code&gt;.authors&lt;/code&gt; field not only as “directly printable” names, but also as keys into page navigation (e.g. each author has a dedicated page) or a &lt;code&gt;.custom&lt;/code&gt; field defined somewhere, maybe in &lt;code&gt;$site.custom&lt;/code&gt;, for example.&lt;/p&gt;&lt;/div&gt;</description>
    </item>
   
  
   
    <item>
     <pubDate>Wed, 17 Jun 2026 00:00:00 +0000</pubDate>
     <link>https://zine-ssg.io/log/#v0.11.3</link>
     <guid>https://zine-ssg.io/log/#v0.11.3</guid>
     <title>v0.11.3</title>
     <description>&lt;div id=&quot;v0.11.3&quot;&gt;&lt;p&gt; This release upgrades to Zig 0.17.0-dev all the way up from 0.15.0. I did not make a release for Zig 0.16.0 because of regressions in translate-c, which have now been fixed.&lt;/p&gt;&lt;p&gt;This release contains relatively few and small user-facing improvements and its main purpose is to isolate potential bugs that come from the Zig upgrade process from upcoming changes to Zine.&lt;/p&gt;&lt;p&gt;In the next version of Zine I will update Ziggy (the .smd frontmatter language) to a new version that changes some of the syntax, requiring you to do some work before you can use it.&lt;/p&gt;&lt;h3&gt;Bugfixes &amp; Breaking Changes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Only emit &lt;code&gt;id&lt;/code&gt; attributes from SuperMD when it has a set value. (&lt;a href=&quot;https://github.com/kristoff-it/zine/pull/198&quot; target=&quot;_blank&quot;&gt;#198&lt;/a&gt;, thanks GasInfinity!).&lt;/li&gt;&lt;li&gt;Fixed a bug where an empty &lt;code&gt;index.smd&lt;/code&gt; (i.e. no content, no frontmatter) would be partially picked up by Zine, creating a buggy section, which would then crash Zine under certain circumstances.&lt;/li&gt;&lt;li&gt;Fixed a bug where toggling a &lt;code&gt;.draft&lt;/code&gt; field from &lt;code&gt;false&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; would cause the Zine dev server to crash.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;New features&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;In SuperMD, you can now specify audio embeds, like so: &lt;code&gt;[](&amp;lt;$audio.asset(&amp;apos;music.wav&amp;apos;)&amp;gt;)&lt;/code&gt; (&lt;a href=&quot;https://github.com/kristoff-it/zine/pull/195&quot; target=&quot;_blank&quot;&gt;#195&lt;/a&gt;, thanks PowerUser64!).&lt;/li&gt;&lt;li&gt;In SuperHTML, added &lt;code&gt;.minus()&lt;/code&gt; to integers (&lt;a href=&quot;https://github.com/kristoff-it/zine/pull/188&quot; target=&quot;_blank&quot;&gt;#188&lt;/a&gt;, thanks acc1729!).&lt;/li&gt;&lt;li&gt;Releases now include a FreeBSD tarball (&lt;a href=&quot;https://github.com/kristoff-it/zine/pull/202&quot; target=&quot;_blank&quot;&gt;#202&lt;/a&gt;, thanks dmarker!).&lt;/li&gt;&lt;li&gt;Zig build system integration has been updated to Zig 0.17.0-dev (see the Zon file for more information).&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description>
    </item>
   
  
   
    <item>
     <pubDate>Fri, 21 Nov 2025 00:00:00 +0000</pubDate>
     <link>https://zine-ssg.io/log/#v0.11.2</link>
     <guid>https://zine-ssg.io/log/#v0.11.2</guid>
     <title>v0.11.2</title>
     <description>&lt;div id=&quot;v0.11.2&quot;&gt;&lt;p&gt;This release fixes some bugs that were discovered since the last and should not require any change for existing websites.&lt;/p&gt;&lt;p&gt;The next release will merge a new version of Ziggy (the data language used in SuperMD frontmatters) that instead will require you to change your content files, so brace for upcoming impact :^) In exchange though, the Ziggy language has improved a lot and you will finally be able to get great code intelligence, which will help you get your frontmatters right more easily. More on that in the next release.&lt;/p&gt;&lt;p&gt;Fixes:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Fixed rendering of links to alternatives when absolute paths are involved.&lt;/li&gt;&lt;li&gt;&lt;code&gt;zine init&lt;/code&gt; template files were created back before superhtml had good autoformatting support, resulting in a bunch of code moving around when you saved the file for the first time (using a new build of superhtml w/ more refined autoformatting behavior). Now the template files embedded in Zine have been formatted, giving you a better out-of-the-box experience.&lt;/li&gt;&lt;li&gt;Linking to the site homepage from SuperMD was impossible because of a bug and because of a missing feature. You can now use either vanilla syntax (&lt;code&gt;[home](/)&lt;/code&gt;) or explicit Scripty syntax (&lt;code&gt;$link.site()&lt;/code&gt;, just added in this release).&lt;/li&gt;&lt;li&gt;Zig build system integration: the serve step now correctly uses a prebuilt zine if you specify the &lt;code&gt;path&lt;/code&gt; option, previously it would ignore the setting and default to building Zine from scratch always.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description>
    </item>
   
  
   
    <item>
     <pubDate>Sat, 26 Jul 2025 00:00:00 +0000</pubDate>
     <link>https://zine-ssg.io/log/#v0.11.1</link>
     <guid>https://zine-ssg.io/log/#v0.11.1</guid>
     <title>v0.11.1</title>
     <description>&lt;div id=&quot;v0.11.1&quot;&gt;&lt;p&gt; Another round of bug fixes, with this release all known bugs have been solved!&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The &lt;code&gt;release&lt;/code&gt; and &lt;code&gt;serve&lt;/code&gt; commands dealt with some asset paths in an inconsistent manner, resulting in the situation where an asset path would work with only one of them at a time, depending on whether it was absolute or relative. Now all paths are normalized before being used.&lt;/li&gt;&lt;li&gt;An absolute install path given to a static asset would be interpreted as a absolute path by &lt;code&gt;release&lt;/code&gt;, resulting in an attempt to install assets outside of the output directory which is, generally speaking, not optimal. We now normalize paths to ensure we don’t try to override your &lt;code&gt;/etc/shadow&lt;/code&gt; (or &lt;code&gt;~/.ssh/id_rsa&lt;/code&gt;) by mistake :^)&lt;/li&gt;&lt;li&gt;Fixed some invalid memory accesses when deiniting a website build. These bugs shouldn’t have impacted the user experience and were in fact caught by CI.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description>
    </item>
   
  
   
    <item>
     <pubDate>Thu, 24 Jul 2025 00:00:00 +0000</pubDate>
     <link>https://zine-ssg.io/log/#v0.11.0</link>
     <guid>https://zine-ssg.io/log/#v0.11.0</guid>
     <title>v0.11.0</title>
     <description>&lt;div id=&quot;v0.11.0&quot;&gt;&lt;p&gt; This release brings minor backwards compatibility breakage and a few good bug fixes.&lt;/p&gt;&lt;h3&gt;Breaking change&lt;/h3&gt;&lt;p&gt;Zine will now refuse to output a website release to a non-empty directory. This solves the problem of users being surprised that old files are somehow still “being rendered” when they’re actually not, and this also seems a better choice than defaulting to emtpying the output dir, as that could have catastrophic consequences.&lt;/p&gt;&lt;p&gt;You can use &lt;code&gt;--force&lt;/code&gt; (or &lt;code&gt;-f&lt;/code&gt;) to ignore the presence of other files.&lt;/p&gt;&lt;p&gt;Related to this change &lt;code&gt;--install&lt;/code&gt; has been renamed to &lt;code&gt;--output&lt;/code&gt; since Zine now refuses to “install” releases.&lt;/p&gt;&lt;h3&gt;Bugfixes&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Added missing check to &lt;code&gt;nextPage?&lt;/code&gt;, &lt;code&gt;prevPage?&lt;/code&gt;, &lt;code&gt;hasNext&lt;/code&gt;, &lt;code&gt;hasPrev&lt;/code&gt; when the target page is the root index. The Zine section model defines the index page of a section to not be part of the section, consequently the root index cannot have any sibling. A proper error will be reported now.&lt;/li&gt;&lt;li&gt;Ziggy parsing code failed to report syntax errors in string escapes, resulting in the confusing situation where an error is being reported but the list of diagnostics is empty. This is now reported correctly.&lt;/li&gt;&lt;li&gt;SuperMD would mistake &lt;code&gt;![](https://foo.com/myphoto.jpg)&lt;/code&gt; (i.e. remote url in vanilla image syntax) for a local asset. This has now been fixed.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description>
    </item>
   
  
   
    <item>
     <pubDate>Wed, 16 Jul 2025 00:00:00 +0000</pubDate>
     <link>https://zine-ssg.io/log/#v0.10.4</link>
     <guid>https://zine-ssg.io/log/#v0.10.4</guid>
     <title>v0.10.4</title>
     <description>&lt;div id=&quot;v0.10.4&quot;&gt;&lt;p&gt; This release upgrades Zine to Zig 0.15.0-dev (post Writergate) and fixes two silly bugs about build assets:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;The Zine live server will now correctly serve build assets (&lt;a href=&quot;https://github.com/kristoff-it/zine/pull/162&quot; target=&quot;_blank&quot;&gt;#162&lt;/a&gt;, thanks llyrical-island!).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Up until now Zine failed to install all build assets when making a site release. Turns out that we were missing the required code entirely, whoops!&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;As an upgrade suggestion, if you have a website that uses build.zig and you don’t want to upgrade your own code to Zig 0.15.0-dev (post Writergate), then consider using in your build.zig &lt;code&gt;.zine = .{ .path = null }&lt;/code&gt; (it’s a field of &lt;code&gt;zine.Options&lt;/code&gt;), which will allow you to use a system-provided build of Zine.&lt;/p&gt;&lt;p&gt;Of course that won’t solve potential CI issues, but you will at least be able to try it out locally. If you’re in that situation, do try to upgrade your code it’s going to be worth it, especially in preparation for the upcoming async I/O redesign coming soon to Zig!&lt;/p&gt;&lt;/div&gt;</description>
    </item>
   
  
   
    <item>
     <pubDate>Mon, 07 Jul 2025 00:00:00 +0000</pubDate>
     <link>https://zine-ssg.io/log/#v0.10.3</link>
     <guid>https://zine-ssg.io/log/#v0.10.3</guid>
     <title>v0.10.3</title>
     <description>&lt;div id=&quot;v0.10.3&quot;&gt;&lt;p&gt; After hiatus of a few months, I’m resuming development of Zine. This release contains bug fixes and minor improvements.&lt;/p&gt;&lt;p&gt;This new Zine development season will focus on two main new big features:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;SuperHTML snippets, so the ability to create reusable components&lt;/li&gt;&lt;li&gt;LSP support for Scripty&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;New changes:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Zine development server:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Added ipv6 support (&lt;a href=&quot;https://github.com/kristoff-it/zine/pull/146&quot; target=&quot;_blank&quot;&gt;#146&lt;/a&gt;, thanks Spiffyk!).&lt;/li&gt;&lt;li&gt;Fixed a crash when trying to some paths with a missing trailing slash.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;SuperHTML:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Added &lt;code&gt;str()&lt;/code&gt; to &lt;code&gt;Int&lt;/code&gt; to make it possible to use them in formatting (&lt;a href=&quot;https://github.com/kristoff-it/zine/pull/140&quot; target=&quot;_blank&quot;&gt;#140&lt;/a&gt;, thanks knutwalker!).&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description>
    </item>
   
  
   
    <item>
     <pubDate>Tue, 22 Apr 2025 00:00:00 +0000</pubDate>
     <link>https://zine-ssg.io/log/#v0.10.2</link>
     <guid>https://zine-ssg.io/log/#v0.10.2</guid>
     <title>v0.10.2</title>
     <description>&lt;div id=&quot;v0.10.2&quot;&gt;&lt;ul&gt;&lt;li&gt;SuperHTML:&lt;ul&gt;&lt;li&gt;Fixed a crash when using &lt;code&gt;$page.alternative()&lt;/code&gt;, in the refactoting to standalone I forgot to wire back some state management, resulting in a reliable crash when using that function. Sorry! Now it’s fixed though.&lt;/li&gt;&lt;li&gt;DateTime: introduced the ability to add and subtract time durations to a DateTime.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;SuperMD:&lt;ul&gt;&lt;li&gt;Fixed a crash when providing a URL to the root path in some directives.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Zine Development Server:&lt;ul&gt;&lt;li&gt;The hot reload script injected to your pages now has a &lt;code&gt;defer&lt;/code&gt; attribute which helps simplify local performance testing of your website.&lt;/li&gt;&lt;li&gt;Fixed websocket disconnections when the client sent long headers, particularly felt on Windows ((&lt;a href=&quot;https://github.com/kristoff-it/zine/pull/139&quot; target=&quot;_blank&quot;&gt;#139&lt;/a&gt;) thanks Scott!).&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Added nix flake ((&lt;a href=&quot;https://github.com/kristoff-it/zine/pull/143&quot; target=&quot;_blank&quot;&gt;#143&lt;/a&gt;) thanks sreehax!)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description>
    </item>
   
  
   
    <item>
     <pubDate>Thu, 10 Apr 2025 00:00:00 +0000</pubDate>
     <link>https://zine-ssg.io/log/#v0.10.1</link>
     <guid>https://zine-ssg.io/log/#v0.10.1</guid>
     <title>v0.10.1</title>
     <description>&lt;div id=&quot;v0.10.1&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;SuperMD:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Added support for &lt;a href=&quot;/docs/supermd/scripty/#Image.size&quot;&gt;&lt;code&gt;$image.size()&lt;/code&gt;&lt;/a&gt;&lt;br&gt;(specify image size manually)&lt;/li&gt;&lt;li&gt;Added support for fragments in Markdown vanilla link syntax. Now &lt;code&gt;[](/my/page/#my-ref)&lt;/code&gt; will correctly translate to &lt;code&gt;$link.page(&amp;apos;my/page&amp;apos;).ref(&amp;apos;my-ref&amp;apos;)&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;SuperHTML:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Added support for &lt;a href=&quot;/docs/superhtml/scripty/#Date.in&quot;&gt;&lt;code&gt;Date.in()&lt;/code&gt;&lt;/a&gt;&lt;br&gt;(change tz of a date based on a location string)&lt;/li&gt;&lt;li&gt;Added support for &lt;a href=&quot;/docs/superhtml/scripty/#String.startsWith&quot;&gt;&lt;code&gt;String.startsWith()&lt;/code&gt;&lt;/a&gt;&lt;br&gt;(&lt;a href=&quot;https://github.com/kristoff-it/zine/pull/137&quot; target=&quot;_blank&quot;&gt;#137&lt;/a&gt;, thanks illfygli!)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Bugfixes:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Fixed one memory corruption bug that could cause Zine to crash on startup (&lt;a href=&quot;https://github.com/kristoff-it/zine/commit/fc0b117f43d1ab985cc06b0c9a0639bd4479cd47&quot; target=&quot;_blank&quot;&gt;fc0b117&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;Fixed some path manipulation inconsistencies on Windows, now CI is green also for the greatest OS ever made.&lt;/li&gt;&lt;li&gt;The help menu wrongly suggested to use &lt;code&gt;--output&lt;/code&gt; to specify an install path, while the correct string is &lt;code&gt;--install&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;Zine checks for output path collisions but a bug in how page aliases were handled in the code could cause false positives.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description>
    </item>
   
  
   
    <item>
     <pubDate>Tue, 08 Apr 2025 00:00:00 +0000</pubDate>
     <link>https://zine-ssg.io/log/#v0.10.0</link>
     <guid>https://zine-ssg.io/log/#v0.10.0</guid>
     <title>v0.10.0</title>
     <description>&lt;div id=&quot;v0.10.0&quot;&gt;&lt;h3&gt;Standalone Zine is here!&lt;/h3&gt;&lt;p&gt;It’s finally time to release the standalone version of Zine:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;it’s &lt;em&gt;stupid&lt;/em&gt; fast&lt;/li&gt;&lt;li&gt;it’s more strict than before&lt;/li&gt;&lt;li&gt;it removed almost all limitations (e.g. rendering other pages via scripty)&lt;/li&gt;&lt;li&gt;&lt;em&gt;it might have added new bugs as many things were reimplemented, sorry!&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/kristoff-it/zine/releases/&quot; target=&quot;_blank&quot;&gt;Download&lt;/a&gt; a prebuilt version to try it out.&lt;/p&gt;&lt;div class=&quot;block warning&quot;&gt;&lt;h1&gt;WARNING&lt;/h1&gt;&lt;p&gt;We have updated the suggested way of deploying to GitHub Pages, and for all GitHub based deployments you will want to check out &lt;a href=&quot;https://github.com/marketplace/actions/setup-zine&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;kristoff-it/setup-zine&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;If you’re a new user of Zine, I highly recommend you start by running &lt;code&gt;zine init&lt;/code&gt; in an empty folder to get a sample website bootstrapped for you by Zine.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;For existing users, here’s the upgrade guide after you have downloaded Zine and put it in PATH:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Create a &lt;code&gt;zine.ziggy&lt;/code&gt; file in your website’s root directory. Every option your original build.zig can be ported over except &lt;code&gt;build_assets&lt;/code&gt; (but &lt;a href=&quot;/docs/zig/&quot;&gt;build.zig integration still exists&lt;/a&gt; if you need that), here’s an example:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;ziggy&quot;&gt;&lt;span class=&quot;error&quot;&gt;Site &lt;/span&gt;&lt;span class=&quot;error punctuation_bracket&quot;&gt;{&lt;/span&gt;
   .&lt;span class=&quot;field&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;Zine - Static Site Generator&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
   .&lt;span class=&quot;field&quot;&gt;host_url&lt;/span&gt; &lt;span class=&quot;punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;https://zine-ssg.io&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
   .&lt;span class=&quot;field&quot;&gt;content_dir_path&lt;/span&gt; &lt;span class=&quot;punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;content&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
   .&lt;span class=&quot;field&quot;&gt;layouts_dir_path&lt;/span&gt; &lt;span class=&quot;punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;layouts&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
   .&lt;span class=&quot;field&quot;&gt;assets_dir_path&lt;/span&gt; &lt;span class=&quot;punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;assets&amp;quot;&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
   .&lt;span class=&quot;field&quot;&gt;static_assets&lt;/span&gt; &lt;span class=&quot;punctuation&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;punctuation_bracket&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;comment_line&quot;&gt;// omitted for brevity
&lt;/span&gt;   &lt;span class=&quot;punctuation_bracket&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;punctuation_delimiter&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;error punctuation_bracket&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;Run &lt;code&gt;zine&lt;/code&gt; to activate the development server and watch the errors that it reports. Zine has become a bit more strict when it comes to paths and it might complain about absolute paths in locations where it previously accepted them. Most errors should be straight forward to fix. The only breaking change that will silently cause issues is that previously &lt;code&gt;aliases&lt;/code&gt; and &lt;code&gt;alternatives&lt;/code&gt; output paths were always relative to the website root, while now a relative path will place the alias / alternative in a subdir of the current page if the output path provided is relative.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;If your website is complex enough, you might want to diff the new version against the old. Assuming you have a build in &lt;code&gt;zig-out/&lt;/code&gt; or a similar location, you can run these commands to get a diff:&lt;/p&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;constant operator function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;constant function&quot;&gt; &lt;/span&gt;&lt;span class=&quot;constant property function&quot;&gt;zine&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;release&lt;/span&gt;
&lt;span class=&quot;constant operator function&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;constant function&quot;&gt; &lt;/span&gt;&lt;span class=&quot;constant property function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;diff&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;--word-diff=color&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;--no-index&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;zig-out&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;public&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The first command will output your website to &lt;code&gt;public/&lt;/code&gt; which then you can diff against an older build of your website. &lt;strong&gt;You should not expect the diff to be perfectly empty&lt;/strong&gt;, as some minor rendering details have changed, &lt;strong&gt;but all the changes should be positive once you inspect them&lt;/strong&gt;. If you see a change that seems wrong, please open an issue with a reproducer. We don’t need the full diff, just the sources to produce the new output and an indication of what is wrong (and why you think the output is wrong).&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This release adds a ton of improvements to Zine, here are just a couple highlights for brevity:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The official docs have been rewritten to reflect the changes, and most importantly I’ve finally added navigation to the Scripty references. Go take a look, they’re pretty cool in my opinion :^)&lt;/li&gt;&lt;li&gt;Added support for math formulas in SuperMD via &lt;code&gt;$mathtex&lt;/code&gt;. Unfortunately we depend on JavaScript for runtime rendering, but eventually we will have our own parser to do everything at build time.&lt;/li&gt;&lt;li&gt;TreeSitter highlighting now captures more classes for tokens thanks to Willians Faria (&lt;a href=&quot;https://github.com/kristoff-it/zine/pull/131&quot; target=&quot;_blank&quot;&gt;#131&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description>
    </item>
   
  
   
    <item>
     <pubDate>Tue, 11 Mar 2025 00:00:00 +0000</pubDate>
     <link>https://zine-ssg.io/log/#v0.9.0</link>
     <guid>https://zine-ssg.io/log/#v0.9.0</guid>
     <title>v0.9.0</title>
     <description>&lt;div id=&quot;v0.9.0&quot;&gt;&lt;div class=&quot;block warning&quot;&gt;&lt;h1&gt;NEW ZINE&lt;/h1&gt;&lt;p&gt;At some point after the last release I started working on a standalone version of Zine that doesn’t depend on the Zig build system anymore, meaning that you will be able to download a &lt;span class=&quot;important &quot;&gt;&lt;code&gt;zine&lt;/code&gt;&lt;/span&gt; executable and run &lt;span class=&quot;important &quot;&gt;&lt;code&gt;zine serve&lt;/code&gt;&lt;/span&gt; without even needing to have Zig installed. I will write more on it once the work is done, but you should expect plenty of improvement with no downsides as it will still be optionally possible to integrate with the Zig build system as needed. &lt;span class=&quot;important &quot;&gt;ETA is a few weeks from now&lt;/span&gt;.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;THIS MEANS&lt;/strong&gt; that this is the last big release of Zine in its current form. Unless current users of Zine report regressions, I will focus entirely on the new standalone version.&lt;/p&gt;&lt;h4&gt;Let’s start with the BREAKING CHANGES:&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Zine now depends on Zig 0.14.0&lt;/strong&gt;, which means that you will also need to change your website’s &lt;code&gt;build.zig.zon&lt;/code&gt;. &lt;span class=&quot;important &quot;&gt;Starting from the next version of Zine this will not be necessary anymore as you will only need a &lt;code&gt;zine.ziggy&lt;/code&gt; file to define your website’s configuration&lt;/span&gt;. That said, here are the changes you will need to make to your &lt;code&gt;build.zig.zon&lt;/code&gt; for this version of Zine after upgrading to Zig 0.14.0:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Change &lt;code&gt;name&lt;/code&gt; from a string to a Zig enum, like so: &lt;code&gt;.name = .site&lt;/code&gt;. Note that this field is required by Zig but not used by Zine so any valid value is fine.&lt;/li&gt;&lt;li&gt;Run &lt;code&gt;zig build&lt;/code&gt; after fixing the name field and watch the compiler report a new error. This error will tell you that you need to add a &lt;code&gt;fingerprint&lt;/code&gt; field. What’s important is that &lt;strong&gt;it will also suggest a value&lt;/strong&gt; to give to the new field. Copy it and paste it into your Zon file (right below &lt;code&gt;version&lt;/code&gt; is a good place where to put it) like so: &lt;code&gt;.fingerprint = 0xAAAAAAAAAA&lt;/code&gt; (where &lt;code&gt;0xAAAAAAAAAA&lt;/code&gt; is the value suggested by Zig).&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;$page.prevPage()&lt;/code&gt; and &lt;code&gt;$page.nextPage()&lt;/code&gt; have been renamed to &lt;code&gt;$page.prevPage?()&lt;/code&gt; and &lt;code&gt;$page.nextPage?()&lt;/code&gt; respectively. The policy in Zine is to have all builtin functions that return an &lt;code&gt;Optional&lt;/code&gt; to end with a question mark.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Other &lt;span class=&quot;important &quot;&gt;new features&lt;/span&gt; in Zine:&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Zine is now MIT licensed. It was actually intended to be that from the start but I forgot to add the file. Consider this a reverse rugpull where from proprietary we went to open source. A rug has been pushed under your feet, in a sense.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Zine can now render footnotes in SuperMD files! Note that you will need to change your SuperHTML templates to explicitly print footnotes (if present). See &lt;a href=&quot;/docs/superhtml/scripty/#Page.footnotes?&quot;&gt;&lt;code&gt;$page.footnotes?()&lt;/code&gt;&lt;/a&gt; for more info. This change was contributed by Brandon in &lt;a href=&quot;https://github.com/kristoff-it/zine/pull/90&quot; target=&quot;_blank&quot;&gt;#90&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Introduced opt-in automated image size attributes for local images! When enabled, this feature will make Zine add automatically &lt;code&gt;height&lt;/code&gt; and &lt;code&gt;width&lt;/code&gt; attributes to image assets embedded in SuperMD files. Doing so will mean that the browser will be able to know the size of all images even before downloading them, completely removing the need for reflowing the page, and overall giving the impression of a much faster page load. See &lt;a href=&quot;/docs/assets/#autosize&quot;&gt;this section&lt;/a&gt; for more info on how to enable it. This feature was contributed in &lt;a href=&quot;https://github.com/kristoff-it/zine/pull/88&quot; target=&quot;_blank&quot;&gt;#88&lt;/a&gt;, thank you pfg!&lt;/p&gt;&lt;div class=&quot;block&quot;&gt;&lt;h1&gt;NOTE&lt;/h1&gt;&lt;p&gt;If you were using main branch Zine, this might be perceived as a breaking change because this feature was enabled by default when first added (but it was never part of a full release so it’s not listed under breaking changes).&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Added &lt;code&gt;Array.first?()&lt;/code&gt; and &lt;code&gt;Array.last?()&lt;/code&gt;, which will return the first and last item in an array, respectively, or &lt;code&gt;null&lt;/code&gt; if the array is empty. This can be useful to implement advanced prev-next page navigation that crosses site section boundaries, &lt;a href=&quot;/docs/frequent/#prev-next&quot;&gt;as explained here&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Added in SuperMD &lt;a href=&quot;/docs/supermd/scripty/#Link.alternative&quot;&gt;&lt;code&gt;$link.alternative&lt;/code&gt;&lt;/a&gt;, which allows linking to an alternative version specified in the target page (by using the &lt;code&gt;alternatives&lt;/code&gt; frontmatter field).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The Zine dev server now implements debouncing in order to avoid issuing a flurry of rebuilds when an editor splits a file save operation into multiple file system level events. The dev server has a new related CLI flag, run &lt;code&gt;zig build help&lt;/code&gt; for more info.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;New version of flow-syntax by neurocyte brings syntax highlighting support for:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Gleam&lt;/li&gt;&lt;li&gt;CMake (to make it easier for you to port CMake to build.zig using &lt;a href=&quot;https://github.com/neurocyte/flow&quot; target=&quot;_blank&quot;&gt;flow&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Astro (not sure what that’s used for, probably nothing interesting)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Here are the bugfixes:&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Git information parsing would error out when a repo only had one commit in it. This has been fixed in &lt;a href=&quot;https://github.com/kristoff-it/zine/pull/85&quot; target=&quot;_blank&quot;&gt;#85&lt;/a&gt;, thank you Brandon!&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The Zig stdlib has a bug that causes the webserver to deadlock on Windows, Zine has a temporary workaround in it but I had left a mistake in the code that was fixed in &lt;a href=&quot;https://github.com/kristoff-it/zine/pull/86&quot; target=&quot;_blank&quot;&gt;#89&lt;/a&gt;, thank you again Brandon!&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Added support for query parameters in URLs in Zine’s dev server (&lt;a href=&quot;https://github.com/kristoff-it/zine/pull/87]&quot; target=&quot;_blank&quot;&gt;#87&lt;/a&gt;), thank you Techatrix!&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Zine now uses a new version of &lt;a href=&quot;https://github.com/rockorager/zeit&quot; target=&quot;_blank&quot;&gt;Zeit&lt;/a&gt; by rockorarger which fixes a couple minor bugs in date time handling (&lt;a href=&quot;https://github.com/kristoff-it/zine/pull/91&quot; target=&quot;_blank&quot;&gt;#91&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Links generated for page &lt;code&gt;alternatives&lt;/code&gt; would erroneously add a trailing slash, fixed in (&lt;a href=&quot;https://github.com/kristoff-it/zine/pull/103&quot; target=&quot;_blank&quot;&gt;#103&lt;/a&gt;) by Anthon, thanks!&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Fixed hot-reloading support in the Zine dev server on Windows in (&lt;a href=&quot;https://github.com/kristoff-it/zine/pull/116&quot; target=&quot;_blank&quot;&gt;#116&lt;/a&gt;), thanks MiXiPi!&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Previously, defining a page alias that contained new directories would cause an error when outputting the website. This has been fixed in (&lt;a href=&quot;https://github.com/kristoff-it/zine/pull/122&quot; target=&quot;_blank&quot;&gt;#122&lt;/a&gt;), thanks deevus!&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description>
    </item>
   
  
   
    <item>
     <pubDate>Mon, 28 Oct 2024 00:00:00 +0000</pubDate>
     <link>https://zine-ssg.io/log/#v0.8.0</link>
     <guid>https://zine-ssg.io/log/#v0.8.0</guid>
     <title>v0.8.0</title>
     <description>&lt;div id=&quot;v0.8.0&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Page alternatives now require you to set the &lt;code&gt;name&lt;/code&gt; field.&lt;/strong&gt; You will get a build error if the name is not defined. It would previously default to an empty string, but now it’s mandatory because of the newly added builtins.&lt;/li&gt;&lt;li&gt;SuperMD&lt;ul&gt;&lt;li&gt;Added some error checking to SuperMD builtins that relate to links, like trying to use &lt;code&gt;$link.ref&lt;/code&gt; in combination with &lt;code&gt;$link.url&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;code&gt;$link.alternative(&amp;apos;rss&amp;apos;)&lt;/code&gt; to link to a page alternative&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;SuperHTML&lt;ul&gt;&lt;li&gt;Fixed documentation for &lt;code&gt;linkRef&lt;/code&gt;, which wrongly reported it did not accept any argument.&lt;/li&gt;&lt;li&gt;Added &lt;code&gt;$page.alternative(&amp;apos;rss&amp;apos;)&lt;/code&gt; which allows you to obtain an &lt;code&gt;Alternative&lt;/code&gt; value by name (instead of looping over all &lt;code&gt;$page.alternatives&lt;/code&gt;).&lt;/li&gt;&lt;li&gt;Added &lt;code&gt;link()&lt;/code&gt; to &lt;code&gt;Alternative&lt;/code&gt; so you can now link to RSS feeds like so:&lt;pre&gt;&lt;code class=&quot;html&quot;&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;ctx&lt;/span&gt; &lt;span class=&quot;attribute&quot;&gt;alt&lt;/span&gt;=&amp;quot;&lt;span class=&quot;string&quot;&gt;$page.alternative(&amp;apos;rss&amp;apos;)&lt;/span&gt;&amp;quot;&lt;span class=&quot;punctuation_bracket&quot;&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;punctuation_bracket&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;attribute&quot;&gt;href&lt;/span&gt;=&amp;quot;&lt;span class=&quot;string&quot;&gt;$ctx.alt.link()&lt;/span&gt;&amp;quot; &lt;span class=&quot;attribute&quot;&gt;type&lt;/span&gt;=&amp;quot;&lt;span class=&quot;string&quot;&gt;$ctx.alt.type&lt;/span&gt;&amp;quot;&lt;span class=&quot;punctuation_bracket&quot;&gt;&amp;gt;&lt;/span&gt;
    RSS feed
  &lt;span class=&quot;punctuation_bracket&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;punctuation_bracket&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;punctuation_bracket&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
(the Frequently Asked Questions section was updated accordingly)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description>
    </item>
   
  
   
    <item>
     <pubDate>Fri, 25 Oct 2024 00:00:00 +0000</pubDate>
     <link>https://zine-ssg.io/log/#v0.7.2</link>
     <guid>https://zine-ssg.io/log/#v0.7.2</guid>
     <title>v0.7.2</title>
     <description>&lt;div id=&quot;v0.7.2&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Windows should now work well. A path-related bug that caused assets to not be detected correctly has now been fixed, and a second bug that caused the webserver to fail to update when a new change happened has also been “fixed” (it’s actually an annoying networking bug unrelated to Zine, so we implemented a workaround). In any case, &lt;strong&gt;Windows should now be a first-class citizen for Zine&lt;/strong&gt; so please consider &lt;em&gt;rawdogging&lt;/em&gt; Zine on Windows instead of using Docker/WSL (also report any issue you find!).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;In the previous release I added by mistake some debug logs that could not be silenced and that caused the webserver to show your the error window even when no error had happened, this is now fixed, sorry!&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Creating duplicate ids inside of a content file is now properly reported as an error by Zine. Some ids would also not be correctly recorded (for the purpose of deeplinking) before, and that too has been fixed now.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;New SuperHTML Scripty builtins:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;$page.linkRef(&amp;apos;foo&amp;apos;)&lt;/code&gt; can be used to deep-link from SuperHTML templates&lt;/li&gt;&lt;li&gt;&lt;code&gt;sriHash()&lt;/code&gt; can be called on assets to generate a hash for &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity&quot; target=&quot;_blank&quot;&gt;Subresource Integrity&lt;/a&gt;, thanks Shardion (&lt;a href=&quot;https://github.com/kristoff-it/zine/pull/73&quot; target=&quot;_blank&quot;&gt;#73&lt;/a&gt;)!&lt;/li&gt;&lt;li&gt;&lt;code&gt;$build.git()&lt;/code&gt; can be used to access repo information when in a repository, see the SuperHTML Scripty reference for more information, thanks Sc3l3t0n (&lt;a href=&quot;https://github.com/kristoff-it/zine/pull/77&quot; target=&quot;_blank&quot;&gt;#77&lt;/a&gt;)!&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description>
    </item>
   
  
   
    <item>
     <pubDate>Wed, 16 Oct 2024 00:00:00 +0000</pubDate>
     <link>https://zine-ssg.io/log/#v0.7.1</link>
     <guid>https://zine-ssg.io/log/#v0.7.1</guid>
     <title>v0.7.1</title>
     <description>&lt;div id=&quot;v0.7.1&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;When using the simplified &lt;code&gt;website()&lt;/code&gt; / &lt;code&gt;multilingualWebsite()&lt;/code&gt; interface, you can now pass &lt;code&gt;-Dinclude-drafts&lt;/code&gt; flag to enable rendering of content pages that have &lt;code&gt;.draft = true&lt;/code&gt; set in their frontmatter. Thank you nihklas (&lt;a href=&quot;https://github.com/kristoff-it/zine/pull/70&quot; target=&quot;_blank&quot;&gt;#70&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;New SuperHTML Scripty builtin functions:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;$page.hasContentSection&lt;/code&gt;: You can now query a page to see if it contains a content section with a given id. Thanks nihklas (&lt;a href=&quot;https://github.com/kristoff-it/zine/pull/76&quot; target=&quot;_blank&quot;&gt;#76&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;&lt;code&gt;$page.subpagesAlphabetic&lt;/code&gt;: lists sub pages sorted in alphabetic order. Unblocks rockorager’s &lt;a href=&quot;https://culver.house/recipes/&quot; target=&quot;_blank&quot;&gt;recipe website&lt;/a&gt;. Recipe websites are good, make more of them.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;New SuperMD Scripty directive:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;$text&lt;/code&gt;, which can be used to give an id and attributes to a inline piece of text.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description>
    </item>
   
  
   
    <item>
     <pubDate>Fri, 11 Oct 2024 00:00:00 +0000</pubDate>
     <link>https://zine-ssg.io/log/#v0.7.0</link>
     <guid>https://zine-ssg.io/log/#v0.7.0</guid>
     <title>v0.7.0</title>
     <description>&lt;div id=&quot;v0.7.0&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Introduced actual arrays in Zine. Previously we would immediately evaluate Scripty expressions into iterators, which made it awkward to implement bulitin functions such as &lt;code&gt;sort&lt;/code&gt;. Zine now has a real concept of Array with dedicated builtins, you can read more in the reference for &lt;a href=&quot;/docs/superhtml/scripty/#Array&quot;&gt;&lt;code&gt;[any]&lt;/code&gt;&lt;/a&gt;. Note that arrays don’t yet offer a sorting builtin (figuring out the interface to expose to the user has been left as work for a subsequent release), but they do support other basic stuff like slicing. I’m happy to work with users to implement functions that would unblock them, even if the design of the function will have to be changed in the future.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Zine currently has a limitation that prevents it from correctly rendering (calling &lt;code&gt;content()&lt;/code&gt; on) pages that have been loaded through Scripty. Over time this limitation has been mitigated, but it’s not fully gone yet. Unfortunately the check that told you that this was the case was not working correctly, and has now been fixed. The most likely situation where you might encounter this problem is when trying to render the content of various pages in an RSS template. Previously it might have worked for simple cases and caused a panic in others, now you will get a consistent error message that tells you that the feature is not available yet.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The webserver now properly parses percent encoding in URLs, used whenever files have funky names. Thank you GigaGrunch! (&lt;a href=&quot;https://github.com/kristoff-it/zine/pull/65&quot; target=&quot;_blank&quot;&gt;#65&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Paths with spaces were not handled correctly when tracking dependencies, causing some failures that might have looked like cache issues, now fixed thanks to brandondyck (&lt;a href=&quot;https://github.com/kristoff-it/zine/pull/68&quot; target=&quot;_blank&quot;&gt;#68&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description>
    </item>
   
  
   
    <item>
     <pubDate>Thu, 19 Sep 2024 00:00:00 +0000</pubDate>
     <link>https://zine-ssg.io/log/#v0.6.3</link>
     <guid>https://zine-ssg.io/log/#v0.6.3</guid>
     <title>v0.6.3</title>
     <description>&lt;div id=&quot;v0.6.3&quot;&gt;&lt;ul&gt;&lt;li&gt;When iterating &lt;strong&gt;content sections&lt;/strong&gt; with &lt;code&gt;$page.contentSections()&lt;/code&gt;, you can now obtain the section’s attached heading by calling &lt;a href=&quot;/docs/superhtml/scripty/#ContentSection.heading&quot;&gt;&lt;code&gt;heading&lt;/code&gt;&lt;/a&gt; or &lt;a href=&quot;/docs/superhtml/scripty/#ContentSection.heading?&quot;&gt;&lt;code&gt;heading?&lt;/code&gt;&lt;/a&gt; on it. This was added mainly to support the usecase of giving titles to RSS entries generated from sections.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description>
    </item>
   
  
   
    <item>
     <pubDate>Tue, 17 Sep 2024 00:00:00 +0000</pubDate>
     <link>https://zine-ssg.io/log/#v0.6.2</link>
     <guid>https://zine-ssg.io/log/#v0.6.2</guid>
     <title>v0.6.2</title>
     <description>&lt;div id=&quot;v0.6.2&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;$image.linked()&lt;/code&gt; is now implemented and allows you to quickly create an image that links to itself.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description>
    </item>
   
  
   
    <item>
     <pubDate>Sat, 07 Sep 2024 00:00:00 +0000</pubDate>
     <link>https://zine-ssg.io/log/#v0.6.1-vscode</link>
     <guid>https://zine-ssg.io/log/#v0.6.1-vscode</guid>
     <title>v0.6.1-vscode</title>
     <description>&lt;div id=&quot;v0.6.1-vscode&quot;&gt;&lt;ul&gt;&lt;li&gt;The VSCode marketplace now has a &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=LorisCro.supermd&quot; target=&quot;_blank&quot;&gt;SuperMD Extension&lt;/a&gt; that gives you syntax highlighting for SuperMD files (no LSP for it yet though, sorry!).&lt;/li&gt;&lt;li&gt;Similarly, the VSCode &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=LorisCro.superhtml&quot; target=&quot;_blank&quot;&gt;SuperHTML Extension&lt;/a&gt; would not provide you with syntax highlighting before, but now it does.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description>
    </item>
   
  
   
    <item>
     <pubDate>Sat, 07 Sep 2024 00:00:00 +0000</pubDate>
     <link>https://zine-ssg.io/log/#v0.6.1</link>
     <guid>https://zine-ssg.io/log/#v0.6.1</guid>
     <title>v0.6.1</title>
     <description>&lt;div id=&quot;v0.6.1&quot;&gt;&lt;ul&gt;&lt;li&gt;Updated &lt;a href=&quot;https://github.com/rockorager/zeit&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;rockorager/zeit&lt;/code&gt;&lt;/a&gt;, which now includes full support for date formatting strings based on the Go magic date. Previously Zine hardcoded only a very small subset of possible formatting styles. See the reference docs for &lt;a href=&quot;https://zine-ssg.io/docs/superhtml/scripty#Date.format&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;Date.format&lt;/code&gt;&lt;/a&gt; for more info.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description>
    </item>
   
  
   
    <item>
     <pubDate>Fri, 06 Sep 2024 00:00:00 +0000</pubDate>
     <link>https://zine-ssg.io/log/#v0.6.0</link>
     <guid>https://zine-ssg.io/log/#v0.6.0</guid>
     <title>v0.6.0</title>
     <description>&lt;div id=&quot;v0.6.0&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Added &lt;code&gt;Page.parentSection()&lt;/code&gt; in SuperHTML.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The website now has a docs section &lt;a href=&quot;https://zine-ssg.io/docs/editors/&quot; target=&quot;_blank&quot;&gt;for editor support&lt;/a&gt;.&lt;br&gt;Follow those instructions to get syntax highlighting and LSP support in your favorite editor.&lt;br&gt;&lt;strong&gt;If you have trouble setting up your editor feel free to &lt;a href=&quot;https://zine-ssg.io/community/&quot; target=&quot;_blank&quot;&gt;ask for help in the community&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description>
    </item>
   
  
   
    <item>
     <pubDate>Wed, 04 Sep 2024 00:00:00 +0000</pubDate>
     <link>https://zine-ssg.io/log/#v0.5.1</link>
     <guid>https://zine-ssg.io/log/#v0.5.1</guid>
     <title>v0.5.1</title>
     <description>&lt;div id=&quot;v0.5.1&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Added typst syntax highlighting support.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;On the topic of RSS feeds, this page &lt;a href=&quot;https://zine-ssg.io/log/index.xml&quot; target=&quot;_blank&quot;&gt;now has an RSS feed&lt;/a&gt; that you can subscribe to. Every entry in this devlog will become an entry in the RSS feed. If you’re curious to see how this is implemented, clone this repo and see how &lt;code&gt;content/log.smd&lt;/code&gt; and &lt;code&gt;layouts/log.xml&lt;/code&gt; work together to make it happen (see &lt;a href=&quot;/quickstart/&quot;&gt;Get Started&lt;/a&gt; for more info).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code&gt;Page&lt;/code&gt; in SuperHTML gained the ability to loop over sections defined by a Page.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;SuperMD Directives can now store data (key-value fields) that can then be accessed programmtically by SuperHTML.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description>
    </item>
   
  
   
    <item>
     <pubDate>Sun, 01 Sep 2024 00:00:00 +0000</pubDate>
     <link>https://zine-ssg.io/log/#v0.5.0</link>
     <guid>https://zine-ssg.io/log/#v0.5.0</guid>
     <title>v0.5.0</title>
     <description>&lt;div id=&quot;v0.5.0&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Added &lt;a href=&quot;/docs/superhtml/scripty/#Build&quot;&gt;&lt;code&gt;$build.generated&lt;/code&gt;&lt;/a&gt; which evaluates to the date in which the build is taking place. It doesn’t add a dependency on the current date so a page will only display a newer date if it actually gets regenerated.&lt;/p&gt;&lt;p&gt;Useful for example to set &lt;code&gt;lastBuildDate&lt;/code&gt; in RSS feeds. Note that without caching the date will always be updated, potentially resulting in unwanted behavior.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description>
    </item>
   
  
   
  
 </channel>
</rss>
