<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>blog - Fanstatic</title>
        <link>https://fanstatic.mass4.org/blog/index.xml</link>
        <description>Tastiest C# Static Site Generator of the World</description>
        <pubDate></pubDate>
        <lastBuildDate>2026-09-25T21:50:59Z</lastBuildDate>
        <atom:link
            href="https://fanstatic.mass4.org/blog/index.xml"
            rel="self"
            type="application/rss+xml"
        />

        

    <item>
    <title>Introducing Fanstatic 7.0.0</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/introducing-fanstatic-7.0.0/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/introducing-fanstatic-7.0.0/index.xml</link>
    <pubDate>2026-09-18T00:00:00Z</pubDate>
    <description><![CDATA[<p><strong>Fanstatic</strong> is the new name for the static site generator you may have known as SuCoS. If you've used SuCoS,
you already know Fanstatic — the engine, the CLI, the Liquid templates, and every feature built up over six and
a half years of releases carry straight over. What changes with v7.0.0 is the name, the home, and the role: this
is no longer a personal project with a side hustle, it's first-class tooling under the
<a href="https://github.com/MASS4ORG">MASS4</a> organization.</p>
<ul>
<li><a href="#why-the-rename">Why the rename</a></li>
<li><a href="#whats-still-here">What's still here</a></li>
<li><a href="#whats-new-since-v7.0.0">What's new since v7.0.0</a></li>
<li><a href="#get-started">Get started</a></li>
</ul>
<h2 id="why-the-rename">Why the rename</h2>
<p>SuCoS — &quot;Tastiest C# Static Site Generator of the World&quot; — was a personal project from day one, built to get
better at C# and to stop fighting Hugo's templating. Over nine major versions it grew Markdown extensions,
sections and taxonomies, multi-language support with full i18n, <code>ref</code>/<code>relref</code> shortcodes, and a <code>validate-links</code>
command that understands local versus production URLs. Somewhere along the way it quietly became the tool every
other project reached for, MASS4's sites included. <strong>Fanstatic</strong> — for Fans of a Fantastic Static Site
Generator — is that same tool, renamed to match what it actually is now: shared infrastructure, not a side
project. New source home at <a href="https://github.com/MASS4ORG/fanstatic">github.com/MASS4ORG/fanstatic</a>, still MIT
licensed.</p>
<h2 id="whats-still-here">What's still here</h2>
<p>Nothing was left behind in the move. Fanstatic v7.0.0 is the direct continuation of SuCoS v6.9.0, with the same
CLI surface:</p>
<pre><code class="language-sh">fanstatic new-site &lt;YOUR_SITE_PATH&gt;             # To create your site
fanstatic &lt;YOUR_SITE_PATH&gt;                      # To build your site
fanstatic serve &lt;YOUR_SITE_PATH&gt;                # To build and run locally
fanstatic validate-links &lt;YOUR_SITE_PATH&gt;       # To check all links
fanstatic api &lt;YOUR_CODE_PATH&gt; &lt;YOUR_SITE_PATH&gt; # To generate API reference
</code></pre>
<p>That includes Liquid templating, Hugo-style shortcodes, full i18n with per-language sections and translation
strings, smart <code>validate-links</code> local-baseurl resolution, and — as of the last SuCoS release before the
rename — a native Windows installer.</p>
<h2 id="whats-new-since-v7.0.0">What's new since v7.0.0</h2>
<p>The rename shipped alongside the work already in flight: v7.0.1 fixed the Windows installer placing <code>fanstatic</code>
correctly on the user <code>PATH</code>, and v7.0.2 added a <a href="https://learn.microsoft.com/windows/package-manager/winget/">winget</a>
manifest, so Windows users can now install with:</p>
<pre><code class="language-powershell">winget install MASS4ORG.Fanstatic
</code></pre>
<h2 id="get-started">Get started</h2>
<p>Grab a release from <a href="https://github.com/MASS4ORG/fanstatic">github.com/MASS4ORG/fanstatic</a> for Linux or Windows,
or install via winget on Windows. Everything you already know from SuCoS applies — the docs on this site are the
same docs, just living at a new address.</p>
]]></description>
</item>


    <item>
    <title>v6.8.0 Release: Smart Shortcodes and Link Validation</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/v6.8.0-release-smart-shortcodes-and-link-validation/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/v6.8.0-release-smart-shortcodes-and-link-validation/index.xml</link>
    <pubDate>2026-07-02T00:00:00Z</pubDate>
    <description><![CDATA[<p>SuCoS v6.8.0 introduces highly convenient Hugo-style shortcodes for internal link management alongside major improvements to link validation efficiency. This update makes it easier to reference your internal pages dynamically while ensuring local test environments don't trigger unnecessary external requests.</p>
<ul>
<li><a href="https://www.google.com/search?q=%23hugo-style-shortcodes">Hugo-Style Shortcodes</a></li>
<li><a href="https://www.google.com/search?q=%23smarter-link-validation">Smarter Link Validation</a></li>
</ul>
<h2 id="hugo-style-shortcodes">Hugo-Style Shortcodes</h2>
<p>We've added native support for <code>ref</code> and <code>relref</code> shortcodes directly within your Markdown content. This allows you to resolve page permalinks dynamically without hardcoding URLs.</p>
<pre><code>Check out our [About Page]({{&lt; ref &quot;path/to/page.md&quot; &gt;} }) for absolute links, 
or link relatively using [this section]({{&lt; relref &quot;path/to/page.md#anchor&quot; &gt;} }).

</code></pre>
<p>By default, the shortcodes automatically resolve using the calling page's language and output format context. However, you can explicitly override these when needed by appending <code>lang=&quot;...&quot;</code> or <code>outputFormat=&quot;...&quot;</code> parameters. It also fully supports <code>#anchor</code> fragment resolution out of the box.</p>
<h2 id="smarter-link-validation">Smarter Link Validation</h2>
<p>The <code>validate-links</code> engine received a robust intelligence upgrade focused on local testing workflow and edge-case handling:</p>
<ul>
<li><strong>Local BaseUrl Mapping</strong>: Absolute links containing your production domain (e.g., hardcoded production URLs) are now smart-resolved against your local site pages during testing instead of initiating actual external HTTP requests. If you prefer the legacy behavior, you can append the <code>-b</code> or <code>--strict-baseurl</code> flags to enforce exact domain-matching.</li>
<li><strong>Hash-Routed URL Fix</strong>: Fixed a routing bug where root-path external URLs using hashes (such as Matrix links like <code>[https://matrix.to/#/!room:matrix.org](https://matrix.to/#/!room:matrix.org)</code>) were mistakenly flagged as internal page hits. This previously triggered frustrating, false-positive <code>fragmentNotFound</code> errors on the home page.</li>
</ul>
<p><a href="https://www.google.com/search?q=https%3A%2F%2Fgitlab.com%2Fsucos%2Fsucos%2F-%2Freleases%2Fv6.8.0">Download It Now</a></p>
<p><a href="https://www.google.com/search?q=https%3A%2F%2Fgitlab.com%2Fsucos%2Fsucos%2F-%2Fblob%2Fmain%2FCHANGELOG.md">View Changelog</a></p>
]]></description>
</item>


    <item>
    <title>Fanstatic</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/fanstatic/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/fanstatic/index.xml</link>
    <pubDate>2026-07-02T00:00:00Z</pubDate>
    <description><![CDATA[<p>SuCoS v6.8.0 introduces highly convenient Hugo-style shortcodes for internal link management alongside major improvements to link validation efficiency. This update makes it easier to reference your internal pages dynamically while ensuring local test environments don't trigger unnecessary external requests.</p>
<ul>
<li><a href="https://www.google.com/search?q=%23hugo-style-shortcodes">Hugo-Style Shortcodes</a></li>
<li><a href="https://www.google.com/search?q=%23smarter-link-validation">Smarter Link Validation</a></li>
</ul>
<h2 id="hugo-style-shortcodes">Hugo-Style Shortcodes</h2>
<p>We've added native support for <code>ref</code> and <code>relref</code> shortcodes directly within your Markdown content. This allows you to resolve page permalinks dynamically without hardcoding URLs.</p>
<pre><code>Check out our [About Page]({{&lt; ref &quot;path/to/page.md&quot; &gt;} }) for absolute links, 
or link relatively using [this section]({{&lt; relref &quot;path/to/page.md#anchor&quot; &gt;} }).

</code></pre>
<p>By default, the shortcodes automatically resolve using the calling page's language and output format context. However, you can explicitly override these when needed by appending <code>lang=&quot;...&quot;</code> or <code>outputFormat=&quot;...&quot;</code> parameters. It also fully supports <code>#anchor</code> fragment resolution out of the box.</p>
<h2 id="smarter-link-validation">Smarter Link Validation</h2>
<p>The <code>validate-links</code> engine received a robust intelligence upgrade focused on local testing workflow and edge-case handling:</p>
<ul>
<li><strong>Local BaseUrl Mapping</strong>: Absolute links containing your production domain (e.g., hardcoded production URLs) are now smart-resolved against your local site pages during testing instead of initiating actual external HTTP requests. If you prefer the legacy behavior, you can append the <code>-b</code> or <code>--strict-baseurl</code> flags to enforce exact domain-matching.</li>
<li><strong>Hash-Routed URL Fix</strong>: Fixed a routing bug where root-path external URLs using hashes (such as Matrix links like <code>[https://matrix.to/#/!room:matrix.org](https://matrix.to/#/!room:matrix.org)</code>) were mistakenly flagged as internal page hits. This previously triggered frustrating, false-positive <code>fragmentNotFound</code> errors on the home page.</li>
</ul>
<p><a href="https://www.google.com/search?q=https%3A%2F%2Fgitlab.com%2Fsucos%2Fsucos%2F-%2Freleases%2Fv6.8.0">Download It Now</a></p>
<p><a href="https://www.google.com/search?q=https%3A%2F%2Fgitlab.com%2Fsucos%2Fsucos%2F-%2Fblob%2Fmain%2FCHANGELOG.md">View Changelog</a></p>
]]></description>
</item>


    <item>
    <title>v6.7.0 Release: Many Tongues, One Site</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/v6.7.0-release-many-tongues-one-site/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/v6.7.0-release-many-tongues-one-site/index.xml</link>
    <pubDate>2026-07-01T00:00:00Z</pubDate>
    <description><![CDATA[<p>SuCoS v6.7.0 is the biggest release yet, introducing full multi-language and internationalization support. Whether your site needs two languages or twenty, SuCoS now has you covered. For a complete reference, see the <a href="/docs/content/localization">Localization documentation</a>.</p>
<ul>
<li><a href="#multi-language-support">Multi-Language Support</a></li>
<li><a href="#internationalization-i18n">Internationalization (i18n)</a></li>
<li><a href="#translation-aware-templates">Translation-Aware Templates</a></li>
<li><a href="#bug-fixes">Bug Fixes</a></li>
</ul>
<h2 id="multi-language-support">Multi-Language Support</h2>
<p>SuCoS now supports building sites in multiple languages. Configure your languages in the site settings:</p>
<pre><code class="language-yaml">languages:
  en:
    LanguageName: English
    Weight: 1
    Title: &quot;My Site&quot;
    IsDefault: true
  pt-br:
    LanguageName: &quot;Português (Brasil)&quot;
    Weight: 2
    Title: &quot;Meu Site&quot;
</code></pre>
<p>Content is mapped to languages through filename suffixes. Simply name your files with the language code (e.g., <code>hello.pt-br.md</code>) and SuCoS automatically associates them with the correct language. Non-default languages get language-prefixed URLs (<code>/pt-br/hello/</code>), while the default language keeps clean URLs by default. Set <code>DefaultContentLanguageInSubdir: true</code> to prefix all languages uniformly.</p>
<p>Auto-generated section and taxonomy pages are now created for every configured language, not just the default. If a directory has an <code>_index.md</code> only in English, SuCoS automatically synthesizes stubs for the other languages — no manual duplication required.</p>
<h2 id="internationalization-i18n">Internationalization (i18n)</h2>
<p>Bring your templates to life in any language with the new i18n system. Create translation files in <code>i18n/</code> directory:</p>
<pre><code class="language-yaml"># i18n/en.yaml
read_more:
  one: &quot;Read more&quot;
  other: &quot;Read more&quot;

posts:
  one: &quot;{{ count }} post&quot;
  other: &quot;{{ count }} posts&quot;

# i18n/pt-br.yaml
read_more:
  one: &quot;Leia mais&quot;
  other: &quot;Leia mais&quot;

posts:
  one: &quot;{{ count }} post&quot;
  other: &quot;{{ count }} posts&quot;
</code></pre>
<p>Use the <code>i18n</code> filter in your Liquid templates:</p>
<pre><code class="language-liquid">&lt;a href=&quot;{{ page.RelPermalink }}&quot;&gt;
  {{ &quot;read_more&quot; | i18n }}
&lt;/a&gt;
</code></pre>
<p>Pluralization is fully supported via Hugo-compatible <code>one</code>/<code>other</code> keys. The value inside the translation uses <code>{{ count }}</code> as the placeholder:</p>
<pre><code class="language-liquid">{% assign count = site.RegularPages.size %}
&lt;p&gt;{{ &quot;posts&quot; | i18n: count }}&lt;/p&gt;
</code></pre>
<p>If there is a single page, this renders <code>1 post</code>; with ten pages, it renders <code>10 posts</code>.</p>
<p>When a translation key is missing in the current language, SuCoS falls back to the default language automatically — so you can roll out translations incrementally.</p>
<h2 id="translation-aware-templates">Translation-Aware Templates</h2>
<p>Building language switchers and cross-language navigation is now straightforward with new page properties:</p>
<ul>
<li><strong><code>page.Translations</code></strong> — same-page content in other languages, perfect for language switchers</li>
<li><strong><code>page.AllTranslations</code></strong> — all translations including self, sorted by language weight</li>
<li><strong><code>page.TranslationsByLanguage</code></strong> — translations keyed by language code</li>
<li><strong><code>page.Variants</code></strong> — every representation across all languages and output formats</li>
<li><strong><code>page.AlternativeOutputFormats</code></strong> — output formats (HTML, RSS, JSON) for the same language</li>
<li><strong><code>page.IsDefaultLanguage</code></strong> — check if page is in the site's default language</li>
<li><strong><code>site.Languages</code></strong> — list of all configured language settings</li>
<li><strong><code>site.Language</code></strong> — the current language context for this output</li>
</ul>
<p>Here's a complete language switcher:</p>
<pre><code class="language-liquid">{% if page.Translations.size &gt; 0 %}
  &lt;nav class=&quot;language-switcher&quot;&gt;
    {% for t in page.Translations %}
      &lt;a href=&quot;{{ t.RelPermalink }}&quot; lang=&quot;{{ t.Language }}&quot;&gt;
        {{ t.LanguageName }}
      &lt;/a&gt;
    {% endfor %}
  &lt;/nav&gt;
{% endif %}
</code></pre>
<h2 id="bug-fixes">Bug Fixes</h2>
<p>This release also fixes several important issues:</p>
<ul>
<li><strong>Section page parent references</strong>: Auto-generated section pages (directories without <code>_index.md</code>) now correctly inherit the section as parent instead of home, preventing URL collisions between identically-named files across directories.</li>
<li><strong>Resource URL generation</strong>: Fixed when <code>RelPermalinkDir</code> lacks a trailing slash (e.g., root <code>/</code>).</li>
<li><strong>Resource Name/Title rendering</strong>: Liquid template rendering now uses <code>SiteInternal</code> instead of the <code>SiteOutput</code> facade.</li>
<li><strong>Debian publishing</strong>: The <code>.deb</code> package is now correctly published to the generic package registry and attached as a release link.</li>
</ul>
<p><a href="https://gitlab.com/sucos/sucos/-/releases/v6.7.0">Download It Now</a></p>
<p><a href="https://gitlab.com/sucos/sucos/-/blob/main/CHANGELOG.md">View Changelog</a></p>
]]></description>
</item>


    <item>
    <title>v6.6.0 Release: Lean and Mean</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/v6.6.0-release-lean-and-mean/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/v6.6.0-release-lean-and-mean/index.xml</link>
    <pubDate>2026-05-07T00:00:00Z</pubDate>
    <description><![CDATA[<p>SuCoS v6.6.0 focuses on making the generator easier to install and more efficient to distribute. We've managed to significantly shrink the binary size and improve our packaging for Linux users.</p>
<ul>
<li><a href="#binary-compression">Binary Compression</a></li>
<li><a href="#debianubuntu-support">Debian/Ubuntu Support</a></li>
</ul>
<h2 id="binary-compression">Binary Compression</h2>
<p>One of the biggest changes in this release is the introduction of executable compression. By enabling compression in our build pipeline, we've managed to reduce the output size of the SuCoS executable from approximately <strong>100MB down to just 20MB</strong>.</p>
<p>This makes downloading and deploying SuCoS much faster, without sacrificing any of the performance you've come to expect.</p>
<h2 id="debianubuntu-support">Debian/Ubuntu Support</h2>
<p>We are happy to announce that we are now officially generating <code>.deb</code> packages for every release! If you are on Debian, Ubuntu, or any derivative distribution, you can now install SuCoS using your favorite package manager.</p>
<p>This ensures that SuCoS is properly integrated into your system, making it easier to manage updates and dependencies.</p>
<p><a href="https://gitlab.com/sucos/sucos/-/releases/v6.6.0">Download It Now</a></p>
<p><a href="https://gitlab.com/sucos/sucos/-/blob/main/CHANGELOG.md">View Changelog</a></p>
]]></description>
</item>


    <item>
    <title>v6.5.0 Release: Pagination Power-Up</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/v6.5.0-release-pagination-power-up/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/v6.5.0-release-pagination-power-up/index.xml</link>
    <pubDate>2026-04-30T00:00:00Z</pubDate>
    <description><![CDATA[<p>SuCoS v6.5.0 is a massive update that brings highly requested pagination features and a significant performance boost. This release reimagines how lists and sitemaps are handled, making it easier than ever to manage large amounts of content.</p>
<ul>
<li><a href="#template-driven-pagination">Template-Driven Pagination</a></li>
<li><a href="#built-in-sitemap-support">Built-in Sitemap Support</a></li>
<li><a href="#massive-performance-gains">Massive Performance Gains</a></li>
<li><a href="#improved-stability">Improved Stability</a></li>
</ul>
<h2 id="template-driven-pagination">Template-Driven Pagination</h2>
<p>We've introduced a new, flexible way to handle pagination directly in your Liquid templates. With the new <code>paginate</code> filter, you can now decide exactly how and when to split your content.</p>
<pre><code class="language-liquid">{% assign sortedPages = site.AllRegularPages | sort: &quot;Date&quot; | reverse %}
{% assign pager = sortedPages | paginate: 10 %}

{% for page in pager.PageItems %}
  &lt;h2&gt;&lt;a href=&quot;{{ page.RelPermalink }}&quot;&gt;{{ page.Title }}&lt;/a&gt;&lt;/h2&gt;
{% endfor %}

{% render &quot;partials/pagination.html&quot;, pager: pager %}
</code></pre>
<p>The new <code>Pager</code> record exposes everything you need: <code>Count</code>, <code>Current</code>, <code>First</code>, <code>Last</code>, <code>Prev</code>, <code>Next</code>, and more. Plus, we've included a built-in <code>partials/pagination.html</code> so you can get started instantly without writing a single line of pagination UI logic.</p>
<h2 id="built-in-sitemap-support">Built-in Sitemap Support</h2>
<p>Keeping search engines happy is now easier than ever. SuCoS now includes a built-in <code>sitemap.xml</code> generator. By default, the home page will now also generate a sitemap using a built-in Liquid template.</p>
<p>To support this and other cross-format needs, we've added <code>site.AllRegularPages</code>, which provides a complete list of all HTML regular pages across all output formats. This is perfect for generating sitemaps, RSS feeds, or custom search indexes.</p>
<p>The template lookup has also been improved to be more specific, checking for format-specific paths like <code>_default/sitemap.xml</code> before falling back to generic templates. This ensures your sitemap looks exactly like a sitemap should, without interference from your standard list templates.</p>
<h2 id="massive-performance-gains">Massive Performance Gains</h2>
<p>Performance is at the core of SuCoS, and v6.5.0 takes it to the next level. We've identified and eliminated several bottlenecks:</p>
<ul>
<li><strong>Template Caching</strong>: Compiled Fluid templates are now cached, eliminating the biggest single overhead in the rendering pipeline.</li>
<li><strong>Content Caching</strong>: Markdig HTML rendering is now cached per page, preventing redundant processing during pagination.</li>
<li><strong>Optimized Internals</strong>: Core path handling and URL sanitization have been rewritten to avoid unnecessary allocations, and we've adopted <code>FrozenDictionary</code> for lightning-fast lookups.</li>
</ul>
<p>These changes result in a much snappier experience, especially for sites with hundreds or thousands of pages.</p>
<h2 id="improved-stability">Improved Stability</h2>
<p>This release also fixes a long-standing issue in <code>serve</code> mode where certain file system events could trigger infinite site recreation. By reimplementing our file provider, we've made the development loop more reliable and responsive.</p>
<p><a href="https://gitlab.com/sucos/sucos/-/releases/v6.5.0">Download It Now</a></p>
<p><a href="https://gitlab.com/sucos/sucos/-/blob/main/CHANGELOG.md">View Changelog</a></p>
]]></description>
</item>


    <item>
    <title>v6.4.0 Release: Anniversary Edition</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/v6.4.0-release-anniversary-edition/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/v6.4.0-release-anniversary-edition/index.xml</link>
    <pubDate>2026-04-01T00:00:00Z</pubDate>
    <description><![CDATA[<p>SuCoS v6.4.0 is a small anniversary release focused on improving the pagination experience and refining project documentation.</p>
<p>This release also includes a major version bump due to the upgrade to .NET 10.</p>
<ul>
<li><a href="#embedded-pagination-footer">Embedded Pagination Footer</a></li>
<li><a href="#changelog-improvements">Changelog Improvements</a></li>
<li><a href="#platform-update">Platform Update</a></li>
</ul>
<h2 id="embedded-pagination-footer">Embedded Pagination Footer</h2>
<p>Pagination footer is now embedded by default.</p>
<p>Previously, templates needed to explicitly include footer logic when working with paginated content. With this change, SuCoS provides a built-in default, reducing duplication and simplifying template setup.</p>
<p>This behavior is handled internally by the template engine, making pagination easier to use out of the box while still allowing customization when needed.</p>
<h2 id="changelog-improvements">Changelog Improvements</h2>
<p>The project now follows the Keep a Changelog 1.1.0 format.</p>
<p>This change standardizes how releases are documented, making it easier to track changes over time and compare versions.</p>
<h2 id="platform-update">Platform Update</h2>
<p>SuCoS now targets .NET 10.</p>
<p>This update brings the usual performance improvements and ensures compatibility with the latest .NET ecosystem. As a result, this release is marked with a minor version bump.</p>
<p><a href="https://gitlab.com/sucos/sucos/-/releases/v6.4.0">Download It Now</a></p>
<p><a href="https://gitlab.com/sucos/sucos/-/blob/main/CHANGELOG.md">View Changelog</a></p>
]]></description>
</item>


    <item>
    <title>v6.3.0 Release: Paging It Right</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/v6.3.0-release-paging-it-right/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/v6.3.0-release-paging-it-right/index.xml</link>
    <pubDate>2025-07-17T00:00:00Z</pubDate>
    <description><![CDATA[<p>SuCoS v6.3.0 focuses on fixing a subtle but important issue in pagination, ensuring that content is distributed correctly across pages.</p>
<ul>
<li><a href="#pagination-fix">Pagination Fix</a></li>
</ul>
<h2 id="pagination-fix">Pagination Fix</h2>
<p>Pagination now slices content per page correctly.</p>
<p>In previous versions, paginated collections could end up duplicating or leaking items between pages due to incorrect slicing logic. This made navigation inconsistent and, in some cases, confusing for readers.</p>
<p>With this fix, each page receives its exact subset of content, preserving order and ensuring predictable behavior across the entire pagination pipeline.</p>
<p>This improvement touches core components such as <code>Page</code>, <code>Pager</code>, and <code>Site</code>, reinforcing the overall stability of paginated builds.</p>
<p><a href="https://gitlab.com/sucos/sucos/-/releases/v6.3.0">Download It Now</a></p>
<p><a href="https://gitlab.com/sucos/sucos/-/blob/main/CHANGELOG.md">View Changelog</a></p>
]]></description>
</item>


    <item>
    <title>v6.2.0 Release: Documentation Made Simple</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/v6.2.0-release-documentation-made-simple/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/v6.2.0-release-documentation-made-simple/index.xml</link>
    <pubDate>2025-06-05T00:00:00Z</pubDate>
    <description><![CDATA[<p>SuCoS v6.2.0 is here with an exciting new feature that transforms how you generate API documentation! This release introduces a powerful new command that makes creating comprehensive API docs as simple as running a single command.</p>
<ul>
<li><a href="#introducing-api-documentation-generation">Introducing API Documentation Generation</a></li>
<li><a href="#dependency-updates">Dependency Updates</a></li>
</ul>
<h2 id="introducing-api-documentation-generation">Introducing API Documentation Generation</h2>
<p>We're thrilled to introduce the brand new <code>sucos api</code> command - a game-changing feature that scans your C# projects and generates beautiful, comprehensive API documentation automatically. Say goodbye to complex DocFx configurations and hello to documentation that just works!</p>
<p>With a simple command:</p>
<pre><code class="language-bash">sucos api --project &lt;PATH&gt;
</code></pre>
<p>SuCoS will analyze your C# project and create ready-to-publish documentation for all your public classes, records, enums, interfaces, and more. Every public member gets properly documented with clear, navigable output that integrates seamlessly with SuCoS's proven template system.</p>
<p>The <code>sucos api</code> command leverages the power of Roslyn analyzers to deeply understand your C# code structure. It automatically extracts:</p>
<ul>
<li><strong>Classes and Records</strong>: Complete documentation including constructors, properties, and methods</li>
<li><strong>Interfaces</strong>: All method signatures and their purposes</li>
<li><strong>Enums</strong>: Every value with descriptions when available</li>
<li><strong>Namespaces</strong>: Organized hierarchically for easy navigation</li>
<li><strong>XML Documentation</strong>: Integrates seamlessly with your existing XML doc comments</li>
</ul>
<p>The generated documentation follows SuCoS's familiar, easy-to-understand concepts. No need to learn complex new markup or configuration files - if you know SuCoS, you already know how to customize your API documentation.</p>
<h3 id="why-choose-sucos-api-over-docfx">Why Choose SuCoS API Over DocFx</h3>
<p>While DocFx is powerful, it can be overwhelming with its complex configuration requirements and steep learning curve. SuCoS API takes a different approach:</p>
<ul>
<li><strong>Zero Configuration</strong>: Point it at your project and go</li>
<li><strong>Familiar Templates</strong>: Use the same templating system you already know</li>
<li><strong>Consistent Styling</strong>: Matches your existing SuCoS site perfectly</li>
<li><strong>Simple Customization</strong>: Modify output using standard SuCoS concepts</li>
<li><strong>Fast Generation</strong>: Optimized for speed and efficiency</li>
</ul>
<p>Want to see it in action? Check out our own API documentation at <a href="https://fanstatic.mass4.org/api">fanstatic.mass4.org/api</a> - generated entirely with this new feature!</p>
<h2 id="dependency-updates">Dependency Updates</h2>
<p>As part of our commitment to staying current with the .NET ecosystem, we've updated all dependencies to their latest versions as of June 5, 2025. These updates ensure optimal performance, security, and compatibility with the latest development tools and frameworks.</p>
<p>This comprehensive update includes improvements to our Liquid templating engine, YAML processing capabilities, and core .NET runtime optimizations that benefit every aspect of SuCoS operation.</p>
<p>The new API documentation feature represents a significant step forward in making developer documentation accessible and beautiful. Whether you're documenting a small library or a complex enterprise application, SuCoS v6.2.0 gives you the tools to create professional, navigable API documentation without the hassle.</p>
<p><a href="https://gitlab.com/sucos/sucos/-/releases/v6.2.0">Download It Now</a></p>
<p><a href="https://gitlab.com/sucos/sucos/-/blob/main/CHANGELOG.md">View Changelog</a></p>
]]></description>
</item>


    <item>
    <title>v6.1.0 Release: Open the Windows</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/v6.1.0-release-open-the-windows/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/v6.1.0-release-open-the-windows/index.xml</link>
    <pubDate>2025-01-30T00:00:00Z</pubDate>
    <description><![CDATA[<p>SuCoS v6.1.0 is here, bringing internal improvements and bug fixes that enhance stability and maintainability.</p>
<ul>
<li><a href="#url-handling-improvements">URL Handling Improvements</a></li>
<li><a href="#windows-path-fixes">Windows Path Fixes</a></li>
<li><a href="#code-quality-updates">Code Quality Updates</a></li>
<li><a href="#dependency-updates">Dependency Updates</a></li>
</ul>
<h2 id="url-handling-improvements">URL Handling Improvements</h2>
<p>Following our URL handling overhaul in <a href="/v6.0.0">v6.0.0</a>, we've made permalinks even more robust by using <code>Uri</code> internally. This change strengthens URL validation and manipulation, making the system more reliable across different deployment scenarios.</p>
<h2 id="windows-path-fixes">Windows Path Fixes</h2>
<p>We've resolved several path handling issues on Windows systems. This fix ensures consistent behavior across all operating systems, particularly when dealing with path separators and absolute paths.</p>
<h2 id="code-quality-updates">Code Quality Updates</h2>
<p>We've made several internal improvements to enhance code maintainability:</p>
<ul>
<li>Increased code wrap width from 80 to 120 characters for better readability</li>
<li>Refactored several methods to reduce cognitive complexity</li>
<li>Improved internal documentation</li>
</ul>
<p>These changes might not be immediately visible to users but contribute to a more maintainable codebase, making future feature development smoother.</p>
<h2 id="dependency-updates">Dependency Updates</h2>
<p>As part of our ongoing commitment to security and performance, we've updated all dependencies to their latest versions as of January 22, 2025.</p>
<p><a href="https://gitlab.com/sucos/sucos/-/releases/v6.1.0">Download It Now</a></p>
<p><a href="https://gitlab.com/sucos/sucos/-/blob/main/CHANGELOG.md">View Changelog</a></p>
]]></description>
</item>


    <item>
    <title>v6.0.0 Release: Relatively Permanent</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/v6.0.0-release-relatively-permanent/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/v6.0.0-release-relatively-permanent/index.xml</link>
    <pubDate>2024-12-19T00:00:00Z</pubDate>
    <description><![CDATA[<p>We're excited to announce SuCoS v6.0.0, focusing on URL handling improvements and consistency.</p>
<ul>
<li><a href="#permalink-changes">Permalink Changes</a></li>
</ul>
<h2 id="permalink-changes">Permalink Changes</h2>
<p>The major change in this release is the inclusion of BaseURL in permalinks. This change provides more consistent URL handling across your site, especially when deploying to subdirectories or custom domains.</p>
<p>Previously, <code>Permalink</code> would return a URL relative to your site root. Now, it includes the BaseURL, giving you absolute URLs out of the box. For those who need the old behavior, we've kept it accessible via <code>RelPermalink</code>.</p>
<p>This change makes it easier to:</p>
<ul>
<li>Generate absolute URLs for social media cards</li>
<li>Create proper RSS feeds</li>
<li>Handle subdirectory deployments seamlessly</li>
</ul>
<h3 id="migration-guide">Migration Guide</h3>
<p>If you're upgrading from v5, here's what you need to know:</p>
<ol>
<li>Replace <code>Permalink</code> with <code>RelPermalink</code> where you need URLs relative to your site root</li>
<li>Keep using <code>Permalink</code> where you want absolute URLs (recommended for RSS feeds and social media cards)</li>
</ol>
<p>Remember our previous URL handling improvements mentioned in <a href="/v5.0.0">v5.0.0</a>? This change builds upon that foundation to provide even more robust URL management.</p>
<p><a href="https://gitlab.com/sucos/sucos/-/releases/v6.0.0">Download It Now</a></p>
<p><a href="https://gitlab.com/sucos/sucos/-/blob/main/CHANGELOG.md">View Changelog</a></p>
]]></description>
</item>


    <item>
    <title>v5.0.0 Release: .NET 9 and RSS Feeds</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/v5.0.0-release-.net-9-and-rss-feeds/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/v5.0.0-release-.net-9-and-rss-feeds/index.xml</link>
    <pubDate>2024-12-12T00:00:00Z</pubDate>
    <description><![CDATA[<p>We're excited to announce SuCoS v5.0.0, a major release that brings significant improvements in flexibility, performance, and architecture.</p>
<ul>
<li><a href="#net-9-upgrade">.NET 9 Upgrade</a></li>
<li><a href="#output-formats">Output Formats</a></li>
<li><a href="#front-matter-separation">Front Matter Separation</a></li>
<li><a href="#parsing-phase-optimization">Parsing Phase Optimization</a></li>
<li><a href="#dependency-updates">Dependency Updates</a></li>
</ul>
<h2 id="net-9-upgrade">.NET 9 Upgrade</h2>
<p>The most significant change in this release is our upgrade to .NET 9. The upgrade necessitated a bit of internal changes and is the primary reason for the major version increment.</p>
<p>Unlike many other project's strategy of waiting for Long-Term Support (LTS) releases, we're committed to using the latest .NET release. Why? Because Microsoft provides the same level of robustness and stability across all .NET versions. This approach ensures we're always leveraging the most recent performance improvements, language features, and runtime optimizations.</p>
<h2 id="output-formats">Output Formats</h2>
<p>Remember when SuCoS could only generate HTML? Those days are gone!</p>
<p>We're introducing a game-changing feature: multiple output formats! Now, each content type can generate various file types beyond HTML. This means you can easily create:</p>
<ul>
<li>RSS Feeds</li>
<li>Robot.txt files</li>
<li>Sitemap XML</li>
</ul>
<p>The templating system is now incredibly smart. You can create format-specific templates:</p>
<ul>
<li><code>single.html.liquid</code>: HTML-only template</li>
<li><code>single.xml.liquid</code>: XML-only template</li>
<li><code>single.liquid</code>: A universal fallback</li>
</ul>
<p>Imagine generating a blog RSS feed with just a few configuration lines. Pure magic!</p>
<h2 id="front-matter-separation">Front Matter Separation</h2>
<p>The old Front Matter was getting complex, so we split it up following the Single Responsibility Principle. Meet <code>ContentClass</code> – our new comprehensive content representation that combines:</p>
<ul>
<li>Front Matter (metadata)</li>
<li>Actual Content</li>
<li>File Metadata</li>
</ul>
<h2 id="parsing-phase-optimization">Parsing Phase Optimization</h2>
<p>Content Front Matter is now generated in a separate loop before page generation. This lays the groundwork for future enhancements, potentially allowing parsing without full page generation.</p>
<h2 id="dependency-updates">Dependency Updates</h2>
<p>We've updated all dependencies to their latest versions as of December 2024. Notable updates include:</p>
<ul>
<li>Fluid.Core: 2.11.1 → 2.14.0</li>
<li>YamlDotNet: 16.1.0 → 16.2.1</li>
<li>Markdig: 0.37.0 → 0.38.0</li>
<li>Microsoft Extensions packages: Updated to .NET 9 versions</li>
</ul>
<h2 id="a-note-on-cicd">A Note on CI/CD</h2>
<p>Remember the trimming improvements we mentioned in <a href="/v4.3.0">v4.3.0</a>? We've finally implemented the full build process optimization. GitLab CI/CD now creates even smaller, more efficient executables.</p>
<h2 id="breaking-changes">Breaking Changes</h2>
<ul>
<li>Requires .NET 9 SDK (for devs only)</li>
<li>Changes in Front Matter handling</li>
<li>Most content will generate RSS by default</li>
</ul>
<p>Let's keep evolving!</p>
<p><a href="https://gitlab.com/sucos/sucos/-/releases/v5.0.0">Download It Now</a></p>
<p><a href="https://gitlab.com/sucos/sucos/-/blob/main/CHANGELOG.md">View Changelog</a></p>
]]></description>
</item>


    <item>
    <title>v4.3.0 Release: Slimmer and Smarter</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/v4.3.0-release-slimmer-and-smarter/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/v4.3.0-release-slimmer-and-smarter/index.xml</link>
    <pubDate>2024-09-05T00:00:00Z</pubDate>
    <description><![CDATA[<p>We're thrilled to announce the release of SuCoS v4.3.0! This update brings significant improvements in terms of efficiency and performance, making your experience even better.</p>
<ul>
<li><a href="#trimmed-executable-smaller-footprint">Trimmed Executable: Smaller Footprint</a></li>
<li><a href="#updated-dependencies-staying-current">Updated Dependencies: Staying Current</a></li>
</ul>
<h2 id="trimmed-executable-smaller-footprint">Trimmed Executable: Smaller Footprint</h2>
<p>One of the most exciting changes in this release is the significant reduction in the size of the SuCoS executable. We've managed to trim it down from about 80 MB to just 40 MB - that's a 50% reduction!</p>
<table class="table table-striped">
<thead>
<tr>
<th>Method</th>
<th style="text-align: right;">Size</th>
</tr>
</thead>
<tbody>
<tr>
<td>Before</td>
<td style="text-align: right;">~80 MB</td>
</tr>
<tr>
<td>After</td>
<td style="text-align: right;">~40 MB</td>
</tr>
<tr>
<td>Trimming Full</td>
<td style="text-align: right;">~30 MB</td>
</tr>
<tr>
<td>Native AOT</td>
<td style="text-align: right;">~25 MB</td>
</tr>
</tbody>
</table>
<p>This impressive size reduction was achieved using dotnet publish trimming in partial mode. We opted for partial mode to keep some dependencies that can't work with full trimming untouched, which is why Native AOT is currently not possible for SuCoS. Interestingly, full trimming mode or  Native AOT would have reduced the even more, but neither option was viable due to compatibility issues.</p>
<p>The smaller executable brings several benefits: faster downloads, quicker startup times, more efficient memory usage, and faster CI/CD executions. This optimization ensures you get all the power of SuCoS in a more compact and efficient package.</p>
<h2 id="updated-dependencies-staying-current">Updated Dependencies: Staying Current</h2>
<p>To ensure that SuCoS continues to leverage the latest improvements and security updates from its underlying technologies, we've updated all dependencies to their latest versions as of August 2, 2024. Here's a quick overview of some key updates:</p>
<ul>
<li>Fluid.Core: 2.10.0 → 2.11.1</li>
<li>FolkerKinzel.MimeTypes: 5.2.1 → 5.3.0</li>
<li>Microsoft.NET.Build.Containers: 8.0.302 → 8.0.401</li>
<li>Microsoft.NET.Test.Sdk: 17.10.0 → 17.11.0</li>
<li>Serilog: 4.0.0 → 4.0.1</li>
<li>Vecc.YamlDotNet.Analyzers.StaticGenerator: 15.1.2 → 16.0.0</li>
<li>xunit.runner.visualstudio: 2.8.1 → 2.8.2</li>
<li>YamlDotNet: 15.3.0 → 16.1.0</li>
</ul>
<p>These updates include the latest .NET runtime improvements, an updated Liquid templating engine, and other third-party libraries used in SuCoS. By keeping our dependencies current, we ensure that SuCoS remains secure, efficient, and compatible with the broader ecosystem.</p>
<p>Happy site generating!</p>
<p><a href="https://gitlab.com/sucos/sucos/-/releases/v4.3.0">Download It Now</a></p>
<p><a href="https://gitlab.com/sucos/sucos/-/blob/main/CHANGELOG.md">View Changelog</a></p>
]]></description>
</item>


    <item>
    <title>v4.2.1 Release: Cascading Effects</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/v4.2.1-release-cascading-effects/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/v4.2.1-release-cascading-effects/index.xml</link>
    <pubDate>2024-06-20T00:00:00Z</pubDate>
    <description><![CDATA[<p>We're excited to announce the release of SuCoS v4.2.0! This version introduces powerful new features that will streamline your static site generation process and provide more control over your site's configuration.</p>
<ul>
<li><a href="#cascading-front-matter">Cascading Front Matter</a></li>
<li><a href="#new-sucos-variable-for-templates">New <code>sucos</code> Variable for Templates</a></li>
</ul>
<h2 id="cascading-front-matter">Cascading Front Matter</h2>
<p>In an effort to make site configuration more efficient, we've introduced the <code>cascade</code> feature in the front matter. This new feature allows you to propagate settings to the content's children, reducing the need for repetitive configuration.</p>
<p>Here's an example of how to use the <code>cascade</code> feature:</p>
<pre><code class="language-yaml">---
Title: Blog
Cascade:
    Weight: 1
    Draft: true
    Params:
        subtitle: &quot;article&quot;
---
</code></pre>
<p>In this example, the <code>Weight</code>, <code>Draft</code>, and <code>subtitle</code> properties will be inherited by all children of the &quot;Blog&quot; section. This feature is particularly useful when you want to apply consistent settings across multiple pages without having to define them individually.</p>
<h2 id="new-sucos-variable-for-templates">New <code>sucos</code> Variable for Templates</h2>
<p>We've added a new <code>sucos</code> variable for templates, which contains useful information about your site and the SuCoS. The <code>sucos</code> variable includes the following properties:</p>
<ul>
<li><code>IsServer</code>: Indicates whether the site is being served by the SuCoS server.</li>
<li><code>DotNetVersion</code>: The version of the .NET runtime being used by SuCoS.</li>
<li><code>Version</code>: The version of the SuCoS.</li>
<li><code>BuildDate</code>: The build date of the SuCoS.</li>
</ul>
<p>You can use these properties in your templates to display relevant information or conditionally render content based on the environment.</p>
<p>For example, you can display the SuCoS version in the footer of your site using the following Liquid code:</p>
<pre><code class="language-liquid">Powered by SuCoS {{ sucos.Version }}
</code></pre>
<p><a href="https://gitlab.com/sucos/sucos/-/releases/v4.2.1">Download It Now</a></p>
<p><a href="https://gitlab.com/sucos/sucos/-/compare/v4.1.0...v4.2.0">Commits</a></p>
]]></description>
</item>


    <item>
    <title>v4.1.0 Release: In Case you Prefer Lowercase</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/v4.1.0-release-in-case-you-prefer-lowercase/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/v4.1.0-release-in-case-you-prefer-lowercase/index.xml</link>
    <pubDate>2024-05-16T00:00:00Z</pubDate>
    <description><![CDATA[<p>We're thrilled to announce the release of SuCoS v4.1.0! This version brings exciting new features and improvements that will enhance your static site generation experience.</p>
<ul>
<li><a href="#extended-theming-with-new-liquid-templates">Extended Theming with New Liquid Templates</a></li>
<li><a href="#case-insensitive-yaml-front-matter-and-site-settings">Case-Insensitive YAML Front Matter and Site Settings</a></li>
</ul>
<h2 id="extended-theming-with-new-liquid-templates">Extended Theming with New Liquid Templates</h2>
<p>We've added two new Liquid templates, <code>term.liquid</code> and <code>taxonomy.liquid</code>, to further extend the list of available templates for theming. If these templates are missing, they will default to <code>list.liquid</code>. These new templates provide you with more flexibility and control when customizing the look and feel of your taxonomy and term pages.</p>
<p><code>term.liquid</code> is used to customize the appearance of a single term page, such as a tag or category. You can now access term-specific data and tailor the layout to better suit the content.</p>
<p><code>taxonomy.liquid</code> is used to customize the appearance of a taxonomy listing page, such as a list of all tags or categories. This template allows you to create a unique layout for each taxonomy type, making it easier for users to navigate and find the content they're looking for.</p>
<h2 id="case-insensitive-yaml-front-matter-and-site-settings">Case-Insensitive YAML Front Matter and Site Settings</h2>
<p>In our ongoing efforts to improve usability, we've made YAML front matter and site settings case-insensitive. This change will make it easier for you to configure your site and reduce the potential for errors.</p>
<p>Previously, the YAML front matter and site settings were only valid if they used CamelCase to match the C# class properties counterparts. For example, to set the site title, you would need to use <code>Title</code> in your YAML configuration:</p>
<pre><code class="language-yaml">---
Title: My Page
---
</code></pre>
<p>With the new case-insensitive feature, you can now use any case when defining your YAML front matter and site settings. The following examples are now all valid and will correctly set the site title:</p>
<pre><code class="language-yaml">---
title: My Page 1
---
</code></pre>
<pre><code class="language-yaml">---
TITLE: My Page 1
---
</code></pre>
<pre><code class="language-yaml">---
tiTle: My Page 1
---
</code></pre>
<p>This change applies to all properties in the <code>sucos.yaml</code> and any content page.</p>
<blockquote>
<p>Notice: in case of repeating values, the last one will prevail.</p>
</blockquote>
<pre><code class="language-yaml">---
title: My Page 1
TITLE: My Page 2
tiTle: My Page 3 # This one will be used since it's the last
---
</code></pre>
<p><a href="https://gitlab.com/sucos/sucos/-/releases/v4.1.0">Download It Now</a></p>
<p><a href="https://gitlab.com/sucos/sucos/-/compare/v4.0.2...v4.1.0">Commits</a></p>
]]></description>
</item>


    <item>
    <title>v4.0.2 Release: Speed and Stability Boost</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/v4.0.2-release-speed-and-stability-boost/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/v4.0.2-release-speed-and-stability-boost/index.xml</link>
    <pubDate>2024-05-09T00:00:00Z</pubDate>
    <description><![CDATA[<p>From a user's perspective, this might seem like a simple release, but don't be fooled! We've been hard at work behind the scenes to bring you significant improvements in both speed and stability.</p>
<ul>
<li><a href="#jetbrains-rider-and-qodana-optimizations">JetBrains Rider and Qodana Optimizations</a></li>
<li><a href="#server-crash-on-constant-file-changes">Server Crash on Constant File Changes</a></li>
</ul>
<h2 id="jetbrains-rider-and-qodana-optimizations">JetBrains Rider and Qodana Optimizations</h2>
<p>We are excited to announce that JetBrains has kindly provided us with a license for their powerful C# IDE, Rider, and their static code analyzer, Qodana. This has allowed us to dive deep into our codebase and optimize it for even better performance.</p>
<h2 id="server-crash-on-constant-file-changes">Server Crash on Constant File Changes</h2>
<p>Ever noticed that the app would sometimes crash when you were rapidly making changes to a content file? We've tracked down the issue and it turns out that each file change was triggering a duplicate server reload, eventually overwhelming the app. But worry no more - we've fixed this bug, and your rapid-fire edits should now be smooth sailing.</p>
<p>Stay tuned for more exciting updates in the near future!</p>
<p><a href="https://gitlab.com/sucos/sucos/-/releases/v4.0.2">Download It Now</a></p>
]]></description>
</item>


    <item>
    <title>v4.0.1 Release: Log the Changes</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/v4.0.1-release-log-the-changes/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/v4.0.1-release-log-the-changes/index.xml</link>
    <pubDate>2024-04-25T00:00:00Z</pubDate>
    <description><![CDATA[<p>We're excited to bring you a small but important update - the introduction of a human-friendly changelog!</p>
<ul>
<li><a href="#human-friendly-changelog">Human-Friendly Changelog</a></li>
</ul>
<h2 id="human-friendly-changelog">Human-Friendly Changelog</h2>
<p>We understand that reading through raw git logs can be a daunting task, so we've taken the time to create a changelog that's both human and machine-readable. This new changelog is handcrafted by our team to provide you with a clear and concise overview of each update. We hope you find it helpful!</p>
<p><a href="https://gitlab.com/sucos/sucos/-/releases/v4.0.1">Download It Now</a></p>
]]></description>
</item>


    <item>
    <title>v4.0.0 Release: Multiple Themes</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/v4.0.0-release-multiple-themes/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/v4.0.0-release-multiple-themes/index.xml</link>
    <pubDate>2024-04-10T00:00:00Z</pubDate>
    <description><![CDATA[<p>One week after the v3, we now have a brand new version! It is about twice as fast and makes lots of internal changes:</p>
<ul>
<li><a href="#breaking-changes">Breaking Changes</a></li>
<li><a href="#readytorun">ReadyToRun</a></li>
<li><a href="#multiple-themes">Multiple themes</a></li>
<li><a href="#new-theme-terminal-command">new theme terminal command</a></li>
<li><a href="#fixes">Fixes</a></li>
<li><a href="#internal-organization">Internal Organization</a></li>
</ul>
<h2 id="breaking-changes">Breaking Changes</h2>
<p>Due to the <a href="#readytorun">ReadyToRun</a> and <a href="#multiple-themes">Multiple themes</a> features, there are some changes that users must be aware when upgrading their sites. More on that later.</p>
<h2 id="features">Features</h2>
<h3 id="readytorun">ReadyToRun</h3>
<p>Recent DotNet versions allow a hybrid approach between compiled vs JIT compilation. It is called <code>ReadyToRun</code>. It tries to optimize the code converting some into native code and also make some inferences about the JIT optimizations.</p>
<p>The main advantage is speed. It will probably be about 2 times faster. It will also pave the way to further attempt to complete AOT compilation #35 , which would bring even more speed and smaller size.
However, it required some changes, specially in the YAML parser, because it needed to avoid Reflection.</p>
<blockquote>
<p><strong>BREAKING CHANGE</strong>: all <a href="/docs/theme/variables/page-variables">page</a> and <a href="/docs/theme/variables/site-variables">site settings</a> (YAML) that are not de default variables will be ignored. Only custom data present under <code>Params:</code> will be kept into your pages. Before, unknown values were automatically placed under Params, even if placed elsewhere.</p>
</blockquote>
<h3 id="multiple-themes">Multiple themes</h3>
<p>SuCoS now allow sites to install multiple themes (but still only use one). They will be placed inside a themes/ folder (or overwriting it using ThemeDir variable in the site settings <code>sucus.yaml</code>). It will also allow using nested git repositories and splitting the theme into other remote repositories.</p>
<blockquote>
<p><strong>BREAKING CHANGE</strong>: until now, the theme data was supposed to be placed in theme/ folder. Now, one must create a themes/ folder and put the theme data into a folder within it, like themes/my-theme</p>
</blockquote>
<h3 id="new-theme-terminal-command"><code>new theme</code> terminal command</h3>
<p>You can now scaffold the theme structure using the new <code>SuCoS new theme</code> command. It will -still- not populate with any generic theme, but it's the plan for the future.</p>
<h3 id="code_of_conduct-and-contributing">CODE_OF_CONDUCT and CONTRIBUTING</h3>
<p>The source code now has CODE_OF_CONDUCT and CONTRIBUTING documents. The first state the expected conduct for everything in the project, from users or maintainers. Respect, tolerance and a bit o humor are a must. The second contains instructions on ways to start contributing and making changes for yourself. Further instructions are in <a href="/developers">developer</a> section of this site.</p>
<h2 id="fixes">Fixes</h2>
<h3 id="page-exception">404 page Exception</h3>
<p>When using live server, if the 404 page is hit (non-existing page), the server was raising an exception and crashing.</p>
<h3 id="return-0-success-for-help-and-version">Return 0 (success) for help and version</h3>
<p>when calling <code>SuCoS version</code> or <code>SuCoS help</code> terminal commands, it was crashing.</p>
<h2 id="internal-organization">Internal Organization</h2>
<p>Some changes in the code that do not change the behavior of the app.</p>
<ul>
<li>Nuke build project is now merged inside <code>.nuke</code></li>
<li>All app commands are placed in <code>Commands</code> folder</li>
<li>Updated dependencies and libraries</li>
<li>Fixes and enhancements in code comments and code style</li>
</ul>
<p><a href="https://gitlab.com/sucos/sucos/-/releases/v4.0.0">Download It Now</a></p>
]]></description>
</item>


    <item>
    <title>v3.0.0 Release: New Site</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/v3.0.0-release-new-site/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/v3.0.0-release-new-site/index.xml</link>
    <pubDate>2024-04-04T00:00:00Z</pubDate>
    <description><![CDATA[<p>v3, finally, is now public:</p>
<ul>
<li><a href="#version-bump-3">Version Bump 3</a></li>
<li><a href="#create-a-site-via-terminal">Create a Site via Terminal</a></li>
<li><a href="#lighter-container-images">Lighter Container Images</a></li>
<li><a href="#check-your-links-beta">Check Your Links</a></li>
</ul>
<h2 id="version-bump-3">Version Bump 3</h2>
<p>As I've mentioned in the <a href="/blog/v2.2.0-release-mage-merlin-resources">v2.2.0 post</a>, I forgot to mark the release as breaking change. It was so impactful that I was not able to even update this very site. Now I've decided to mark as a new version, signalling the need of changes of any client site.</p>
<h2 id="create-a-site-via-terminal">Create a Site via Terminal</h2>
<p><code>SuCoS newsite -o &lt;PATH&gt;</code> will create a simple blank site.</p>
<h2 id="lighter-container-images">Lighter Container Images</h2>
<p>Using containers to build your site is one of many usages of the program. <em>GitLab</em>, <em>GitHub</em>, <em>Netlify</em> and <em>Cloudflare</em> allow specifying the site builder.</p>
<p>The base image will impact in the speed that the provider will download it to build your site. It was never a big size but it exposes the software to potential vulnerabilities.</p>
<p>The new images (now using both Microsoft modified <em>Ubuntu</em> and <em>Alpine</em>) are smaller and have less stuff into them. Win-win. For those that are using the latest, nothing changes.</p>
<h2 id="check-your-links-beta">Check Your Links (Beta)</h2>
<p>It's now possible to check all the links of your site using the <code>checklinks</code> command. There are flags to check only internal or external links and to skip any given URL that are problematic. It's useful for the build process, making sure that your site is all valid.</p>
<div class="markdown-alert markdown-alert-note">
<p class="markdown-alert-title"><svg viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path></svg>Note</p>
<p>The &quot;internal&quot; flag, that scans the filesystem instead the URL might not work if your site uses Aliases or changes the name of the content.</p>
</div>
<p><a href="https://gitlab.com/sucos/sucos/-/releases/v3.0.0">Download It Now</a></p>
]]></description>
</item>


    <item>
    <title>SuCoS Turns 1</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/sucos-turns-1/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/sucos-turns-1/index.xml</link>
    <pubDate>2024-04-01T00:00:00Z</pubDate>
    <description><![CDATA[<h2 id="past">Past</h2>
<p>Hold onto your hats, folks! It's time to celebrate a major milestone - our very own Static Site Generator (SSG) built with C# has officially turned one! As we blow out the candles and sing &quot;Happy Birthday,&quot; let's take a moment to reflect on the wild ride that our SSG has been on since its inception on April 1st, 2023.</p>
<p>Our SSG was born out of a desire to test and improve my C# skills, as well as a growing frustration with the template system used by <a href="https://gohugo.io/">Hugo</a>, a popular SSG built with Golang. I wanted to create a solution that addressed a problem that I was personally facing. And so, the idea of our SSG was conceived!</p>
<h2 id="present">Present</h2>
<p>When it came to choosing a template system for our SSG, I opted for <a href="https://shopify.github.io/liquid/">Liquid templates</a>. Their popularity and user-friendly nature made them an ideal choice for our SSG. They provided the flexibility and ease of use that I was looking for, making it a perfect fit for our SSG.</p>
<p>As for performance, <a href="https://dotnet.microsoft.com/">DotNet</a> (6, 7, and now, 8) has been instrumental in making our SSG the powerhouse that it is today. The C# team's continued efforts to enhance the performance of DotNet have made it a viable option for performance-critical programs. This has significantly improved the speed and efficiency of our SSG, making it a reliable choice for developers.</p>
<p>As mostly a one-man project, the use of AI was a very important motivator for diving into unknown territory. <a href="https://chat.openai.com/">ChatGPT</a>, <a href="https://copilot.github.com/">Copilot</a>, <a href="https://bard.ai/">Bard</a>, <a href="https://gemini.google.com">Gemini</a>, and <a href="https://chat.mistral.ai">Mistral</a> were mainly used to generate test suites, analyze and suggest optimizations in the code, and suggest libraries that might help.</p>
<h2 id="future">Future</h2>
<p>While our SSG has come a long way in its first year, there's still work to be done. In the coming months, I plan to implement key features such as pagination, multi-language, and image manipulation and conversion. My &quot;ultimate&quot; goal is to port my <a href="https://brunomassa.com">personal blog</a> to our SSG, and I'm confident that these improvements will make that possible.</p>
<p>My wife thought it was an April Fool's joke when I started our SSG. But here we are, a year later, celebrating the first birthday of a project that has grown beyond my wildest dreams. It's been a year of learning, growth, and innovation, and I can't wait to see what the future holds for our SSG.</p>
]]></description>
</item>


    <item>
    <title>v2.4.0 Release: Elegant Crashes</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/v2.4.0-release-elegant-crashes/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/v2.4.0-release-elegant-crashes/index.xml</link>
    <pubDate>2024-03-21T00:00:00Z</pubDate>
    <description><![CDATA[<p>v2.4.0 is now live.</p>
<p>Here are some of the highlights:</p>
<ul>
<li><a href="#build-command-as-default-and-source-as-argument">Build Command as Default and Source as Argument</a></li>
<li><a href="#elegant-crashes">Elegant Crashes</a></li>
</ul>
<h2 id="build-command-as-default-and-source-as-argument">Build Command as Default and Source as Argument</h2>
<p>Now the build command is implicit. Also, the <code>--source</code> option is now an argument, so one can call either build or serve and then the path directly. As before, the default is to assume the current path (<code>./</code>). The usage of <code>--source</code> or <code>-s</code> is still possible and will take precedent, for compatibility’s sake.</p>
<p>Now you can build a site just by calling <code>SuCoS</code>.</p>
<h2 id="elegant-crashes">Elegant Crashes</h2>
<p>When something goes wrong in the build or serve processes (and it most definitively, will), the program crashes. Well, we are not fixing anything here, but at least print the sh*t in a very delicate manner!</p>
<p><a href="https://gitlab.com/sucos/sucos/-/releases/v2.4.0">Download It Now</a></p>
]]></description>
</item>


    <item>
    <title>v2.3.0 Release: .NET 8</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/v2.3.0-release-.net-8/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/v2.3.0-release-.net-8/index.xml</link>
    <pubDate>2024-03-14T00:00:02Z</pubDate>
    <description><![CDATA[<p>Program updated to <strong>.NET 8</strong>. Faster by consequence. Unless you are using SuCoS as a library, nothing changes.</p>
<p><a href="https://gitlab.com/sucos/sucos/-/releases/v2.3.0">Download It Now</a></p>
]]></description>
</item>


    <item>
    <title>v2.2.1 Release: We are back!</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/v2.2.1-release-we-are-back/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/v2.2.1-release-we-are-back/index.xml</link>
    <pubDate>2023-10-19T00:00:10Z</pubDate>
    <description><![CDATA[<p>After some weeks of development hiatus after the sad passing of my dog <a href="https://brunomassa.com/en/blog/my-son-did-his-last-magic-trick/">Mage Merlin</a>, I'm back developing my juice. 2.2.0 was supposed to be 3.0.0 due the disrupting changes for the page resources. I hope anyone using the system found their way.</p>
<p>Anyway, let's try to summarize:</p>
<h2 id="section">2.2.1</h2>
<ul>
<li><a href="#bundle-pages">Bundle pages</a></li>
<li><a href="#other-2.2.1-changes">Other 2.2.1 changes</a></li>
</ul>
<h3 id="bundle-pages">Bundle pages</h3>
<p>You have three bundle types:</p>
<ul>
<li>Branch (also called page bundles): content with filenames as <code>index.md</code> or <code>_image.md</code>. They are the hub and all other files in the folder will be considered as its resources.</li>
<li>Leaf: other markdown content in a folder</li>
</ul>
<pre><code class="language-tree">content/
├── post/
    ├── my-article/
        ├── index.md          // Leaf bundle
        ├── image1.png        // Page resources
    ├──  articles-list/
        ├── _index.md         // Branch bundle
        ├── content2.md       // Page resources
        ├── another-article/
            ├── index.md      // Leaf bundle
            ├── image2.png    // Page resources
</code></pre>
<h3 id="resources">Resources</h3>
<p>Resources can be accessed and printed in the templates:</p>
<pre><code class="language-html">&lt;li&gt;
{% for resource in page.Resources %}
  &lt;ul&gt;&lt;a href=&quot;{{ resource.Permalink }}&quot;&gt;{{ resource.Title }} (FileName: {{ resource.FileName }})&lt;/a&gt;&lt;/ul&gt;
{% endfor %}
&lt;/li&gt;
</code></pre>
<h3 id="resources-definition">Resources Definition</h3>
<p>You can set the title of the resources and rename the assets directly on the front matter metadata.</p>
<pre><code class="language-yaml">ResourceDefinitions:
- src: '*specs.pdf'
  title: 'Specification #{{counter}}'
- src: '*.pdf'
  name: &quot;pdf-file-{{counter}}&quot;
- src: '*.jpg'
  name: &quot;{{title}}-{{counter}}&quot;
  title: &quot;{{title}}-{{counter}}&quot;
</code></pre>
<p>The results would be:</p>
<table class="table table-dark table-striped table-hover" :="">
<thead>
<tr>
<th>Resource file</th>
<th><code>Name</code></th>
<th><code>Title</code></th>
</tr>
</thead>
<tbody>
<tr>
<td>checklist.pdf</td>
<td><code>&quot;pdf-file-1.pdf</code></td>
<td><code>&quot;checklist.pdf&quot;</code></td>
</tr>
<tr>
<td>guide.pdf</td>
<td><code>&quot;pdf-file-2.pdf</code></td>
<td><code>&quot;guide.pdf&quot;</code></td>
</tr>
<tr>
<td>other_specs.pdf</td>
<td><code>&quot;pdf-file-3.pdf</code></td>
<td><code>&quot;Specification #1&quot;</code></td>
</tr>
<tr>
<td>photo_specs.pdf</td>
<td><code>&quot;pdf-file-4.pdf</code></td>
<td><code>&quot;Specification #2&quot;</code></td>
</tr>
<tr>
<td>my-photo.jpg</td>
<td><code>&quot;posttitle-5.jpg</code></td>
<td><code>&quot;posttitle-5.jpg&quot;</code></td>
</tr>
<tr>
<td>my-kids.jpg</td>
<td><code>&quot;posttitle-5.jpg</code></td>
<td><code>&quot;posttitle-5.jpg&quot;</code></td>
</tr>
</tbody>
</table>
<h2 id="other-2.2.1-changes">Other 2.2.1 changes</h2>
<ul>
<li>We're replacing the outdated <code>Microsoft.AspNetCore</code>, that is going to be deprecated, with System.Net for the live server.</li>
<li>We've updated some key packages:
<ul>
<li>Fluid.Core* from 2.4.0 to 2.5.0</li>
<li>Markdig* from 0.31.0 to 0.33.0</li>
<li>Microsoft.NET.Test.Sdk* from  to 17.7.2</li>
<li>Nuke.Common* from 7.0.2 to 7.0.6</li>
<li>Serilog* from 3.0.0 to 3.0.1</li>
<li>YamlDotNet* from 13.1.0 to 13.7.1</li>
</ul>
</li>
<li>For smoother unit testing and URL generation, we're making sure everything uses Unix path style, especially when dealing with code that relies on paths.</li>
</ul>
]]></description>
</item>


    <item>
    <title>v2.2.0 Release: Mage Merlin Resources</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/v2.2.0-release-mage-merlin-resources/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/v2.2.0-release-mage-merlin-resources/index.xml</link>
    <pubDate>2023-10-19T00:00:01Z</pubDate>
    <description><![CDATA[<div class="markdown-alert markdown-alert-warning">
<p class="markdown-alert-title"><svg viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path></svg>Warning</p>
<p>Despite not being marked as a BREAKING CHANGE, it includes a breaking change.</p>
</div>
<div class="markdown-alert markdown-alert-warning">
<p class="markdown-alert-title"><svg viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path></svg>Warning</p>
<p>It was supposed to be published in 2023-08-17.</p>
</div>
<blockquote>
<p>Despite not being marked as a BREAKING CHANGE, it includes a breaking change.</p>
</blockquote>
<h2 id="intro">Intro</h2>
<p>Due to a familiar problem, the death of (from 3) my dog <em>Mage Merlin</em>, I've basically stopped everything I was developing for weeks. I'm still managing to resume all the stuff. I was working in a feature of Page Resources (embed pictures, PDFs, videos, etc.) into pages. It was incomplete, but I decided to publish the WIP, so users might get any potential new feature.</p>
<ul>
<li><a href="#feature-page-bundles">Feature: Page Bundles</a></li>
<li><a href="#version-merlin">Version Merlin</a></li>
</ul>
<h2 id="feature-page-bundles">Feature: Page Bundles</h2>
<p>Each page can have extra content, like image files, video, audio, PDF, and even other markdown pages. They are called page <strong>Resources</strong>. It's available on Bundle pages (see the <a href="/v2.2.1">2.2.1 post</a>).</p>
<h2 id="version-merlin">Version Merlin</h2>
<p>I dedicate this release to my 4-pawns son, <em>Mago Merlin Harigaya Massa</em> 🐕. RIP my boy.</p>
]]></description>
</item>


    <item>
    <title>v2.1.0 Release: Drafting a Site!</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/v2.1.0-release-drafting-a-site/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/v2.1.0-release-drafting-a-site/index.xml</link>
    <pubDate>2023-07-20T00:00:00Z</pubDate>
    <description><![CDATA[<p>New version live. Simple but it's moving forward! That what matters.</p>
<p>Here are some of the highlights:</p>
<ul>
<li><a href="#page-drafts">Page Drafts</a></li>
<li><a href="#site-is-now-a-top-variable">Site is now a top variable</a></li>
</ul>
<h2 id="page-drafts">Page Drafts</h2>
<p>Pages now have a Draft variable that can be used to signal content that is still under development. This can be useful for keeping track of work in progress, or for sharing drafts with others for feedback.</p>
<p>To create a draft page, simply add the <code>Draft</code> variable to the front matter of the page. For example:</p>
<pre><code class="language-md">---
Title: My Draft Page
Draft: true
---

Still writing...
</code></pre>
<p>You can then use the <code>--draft</code> or <code>-d</code> command line argument to serve the draft page.</p>
<h2 id="site-is-now-a-top-variable">Site is now a top variable</h2>
<p>The site variable is now exposed as a top-level variable, so you can access it directly in your templates. This makes it easier to access site-wide variables, such as the title or description.</p>
<p>For example, you could use the <code>site.Title</code> variable to display the site title in your header.</p>
<pre><code class="language-html">&lt;div&gt;
  &lt;h1&gt;{{ site.Title }}&lt;/h1&gt;
&lt;/div&gt;
</code></pre>
<p>We hope you enjoy the new features in v2.1.0!</p>
]]></description>
</item>


    <item>
    <title>v2.0.0 Release: Pages!</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/v2.0.0-release-pages/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/v2.0.0-release-pages/index.xml</link>
    <pubDate>2023-07-13T00:00:00Z</pubDate>
    <description><![CDATA[<p>We're absolutely ecstatic to present to you the fresh-off-the-software-press v2.0.0 release of our platform! This isn't just a bump in the version number or some behind-the-scenes tinkering. No, my friends, this is a revolution for writers and website creators alike, ready to charge up your creative engines!</p>
<p>Let's dive right in and explore these thrilling additions and enhancements:</p>
<ul>
<li><a href="#redefining-the-pages-and-front-matter-concept">Redefining the 'Pages' and 'Front Matter' Concept</a></li>
<li><a href="#discover-the-power-of-plain-content-and-word-count">Discover the Power of Plain Content and Word Count</a></li>
<li><a href="#boost-your-seo-with-site-description-and-copyright">Boost Your SEO with Site Description and Copyright</a></li>
<li><a href="#taking-control-with-forced-expired-pages">Taking Control with Forced Expired Pages</a></li>
<li><a href="#shifting-gears-everything-is-now-internal">Shifting Gears: Everything is Now Internal</a></li>
<li><a href="#power-packed-performance-enhancements">Power-Packed Performance Enhancements</a></li>
<li><a href="#raising-the-bar-with-improved-test-coverage">Raising the Bar with Improved Test Coverage</a></li>
</ul>
<h2 id="redefining-the-pages-and-front-matter-concept">Redefining the 'Pages' and 'Front Matter' Concept</h2>
<p>Our vision has always been a website abundant with vibrant pages. Previously, these pages sprung from markdown with front matter. But we've realized that our code's class <code>Frontmatter</code> was donning many hats, including handling content metadata and calculated properties.</p>
<p>Time for a paradigm shift! Let's call a spade a spade. <strong>Front matter</strong> will solely parse from content, while <strong>Page</strong> ascends as the principal entity. We've cleared the clutter by removing an internal &quot;page-lite&quot; class in favor of front matter. Yes, even the system-generated pages like tags now employ front matter to shape the full page.</p>
<p>This reinvention might disrupt compatibility from previous ABI, thus flagged as Breaking Changes and boosting the major version to the groundbreaking <strong>2</strong>.</p>
<h2 id="discover-the-power-of-plain-content-and-word-count">Discover the Power of Plain Content and Word Count</h2>
<p>In a nod to all future literary prodigies, our Pages now can bare it all – outputting the text in its raw, untarnished form, free from the confines of HTML and markdown tags. To bask in this authenticity in your template, simply use <code>{{ page.Plain }}</code>.</p>
<p>Also, say hello to the new word count functionality, powered by <code>{{ page.WordCount }}</code>.</p>
<p>As like any other page variable, they are case-sensitive.</p>
<h2 id="boost-your-seo-with-site-description-and-copyright">Boost Your SEO with Site Description and Copyright</h2>
<p>Fine-tune your <code>sucos.yaml</code> to include <code>Description</code> and <code>Copyright</code> information, making your website even more enticing to SEO algorithms. Implement these in your templates with <code>{{ page.Site.Description }}</code> and <code>{{ page.Site.Copyright }}</code>.</p>
<h2 id="taking-control-with-forced-expired-pages">Taking Control with Forced Expired Pages</h2>
<p>By default, <strong>SuCoS</strong> smartly sidesteps pages marked with a past <code>ExpiredDate</code> yaml tag. However, we believe in giving you control. Override this feature by simply setting the -e or -expired flag in the command line.</p>
<h2 id="shifting-gears-everything-is-now-internal">Shifting Gears: Everything is Now Internal</h2>
<p>In our relentless quest to maximize security and performance, we've transitioned most of the code from public to internal. In the <em>C#</em> universe, this means that while our code remains internally visible, it isn't exposed to the public. The only outlier here is our testing suite, which needs access to do its thing – testing!</p>
<h2 id="power-packed-performance-enhancements">Power-Packed Performance Enhancements</h2>
<p>We've introduced a multitude of optimizations, mainly avoiding thread locking, to serve you a robust, performance-oriented system. Enjoy a smoother, faster experience!</p>
<h2 id="raising-the-bar-with-improved-test-coverage">Raising the Bar with Improved Test Coverage</h2>
<p>We've pushed the test coverage envelope to now encompass 63%+ of the code, ensuring it stands strong even in rare scenarios. A slew of testing sites has been set up to simulate a wide variety of these scenarios. But wait, there's more to come! Stay tuned.</p>
]]></description>
</item>


    <item>
    <title>v1.3.0 Release: An Exciting Bounty of New Features</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/v1.3.0-release-an-exciting-bounty-of-new-features/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/v1.3.0-release-an-exciting-bounty-of-new-features/index.xml</link>
    <pubDate>2023-07-06T00:00:00Z</pubDate>
    <description><![CDATA[<p>Hello, tech enthusiasts and loyal users! We're beyond thrilled to unveil the latest sensation in our feature lineup - the v1.3.0 release. Buckle up, because we're about to embark on a journey through some impressive upgrades that are sure to spark your curiosity and streamline your user experience. We've focused on your feedback, rolled up our sleeves, and delivered functionalities that add finesse and flexibility to your tech endeavors.</p>
<p>In this blog post, we're giving you the full tour of what's new, what's enhanced, and what's completely reimagined. Let's dive right in and see what v1.3.0 has in store!</p>
<p>Thrilling Changes on Deck:</p>
<ul>
<li><a href="#page-weight">Page Weight</a></li>
<li><a href="#page-ishome-ispage-issection">Page IsHome IsPage IsSection</a></li>
<li><a href="#page-parent">Page Parent</a></li>
<li><a href="#theme-static-folder">Theme Static Folder</a></li>
<li><a href="#build-default-output-folder">Build Default Output Folder</a></li>
<li><a href="#test-coverage-report">Test Coverage Report</a></li>
</ul>
<h2 id="page-weight">Page Weight</h2>
<p>You've asked and we've listened. Pages are now empowering users to set a Weight value for a finer degree of sorting control. Keep things light with the default zero, or ramp it up to sort your pages just how you like.</p>
<h2 id="page-ishome-ispage-issection">Page IsHome IsPage IsSection</h2>
<p>To make your templates that much more intuitive, we're offering extra calculated values:</p>
<p><code>{{ page.IsHome }}</code> is your trusty indicator for the home page.</p>
<p><code>{{ page.IsPage }}</code> stands tall when the page is of the Kind.single variety.</p>
<p><code>{{ page.IsSection }}</code> raises its flag for Section type pages.</p>
<p>Feel the pulse of your page with these new identity markers!</p>
<h2 id="page-parent">Page Parent</h2>
<p>Family ties matter, even for pages. While scanning for content files, we now set the previously created page as the Parent. This allows templates to roam freely through parsed content, just as they wish.</p>
<p>Witness this new feature in action with the new URL default, pairing the title of the parent page with the current page title.</p>
<h2 id="theme-static-folder">Theme Static Folder</h2>
<p>Themes just got a shiny new toy - a folder labeled <code>static</code>! Now, you can stow away unique files like logos and CSS files directly within the theme. And don't worry, the site's own <code>static</code> files will take precedence if available.</p>
<h2 id="build-default-output-folder">Build Default Output Folder</h2>
<p>When using<code>SuCoS build -s /path/of/site</code>, the default output, sans <code>-output/-o</code> was nestled in <code>./public</code>. But we know you deserve better. Now, it will default to <code>/path/of/site/public</code>, a more intuitive and logical choice.</p>
<h2 id="test-coverage-report">Test Coverage Report</h2>
<p>As we ramp up our unit testing efforts, the desire for a coverage report becomes more pressing. Rejoice, because both internal GitLab and external reports are now automatically whipped up after each test. Stay on top of your game with these up-to-the-minute updates! For now, the coverage is about 40%.</p>
]]></description>
</item>


    <item>
    <title>Unveiling the Freshly-Squeezed SuCoS Logo</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/unveiling-the-freshly-squeezed-sucos-logo/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/unveiling-the-freshly-squeezed-sucos-logo/index.xml</link>
    <pubDate>2023-07-05T00:00:00Z</pubDate>
    <description><![CDATA[<p>Get ready to peel back the layers of our exciting new logo for <strong>SuCoS</strong>! We've paired succulent typography with vibrant new hues to quench your thirst for visual appeal. This whole reimagining project wasn't just about stamping our name on a logo. Oh no! We took this fruitful opportunity to juice up some splendid improvements.</p>
<p>By a twist of citrusy fate, we're using a zesty fruit-inspired font: <strong>Lemon Milk</strong>, a refreshing creation by the incredibly talented <em>MARSNEV</em>. This font was just the ripe pick for us, with its perfectly round 'O' that snugly nestles our badge, like a berry in a basket! The only tiny sour note? It doesn't offer lowercase, but hey, it's all about embracing the charm of uppercase, isn't it?</p>
<p>Gone are the days of the faded outer ring color. We've injected a fresh squeeze of the vivid yellow from the inside, creating a sunlit aura as if a burst of tropical juice is splashing out!</p>
<p>Our <strong>SuCoS</strong> project now sports a full logo and badge, holding within it the essence of a refreshing cup of assorted fruit juices.</p>
<p>Curious about the secret juice blend our logo symbolizes? Brace yourself for a delightful cocktail of flavors we've just stirred up:</p>
<ul>
<li>Succulent kiwis</li>
<li>Unforgettable berries</li>
<li>Crisp grapes</li>
<li>Opulent oranges</li>
<li>Spectacular tangerines</li>
</ul>
<p>Isn't this a feast for your senses?</p>
<p class="text-center" :=""><img src="/SuCoS-logo.svg" class="img-fluid" :="" alt="SuCoS logo" /> </p>
<p>Experience the taste of SuCoS in this fresh new logo that promises to make your visual journey with us a joyful ride!</p>
]]></description>
</item>


    <item>
    <title>v1.2.0 Release: Polishing the Edges</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/v1.2.0-release-polishing-the-edges/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/v1.2.0-release-polishing-the-edges/index.xml</link>
    <pubDate>2023-06-29T00:00:00Z</pubDate>
    <description><![CDATA[<p>Welcome to our latest production, the v1.2.0 release! We've been busy squashing some bugs and fine-tuning the gears beneath the surface.</p>
<p>A minor misstep led us to inadvertently christen one of the internal tweaks as a <em>new feature</em>, thus birthing the latest minor version, instead of 1.1.1. Just a slip on the dance floor, nothing to lose sleep over.</p>
<p>Here's the latest playbill:</p>
<ul>
<li><a href="#automated-tests">Automated Tests</a></li>
<li><a href="#lazy-pages-list">Lazy Pages List</a></li>
<li><a href="#code-reorganization">Code Reorganization</a></li>
</ul>
<h2 id="automated-tests">Automated Tests</h2>
<p>Your trusted assistant, SuCoS, is now harnessing the power of automated tests, acting upon every commit and release. With an eye for both the everyday and the peculiar, these tests aim to scour every nook and cranny of the code.</p>
<p>Although we're just dipping our toes in the world of testing, we're already executing around 60 tests, covering roughly 30% of SuCoS's labyrinthine code. We've christened this proportion of the code eventually executed during testing as <em>Coverage</em>.</p>
<p>Our ambitions soar to:</p>
<ul>
<li>A legion of <em>hundreds</em>, billions of tests</li>
<li>Ensuring at least 75% of the code is under the protective umbrella of <em>Coverage</em></li>
<li>Embracing the <a href="#tdd">Test-Driven Development</a> ethos</li>
</ul>
<h3 id="tdd">TDD</h3>
<p><strong>TDD</strong> or <strong>Test-Driven Development</strong>, is a fine art of code crafting. It's akin to crafting a treasure map, where the tests that the new feature must conquer are delineated <em>before</em> even a single line of actual code is written.</p>
<p>Although, it's not always the star of the show during early stages due to the dynamic dance of prototyping. And I must confess, this method and I have an ongoing love-hate relationship.</p>
<h2 id="lazy-pages-list">Lazy Pages List</h2>
<p>A pivotal shift occurred in the site and page .Pages list in the previous versions - they morphed into a dictionary indexed by URL. This evolutionary step wielded a significant edge during site parsing as it could quickly summon a given content using its permalink.</p>
<p>However, the flip side of using dictionaries within the Liquid template presented a hefty challenge, leading us to use the dictionary covertly and only conjure a list when the situation calls for it. This tactical switch ensured a swift process while preserving the simplicity of use.</p>
<h2 id="code-reorganization">Code Reorganization</h2>
<p>Once upon a time, we had a factory class (<code>BaseGeneratorCommand</code>) for creating Site and Front Matter that had a bit of a growth spurt. When the <a href="#automated-tests">Automated Tests</a> spotlight hit this class, it was clear: it was juggling too many roles.</p>
<p>Our fix? We moved parts of <code>Site</code> and <code>FrontMatter</code> creation into their own hands. This meant a slight growth spurt for these classes, the <code>BaseGeneratorCommand</code> class underwent a pleasing slimming-down procedure.</p>
<p>Our next act? More tests and a return to the wonderland of new features!</p>
]]></description>
</item>


    <item>
    <title>v1.1.0 Release</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/v1.1.0-release/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/v1.1.0-release/index.xml</link>
    <pubDate>2023-06-22T00:00:00Z</pubDate>
    <description><![CDATA[<p>We are thrilled to announce the latest release of <strong>SuCoS</strong>, <a href="https://gitlab.com/sucos/sucos/-/releases/v1.1.0">v1.1.0</a>. The first automated weekly release. This version comes chock-full of new features that will significantly improve your user experience and streamline your content management process. The primary features introduced include:</p>
<ul>
<li><a href="#markdown-extras">Markdown Extras</a></li>
<li><a href="#params">Params</a></li>
<li><a href="#url-with-liquid-tokens">URL with Liquid tokens</a></li>
<li><a href="#content-url-aliases">Content URL Aliases</a></li>
<li><a href="#content-date-publishdate-expirydate-and-lastmod">Content Date, PublishDate, ExpiryDate and LastMod</a></li>
<li><a href="#section-pages">Section Pages</a></li>
</ul>
<p>Let's take a closer look at these updates!</p>
<h2 id="markdown-extras">Markdown Extras</h2>
<p>The power of <a href="https://github.com/xoofx/markdig">Markdig</a>, our reliable Markdown parser, just got an upgrade! Now, its default setting includes all built-in extensions. This means you can now create tables, citations, figures, mathematical formulas, auto-links, and more with ease and precision.</p>
<p>For example, to create a simple table, use the following format:</p>
<pre><code class="language-md">| Header 1 | Header 2 |
| -------- | -------- |
| Row 1    | Row 2    |
</code></pre>
<p>will become:</p>
<table>
<thead>
<tr>
<th>Header 1</th>
<th>Header 2</th>
</tr>
</thead>
<tbody>
<tr>
<td>Row 1</td>
<td>Row 2</td>
</tr>
</tbody>
</table>
<h2 id="params">Params</h2>
<p>The Params feature allows all site and page YAML values without matching attributes in the FrontMatter or Site classes to be placed in a dictionary <code>Params</code>. This opens the door for using custom fields in your templates. Here's how you can do it:</p>
<p>Create your content as shown below:</p>
<pre><code class="language-yaml">---
Title: My Page
MyCustomValue: HELLO
---

This is the *Markdown* content.
</code></pre>
<p>And use the custom value in your template:</p>
<pre><code class="language-html">&lt;!-- It will create &lt;span&gt;HELLO&lt;/span&gt; --&gt;
&lt;span&gt;{{ page.Params.MyCustomValue }}&lt;/span&gt;
</code></pre>
<h2 id="url-with-liquid-tokens">URL with Liquid tokens</h2>
<p>We've added a feature that enables Content URL fields to be parsed as a mini Liquid template. This means you can now use other content values, like title, path, or tags, to generate unique URLs. This feature provides a more efficient and dynamic URL creation process.</p>
<pre><code class="language-md">---
Title: My Page
Type: page
URL: &quot;{{ page.Type }}/{{ page.Title }}&quot; # it will become &quot;/page/my-page&quot;
---

This is the *Markdown* content.
</code></pre>
<h2 id="content-url-aliases">Content URL Aliases</h2>
<p>This feature allows content to have multiple URLs pointing to the same page. It's particularly useful when you're transitioning from legacy or old URLs or when you're generating small <code>bitly</code>-like alternatives. Like regular URLs, aliases can also use tokens.</p>
<p>For example, define your aliases in the content file:</p>
<pre><code class="language-md">---
Title: My Page
Aliases:
  - /legacy-url
  - /short-url
  - &quot;{{ page.Type }}/{{ page.Title }}&quot;
---

This is the *Markdown* content.
</code></pre>
<h2 id="content-date-publishdate-expirydate-and-lastmod">Content Date, PublishDate, ExpiryDate and LastMod</h2>
<p>We've added support for these four date fields in the content front matter. Now, you can easily manage your content's publish and expiry dates, as well as track their last modification.</p>
<div class="warning"><p>Important: SuCoS now ignore content that have <code>Date</code> or <code>PublishDate</code> set in the future, as well <code>ExpiryDate</code> that is earlier than the current time. Use the <a href="#f-future-command-line-option">Future</a> command to include them</p>
</div>
<h2 id="f-future-command-line-option">-f/--Future command line option</h2>
<p>We have introduced a new build and serve command line option to include posts from the future (Date or PublishDate values later than the current time). This is particularly handy when you want to preview posts that will be displayed at a later time.</p>
<p>As we continue to improve SuCoS, we appreciate your feedback on these new features. Please feel free to share your thoughts and experiences as you explore SuCoS</p>
<h2 id="section-pages">Section pages</h2>
<p>The very first folder inside <code>content</code> defines each content's <code>Section</code>. Pages, blog, tags... Now SuCoS automatically creates a page for each section. So you can now use <code>ht&lt;span&gt;tp://&lt;/span&gt;example.com /blog</code> to get a list of all blog posts, by default.</p>
]]></description>
</item>


    <item>
    <title>First Release</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/first-release/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/first-release/index.xml</link>
    <pubDate>2023-06-15T00:00:00Z</pubDate>
    <description><![CDATA[<p>Greetings, fellow web enthusiasts and explorers of the digital frontier! Today, we have the great pleasure of unveiling an extraordinary tool that will leave you spellbound and filled with wonder. Allow us to introduce <strong>SuCoS</strong>!</p>
<p><strong>SuCoS</strong>, crafted entirely in <strong>C#</strong> like its spirited sibling <a href="https://dotnet.github.io/docfx/">Docfx</a>, is lovingly crafted entirely in C#. It aspires to be a feature-rich wonderland, drawing inspiration from the ever-popular <a href="/docs/introduction/alternatives/hugo">Hugo</a>. This charming tool is poised to help developers and users alike embark on a whimsical journey of content creation and website building.</p>
<p>Now, dear readers, let's address the number we've bestowed upon this pre-release version. <strong>SuCoS</strong> v1.0.0 is but a humble number, not to be confused with production readiness. We pledge to embrace semantic versioning, with new releases shimmering into existence every week. Our commitment to progress and improvement knows no bounds!</p>
<p>Now, let's take a moment to soak in the majesty of <strong>SuCoS</strong>, as we delve into some of its captivating features:</p>
<ul>
<li><strong>Astonishing Performance</strong>: With <strong>SuCoS</strong>, even when handling a whopping 100k pages, it takes less than a millisecond per page. Blink, and you'll miss it! Who knew that website load times could be this electrifying?</li>
<li><strong>Dynamic Live Server</strong>: Say goodbye to manual refreshing! With the &quot;SuCoS serve&quot; feature, you gain a real-time server for easy prototyping and content writing. Making edits has never felt this invigorating!</li>
<li><strong>Theming</strong>: Want your website to dazzle with personality? <strong>SuCoS</strong> uses the super easy-to-use <strong>Liquid</strong> template system, allowing you to paint your sites with your personal style.</li>
<li><strong>Never-ending Updates</strong>: We believe in sharing our progress with you! There's no holding back on features and fixes - we bring them to you on a <em>weekly basis</em>.</li>
</ul>
<p>Though <strong>SuCoS</strong> may still be polishing its armor for the grand showdown of production readiness, it is already a welcoming haven for adventurous souls ready to embark on this pre-release exploration. Developers and users, join forces! Let's voyage through the depths of this evolving tool together, unveiling its hidden gems and endless potential.</p>
<p>We warmly invite you to accompany us on this magical journey, where sparks of imagination ignite and static websites burst into life. As we continue to perfect <strong>SuCoS</strong>, turning it into a commanding knight of the web, we're eager to hear your feedback, suggestions, and tales of victory.</p>
<ul>
<li>GitLab: <a href="https://gitlab.com/sucos/sucos">https://gitlab.com/sucos/sucos</a></li>
<li>Mastodon <a href="https://fosstodon.org/@SuCoS">@SuCoS</a></li>
<li>Twitter <a href="https://twitter.com/SuCoS_SSG">@SuCoS_SSG</a> (similar to Mastodon, but not free)</li>
<li>Matrix <a href="https://matrix.to/#/#SuCoS:matrix.org">#SuCoS:matrix.org</a></li>
<li>Discord <a href="https://discord.com/channels/1112051704733647058/1112051705316638835">SuCoS Channel</a> (similar to Matrix, but not free)</li>
</ul>
<p>So, dear readers, buckle up and prepare for a magical ride with <strong>SuCoS</strong> that's on the brink of greatness. Together, we'll illuminate the web and create digital wonders that will leave a lasting impression.</p>
<blockquote>
<p>Squeeze Your Ideas, Sweeten the Web!</p>
</blockquote>
]]></description>
</item>


    <item>
    <title>First Commit</title>
    <guid isPermaLink="true">https://fanstatic.mass4.org/blog/first-commit/index.xml</guid>
    <link>https://fanstatic.mass4.org/blog/first-commit/index.xml</link>
    <pubDate>2023-04-01T00:00:00Z</pubDate>
    <description><![CDATA[<p>👋🌍 Hello, World! Bid farewell to your web development woes and say hello to <strong>SuCoS</strong> ✨</p>
]]></description>
</item>




    </channel>
</rss>
