How This Site Is Built
alexricher.com is a static site, hand-built and shipped from my laptop. Here is what runs it and the discipline behind it.
Static by default
Next.js builds the whole site to static HTML, and it ships to cPanel shared hosting. The only server-side piece is a small PHP handler for the contact form. No database, no Node process in production. Pages load as files.
One command to ship
Bun runs the build. It generates AVIF and WebP for every image, renders the per-page and per-game social cards through headless Chrome, writes the sitemap and the feeds, then injects the PHP backend. Deploys are blue-green: the new release goes up beside the old one, gets checked, and a symlink swap makes it live. A bad deploy rolls back.
English and French, in parallel
English lives at the root, French under /fr/. Every page has a counterpart. The strings sit in sharded JSON that merges into one bundle per language, and a test fails the build if a key exists in one language but not the other. The French is Quebec French.
Eleven themes, mostly seasonal
Light and dark, plus twelve seasonal palettes that switch themselves on by date: Halloween, the holidays, Saint-Jean, Canada Day, Carnaval, and more. The colours come from one JSON file that generates the CSS, so a new theme is a data edit, not a code change.
Things to find
There is an achievement system hiding in the page, a dozen eggs to trigger, and a trophy room that tracks what you have found. The director's-commentary toggle on the game pages is the kind of extra that shipped on the Deus Ex: Human Revolution disc.
Written to not sound like a robot
Most of the copy here starts as an AI draft, then runs through a house style guide that strips the tells, the em-dashes and the words that cluster in machine prose, so it reads like an engineer wrote it.
Six thousand tests
Every change runs unit tests, browser end-to-end tests, an accessibility scan that fails on a single serious violation, visual-regression snapshots, and Lighthouse. It all stays green before anything ships, and the count climbs every week.
Quiet by default
No third-party trackers and no cookie wall. Analytics are self-hosted and opt-in. The contact form is rate-limited and validates on both ends, and robots.txt tells AI crawlers where the site stands.
Set in Geist and JetBrains Mono. Icons by Lucide. Next.js, Tailwind, and TypeScript underneath, all open source. Everything else is hand-rolled.
Last updated: 2026-06-20