Browser game · Action RPG
Ashen Vault
A single-player action RPG that runs in the browser. You pick a sword, a staff, or a bow, walk one road through a sunken monastery, and fight your way to the Bellkeeper.
Project notes ·
The hosted build asks for a ChatGPT sign-in before it loads. Progress is saved in the browser.

The ideaFind a fighting style and make it yours
I wanted a game where every attack means something. Enemies wind up before they strike, positioning matters, and a good hit visibly throws, floors, or pins whatever it lands on.
Every character carries all three weapons. Equipping a different one changes the class and restores its own four-slot ability loadout, so switching styles mid-run is a real choice rather than a restart.
- Sword. A three-hit chain of cut, drive, and cleave that sweeps enemies along the blade. Hold the right button to guard; time it to parry and riposte.
- Bow. Tap for a quick arrow or hold for a full draw that knocks lighter enemies off their feet. The art is a seven-arrow scatter volley.
- Staff. Warp Bolt tugs a target towards you; Arcane Pulse charges up and releases a cone of force that flings even heavy foes.
The monasteryOne road, eighteen chambers
The map is deliberately linear. There is no backtracking: each chamber joins exactly two neighbours, and three seal chambers hold sealed doors that only open once their seal is claimed. The Hollow Throne and the Bellkeeper wait at the end.
Later depths reuse the same monastery with a stronger garrison and extra rules. Gear and levels survive death; the current run does not survive a reload.



Under the hoodBodies, momentum, and enemies that read the room
The part I spent longest on is a single body state for every enemy. Heavy arrows, force spells, sword carries, and ordinary knockdowns all push the same object, so nearby bodies exchange momentum by mass, fast impacts bowl over lighter foes, and a body thrown into stone slams into it.
Enemies have threat tiers, poise, hearing, and morale. A husk pack presses forward together, arbalists hold their fire until they have a line, and a shirker breaks off when the fight turns. Casks, chandeliers, and the monastery bell can all be broken.
- Three classes, twenty-four abilities, and seventy-two bought improvements with free refunds.
- A regression suite of over four hundred tests pins map geometry, cooldown rules, and enemy behaviour.
- Sound comes from a curated sample bank, mixed to level targets for cues like tells, hits, and falls.
TouchA phone held sideways
The same game runs on a phone in landscape. A floating stick follows the thumb, the buttons sit under the right hand, and tapping a foe targets it. Ground abilities aim from a drag, so a spell lands on the enemy instead of behind it.


Built withthree.js, React, and a lot of notes
The engine is TypeScript on three.js, with React for the menus and HUD and Vite for the build. Enemy models and gear are made in Blender and exported as meshes. The game state is saved in the browser; there is no server.
Much of the code was written with AI coding assistants, steered through design notes, handoff documents, and the test suite. Each feature has a short write-up recording what was decided and how it was checked.
What is not finished
Balance across a whole run has not been tuned, physical handsets have only been tested in browser emulation, and later depths reuse the same monastery rather than adding new chapters.



