It started because I was bored one evening.
I'd finished the main build of this site, the case studies were written, and I had that restless feeling you get when a project is done but you're not ready to stop. So I added a game. Then another. Then I couldn't stop, and now there are eight of them, each with its own music, all living at /arcade.
This is the story of how that happened, and what I learned building games the slow way — no engine, no framework, just a canvas and a lot of math.
Why no engine#
The obvious move would have been to reach for a game engine. There are good ones that run in the browser. But I didn't want the obvious move — I wanted to understand what I was building, down to the pixel.
So every game here is plain Canvas and vanilla JavaScript. No physics library, no sprite framework, no game loop someone else wrote. When an asteroid splits in VOID, I wrote the vector math that splits it. When the centipede breaks in two where you shot it, that's my code deciding which segments become a new creature and which mushroom appears in the gap. When four ghosts chase you through a maze, each with a different personality, those are four little decision functions I wrote by hand.
This is slower. Much slower. But it's the difference between using something and understanding it — and understanding is the whole reason I do this work. I spent years in geology before I came to code, and the thing that hooked me was exactly this: taking something apart until you know why it moves.
The eight#
They're all classics, rebuilt: VOID (asteroids with real momentum), SNAKE, PONG (against an AI you can actually beat), INVADERS, BREAKOUT (with power-ups), CENTIPEDE (the splitting kind, with spiders and fleas and scorpions), PAC-MAN (my own maze, four-ghost AI), and TETRIS (seven-bag, wall kicks, ghost piece).
Some were easy. SNAKE took an afternoon. Some nearly broke me — TETRIS, with its rotation system and wall kicks and line-clear timing, is deceptively hard to get right. PAC-MAN's ghosts each needed their own chase logic: one comes straight at you, one cuts ahead to ambush, one wanders, one is shy and bolts when you get close. That last detail — the shy one — is what makes the originals feel alive, and it's the kind of thing you only appreciate when you try to rebuild it.
The hardest part was usually balance. A game can be mechanically correct and still no fun. INVADERS felt sluggish until I sped the swarm up as it thinned — that creeping acceleration is the whole tension of the original. PAC-MAN was too fast and too cramped until I slowed everything down and widened the maze. You don't find these numbers by thinking. You find them by playing your own game over and over until it feels right.
The sound is code too#
Here's the part I'm proudest of: none of the audio is a file. There are no .mp3s, no samples, no recordings. Every sound effect and every note of music is generated live in the browser with the Web Audio API — oscillators and noise, shaped into blips and sweeps and drums.
That meant writing a small music engine. It has a scheduler that looks slightly ahead in time and queues notes so the rhythm stays tight, four channels (a square-wave lead, a triangle bass, a noise channel for percussion, an arpeggio), and a way to change tempo on the fly. Then I composed eight themes on top of it — one per game, each in a different mood. VOID is driving and tense. SNAKE is cheerful. INVADERS is dark and speeds up as the swarm closes in. TETRIS is a hypnotic folk theme that accelerates with the level. None of them are copies of the originals — Tetris's famous melody is someone's arrangement, so I wrote my own thing in the same spirit.
I can't overstate how satisfying it is to hear a melody you wrote, made entirely of math, coming out of a game you also wrote. It's the closest thing to the feeling I chased in my museum installation work — building something that responds, that has a voice.
What it's for#
A portfolio is supposed to show what you can do. I could tell you I build interactive things, that I came up through Unity and physical installations, that I care about the feel of a thing and not just whether it works. Or I could put eight playable games in front of you, each with its own soundtrack, and let you find out.
I think the second one is better. Most of what I know about making things responsive and alive doesn't fit in a case study — it lives in the thousand small decisions about timing and feedback and difficulty that you can only feel by playing.
So: go play. Beat the PONG AI. See how far you get in CENTIPEDE before the mushrooms overwhelm you. Turn the music on. It's all running in your browser, right now, and I wrote every pixel and every note.
I was bored for about ten minutes. Then I built an arcade.