2025-08-19

Built a lightweight blog server in Rust over the past few weekends. The page templates are specified in a custom DSL inspired by styled-components which is parsed with nom:

component Favicon {
  style {
    all: unset;
  }

  {if page == "main"}
    <FaviconImage />
  {else}
    <a style="cursor: pointer" href="/">
      <FaviconImage />
    </a>
  {end}
}

All code changes are published with Woodpecker CI to a local Docker Registry instance. The templates, articles and posts are stored on Hetzner S3 as a tar.gz archive, and loaded into memory on startup. Internal endpoints reload the archives and make new content or style changes available without downtime.