Kindlefall started as five rooms, four kinds of skeleton and one boss. Today it has seven floors, five playable heroes, seven floor bosses plus secret duels, an epilogue, a soundtrack, and 200+ boons, relics and blessings to build a run out of. It runs in a browser tab, capped at 60 frames a second so a laptop stays cool.
Most of the code was written by AI, directed and playtested by a person with an Xbox controller who said, often bluntly, what felt wrong. This series is about how that worked: what we built, how we organised it, what we got wrong and what made the difference.
What Kindlefall is
A top-down action roguelite: Dark Souls meets Zelda meets Hades. You're one of the Ember-born, descending the halls the First Flame burned into the earth. Most rooms are fights; after them, shrines offer a choice of three boons that change how you play; every floor ends with a guardian. Fall, and you rise again at the start of the room that killed you, boons intact, while a bloodstain holds the souls you dropped.
The story
The game's Codex tells it best. "Ages ago, on a night the old songs call the Kindlefall, the First Flame fell out of the sky. It did not stop when it struck the earth. It burned its way down, floor by floor, until it found the dark at the bottom of everything and lay there." The stairs you walk are its scar.
Before it fell, the First Flame took the dead home, "the way a hearth takes in the cold". Now it has burned low, and the dead have nowhere to go, so they walk toward the nearest warmth: the Ember in your chest, a spark struck from the Flame itself. "Every skeleton you meet is only walking home. You are carrying home in your chest."
Under the hood it is deliberately plain: three.js and ES modules, no build step for the game code, served by a tiny Python script. The art is the CC0 KayKit packs (dungeon pieces, adventurers and skeletons), merged into single skinned meshes and drawn with a toon shader, bloom and a warm colour grade. Every sound effect and every piece of music is rendered offline by Python synthesis code, with a few CC0 Kenney recordings layered under it. Nothing in the game needs an attribution line; that was a rule from the start.
src/How we worked
The loop was simple. Play the latest build, write notes, sometimes very blunt ones. The AI turned the notes into changes, tested them with a bot that plays the game headless, bumped the build number and shipped. Then play again.
Two things kept that loop from falling apart.
The first was AGENTS.md, a single file at the root of the project that every AI session reads first. It holds the rules ("every change gets a line in the changelog"), a map of every source file, the performance budgets, the things we learned the hard way, and a changelog entry for every build. When a session ran out of context or a new one started, it didn't start from zero: it read the file. That changelog is the best history of the project there is, and most of these posts are built from it.
The second was testing that didn't need a person. Early on there was a smoke test: a Playwright script that loads the game in Chrome, hands control to a simple bot, and plays a whole run invincibly, failing on any console error, any boss stuck in an invalid state, or any fight over the draw-call budget. Later each floor got its own run, and a regression script that plays every floor and reports frame times. That bot comes back in part 2, because it ended up being the referee for a whole set of AI teams.
The arc
- The first sliceKayKit models, the asset optimizer, characters merged into one mesh, the toon and post pipeline, five rooms, four enemies and the Bone Tyrant. Also the first Mac-only bug: a black box on every sword swing, from a
pow(0, y)in a shader returning NaN on the Mac's GPU. - Feel and foundationsThe dodge becomes a real forward somersault. Enemies get flow-field navigation so the boss stops getting stuck behind pillars. The real-time synth audio is replaced by an offline-rendered pipeline and a composed score. The HUD gets an art pass, then a rethink after a playtest said it looked awful.
AGENTS.mdis born, then a playbook of "feel tiers" with real numbers, an art guide, a roadmap, and the smoke test. - Three floorsBoon shrines, elites, interactive props, Floor II (the Ashen Archive) and its Archmage, Floor III (the Hollow Barrows) and the Hollow King who steals your boons, boon rarity, Pacts, Duos and Relics, the first deploy to a private dev site, and the groundwork for Floor IV with four rounds of lava.
- The overnight sprintThe turning point: Floors IV to VII, a fifth hero, NPCs, an ending, new modes, built overnight by an orchestrator and its specialist sub-teams in parallel. That's part 2.
- Playtest buildsSeven builds from four rounds of playtest notes: a stuck door, flickering floors, an ending that didn't feel like one, ripostes you could mash, a Pyromancer who swung her staff. That's part 5.
- Sprint #2Polish and complete it end to end, with teams for playtesting, bugs, performance, boons, balance and marketing, and the one writing this devlog.
From three floors to seven
For most of its early life Kindlefall was three floors of five rooms each: three fights with a shrine after each, a treasure room that ambushes you, and a boss, linked by a fire portal that opens where the boss dies. The Kindlescar (skeletons and the Bone Tyrant), the Ashen Archive (a burning library, a cult, the Hollow Archmage), the Hollow Barrows (a graveyard of the knights who came before you, and the Hollow King).
Floor IV was different from the start. Before any code, the AI wrote a design document for it, docs/FLOOR4.md: a hub with three wings instead of a straight line, light from lava below instead of torches, a puzzle, new monsters made of fire so fire stops being the answer. Building it needed the level code to support branching layouts and sealed gates, and building that taught us how to make a floor that's a place rather than a corridor.
Then came the request for seven hours of "go crazy". The overnight sprint finished Floor IV and added three more floors: the Drowned Cathedral, the Shattered Spire and the Hearth of Origins, where the story ends. Each has its own terrain system, five new enemies, a three-phase boss, a secret duel behind a cracked wall, its own music, and between 23 and 45 new sounds. Part 3 walks through all seven.
What's in this series
- From Idea to Prototype (this one)
- The overnight sprint: the turning point, an orchestrator and its sub-teams
- Floor by floor: seven identities, with clips
- Five heroes and the boon system
- Playtesting: what the notes changed
- What made it good: the lessons
- The Hearth, and making it fair for strangers
- A new name: Kindlefall
- Hundreds of things on screen, and no stutter: performance, with profiles
- Bending time to make you feel powerful: hit-stop, slow motion and telegraphs
- Warm, not white: the glare guard, strike the heart, the theft cutscene, the music
- Making the boons delight the eye: five icon styles and the living set
All the clips in these posts were captured from the real game by a script driving Chrome, using the same test bot that plays the game in every test run. Nothing is mocked up. Where we show "before", it's the actual old build, checked out from git and played the same way.