codesthings.com — personal portfolio/CV. Static site generator: JSON → EJS → plain HTML/CSS/JS. No frameworks.
make build # Docker build
make serve # Docker serve only
make dev # Docker watch + serve
make pdf # Generate PDF via Gotenberg
make cleandata/— JSON content +data/blog/*.mdsrc/index.js— build pipelinesrc/templates/— EJS.index.ejsmain,sections/partialssrc/css/styles.css— all styles, CSS custom props for theming (.darkclass)src/js/theme.js— dark mode + scroll animationssrc/assets/— icons, logos, faviconssrc/assets/— icons, logos, faviconssrc/assets/fonts/— local font filessrc/assets/logo/—logo.svg/logo-dark.svg(full),icon.svg/icon-dark.svg(128×128)
Icons: devicon-* CSS classes or local paths. iconType field controls which.
Node.js ESM. Prettier: 120ch, 2-space, single quotes, trailing commas, no arrow parens. No TypeScript.
Tasks: docs/todo.md. Plans: docs/superpowers/plans/. Active plan: docs/superpowers/plans/2026-04-12-ux-polish.md.
After each task: mark [x] in docs/todo.md and active plan. Commit with final work.
Commit cadence: every git commit → immediately git push origin claude-cleanup.
Skills: brainstorm before non-trivial work. subagent-driven-development for parallel tasks. verification-before-completion before marking done.
Browse (visual checks):
B="$HOME/.claude/skills/gstack/browse/dist/browse"
npm start && npm run server &
$B goto http://localhost:8080 && $B screenshot /tmp/check.png
pkill -f "node src/server"- Always: no secrets/junk in staged files
- Source changed (JS/EJS/CSS):
npm startbuilds,npm run format:checkpasses - Visual output changed: browse screenshot, check light + dark
- Docs/config only: skip build + visual checks
main → GitHub Actions → Gotenberg PDF → pages branch → codesthings.com.