A zero-build CSS pipeline for Hugo
How Systemone assembles hand-written CSS with Hugo Pipes alone, no Node build step required.
Systemone ships hand-written plain CSS. There is no Sass, no PostCSS, no
Tailwind, and no Node build dependency — resources.Concat, resources.Minify
and resources.Fingerprint are the only build tooling, and Hugo is already
running them.
The theme’s head.html partial assembles the final stylesheet from an
ordered list of files:
{{- $cssFiles := slice "css/reset.css" "css/tokens.css" "css/base.css" "css/prose.css" "css/a11y.css" -}}
{{- $cssResources := slice -}}
{{- range $cssFiles -}}
{{- with resources.Get . -}}
{{- $cssResources = $cssResources | append . -}}
{{- end -}}
{{- end -}}
{{- $css := $cssResources | resources.Concat "css/systemone.css" -}}
{{- if hugo.IsProduction -}}
{{- $css = $css | minify | fingerprint -}}
{{- end -}}
A small generated stylesheet, built from validated design.* params, is
appended last so a site’s hugo.toml can override a handful of tokens
without touching the theme’s own CSS files:
[design]
appearance = "auto"
lime = "#d4ff3f"
pink = "#ee5ba6"
containerMax = "1160px"
Why this matters
A user should be able to clone the theme, point Hugo at it, and read the
site without running npm install first. That constraint shapes everything
else: no webfonts, no icon font, and — in Stage 1 at least — no JavaScript
at all.
Authoring remains build-tool-free CSS. A user can understand and edit the theme without package installation.
— docs/DESIGN-SYSTEM.md, §7
Inline code like resources.Concat reads the same monospace stack as
fenced blocks, just smaller and boxed in a thin ink line rather than a full
terminal panel.