Stack
Eleventy (11ty), Nunjucks templates
Hand-rolled Sass, compiled with the Dart Sass CLI. Still built on the vendored Bourbon/Neat grid mixins rather than an npm package — old-school, and I know it.
Vanilla JS, no framework
Google Fonts (IBM Plex Mono, Instrument Sans) — not self-hosted yet
GitHub Actions build → FTP deploy to shared hosting
Google Analytics
Decisions
Flash-free theme switching
The theme toggle needs to know the visitor's preference before the page paints, or you get a flash of the wrong theme. This script runs synchronously in <head>, before anything renders, reading localStorage and falling back to prefers-color-scheme:
!function () {
var el = document.documentElement,
theme = localStorage.getItem("theme") ||
(window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").matches
? "dark" : "light");
el.className = el.className.replace(/\btheme-\S+/g, "");
el.classList.add("theme-" + theme);
}();
No framework
The site is a handful of pages with light interactivity — a theme toggle, a mobile menu, a marquee, some scroll-triggered reveals. None of that needed React or a build pipeline beyond Eleventy itself. Vanilla JS keeps the payload small and the code easy to read top to bottom.
Accessible marquee
The client-logo marquee is duplicated so it can scroll continuously. The repeated copies are marked aria-hidden with tabindex="-1", so screen readers and keyboard users only ever encounter each logo once. A small script clones further copies at runtime to fill wide viewports, and those clones inherit the same attributes automatically.
Vendored Sass over an npm grid package
The layout grid still runs on Bourbon and Neat, vendored directly into the repo rather than installed from npm. That's a decision from an earlier version of the site that never got revisited — it works, so replacing it hasn't been worth the churn yet.
Built with Claude Code
This page — spec, implementation plan, code, and review — was built with Claude Code using the Superpowers skill framework: a brainstormed spec, a task-by-task implementation plan, then a fresh subagent per task with a review gate before the next one starts. I also ran two community skill packs directly against this page — jakubkrehel/skills and make-interfaces-feel-better — the latter is what caught the repo-link pills below sitting under the recommended hit-area minimum, since fixed. On the homepage hero, better-accessibility from that same collection measured real contrast ratios (not eyeballed) and caught a light-theme text failure at 3.18:1, since fixed to 5.01:1. I directed all of it, reviewed every diff, and made the calls on scope and content. It's one more data point on the "vendored Sass" decision above — some of this site is old-school, some of it isn't.
A brief history
-
2016
First version of the site.
-
2018–19
Rebuilt on Jekyll — HTTPS, cleaner URLs.
-
2025
Rebuilt again on Eleventy — the version you're looking at now.
Repo
The whole site is open. Poke around, or start with a few of the more interesting parts: