My personal website built with Hugo (extended, pinned to
0.164.0 - see .github/actions/setup-hugo/action.yml and
.devcontainer/devcontainer.json).
Presentation lives in its own theme, themes/constructivist/ (see its
README), wired in via
theme = 'constructivist' in hugo.toml. content/, data/, and
archetypes/ stay at the repo root and are theme-agnostic; trying a
different look later means adding a sibling theme directory and changing
that one config line, without touching content. themes/typewriter/ is the
prior theme, kept in the repo as a fallback and reference implementation
rather than deleted.
CI: pull requests build the site, validate internal links, and check
formatting (.github/workflows/ci.yml); merges to main build and deploy to
GitHub Pages (build-and-deploy.yml); a weekly job checks external links
online and files an issue on rot (link-check.yml).
hugo server -D # live preview with drafts at http://localhost:1313
npm run format # format templates with Prettier
npm run check-links # build and validate links with lycheeHTML templates are formatted with Prettier via prettier-plugin-go-template. Two caveats:
- Keep Go template comments (
{{ /* ... */ }}) on a single line: the plugin splits multiline comments across lines, which breaks Hugo's template parser. - Each theme's
layouts/rss.xmlis hand-formatted and untouched by the*.htmlglob above: the plugin parses input as HTML, where<link>is a void element, so RSS's<link>...</link>container breaks its parser. The template uses{{- -}}whitespace-trim markers around text content, so indentation never leaks into the feed.