Inspiration

I wanted real adventure on a phone. Not a menu with a progress bar, not a timer you check between other things — actual exploring, actual building, actual getting further than you got last time, in a land that keeps changing while you're in it. That's the dream I kept coming back to: pull a phone out of your pocket and there's a world in there that's genuinely yours to dig into.

The problem with block-building is that it's comfortable. You can dig for six hours and nothing is asking anything of you, which is lovely and which is also why sessions blur together. So I gave the world an owner. You wake beside a shrine on a small square of land surrounded by void, and the gods who put you there want paying. Experience is the rent. The question the game asks every single night is the same one, and it never stops being uncomfortable: do you survive tonight, or get stronger for tomorrow?

What it does

Tithe: Reborn in Debt is a single-player voxel survival prototype that runs in the browser in portrait orientation.

The core loop. Hunt and gather on the land you own. Craft tools. Offer materials at the shrine to convert them into experience. Then, before dawn, spend it. Tribute keeps you alive. Levels raise health and attack, and at set thresholds the gods grant a new World Stage and the square world physically expands. The tribute demand grows with both day count and stage, so hoarding, coasting and standing still are all forms of losing slowly.

Space as reward. The hard-edged square is deliberate. The void is a visible receipt for what you have not earned yet. Land Levels ring outward from the shrine and get more dangerous the further out you go. Ring 0 is animals only, so the first nights are calm. Ring 1 adds slimes, day and night. Ring 2 adds ghosts that only appear after dark, phase in and out, and dissolve at sunrise, which makes night the real difficulty spike rather than a lighting change. Ring 3 and beyond scale everything.

Legibility. Tribute due, experience held, next level cost and current land level are on screen at all times. A player should never lose and wonder why. They should lose and know exactly which decision did it.

A little luck, not a lot. Rare drops like the Rabbit's Foot, Horseshoe and Ghost Sword sit at a tuned drop rate, and equipped charms and pets add Luck and Speed. Enough to make a run feel distinct; not enough to be the reason you won.

A finishable arc. Seven fairies, each raising maximum health. Seven world stages. A tribute curve that eventually outpaces any player. Death is the expected ending. The score is how far you got and what you'll change on the next seed.

How I built it

The whole thing was built in 2 days, is a self-contained Three.js / HTML5 build with no external requests at runtime, driven by AI-assisted prompting, no changes by me personally besides documentation.

No external assets. Every texture, item icon, creature model and sound effect is generated procedurally at load. Nothing is fetched, nothing is bundled as art. Original creature design. Rabbits, horses, slimes, ghosts, crystal slimes and fairies are box-model silhouettes designed for this game, built to read at a glance on a phone screen. Worker-threaded world. Terrain generation, lighting and meshing run in a Web Worker so the main thread stays responsive on mobile. Deterministic and persistent. The world is deterministic per seed and fully saved to localStorage, including every individual block edit. One tuning file. Every balancing value — tribute curve, drop rates, ring composition, level costs, stage thresholds — lives in a single config, so the difficulty curve can be retuned without touching game logic. Challenges I ran into

The hard problem was making the central decision legible on a phone. A survival game with a currency that does two contradictory things only works if the player can hold both options in their head at once, at 2am in-game, while something is chasing them. Most of the iteration went into surfacing tribute due, experience held and level cost as a single readable state rather than three separate numbers.

Second hardest: making night mean something. Ghosts that phase in, ignore terrain and evaporate at sunrise turned darkness from a visibility problem into a scheduling problem. You stop asking "can I see?" and start asking "can I be somewhere else?"

Third: keeping procedural generation cheap enough that a mid-range phone doesn't stutter when the world grows a stage.

Accomplishments that I'm proud of

The tension actually lands. Playtest runs consistently produce the moment the design was built for: enough experience to level, not enough to do both, and a visible sunrise. Players hesitate. That hesitation is the whole game.

Also: a fully offline, zero-external-asset build where the world, the creatures, the icons and the audio all come out of code, and every block you place survives a page refresh.

What I learned

That AI can do more then I realized, I have used in the past and it just didn't work too well. This time I used claude fable and it did a great job of doing everything I asked and more. I think it shows it works really well for building a prototype, and then you can update the assets to be more unique.

What's next for Tithe: Reborn in Debt

Create more monsters, new lands, new blocks, more items, and more pets. It has never ending possibilities, really easy to grow and extend.

Built With

three.js · javascript · html5 · webgl · canvas · web-audio-api · localstorage · procedural-generation

Built With

Share this project:

Updates

Submission history