Playable now: start to finish, final art in progress
Tethered Darkness
Gothic horror JRPG
Every grave in Hollowmere has a lantern, and the lanterns keep the dead below. Tonight they are going out.
A disgraced knight, an occultist and a church cantor are left on a fen jetty by a ferryman who won't wait. Up in Broodhollow the churchyard lanterns are dying, the dead are climbing out, and somewhere beneath the water a drowned bell screams each time another light fails. They follow the sound down.
It's the 16-bit Final Fantasy you grew up with, with the dial turned from adventure to dread: fog, candlelight, drowned churches, and things that move just past the edge of your lantern. The horror comes from what you can't see, and from what the light costs you.
Play Tethered Darkness- Light is a resource The floors before every boss are dark. Spend scarce lantern oil to light them, or fight in a shrinking circle of light against monsters 20% stronger.
- Real-time turn gauges Heroes and monsters fill their gauges in real time, so hesitating in a menu is a decision too.
- Learn from the dead The cantor Absorbs enemies to learn their skills and fill in the bestiary, the occultist steals, and the knight takes the hit for whoever needs it.
- No random battles Every enemy is on the map. Slip past the fights you don't want, or pick them for what they carry.
- Six regions down From the fens through frozen wastes, jagged peaks, a sunless chasm and a foundry of lava, then back through a portal to a Hollowmere gone wrong, and down to whatever has been ringing.
- Five endings At the bottom, a choice: silence the bell, or relight every lantern and choose who stays below to tend them. Each of the first five regions hides an optional dungeon with a charm, and finding all five changes what that choice costs.
- Plays anywhere Keyboard, gamepad or a touch D-pad on your phone, with cloud saves across three slots.
Under the hood
TypeScript, Phaser 4 and Vite, with every enemy, skill and item in JSON checked by Zod, and branching dialogue written in Ink. The battle engine is pure TypeScript with a seeded random generator and no Phaser imports, so a headless simulator can play any encounter thousands of times, and a route tool plays each region in story order, carrying levels, gear and items from fight to fight, to balance every boss against the level a player really arrives at. Accounts and cloud saves run on a small Symfony 8.1 API with MySQL, and every green push to main deploys itself through GitHub Actions.