Case study
How Unhallowed was built
Unhallowed is a free gothic action roguelike that plays in the browser, on the rules of the original Diablo from 1996. I set the direction, playtested every round, and built it with Claude Code. It was playable on day one and launched on itch.io on day seven.
What it does
You pick one of seven heroes, take what the town of Hollowmere can give you, and go down through sixteen depths beneath a ruined abbey to the Pit where Vorthax the Unmaker stirs. Fights, loot, and leveling follow the original's formulas to the number. The dungeons, quests, and shrines change with every run. The story is told in 500 voiced lines and illustrated cutscenes, and it plays with a mouse and keyboard or by touch.
How it works
A moment of play
- The rules advance the world 20 times a second, as in the original
- Code draws every sprite into a 480 by 270 canvas
- The browser scales it up, and Web Audio mixes the score, effects, and voices
- One web page. About 110,000 lines of TypeScript build into a single 2.3 MB HTML file, and the music and voices, about 42 MB, load beside it. A Cloudflare Worker serves it, and a service worker keeps it playable offline.
- The rules come from DevilutionX, the community's rebuild of the original game's C++ code. Claude Code ported that code to TypeScript and converted its data tables with a script, and every name in them is new. The world advances 20 times a second, as in the original.
- No image files. Every sprite, tile, portrait, and cutscene panel is pixel art drawn by code as the game runs, into a 480 by 270 canvas the browser scales up.
- The game synthesizes its sound effects with Web Audio, and its scores are written in code. The title theme, prologue, and epilogues play on free sampled orchestras. The town plays my own Suno recording of its theme, the depths play pieces made with ElevenLabs' Eleven Music, and ElevenLabs voices read the 500 lines.
- Phones get touch controls ported from DevilutionX's virtual gamepad, and a closer view like Diablo Immortal's.
- Saves stay in the browser, and a Save Code carries a run to another device.
- The wiki is built from the game's own data and art, so it can't drift from the game.
Decisions that shaped it
- Diablo underneath, everything else new. The mechanics, formulas, and balance are the original's, so it plays the way Diablo 1 fans remember. The art, sound, names, story, and dialogue are all original.
- Free for good. DevilutionX's license allows only free, non-commercial use, so there are no ads and nothing to buy. Donations on itch.io are optional and unlock nothing.
- Art as code. Drawing everything procedurally keeps the game one small page, and a new palette or sprite is a code change like any other.
- Comforts are options. Every change to the original's gameplay, like walking at any angle or a gold purse, sits behind a toggle, so purists can play it straight.
- Phones are a real way to play. Playtesting on my phone brought a zoomed-in view, an attack button, and a bottom bar that steps aside for bigger buttons with life and mana rings.
- Fix what players hit the day they hit it. A friend's link that opened inside Instagram couldn't turn sideways, and a save made near enemies could load into a death. Both were fixed the same day.
How it came together
- October 11, 2026: day one. The rules ported from DevilutionX, the art drawn in code, the prologue, the town, and the depths. The same day, walking at any angle, running with stamina, and elite packs.
- October 12: four new heroes, the Monk, Necromancer, Druid, and Assassin, each with a class skill and four abilities.
- October 14: a playtest round, with a gold purse, belt refill, sorting, and rebindable keys, and the wiki, 21 pages built from the game's data.
- October 15: the epilogue in eight illustrated, voiced panels, a boss's sanctum staged as in the original, and recorded music for the town and the depths.
- October 16: the title theme, prologue, and epilogues rendered on sampled orchestras.
- October 17: touch controls, a thumb stick, and a closer view for phones, then the launch on itch.io.
- October 18: the first fixes from players, and a web app you can install that runs offline.
- Along the way: about 100 commits, 110,000 lines of TypeScript in the game and 37,000 in its tools, 42 test files, 500 voiced lines, and 21 wiki pages.
Where it is now
Live at playunhallowed.com and on itch.io at stvdwell.itch.io/unhallowed, free to play in the browser on computers, phones, and tablets. The wiki is at wiki.playunhallowed.com, and bugs and questions go to support@playunhallowed.com.