blog

v4.3.0 Release: Slimmer and Smarter

2024-09-05

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.

Trimmed Executable: Smaller Footprint

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!

Method Size
Before ~80 MB
After ~40 MB
Trimming Full ~30 MB
Native AOT ~25 MB

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.

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.

Updated Dependencies: Staying Current

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:

  • Fluid.Core: 2.10.0 → 2.11.1
  • FolkerKinzel.MimeTypes: 5.2.1 → 5.3.0
  • Microsoft.NET.Build.Containers: 8.0.302 → 8.0.401
  • Microsoft.NET.Test.Sdk: 17.10.0 → 17.11.0
  • Serilog: 4.0.0 → 4.0.1
  • Vecc.YamlDotNet.Analyzers.StaticGenerator: 15.1.2 → 16.0.0
  • xunit.runner.visualstudio: 2.8.1 → 2.8.2
  • YamlDotNet: 15.3.0 → 16.1.0

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.

Happy site generating!

Download It Now

View Changelog

v4.2.1 Release: Cascading Effects

2024-06-20

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.

Cascading Front Matter

In an effort to make site configuration more efficient, we've introduced the cascade feature in the front matter. This new feature allows you to propagate settings to the content's children, reducing the need for repetitive configuration.

Here's an example of how to use the cascade feature:

---
Title: Blog
Cascade:
    Weight: 1
    Draft: true
    Params:
        subtitle: "article"
---

In this example, the Weight, Draft, and subtitle properties will be inherited by all children of the "Blog" section. This feature is particularly useful when you want to apply consistent settings across multiple pages without having to define them individually.

New sucos Variable for Templates

We've added a new sucos variable for templates, which contains useful information about your site and the SuCoS. The sucos variable includes the following properties:

  • IsServer: Indicates whether the site is being served by the SuCoS server.
  • DotNetVersion: The version of the .NET runtime being used by SuCoS.
  • Version: The version of the SuCoS.
  • BuildDate: The build date of the SuCoS.

You can use these properties in your templates to display relevant information or conditionally render content based on the environment.

For example, you can display the SuCoS version in the footer of your site using the following Liquid code:

Powered by SuCoS {{ sucos.Version }}

Download It Now

Commits

v4.1.0 Release: In Case you Prefer Lowercase

2024-05-16

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.

Extended Theming with New Liquid Templates

We've added two new Liquid templates, term.liquid and taxonomy.liquid, to further extend the list of available templates for theming. If these templates are missing, they will default to list.liquid. These new templates provide you with more flexibility and control when customizing the look and feel of your taxonomy and term pages.

term.liquid 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.

taxonomy.liquid 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.

Case-Insensitive YAML Front Matter and Site Settings

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.

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 Title in your YAML configuration:

---
Title: My Page
---

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:

---
title: My Page 1
---
---
TITLE: My Page 1
---
---
tiTle: My Page 1
---

This change applies to all properties in the sucos.yaml and any content page.

Notice: in case of repeating values, the last one will prevail.

---
title: My Page 1
TITLE: My Page 2
tiTle: My Page 3 # This one will be used since it's the last
---

Download It Now

Commits

v4.0.2 Release: Speed and Stability Boost

2024-05-09

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.

JetBrains Rider and Qodana Optimizations

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.

Server Crash on Constant File Changes

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.

Stay tuned for more exciting updates in the near future!

Download It Now

v4.0.1 Release: Log the Changes

2024-04-25

We're excited to bring you a small but important update - the introduction of a human-friendly changelog!

Human-Friendly Changelog

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!

Download It Now

v4.0.0 Release: Multiple Themes

2024-04-10

One week after the v3, we now have a brand new version! It is about twice as fast and makes lots of internal changes:

Breaking Changes

Due to the ReadyToRun and Multiple themes features, there are some changes that users must be aware when upgrading their sites. More on that later.

Features

ReadyToRun

Recent DotNet versions allow a hybrid approach between compiled vs JIT compilation. It is called ReadyToRun. It tries to optimize the code converting some into native code and also make some inferences about the JIT optimizations.

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.

