Fresh from resurrecting Tanks! Mayhem, I went digging for the other game I wrote back in the early App Store days: Invaders!, a 2009 Space Invaders homage for the iPhone. It wasnât a straight clone - the aliens teleport in, some of them carry bubble shields, power-ups drift down on parachutes, and the score is displayed on glowing nixie tubes, because in 2009 I apparently thought everything looked better as a nixie tube.
The code that wasnât there
There was one problem: I couldnât find the source code anywhere. Tanks had been sitting safely in Dropbox for sixteen years. Invaders was on none of my drives, none of my backups, nowhere. It was written two laptops and at least three backup strategies ago, and Iâd quietly written it off as gone forever.
Then I remembered that before GitHub ate the world, there was Bitbucket. I managed to log back into an account Iâd forgotten I had, and there it was: the Objective-C, the sprite sheets, the Photoshop files, the .caf sound effects, even the original App Store screenshots. A complete time capsule from 2009.
I got lucky with one detail: Bitbucket deleted every Mercurial repository on the platform back in 2020. If nine-years-younger me had picked hg instead of git, this post wouldnât exist.
The port
Same trick as last time: point Claude Code at the folder and ask it to get the game running in the browser. It read through the Objective-C classes, mapped out the sprite sheet, converted the .caf sounds to WAV with afconvert, and produced a plain JavaScript canvas game with no build step.
Play it now at invaders.atomic14.com. Arrow keys or A/D to move, space to fire, 1-5 to toggle power-ups once youâve caught them. It works on phones too, with the original touch controls.
And hereâs the 2009 original for comparison:

The clever bit of the port is the coordinate system. The original game logic all runs in OpenGL coordinates - origin at the bottom left, y pointing up. Rather than translating every constant and every bit of movement code to the browserâs upside-down coordinate system (and inevitably introducing a hundred off-by-one bugs), the web version keeps all the game logic in the original coordinates and flips everything in one place, at draw time. That meant the numbers from the 2009 code - the barrier positions, the alien grid spacing, the bullet speeds, the difficulty curve - could be copied across verbatim.
So what youâre playing is genuinely the 2009 game: the same 8x4 grid of aliens that speeds up as you thin it out, the same bubble-shielded aliens that start appearing from level 2 (thatâs level 3 in the screenshot above), the same barriers that erode column by column (invader fire chews the top, your own shots chew the bottom), the same UFO trundling across every ten seconds.
A seventeen-year-old bug
The power-up system had a surprise in it. Each power-up is supposed to be gated by level - you shouldnât see the laser blast until youâre a few levels in. Hereâs Claudeâs explanation of what the original code actually does:
The loop walks through the candidate upgrades looking for one thatâs unlocked at the current level. But if none of them pass the check, it falls out of the loop with the last candidate still sitting in the
upgradevariable - and then grants it anyway. The level gate compiles, runs, and has never once stopped a power-up from dropping.
Seventeen years that bug has been in the game, and neither I nor any player ever noticed, because the effect is just âyou sometimes get a good power-up earlyâ, which nobody complains about. The web version filters the candidates properly. Itâs possible Iâve made the game slightly worse by fixing it.
The font that canât say âdashâ
One small improvement over the original: when you catch a power-up, the game now tells you what you got and which key fires it, in text along the bottom of the screen. The original just played a sound and lit up an icon, and you were left to work out what the mysterious fifth button did mid-firefight.
The text is drawn with the original 2009 bitmap font, which led to a very 2009 problem: the first version of the message said âRapid fire - press 5â, and rendered with a hole in the middle. The font atlas contains the characters I needed in 2009 and not one glyph more: letters, digits, a period. No dash. No colon. Rather than regenerate a texture thatâs been pixel-perfect for seventeen years, the message now reads âRapid fire. Press 5â. The font wins.

The code is on GitHub at atomic14/invaders-web: plain JavaScript, one file of game logic, every constant traceable back to the Objective-C it came from. The original source is in the repo too, safely somewhere that isnât a forgotten Bitbucket account.
Two games rescued in one week. Iâm starting to wonder what else Iâve written off as lost.
