This is the meta post — documenting the stack while the decisions are still fresh.
Why Hugo
Hugo compiles in milliseconds. There is no Node.js in the build pipeline, no node_modules, no webpack config to debug. A single binary takes Markdown and templates and produces HTML. That’s the entire build.
The extended version includes Dart Sass and esbuild, so SCSS compilation and JS bundling happen inside the same binary. One dependency.
No Theme
Hugo supports building entirely from your own layouts/ directory. No imported theme means no fighting someone else’s opinions, no overriding classes, no wondering which template is actually rendering.
The tradeoff is more upfront work. It’s worth it.
Self-Hosted Fonts
No Google Fonts. No external CDN. Two fonts — Inter for prose, JetBrains Mono for code and metadata. Both served from this domain.
This satisfies the Content Security Policy (font-src 'self') and eliminates a third-party request on every page load. The fonts are fingerprinted and cached.
GitHub Actions
Every push to main triggers a build. Hugo runs with --minify. The output goes to GitHub Pages. The footer shows the short commit SHA and deploy timestamp — both written to data/build.json at build time.
- name: Write build info
run: |
printf '{"commit":"%s","short_commit":"%s","timestamp":"%s"}\n' \
"$GITHUB_SHA" "${GITHUB_SHA:0:7}" "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
> data/build.json
What’s Not Here
No analytics. No comment system. No newsletter. No cookie banner — there’s nothing to consent to. The CSP enforces most of this technically, not just as a policy.
curl -I on this domain returns something worth reading.