BREAKING CHANGE: all page and site settings (YAML) that are not de default variables will be ignored. Only custom data present under Params: will be kept into your pages. Before, unknown values were automatically placed under Params, even if placed elsewhere.

Multiple themes

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 sucus.yaml). It will also allow using nested git repositories and splitting the theme into other remote repositories.

BREAKING CHANGE: 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

new theme terminal command

You can now scaffold the theme structure using the new SuCoS new theme command. It will -still- not populate with any generic theme, but it's the plan for the future.

CODE_OF_CONDUCT and CONTRIBUTING

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 developer section of this site.

Fixes

404 page Exception

When using live server, if the 404 page is hit (non-existing page), the server was raising an exception and crashing.

Return 0 (success) for help and version

when calling SuCoS version or SuCoS help terminal commands, it was crashing.

Internal Organization

Some changes in the code that do not change the behavior of the app.

  • Nuke build project is now merged inside .nuke
  • All app commands are placed in Commands folder
  • Updated dependencies and libraries
  • Fixes and enhancements in code comments and code style

Download It Now

v3.0.0 Release: New Site

2024-04-04

v3, finally, is now public:

Version Bump 3

As I've mentioned in the v2.2.0 post, 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.

Create a Site via Terminal

SuCoS newsite -o <PATH> will create a simple blank site.

Lighter Container Images

Using containers to build your site is one of many usages of the program. GitLab, GitHub, Netlify and Cloudflare allow specifying the site builder.

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.

The new images (now using both Microsoft modified Ubuntu and Alpine) are smaller and have less stuff into them. Win-win. For those that are using the latest, nothing changes.

It's now possible to check all the links of your site using the checklinks 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.

Note

The "internal" flag, that scans the filesystem instead the URL might not work if your site uses Aliases or changes the name of the content.

Download It Now

SuCoS Turns 1

2024-04-01

Past

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 "Happy Birthday," let's take a moment to reflect on the wild ride that our SSG has been on since its inception on April 1st, 2023.

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 Hugo, 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!

Present

When it came to choosing a template system for our SSG, I opted for Liquid templates. 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.

