Colophon

// how this site was built

The short version

Every page here is hand-written HTML with inline CSS and vanilla JavaScript. There is no framework, no bundler, and no build step. You can right-click, view source, and read the entire thing top to bottom. Deploys are one command to Firebase Hosting, which serves the files exactly as they sit on disk.

-Game versions shipped
-Playable games
11Tools
0Build steps

Why no framework

A portfolio that takes ninety seconds to install before you can change a color is a portfolio you stop updating. Plain files load instantly, never break from a dependency bump, and will still run in a browser in ten years. The constraint also keeps me honest: if a page needs a megabyte of JavaScript, the idea was probably wrong.

The tradeoff is repetition. Shared behavior lives in three small scripts that every page pulls in: site-fx.js for the constellation background, page transitions, and the command palette; player.js for the cross-game save layer; touch.js for on-screen controls when you're on a phone.

The games

Each game is a single HTML file, typically 1,500 to 2,500 lines. Three.js handles rendering, cannon-es handles physics where a game needs it. Nothing is precompiled; the browser downloads the file and starts simulating.

Drive's terrain is the piece I'm proudest of. A hand-rolled value-noise function feeds a heightfield: flat in the middle for the playground and speedway, rolling hills beyond that, a rectangular mask that irons the ground flat where downtown sits, a ribbon mask that carves the scenic route into the mountains, and a ring of peaks around the whole thing. The physics engine and the renderer sample the exact same function, so what you see is precisely what you collide with. No baked meshes, no exported geometry.

Versioning & backup

A Node script, tools/version-games.js, hashes every game folder on each deploy. If the hash changed, it snapshots the whole build into versions/vN/, appends to that game's versions.json, and copies a dated backup outside the web root. That's why the games hub lets you open any past version and actually play it. Nothing is ever overwritten, only added to.

The AI part, honestly

Most of the foundation here predates the current wave: hand-coded pages, servers I stood up and maintained, the unglamorous work of keeping things running for people who expected them to just work. What changed is throughput. I now design, direct, and review while an AI pair does a large share of the typing.

That only works because the review is real. Every physics bug, every clipped hover state, every broken flipper in this site got found by playing it and reading the diff, not by trusting output. The judgment about what to build and how to steer is still the job. The machine just made the distance between an idea in the morning and a playable thing that night a lot shorter.

Stack

HTMLCSSVanilla JS Three.jscannon-esWeb Audio API Canvas 2DFirebase HostingNode (tooling) Outfit + Space MonolocalStorage

Credits

Drive's engine, horn, and impact sounds come from Bruno Simon's folio-2025, used under the MIT license. His portfolio is the reason a driving game felt like a reasonable thing to put on a personal site at all. The license ships alongside the assets in the repo.

Everything else, including all game code, art direction, and the terrible puns in the easter eggs, is mine.