The usual static-site build has a Node step in it, and the Node step is where most of the breakage lives. Hugo’s own pipeline covers enough that a content site does not need one.

What the pipeline already does#

Concatenation, minification, fingerprinting and subresource integrity are all built in:

{{ $css := slice
     (resources.Get "css/tokens.css")
     (resources.Get "css/base.css")
   | resources.Concat "css/site.css" | minify | fingerprint "sha512" }}
<link rel="stylesheet" href="{{ $css.RelPermalink }}" integrity="{{ $css.Data.Integrity }}">

That is the whole build. No lockfile, no node_modules, nothing to audit.

What you give up#

Autoprefixing, and the ability to use a framework that assumes a bundler. Custom properties and modern CSS cover most of what a preprocessor was for, and the browsers that needed the prefixes are gone.

What you gain#

A build that still works in two years. The failure modes of a Hugo-only build are Hugo’s, and there is exactly one binary to upgrade.