As for performance, DotNet (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.

As mostly a one-man project, the use of AI was a very important motivator for diving into unknown territory. ChatGPT, Copilot, Bard, Gemini, and Mistral were mainly used to generate test suites, analyze and suggest optimizations in the code, and suggest libraries that might help.

Future

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 "ultimate" goal is to port my personal blog to our SSG, and I'm confident that these improvements will make that possible.

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.

v2.4.0 Release: Elegant Crashes

2024-03-21

v2.4.0 is now live.

Here are some of the highlights:

Build Command as Default and Source as Argument

Now the build command is implicit. Also, the --source 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 (./). The usage of --source or -s is still possible and will take precedent, for compatibility’s sake.

Now you can build a site just by calling SuCoS.

Elegant Crashes

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!

Download It Now

v2.3.0 Release: .NET 8

2024-03-14

Program updated to .NET 8. Faster by consequence. Unless you are using SuCoS as a library, nothing changes.

Download It Now

v2.2.1 Release: We are back!

2023-10-19

After some weeks of development hiatus after the sad passing of my dog Mage Merlin, 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.

Anyway, let's try to summarize:

2.2.1

Bundle pages

You have three bundle types:

  • Branch (also called page bundles): content with filenames as index.md or _image.md. They are the hub and all other files in the folder will be considered as its resources.
  • Leaf: other markdown content in a folder
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

Resources

Resources can be accessed and printed in the templates:

<li>
{% for resource in page.Resources %}
  <ul><a href="{{ resource.Permalink }}">{{ resource.Title }} (FileName: {{ resource.FileName }})</a></ul>
{% endfor %}
</li>

Resources Definition

You can set the title of the resources and rename the assets directly on the front matter metadata.

ResourceDefinitions:
- src: '*specs.pdf'
  title: 'Specification #{{counter}}'
- src: '*.pdf'
  name: "pdf-file-{{counter}}"
- src: '*.jpg'
  name: "{{title}}-{{counter}}"
  title: "{{title}}-{{counter}}"

The results would be:

Resource file Name Title
checklist.pdf "pdf-file-1.pdf "checklist.pdf"
guide.pdf "pdf-file-2.pdf "guide.pdf"
other_specs.pdf "pdf-file-3.pdf "Specification #1"
photo_specs.pdf "pdf-file-4.pdf "Specification #2"
my-photo.jpg "posttitle-5.jpg "posttitle-5.jpg"
my-kids.jpg "posttitle-5.jpg "posttitle-5.jpg"

Other 2.2.1 changes

  • We're replacing the outdated Microsoft.AspNetCore, that is going to be deprecated, with System.Net for the live server.
  • We've updated some key packages:
    • Fluid.Core* from 2.4.0 to 2.5.0
    • Markdig* from 0.31.0 to 0.33.0
    • Microsoft.NET.Test.Sdk* from to 17.7.2
    • Nuke.Common* from 7.0.2 to 7.0.6
    • Serilog* from 3.0.0 to 3.0.1
    • YamlDotNet* from 13.1.0 to 13.7.1
  • 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.

v2.2.0 Release: Mage Merlin Resources

2023-10-19

Warning

Despite not being marked as a BREAKING CHANGE, it includes a breaking change.

Warning

It was supposed to be published in 2023-08-17.

Despite not being marked as a BREAKING CHANGE, it includes a breaking change.

Intro

Due to a familiar problem, the death of (from 3) my dog Mage Merlin, 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.

Feature: Page Bundles

Each page can have extra content, like image files, video, audio, PDF, and even other markdown pages. They are called page Resources. It's available on Bundle pages (see the 2.2.1 post).

Version Merlin

I dedicate this release to my 4-pawns son, Mago Merlin Harigaya Massa 🐕. RIP my boy.

v2.1.0 Release: Drafting a Site!

2023-07-20

New version live. Simple but it's moving forward! That what matters.

Here are some of the highlights:

Page Drafts

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.

To create a draft page, simply add the Draft variable to the front matter of the page. For example:

---
Title: My Draft Page
Draft: true
---

Still writing...

You can then use the --draft or -d command line argument to serve the draft page.

Site is now a top variable

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.

For example, you could use the site.Title variable to display the site title in your header.

<div>
  <h1>{{ site.Title }}</h1>
</div>

We hope you enjoy the new features in v2.1.0!

v2.0.0 Release: Pages!

2023-07-13

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!

Let's dive right in and explore these thrilling additions and enhancements:

Redefining the 'Pages' and 'Front Matter' Concept

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 Frontmatter was donning many hats, including handling content metadata and calculated properties.

Time for a paradigm shift! Let's call a spade a spade. Front matter will solely parse from content, while Page ascends as the principal entity. We've cleared the clutter by removing an internal "page-lite" class in favor of front matter. Yes, even the system-generated pages like tags now employ front matter to shape the full page.

This reinvention might disrupt compatibility from previous ABI, thus flagged as Breaking Changes and boosting the major version to the groundbreaking 2.

Discover the Power of Plain Content and Word Count

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 {{ page.Plain }}.

Also, say hello to the new word count functionality, powered by {{ page.WordCount }}.

As like any other page variable, they are case-sensitive.

Fine-tune your sucos.yaml to include Description and Copyright information, making your website even more enticing to SEO algorithms. Implement these in your templates with {{ page.Site.Description }} and {{ page.Site.Copyright }}.

Taking Control with Forced Expired Pages

By default, SuCoS smartly sidesteps pages marked with a past ExpiredDate yaml tag. However, we believe in giving you control. Override this feature by simply setting the -e or -expired flag in the command line.

Shifting Gears: Everything is Now Internal

In our relentless quest to maximize security and performance, we've transitioned most of the code from public to internal. In the C# 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!

Power-Packed Performance Enhancements

We've introduced a multitude of optimizations, mainly avoiding thread locking, to serve you a robust, performance-oriented system. Enjoy a smoother, faster experience!

Raising the Bar with Improved Test Coverage

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.

v2.0.0 Release: Pages!

2023-07-13

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!

Let's dive right in and explore these thrilling additions and enhancements:

Redefining the 'Pages' and 'Front Matter' Concept

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 Frontmatter was donning many hats, including handling content metadata and calculated properties.

Time for a paradigm shift! Let's call a spade a spade. Front matter will solely parse from content, while Page ascends as the principal entity. We've cleared the clutter by removing an internal "page-lite" class in favor of front matter. Yes, even the system-generated pages like tags now employ front matter to shape the full page.

This reinvention might disrupt compatibility from previous ABI, thus flagged as Breaking Changes and boosting the major version to the groundbreaking 2.

Discover the Power of Plain Content and Word Count

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 {{ page.Plain }}.

Also, say hello to the new word count functionality, powered by {{ page.WordCount }}.

As like any other page variable, they are case-sensitive.

Fine-tune your sucos.yaml to include Description and Copyright information, making your website even more enticing to SEO algorithms. Implement these in your templates with {{ page.Site.Description }} and {{ page.Site.Copyright }}.

Taking Control with Forced Expired Pages

By default, SuCoS smartly sidesteps pages marked with a past ExpiredDate yaml tag. However, we believe in giving you control. Override this feature by simply setting the -e or -expired flag in the command line.

Shifting Gears: Everything is Now Internal

In our relentless quest to maximize security and performance, we've transitioned most of the code from public to internal. In the C# 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!

Power-Packed Performance Enhancements

We've introduced a multitude of optimizations, mainly avoiding thread locking, to serve you a robust, performance-oriented system. Enjoy a smoother, faster experience!

Raising the Bar with Improved Test Coverage

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.

v1.3.0 Release: An Exciting Bounty of New Features

2023-07-06

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.

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!

Thrilling Changes on Deck:

Page Weight

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.

Page IsHome IsPage IsSection

To make your templates that much more intuitive, we're offering extra calculated values:

{{ page.IsHome }} is your trusty indicator for the home page.

{{ page.IsPage }} stands tall when the page is of the Kind.single variety.

{{ page.IsSection }} raises its flag for Section type pages.

Feel the pulse of your page with these new identity markers!

Page Parent

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.

Witness this new feature in action with the new URL default, pairing the title of the parent page with the current page title.

Theme Static Folder

Themes just got a shiny new toy - a folder labeled static! Now, you can stow away unique files like logos and CSS files directly within the theme. And don't worry, the site's own static files will take precedence if available.

Build Default Output Folder

When usingSuCoS build -s /path/of/site, the default output, sans -output/-o was nestled in ./public. But we know you deserve better. Now, it will default to /path/of/site/public, a more intuitive and logical choice.

Test Coverage Report

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%.

Unveiling the Freshly-Squeezed SuCoS Logo

2023-07-05

Get ready to peel back the layers of our exciting new logo for SuCoS! 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.

By a twist of citrusy fate, we're using a zesty fruit-inspired font: Lemon Milk, a refreshing creation by the incredibly talented MARSNEV. 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?

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!

Our SuCoS project now sports a full logo and badge, holding within it the essence of a refreshing cup of assorted fruit juices.

Curious about the secret juice blend our logo symbolizes? Brace yourself for a delightful cocktail of flavors we've just stirred up:

  • Succulent kiwis
  • Unforgettable berries
  • Crisp grapes
  • Opulent oranges
  • Spectacular tangerines

Isn't this a feast for your senses?

SuCoS logo

Experience the taste of SuCoS in this fresh new logo that promises to make your visual journey with us a joyful ride!

v1.2.0 Release: Polishing the Edges

2023-06-29

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.

A minor misstep led us to inadvertently christen one of the internal tweaks as a new feature, thus birthing the latest minor version, instead of 1.1.1. Just a slip on the dance floor, nothing to lose sleep over.

Here's the latest playbill:

Automated Tests

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.

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 Coverage.

Our ambitions soar to:

  • A legion of hundreds, billions of tests
  • Ensuring at least 75% of the code is under the protective umbrella of Coverage
  • Embracing the Test-Driven Development ethos

TDD

TDD or Test-Driven Development, 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 before even a single line of actual code is written.

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.

Lazy Pages List

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.

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.

Code Reorganization

Once upon a time, we had a factory class (BaseGeneratorCommand) for creating Site and Front Matter that had a bit of a growth spurt. When the Automated Tests spotlight hit this class, it was clear: it was juggling too many roles.

Our fix? We moved parts of Site and FrontMatter creation into their own hands. This meant a slight growth spurt for these classes, the BaseGeneratorCommand class underwent a pleasing slimming-down procedure.

Our next act? More tests and a return to the wonderland of new features!

v1.1.0 Release

2023-06-22

We are thrilled to announce the latest release of SuCoS, v1.1.0. 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:

Let's take a closer look at these updates!

Markdown Extras

The power of Markdig, 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.

For example, to create a simple table, use the following format:

| Header 1 | Header 2 |
| -------- | -------- |
| Row 1    | Row 2    |

will become:

Header 1 Header 2
Row 1 Row 2

Params

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 Params. This opens the door for using custom fields in your templates. Here's how you can do it:

Create your content as shown below:

---
Title: My Page
MyCustomValue: HELLO
---

This is the *Markdown* content.

And use the custom value in your template:

<!-- It will create <span>HELLO</span> -->
<span>{{ page.Params.MyCustomValue }}</span>

URL with Liquid tokens

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.

---
Title: My Page
Type: page
URL: "{{ page.Type }}/{{ page.Title }}" # it will become "/page/my-page"
---

This is the *Markdown* content.

Content URL Aliases

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 bitly-like alternatives. Like regular URLs, aliases can also use tokens.

For example, define your aliases in the content file:

---
Title: My Page
Aliases:
  - /legacy-url
  - /short-url
  - "{{ page.Type }}/{{ page.Title }}"
---

This is the *Markdown* content.

Content Date, PublishDate, ExpiryDate and LastMod

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.

Important: SuCoS now ignore content that have Date or PublishDate set in the future, as well ExpiryDate that is earlier than the current time. Use the Future command to include them

-f/--Future command line option

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.

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

Section pages

The very first folder inside content defines each content's Section. Pages, blog, tags... Now SuCoS automatically creates a page for each section. So you can now use ht<span>tp://</span>example.com /blog to get a list of all blog posts, by default.

First Release

2023-06-15

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 SuCoS!

SuCoS, crafted entirely in C# like its spirited sibling Docfx, is lovingly crafted entirely in C#. It aspires to be a feature-rich wonderland, drawing inspiration from the ever-popular Hugo. This charming tool is poised to help developers and users alike embark on a whimsical journey of content creation and website building.

Now, dear readers, let's address the number we've bestowed upon this pre-release version. SuCoS 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!

Now, let's take a moment to soak in the majesty of SuCoS, as we delve into some of its captivating features:

  • Astonishing Performance: With SuCoS, 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?
  • Dynamic Live Server: Say goodbye to manual refreshing! With the "SuCoS serve" feature, you gain a real-time server for easy prototyping and content writing. Making edits has never felt this invigorating!
  • Theming: Want your website to dazzle with personality? SuCoS uses the super easy-to-use Liquid template system, allowing you to paint your sites with your personal style.
  • Never-ending Updates: We believe in sharing our progress with you! There's no holding back on features and fixes - we bring them to you on a weekly basis.

Though SuCoS 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.

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 SuCoS, turning it into a commanding knight of the web, we're eager to hear your feedback, suggestions, and tales of victory.

So, dear readers, buckle up and prepare for a magical ride with SuCoS that's on the brink of greatness. Together, we'll illuminate the web and create digital wonders that will leave a lasting impression.

Squeeze Your Ideas, Sweeten the Web!

First Commit

2023-04-01

👋🌍 Hello, World! Bid farewell to your web development woes and say hello to SuCoS