Skip to main content

Colophon

How this site is built, and why.

Stack

Framework

Eleventy (11ty), Nunjucks templates

Styles

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.

JavaScript

Vanilla JS, no framework

Fonts

Google Fonts (IBM Plex Mono, Instrument Sans) — not self-hosted yet

Hosting

GitHub Actions build → FTP deploy to shared hosting

Analytics

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: