Updates
Every release of Dystopia One and what changed in it, newest first. The version you are playing is at the bottom of the game screen.
0.7.0 — 2026-11-02
The kit speaks the Tower's language. No migration; item keys, inventory rows and save files are untouched — only what the player reads changes.
- Consumables: potions are stims (injected: "You inject the stim of cure light wounds"), scrolls are chips (run once: "You run the chip of fireball; the chip burns out"), wands are emitters (charges). The feats are Burn Chip, Brew Stim and Craft Emitter; the pharmacist sells "stims, chips, the odd emitter"; the belt button, the guide, the controller help, the achievements, the admin console and the recipe names follow.
- The classic kit renamed, every piece: combat knife, machete, alloy sword, fire axe, sledgehammer, curved blade, heavy sword, demolition axe, wrecking bar, conduit staff, hatchet, thrusting blade, carbon bow, compound bow; padded jacket, riveted jacket, ballistic mesh, chest plate, segmented armor, assault armor; alloy buckler, ballistic shield; deflector ring, dermal-plating dongle, shielding poncho, neural pendant, cortical headband, sensor earring, dog-tooth earring, powered gauntlets, circuit gloves, servo belt, spring-sole boots, riot helmet, lamp helmet, medical pendant; emitter staffs (fire, frost), medical staff, revival staff; the metamagic rods as "Empower rod (lesser)" and so on; incendiary, cryo, shock and killshot arrows, incendiary and shock bolts, sonic charges. The mechanics (dice, crit ranges, AC, prices) are exactly what they were.
- Monsters' weapons in the log: no more greatswords, morningstars, glaives and tridents — heavy swords, spiked maces, pole blades, pronged spears.
- Still the old world's, on purpose, until the spell layer is rethemed: the spell names themselves ("Stim of cure light wounds", "Chip of fireball"), Spellcraft and Use Magic Device. That is the next ship.
0.6.1 — 2026-11-02
The sprites named and drawn for the Tower. No migration.
- The console's sprite page named most tiles, piles, effects and people by their storage key (
halls floor,pile of mithral ore,holy,hermit,hireling_acolyte). Every sprite now carries the Tower's name, taken from the game's own tables where it has them:The offices: floor,Pile: Superconductor,Radiant burst,Archivist,Medic (hireling),Transit relay,Elevator,Fabricator (furniture). Storage keys do not change (the client looks images up by key), so nothing in the bucket moves. - The prompts of the classic kit still drew the old world — parchment scrolls with wax seals, wooden wands and bows, leather jerkins, chain mail and plate, a bear-claw amulet, gnarled staves. All 60-odd are rewritten for the Tower (a sealed data chip, an emitter wand, a compound bow, a ballistic mesh shirt, composite assault armour, a dermal-plating dongle, an alloy staff with an emitter crystal…), with the arrow effect, the surveyor, the undertaker and a few monsters. If any of those were generated already, Redo them from the console (filter the items group); the rest are untouched.
- Still to come, in the kit itself: the generic words Potion of…, Scroll of…, Wand of… and the armour and bow names in the inventory are the old world's; renaming them in play is queued for a later ship.
0.6.0 — 2026-11-02
Duels: player against player on the sand. Migration 071 (run migration-071-duels.sql in the Supabase SQL editor; it adds three columns and widens one check).
- Post a duel from the arena panel while standing on the sand of any market in a PvP or PvPvE world, for a stake of your choosing (10–5,000 credits). It stands on that sand until another player there takes it up for the same stake, or you take it back. The purse is both stakes less the house's tenth.
- The book opens on both fighters once the duel is taken up — the crowd backs the higher level — and closes at the start. Neither duelist may bet on it. Wagers from anywhere in the world, as for the beast bouts.
- The fight: either duelist starts it from the panel when both stand on the sand; the marshal drops the flag and the refuge's peace lifts for the two of them alone — walk into each other to strike, with the ordinary rules. A duel is for the stake, so a kill on the sand takes none of the loser's belt (the ordinary quarter in open PvP).
- The end: a fall, the marshals' call at a fifth of either's hit points, a forfeit for leaving the sand, or a void after an hour (stakes back). Judged after either duelist's action; both are told. The challenged may step back from a taken-up duel before the start: both stakes and the wagers go back. The winner earns Duellist.
- One bout per sand, not per world: a bout at Market 64 no longer blocks a challenge at the Lobby.
- Fixed: the admin console's "void a bout" cleared the Lobby's sand whatever market the bout was on; it now clears the bout's own square, and refunds both duelists.
0.5.1 — 2026-11-02
- Signing in with an account whose email Supabase has not confirmed now says so, instead of "No account matches that name and password." (Supabase projects confirm emails by default; the first deployment hit it.) No migration.
0.5.0 — 2026-11-02
The Tower map. No migration.
- The Tower, in the Maps panel under the floor map: all 1,024 floors as a 32 × 32 grid climbing from the bottom left (floor 0) to the top right (the roof). Lit cells are floors you — or your squad — have stood on, from the explored record, not just this session. Gold is a market, green a refuge, red a lair not yet cleared in this world, grey a lair that has fallen; a white box is your floor. The caption counts floors stood on and lairs cleared (of 64). It is the overview players were asked to keep in their heads: where the markets are, which sections' bosses are down, how far up anyone has been.
- The view carries
tower: { floor, cleared, visited }; cleared lairs are read fromboss_killsand cached a minute (a kill this action refreshes it at once), visited floors fromexploredthe same way. - Each market's plaque now names it; the Lobby's says the corporation still lights the ground floor.
0.4.0 — 2026-11-02
Commerce throughout the Tower. Migration 070 (two columns on arena_bouts), run before deploying.
- Markets. Every 64th floor — 64, 128 … 960, fifteen of them — has a market at square 3-3, cut from the Lobby's own plan: the Concourse with its stall pitches, the Grand Exchange, four Counters, the Arena and the Clinic with its autodoc. A market is a refuge: nothing hunts there, nothing can be dug, a relay always stands in it, no stair or elevator lands in it, and it is never cut off from its floor's spine. The HUD and the entry line name it ("Market 192"); the floor map marks it like the Lobby.
- Businesses open on any market's pitches (a stall, 150 credits), as on the Lobby's; the board, the houses and the crowd buy from them on the tick wherever they stand.
- The Arena is at every market: challenges on the sand, wagers from anywhere in the world. A bout now records the square it was fought in, so the console voids it in the right place.
- Convoys run up the Tower: each of the four leaves the Lobby for three to five markets in a seeded order, calling at the refuge eight floors below each on the way, moving every four hours on the real clock. The two resident houses keep their Counters at the Lobby.
- The weekly hunt, jobs and rumours are unchanged. The price index stays one per world (a per-band index is a later ship).
0.3.0 — 2026-11-02
Classes and bestiary. No migration; every key, stat and sprite path is unchanged — only what the player reads.
- Classes. Enforcer, Operator, Medtech, Brawler, Marshal, Scout, Striker, Netrunner, Psion, Biohacker and Face (the fighter, rogue, cleric, barbarian, paladin, ranger, monk, wizard, sorcerer, druid and bard of the rules); prestige: Sharpshooter, Assassin, Chrome Ascendant. Blurbs and sprite prompts to match.
- The bestiary, all 242, renamed and re-described for a corporate tower, with a new sprite prompt each (the 26 that fell back to their names now have one): gangers, scrappers, contract troopers and splices; the revived (tenants and guards on nanite filament, data wraiths, system shadows); heavy cyborgs (bruisers, regens, furnace, cryo, storm-rig, the mono-optic); warmechs (the corporation's dragon-shaped war machines: acid, gas, arc, flame, gold; prototype → Mk I → Mk II → Mk III → Mk IV → flagship); daemons (rogue AIs in drone-bodies: errand, enforcer, auditor, director, the Executive; the Founder); drones (unchanged, with the Prototype titan); bioforms (lab mites to the hive queen; the Leviathan bioform); the lockdown (nanophages, scrubbers, the Clot, Lockdown protocol); and the lab beasts, splices, horrors, sludges, hazards (plasma fire, vent vortices, rubble masses, coolant surges), automata, feral and escaped animals, reservoir and tank fauna, vermin and overgrowth. Weapons where it mattered (shock prods, machetes, girder clubs, box knives, a thrown stapler).
- Family names a player reads (
FAMILY_NAMES): gangers, scrappers, revived workers, heavy cyborgs, feral animals, vermin, lab beasts, splices, horrors, warmechs, hazards, sludges, overgrowth, shapechangers, daemons, automata, drones, bioforms, lockdown nanites — in surges, bounties and the hunt. - Monster parts: cyborg hydraulics, daemon cores, warmech plating, nanite ash, bioform carapace and glands.
- Boss titles go corporate: Floor Manager, Head of Security, the Rent Collector, Chief Auditor, the Night Manager, Vice-President of Nothing, of the Thirteenth Floor, Queen of the Parking Decks.
- Companions take their names from the bestiary (feral dog, cyber-hound, black bear, brown bear, lab bear); the arrival line gets its article right. The guide's classes and monsters paragraphs rewritten.
0.2.0 — 2026-11-02
Floor types and the retheme. The Tower reads as a tower now. No migration.
- Floor types. Every floor has a type from the seed: offices (56 %), residential (12 %), retail (7 %), security (6 %), maintenance (6 %), medical (5 %), server farm (4 %), hydroponics (3 %) and, on the first 64 floors only, parking (1 %); floor 0 is the lobby floor. A type picks one of the four generators — offices, residential, retail, medical, parking and the lobby are rooms and corridors; security and server farms are narrow ways with chambers off them; maintenance is a warren of ducts; hydroponics is flooded halls — and brings its own room names and furnishings: cubicle farms and boardrooms, family units and laundries, food courts, wards and morgues, cell blocks, server aisles, plant rooms, grow halls. The HUD says "Floor 212 · square 4-6 · residential". Rumours tell you what the floor above is.
- The words. The hulk's vocabulary is the Tower's everywhere a player reads it: doors (not hatches), walkways and rafts over coolant conduits, partitions, refuges (the havens), runners (the players), tenants (who was here before), the Lobby and its Counters, the Clinic, convoys, the Wardens, the roof door, company offices, the next Tower (+1). Materials: concrete, copper wire, gold contacts, superconductor, glow-mold, synth-bloom, black lotus, scrap silicon, rare earths, legacy chips, steel studs, sheet metal, cable, a power core; gathered at stripped cable runs, grow trays, e-waste bins and salvage heaps. Tools: hand pick, steel pick, claw hammer, framing hammer. Builds: partition wall, door, walkway, raft, water tap, grow bed. Factions: the Night Shift, the Logistics Syndicate, the Records Office, the Breakers. Seasons: Audit, Crunch, Launch, Shutdown. Traders: armorer, outfitter, pharmacist, supply clerk. Keys unchanged throughout.
- The story. Landing page, About, the guide and the welcome: civilisation lives in towers; the corporation that owns this one has not been seen in a generation; the lobby is safe and the roof is a rumour.
- Sprites. Tile prompts for the four generators (carpet and partitions, ductwork, server racks, flooded concrete) and the gathering nodes rewritten; monsters and NPCs are 0.3's.
- French and Spanish follow (the floor types, the raft, the Tower).
- Still the hulk's, on purpose, until 0.3: the monsters and their families, the classes' names, the Space Colosseus content block (energy weapons, xenos, parasites) and its sprite prompts.
0.1.0 — 2026-11-02
The Tower. The flat 256 × 256 hulk is gone; the world is 1,024 floors, each an 8 × 8 grid of squares, each square the same 128 × 128 level as before. No migration: every table keyed by square coordinates reads the same bytes, so nothing about saved data changed — but every world is a different place now, and this is a new game, not yet deployed anywhere.
- Floors. Floor 0 is the lobby floor; square 3-3 of it is the hand-cut hub. A floor's squares are joined by hatches as before; the block's outer walls are the Tower's skin and have none. Each floor is its own small maze, and about four in ten floors have a pocket — a few squares cut off from the rest, reached only by a stair or an elevator that lands in them.
- Stairs. Every floor below the roof has one to four stairs up (▲ on the floor map); the floor above has a stair down (▼) in the same squares. Walk onto a stair and you are on the next floor, beside its other end. One stair per floor, the spine, always leads on; the others may land you in a pocket. Map your seed.
- Elevators. Four shafts stand in the same squares of every floor; in each section of sixteen floors one or two of them run, stopping at some of the section's floors (never fewer than two). Walk into the car (▣) and the Elevator panel lists its stops; ride to any of them. No shaft crosses a boss floor.
- Difficulty by floor. Area CR ¼ in the lobby, 5 at floor 512, 20 at the roof — the old rim curve, stood upright. Fees, DCs, quest rewards and achievement thresholds that were tuned on the 0–127 ring scale keep that scale as a band of eight floors; everything a player reads says the floor.
- Bosses as gates. A boss on floors 15, 31, … 1,023 — sixty-four of them. The lair room holds the floor's vault and the floor's only stair up. The Wardens are the bosses of floors 255, 511, 767 and the roof; their four keys open the roof door, which stands in the roof floor's lair behind its Warden. Through it: the sky, retirement with honours or a Tower +1, and the service hatch down to the Vault of the Nine (unchanged, now under the roof).
- Havens on floors 8, 24, 40 … (midway between bosses), one square each: nothing hunts there, the autodoc, a trader and a relay. Relays charge five credits, two a square on the floor and one a floor between.
- Veins (coolant conduits) run across one floor in six, never through the hub, a lair or the skin.
- Maps. The Maps panel shows the floor you are on: 8 × 8, hatches, where you have been, the squad, stairs, elevators, the lair, the haven and the hub. In an unpowered world only what you have found. The HUD says "Floor 12 · square 4-6". World cards draw the Tower laid flat, floor 0 top-left.
- Rumours, jobs, hunts, caravans name floors; jobs stay on the giver's floor; the first eight lairs are the hunt's; caravans run the lobby floor for now (0.4 takes commerce up the Tower).
- Achievements retitled for height (floor 80, 200, 400, 600, 800, the top floor; the Wardens of the 256th, 512th and 768th and of the roof; all sixty-four lairs). Keys unchanged.
- Three new sprite prompts (
tiles/stair_up,stair_down,lift); French and Spanish for the new lines; the welcome walkthrough, the guide, the admin console and the leaderboards say floors. - Tests: the smoke test proves no edge leaves a floor, every spine connects, pockets exist, stairs and elevators are placed and ride; the integration test's lairs, Wardens, roof door, havens and quests moved to floors; the browser test climbs a real stair and reads the floor map.
0.0.1 — 2026-11-01
The fork. Space Colosseus 2.3.2, taken whole, renamed and given a fresh version count. Nothing about play has changed yet: the world is still the 256 × 256 hulk and the words are still the Colosseus's. The Tower comes in 0.1.0.
- Name. Dystopia One, at DystopiaOne.com. Package
dystopiaone;D1_FAKE_DB,D1_QUIET,D1_LOADTEST_OK; browser storage keysd1_*;window.__d1.dist/dystopiaone-<version>.zipand the roll-up to match. - Migration 069 reserves the new site names, renames the public world and sets the
schema_dystopia_onemarker. Migrations 001 and 010 say the new name on a fresh project (they were never run anywhere under the old one). 065 (Space Colosseus's own fork migration) stands as history. - Docs.
docs/PROJECT.mdrewritten for Dystopia One: what the Tower is to be, the decisions taken on 1 November, the plan of ships, and the lessons carried from the two games before it. Space Colosseus's changelog moved todocs/HISTORY-spacecolosseus.md. Screenshots that had landed in a folder calledundefinedlive indocs/screenshots/. - Infrastructure. A fresh build: its own Supabase project, Stripe product,
WORLD_SEED_SECRET, Resend sender and VAPID pair. Dystopia One never shares any of them with GigaDungeon or Space Colosseus.
Before Dystopia One
Dystopia One is built from Space Tower, which was built from GigaDungeon. Their release notes, newest first:
2.3.2 — 2026-11-01
Two things the phone showed. No migration.
- The sheet's "Next level in" list no longer runs off the screen. The prestige options carried their whole requirement ("Leviathan Disciple (0/10) · d12 — needs a level of a spontaneous arcane caster…"), which made the select as wide as its longest line and pushed the drawer sideways. Options now read as name, level and die with "· locked" when the way is barred; the requirements sit in a line under the select (and in each option's tooltip). The select can no longer be wider than the drawer. The requirement texts name the hulk's classes (technomancer, psion, herald) instead of the old ones.
- World cards keep their thumbnail. A card's text column could not shrink below its longest unbreakable word — a 32-character seed hash — so on a narrow screen the thumbnail column was pushed outside the card. The text column is now allowed to shrink and long words wrap; cards clip anything that still overflows, and the grid of cards never asks for more than the screen's width.
- Tests. The Frontier well test allowed for the season's thirst (this week is Flare: thirst runs double, so the turn after a drink leaves two on the clock, not one). The seasons turn on the real calendar, a week each.
2.3.1 — 2026-10-27
Operations. No new mechanics; the tools to run the business layer live, and the loose ends before the first deployment. No migration.
- The Colosseus tab in the admin console: pick a world and see today's index movers, the six trading houses (where each is now, its cash, stock and goods, the week of its ledger), every player business (owner, kind, tier, status, till, sales, stock, last sale) and the last thirty bouts with their books. Levers: reset the index to book, give a house a fresh ledger, force-close a business (its stock and till go back to the owner's character if it still stands), reopen a shuttered one, and void a bout that is open or on (stake and wagers refunded, the sand cleared).
GET /api/admin/colosseus?world=,POST /api/admin/colosseus/{index/reset,house/reset,business/close,business/reopen,bout/void}. - French and Spanish for the counter, business and arena panels' headings and the market's business list, and log rules for the trades, the till, the stall's opening, the gate, the purse, the marshals' call, the forfeit and the bookmaker's payout. The panels' running text is English, as the other panels' is (localisation wave two).
- Tests. The Frontier block now names the cause if the settler is ever found away from the homestead before the hydroponics test, and makes the square harmless first; the smoke's phase-arrow sample keeps its target alive (2.2.0). The suite has run clean nine times in a row across 2.2–2.3.1.
2.3.0 — 2026-10-27
The Arena. The third ship of the business builder: bouts on the sand of the Heart, and the book. Migration 068 (arena_bouts, arena_wagers).
- Challenges on the sand. Walk into the Arena south of the Concourse and the arena button offers three fights, each with the beast it would bring and the stake and purse at your level: Sparring (half your weight; stake 10 + 3/level, purse ×1.5), a Bout (your weight; 10 + 6/level, ×2.5) and a Title fight (over your weight by design; 10 + 12/level, ×5). The beast is drawn from the bestiary at the right CR — nothing epic, aquatic, incorporeal or swarming — and changes with the hour. One bout on the sand at a time per world; one per fighter.
- The fight is the fight. Start the bout and the gate lets the beast onto the sand seven tiles off; the book closes; the ordinary rules apply. Kill it and the marshal counts out the purse. Drop under a fifth of your hit points and the marshals call it — the beast is hauled off, you keep your life and lose the stake. Leave the sand and you forfeit. Fall and you fall. An hour on, a bout is void and the stakes go back. A challenge not yet started can be taken back.
- The book. While a bout is open, anyone in the world lays a wager from anywhere — on the fighter or the beast, 5 to 5,000 credits, one side per character, not on your own bout. The crowd bets too (the stake on the favourite, half on the other side, judging the beast's CR against the fighter's level), so a pool is never empty. The pools and the odds show live. When the bout ends, the winning side splits the losing pool less the house's tenth; the bookmaker pays you the next time you open the arena panel. A called bout or a forfeit pays the beast's backers.
- Lately on the sand. The panel lists the last ten results. Achievements: Gladiator (win a bout) and the hidden Champion of the Heart (win a title fight). The beast gate's notice is rewritten; the Arena room reads as open.
- Under the hood.
engine/arena.jsholds the rules dry (tiers, the opponent pick, the crowd's book, pools, odds, settlement, the gate tile, the judgement);src/arena.jsthe rows, the view, challenge/withdraw/wager and the two hooks inside the square's lock: thearenaaction (what: 'start') that puts the beast into the square's delta as a wanderer, andarenaAfterAction, which judges every action of the fighter's. Views carryarena: { live, bout }on surface worlds so the button appears for bettors anywhere.GET /api/game/arena,POST /api/game/arena/{challenge,withdraw,wager}. Achievement catalogue: 124.
2.2.0 — 2026-10-26
Businesses. The second ship of the business builder: your own counter. Migration 067 (businesses).
- Found a business. Stand on one of the twenty pitches along the north and south walls of the Concourse of the Heart and the business button offers a stall (150 credits for the licence); stand in a room you have claimed with a hab core in a Frontier world and it offers a shop (100). Name it (reserved names and the chat filter apply; one name per world) and the counter stands where you stood. One business a character in a world; one stall a pitch; one shop a room. Walking into the counter opens it — yours to run, anyone else's to buy from.
- Stock and prices. From the counter you put materials (a stack is one slot) and items from your pack out at a price a unit, see today's rate beside each, reprice, and take things back. A tier-1 Counter has six slots.
- Who buys. Other players, at your price, from any character in the world who walks up. The trading houses send for whatever you sell that they want this week, a stack at a time, as long as your price is under their premium and their cash holds. And the crowd of the hulk — salvagers, pilgrims, deckhands, Syndicate runners — buys on the economy's ten-minute tick whenever a price sits at or a little over the index: up to 10% over at tier 1, 20% at tier 2, 30% at tier 3. A stall at the Heart sees the whole crowd; a shop out in the strata sees a share that shrinks with the ring. Every sale moves the index like any other trade, and the ledger says who bought what.
- The till and the upkeep. Takings go into a till you empty at the counter. A stall pays the Heart 5% of each sale; a shop pays no fee. Upkeep comes out of the till every real day (stall 20/35/60 credits by tier, shop 10/18/30); a day the till cannot pay is a day in arrears, and seven of them shutter the business — nothing sells until you reopen it by paying what is owed. Closing down pays out the till; take the stock back first.
- Tiers. Twenty sales and 600 credits make an Emporium (ten slots, a crowd 1.6× the size that pays up to 20% over); a hundred sales and 2,000 make a House (sixteen slots, 2.4×, 30%).
- The board lists the businesses of the world — name, owner, where, tier, how much is on the counter, sales — so buyers know where to walk. The look-around line names any business in the square.
- Under the hood.
engine/business.jsholds the rules dry (pitches, tiers, footfall, upkeep);src/business.jsthe rows, the counter and the tick hook; the economy tick runs businesses after the houses. Worlds with a business are kept awake by the tick.GET /api/game/business,POST /api/game/business/{found,rename,close,stock,unstock,price,buy,collect,upgrade,reopen}. The sprite manifest gainsnpcs/stall. Tests: a stall and a shop end to end, dry footfall, upkeep, arrears, tiers, the directory; the Heart-factor assertions in the Exchange test no longer depend on the hour.
2.1.2 — 2026-10-26
The look of the hulk. The site now reads as the instruments of a dead ship rather than a scriptorium, and the words around the player follow.
- Theme. Dark by default: void background, steel panels, cool white ink, amber for value and good news, alert red for harm, cyan for the live edge of everything (links, the pressed buttons, the avatar). A pale steel console for anyone whose system asks for light; the high-contrast palettes (system or the toggle) are unchanged in meaning. Type is Exo 2 for the wordmark and headings, IBM Plex Sans for the body and IBM Plex Mono for the log and the map's labels. Map tiles are steel and slate; the exit glyphs are amber. The admin console, the public pages, the chronicle and the digest mail follow (they share
style.cssor had the fonts named inline). The About page's type credit is updated. Every colour was already a CSS variable, so nothing else moved. - Factions. The four bands take the hulk's names: the Beacon Watch (was the Lamplighters), **the Cargo Syndicate (the Cargo Guild), the Marrow Archive (the Marrow Court) and the Breaker Crews** (the Red Hand). Keys and standing are unchanged (
lamplighters,salt_guild,barrow_court,red_hand). - Bestiary. Seventy-two of the SRD monsters are renamed for the setting while keeping their keys, stat blocks, sprites and families: the fauna of the ship (vent rats, deck wolves, cable spiders, bilge sharks, coolant squid, hull scorpions, shaft-bat swarms), its settler dead (settler skeletons and husks, vac-dried mummies, the death templar), its clans (vent kobolds, scrap goblins, orc boarders, hobgoblin troopers, bugbear raiders and warbosses, deep-deck drow), its giants (hull, slag, reactor, coolant and void giants), its oozes (solvent cube, gray sludge, ochre slurry, reactor tar), its growths (shrieker fungus, strangler vine, compost shambler, hydroponic treant) and its machines (animated hardsuit, ceramic and slag golems, vat-flesh golem, guardian frame). Dragons, fiends, elementals and the stranger aberrations keep their names: this is science fantasy. Quest lines ("Kill 3 vent kobolds") and the bestiary follow automatically.
- Verbiage. "Clear …" jobs name the stratum as players know it (in the decks, the marrow, the ossuaries, the vessels) instead of the generator's key; the look-around line does the same. World events: *The hulk gives up its dead* and Hazard pay (was the king's purse). Boss titles lose their crowns (Warden of the Bilge, Queen of Slag, Keeper of the Reactor, the Dead Signal…). The world-name generator stops naming moors, fens and saints' barrows (the Vented Holds Below Dock Nine; the Irradiated Shafts Where the Beacons Went Out). The digest mail uses a system sans-serif.
- No migration.
2.1.1 — 2026-10-26
- The classes take the hulk's names. Trooper, operative, chaplain, berserker, templar, scout, adept, technomancer, psion, biomancer and herald, with void archer and leviathan disciple among the prestige paths (the assassin keeps its name). Same rules, same keys, same sheets: only what the player reads changed — class names, blurbs, the level-up and "only a …" lines, the guide. Operatives, berserkers and scouts start in a vacc suit or a flak vest (the same numbers as the leather and studded they replace). Spell names are still the 3.5 ones.
- No migration.
2.1.0 — 2026-10-26
The Exchange. The first ship of the business builder: the Heart, the trading houses, the price index and the peddlers. Migration 066 (price_index, trading_houses).
- The Heart. The centre square of every surface world is now cut by hand: the Concourse with the Heart Gate in its east wall, the Grand Exchange (the board), four Berths for the houses, the Arena (barred until 2.3) and the Chapel of the Carcass with the autodoc and the relay. Nothing hunts there and nothing can be dug; a trader keeps a stall on the Concourse; a company may claim a lodge there as in any haven. Deeper strata keep their generated centre squares. The hatches to the neighbours are hashed from the shared walls as before, so the maze around the Heart is unchanged for a given seed.
- Trading houses. Six named houses per world, hashed from the seed: a specialty each (ores, salvage, reagents, bone and relics, tech, arms, or potions), a premium of 20–60% and a factor with a name. Two are resident at the Heart; four run caravans on a route of the Heart, the nearest havens and four traders' squares, moving every four hours on the real clock (everyone sees a house in the same square). Where a house is, its factor stands in the safe room (a berth at the Heart); walking into the factor, or the counter button, opens the counter: buy its specialty at the rate plus a tenth, sell what it wants this week at its premium and anything else at half the rate, while its cash holds out. Each house has a ledger — cash, stock, goods — that moves with every trade and is topped up between visits; the goods and the want list roll over weekly.
- The houses trade while you are away. Every ten minutes the server lets each house buy fairly priced listings of what it wants off the world's board (the seller is paid out as for any sale; the buyer is named), post up to three listings of its own specialty at the rate, and take down what nobody bought. A house listing bought by a player banks to the house.
- The price index. One rate per material and per class of goods (arms and armor, tech, potions, scrolls and wands, wondrous things, sundries) per world, starting at book value: a purchase moves it up 1.5% a unit, a sale down, clamped to two fifths and three times book, and every day it drifts a tenth of the way back. Houses, peddlers and the board's "rate" tags all read it; the board shows today's rates and the movers. Traders' own stalls keep their fixed prices.
- Peddlers. One square in eight with no trader, no safe-room person and no haven has a peddler walking its rooms — peaceful, hunted by nothing, hunting nobody — with a day's cart of two or three local materials and two sundries at the rate plus 15%, and a flat three fifths of the rate for anything you sell. Walk into one to trade.
- The board marks house listings and shows each listing's rate (dear / cheap). Prices on the shop and board buttons read "cr" rather than "gp".
- Fixed. Six
select()column lists that the 2.0 rename had turned fromgoldtocredits(mail, chronicle, profile, characters, admin, company quests) aregoldagain; they would have failed against a real database. The Frontier and market tests moved one square east of the Heart. - Migration 066, run twice on a scratch Postgres; doctor probes added.
2.0.0 — 2026-10-26
Space Colosseus. GigaDungeon 1.58.4, forked whole and moved into the carcass of a leviathan that died between the stars long before anyone now living was born. Everything that worked still works; the names have changed and the hulk has grown things of its own. A new game on a new site, a new Supabase project and a new Stripe product — never point it at GigaDungeon's.
- The world. The hulk: 256 × 256 squares of settled decks, bored marrow, ossuaries and flooded vessels (the four level styles, renamed; the generator is untouched, so a seed still makes the same maze). The Heart Gate in the centre; the four Sentinels — of the Prow, Starboard, Stern and Port — hold its keys: a relic titan, a pit fiend, the Clot and a void leviathan spawn. Havens with an autodoc and a **transit relay; coolant veins crossed by gangway or skiff; hatches between squares; deeper strata** beneath. The Daily Run. Seasons are Thaw, Flare, Bloom, Freeze. The Cargo Guild and the Marrow Court.
- Money is credits. Everywhere a player reads it. (The
goldcolumn and field keep their names.) - The people. Traders (gunsmith, outfitter, chemist, quartermaster); archivists, surveyors, undertakers, prospectors, pilgrims of the Carcass, relic-sellers; mercenaries, shield-bearers, medics and lamp-bearers for hire; company lodges in the havens. Ten more first names and five more epithets.
- The hulk's bestiary. Thirty-seven new monsters in three new families — machines (sentry drone to relic titan), xenos (hull mite to hive queen) and parasites, the leviathan's immune system (phage to the immune response) — plus six settler gangs. Machines are constructs for sleep, charm, paralysis and death attacks. Two new lurkers in the ducts; spell resistance on the four biggest. 241 monsters in 19 families.
- Energy weapons and powered armor, in the spirit of the d20 Future SRD and scaled to the 3.5 table: shock baton, vibroblade, power fist, plasma sword; laser pistol and rifle, plasma pistol and rifle, gauss carbine; vacc suit, flak vest, composite plating, hardsuit, powered exoskeleton; riot shield, energy buckler; targeting visor, shield belt, servo harness. Beams need no ammunition and strike the incorporeal; overcharged cells ride on every beam as a quiver does on a bow. The log says beam, plasma bolt or slug.
- Materials and crafting. Calcite, ferrite, iridium, neutronium, alloy, struts, cable, lumen moss, ichor bloom, void lotus, marrow dust, relic weave, plasma cores (renamed, same keys); ichor, circuitry, servos, carapace, xeno glands harvested from the new families; isotope refined at a fabricator. Thirty-seven tech recipes (plain and masterwork), overcharged cells and ichor stims: 130 recipes. Craft (bowmaking) is Craft (gunsmithing). Plasma cutter and nano-welder for the Frontier; fabricators, chem benches, hab cores, bunks, condensers, lockers, floodlights, hydroponics beds, bulkheads.
- Mounts are a scout walker, a hoverbike, a cargo hauler, a combat walker and a tamed stalker.
- Lights are torches, work lamps on fuel cells, flares and fusion lamps.
- Sprites. Every prompt rethemed for Retro Diffusion and written for everything new (706 in the manifest). Generate from the admin console as before; the bucket starts empty on a new project and the client falls back to glyphs until it is filled.
- Copy. The guide, the landing page, the welcome, the About and Terms pages, the achievements, the French and Spanish tables. Site name reserved as a username.
- For developers.
SC_FAKE_DB,SC_QUIET,SC_LOADTEST_OK;sc_*localStorage keys;window.__sc;npm run rollupbuilds the whole hand-over package with a git bundle;STYLE_NAMESandSTYLE_LABELScarry the player-facing style names. Tests updated and a new smoke block for the 2.0 content. Migrations 001–064 are GigaDungeon's with the site name adjusted; migration 065 reserves the new names and renames an old public world. All 65 run twice on a scratch Postgres.
1.58.4 — 2026-10-26
- The project file.
docs/PROJECT.md: what GigaDungeon is, the stack, the layout, every environment variable, the ship loop, the rules that never bend, the data model, the admin console, where things stand and the conventions — one document to pick the project up cold. No code change, no migration.
1.58.3 — 2026-10-23
- Hide a daily. The ⋯ menu on any daily run or ladder season card has "Hide from my lobby". Hidden worlds sit folded under a "hidden worlds" line at the foot of the lobby with "Show again". Per account; nothing else changes — the day's board, titles and your characters there stay as they are.
- Migration 064 (
hidden_worlds).
1.58.2 — 2026-10-23
- The lobby stops filling with old dailies. Every day's hulk stayed on the worlds screen after it closed, so the list grew by one "Daily, closed" card a day. Now today's daily is always there; a closed daily stays only when you walked it (a character or a grave of yours), and only your newest seven; closed ladder seasons the same, your newest three. Every past day is still on Leaderboards → Daily.
- No migration.
1.58.1 — 2026-10-22
- Controller menus. The pad now runs everything off the map too: in a drawer (sheet, spellbook, shop, chest, market, maps…), the menu, a dialog, or the worlds, create, profile, Hero and leaderboard screens, the D-pad moves a credits cursor between the controls — nearest in the pressed direction, up and down wrapping — A presses the one under it (buy, equip, cast, take, Rename, OK), B backs out (dialog, then drawer, then screen). LB and RB land the cursor on the first control of the drawer they open; Start opens the menu from any screen. The cursor is real focus, so it is the same thing a keyboard user tabs to. No migration.
1.58.0 — 2026-10-22
- Controllers. Pair a Bluetooth pad (Xbox, PlayStation, MFi, any standard-layout pad) and press a button: the game switches to it, and back when it goes. D-pad or left stick walks (held: keeps walking; a dig or build takes the direction). A acts on the tile you face — attack, open, talk, cross — and confirms a target or a dialog; B cancels; X shoots and, with several foes in range, cycles the highlight; Y drinks a potion; RB held with A, X or Y eats, drinks, lights; LB and RB tapped open the drawers in turn; LT rests, RT searches; Back looks around; Start opens the menu. A "Controller" line in the menu swaps A and B for Nintendo-style pads. A toast says when a pad connects or drops; the toolbar shows the pad's letters while one is in use. Spectating ignores the pad. Menu navigation inside the drawers with the pad is next.
npm run browserdrives a fake pad through all of it.- No migration.
1.57.3 — 2026-10-22
- Needs on the map. Food, water, light — and fatigue when it is on you — now sit as chips in the bottom-left corner of the map instead of a row under it. Amber when low, red when critical, dimmed when all is well. Hungry, Thirsty and Dark are buttons: tap to eat, drink or light up. On a phone the chips are icons until something needs you. High contrast and reduced motion are respected; the screen reader's status line is unchanged.
- No migration.
1.57.2 — 2026-10-22
- Shoot opened the spellbook. With two or more foes in range, Shoot (and Charge, Feint, Intimidate and a targeted item) opened the Spellbook with no target list: the panel cleared the pending target as it opened. Fixed. The panel now opens as a plain "Light crossbow: choose a target" list, with the spell grid out of the way, and closes itself once the shot is loosed.
- Tap the map. A foe in range of your bow is shot with a tap; a foe is picked with a tap when a shot, skill, spell or item is waiting for a target; a tile beside you is a step (or the direction for a dig or build); a tile further off is a short walk toward it along floor you have seen, up to eight steps a tap.
npm run browser: the real page in headless Chromium against the fake DB (not part ofnpm run check; needs Playwright). It covers the shoot flow above.- No migration.
1.57.1 — 2026-10-21
- J at two paces. A giver's offer shows when they are two tiles off, but the job is taken face to face. Pressing J from two paces now says "walk up to them", as G does, instead of a bare refusal from the server.
1.57.0 — 2026-10-21
- How to play. A player's guide at
/guide— what GigaDungeon is, every feature as it stands, every key, and the things that take more than one step: digging, building (with every build's cost), gathering, crafting, setting traps, casting, shooting, charging, riding, crossing veins, chests, jobs, hirelings, haggling, the market and the trading post, relays, squads, companies, mail, the Heart Gate, travel, save files, chronicles. "How to play" in the menu, on the sign-in screen and on the profile; editable in the admin console's Pages tab. - The welcome. New accounts meet a five-card walkthrough before their first character — the world, walking, fighting, staying alive, the first hour — skippable at any step and replayable from the profile. Guests who drop straight into the hulk meet it there.
- Skip the guide. Every character after an account's first can start without the in-game guide: a box on the create screen, ticked by default once the guide has been finished. The first character always gets it (and can still skip from the card). A skipped guide can be brought back from the sheet, as before.
- Migration 063 (
profiles.onboarded_at).
1.56.0 — 2026-10-21
- Save files. 💾 on the character sheet, or beside any living character on the Profile page, downloads the character as a JSON file: class, levels, abilities, skills, feats, spells, credits, the pack as it is worn, materials, mount, companion, lineage, trade picks and faction standing — not the world's state (position, keys, relays, party, effects, hunger). The create-character screen of any world takes the file back and restores the character whole at that world's hatch. A save is signed by the server, so an edited one is refused; it belongs to the account that made it; it restores once; and only after the original is gone — a living character travels instead, the fallen rest, the retired are reborn. Restoring into a world other than the one it came from needs the Hero plan, like travel. Ironman and gated worlds take no save files.
- No migration.
1.55.0 — 2026-10-21
- Localisation. A "Language" line in the menu cycles English, French and Spanish (a French or Spanish browser starts in its own). The menu, the panels' headings, the action bar's tips, the chat scopes and the menu's own toggles come from a table; the log is translated by the server as it is written — strikes, misses, blows taken, kills, levels, arrivals, rests, potions, spells, effects, chests, buying and selling, hunger and thirst, light, mounts, skiffs, building, quests, the autodoc, the gate — numbers and names carried through, and a line the table does not know stays in English rather than breaking. Monsters, items and places keep the game's names.
X-Langon any game request (or?lang=) picks the language of the reply;GET /api/i18n/:langgives the interface table. - No migration.
1.54.0 — 2026-10-21
- Admin wave three. The Worlds tab counts each world's graves and shared chronicles. The overview's class mix is now a bar chart of levels taken per class — every class a multiclassed character holds counts, prestige classes marked — with how many characters are multiclassed and how many walk a prestige path. Every player row has a Timeline: account made, characters made (and reborn), gate passages, retirements, deaths with their cause, bosses slain, achievements, titles and plan changes, newest first. The Sprites tab's "Regenerate shown" redoes every sprite the current filter shows, existing ones included, with the cost confirmed first. A new Economy tab: credits in living characters' hands by level band, board and trading-post listings, sales, turnover and fees this week, what the traders took, the most-listed materials, and what waits in the mail's escrow.
- No migration.
1.53.0 — 2026-10-21
- Accessibility. A high-contrast palette — black on white (white on black in dark mode), two-pixel borders, map tiles in plain, well-separated colours — switched from the menu ("Contrast: high") and on by default where the device asks for more contrast. Visible focus rings everywhere the keyboard goes. "Motion: reduced" in the menu turns off every transition and animation, sprite animation included, and follows the device's reduced-motion setting by default. For screen readers: the log is a live region that reads each new line; the map carries a description of the square — where you are and in which room, what is in sight with distance and direction and whether it is wounded, the hatches out, your hit points and effects — updated every turn, with a quieter status line (hit points, how many in sight, the room) announced only when it changes; every action-bar button has a name.
- No migration.
1.52.0 — 2026-10-21
- Mobile layout pass. On phones the sheet, spells, squad, shop, maps, build, chest, relays and market panels open as full-screen sheets (edge to edge, under the notch and above the home bar), with a close button a thumb can find and a line at the top naming the panels either side: a horizontal swipe moves to the next or previous one. The direction pad's buttons are 64 px on touch devices (56 on narrow phones) and the action bar's 44 px, with the bar clear of the home bar. The viewport uses the whole screen on notched phones.
- No migration.
1.51.0 — 2026-10-21
- Sound wave two. Monster cries: when something notices you, and once more when it falls, a cry by its family — the moan of the undead, a growl, a dragon's roar, chittering vermin, a fiend's horn, a goblin's yell, a giant's bellow, an elemental's rush, an ooze's gurgle, a construct's grind, a screech, a warble — all synthesised like the rest, nothing to download. Ambience grows layers on top of the four level styles: chimes in a haven, a slow heartbeat in the Vault, a vein's rush, winter's wind in a Frontier world, a crackle where a company deck stands. Music: the admin console's Site tab takes one MP3 or OGG (under 10 MB), kept in the sprites bucket and looped quietly under the game for anyone with sound on; "Music: on/off" in the menu (shown only when a track is set), remembered on the device. Also fixes the favicon upload, which the request-size limit had been refusing.
- No migration.
1.50.0 — 2026-10-21
- Chronicle extras. A shared chronicle now carries an OpenGraph image — the explored map drawn at 1,200 × 630, rings and all, with the character's level and deepest ring as bars at the sides — so a link pasted into a chat or a feed unfurls with the map (
/chronicle/<id>/map.png). Every company has a public page at/company/<tag>: name, motto, renown together, the deck and its notice, the open quest, and the roster with each member's living characters (linked where their chronicles are shared). Every account has a shelf at/chronicles/<username>: its shared chronicles, titles and company. Links to both from the profile page. All three are public and cached a minute, like the chronicle. - No migration.
1.49.0 — 2026-10-21
- The cross-world trading post. A second list in the market panel, seen from every trader's board in every world: materials only, Heroes only. A Hero ticks "post" when listing a stack and it goes up where every other Hero can see it, whatever world they stand in; buying works the same as the board, from any trader, and the post keeps 15% rather than the board's 5%. Your post listings show among yours from any world; payouts settle the next time you open a market anywhere, as before. The Salvager plan sees the post's heading and what it would take.
- Migration 062 adds
listings.scope.
1.48.0 — 2026-10-21
- Mail. Letters between players, from the profile page: to a username, from one of your living characters, with a subject, up to a thousand characters, and — if you like — one item from that character's pack and some credits. The attachment leaves the pack when the letter is sent and waits in it, as the market holds an escrow, until the recipient claims it onto a living character of theirs; until then the sender can recall it. Each side deletes its own copy (a recipient cannot delete an unclaimed attachment away). The chat filter masks the words it masks in chat, the muted cannot write, inboxes hold twenty unread letters, and fifty letters a day is the limit. The profile's Mail heading shows the unread count.
- Migration 061 adds
mail.
1.47.0 — 2026-10-21
- Spectating. Watch another character's turns as they take them: the 👁 beside a squad-mate in the squad panel, or beside a company-mate on the roster (it finds the character they played last), opens the game screen as a spectator — the same map, square and log, read-only, with their pack, credits, shop and chest kept out of it. It refreshes on the square's own broadcasts and every three seconds besides; Esc or "Stop watching" returns you to the worlds. A shared chronicle now carries a "Watch live" link (
/?watch=<id>) that opens the same view for anyone signed in, as long as the chronicle stays shared. Spectators are not counted as present in the square and write nothing. - No migration.
1.46.0 — 2026-10-21
- Company quests. A goal the whole company works at. An officer or the leader posts one from the company panel — slay monsters (50/200/500), hunt a family (10/30/80 of undead, dragons, outsiders…), slay bosses (1/3/6), reach a ring (25/50/90, the farthest any member sets foot on), gather materials (100/300/800) or build in the Frontier (10/40/100) — at one of three tiers. It runs a week; every member's play advances it, counted the way the achievements already count. When the target falls, every member is paid: 300/900/2,500 renown on the account and 150/500/1,500 credits to their latest living character, and the one who struck the last blow sees it in their log. One open quest at a time; an officer can abandon it; a week unanswered fails it. The panel shows the bar and who contributed. One hidden achievement: Common Cause.
- Migration 060 adds
company_quests.
1.45.0 — 2026-10-21
- New game plus. A retired character can be reborn: from the profile, "Reborn…" makes a new level-1 character of the same class in the +N world beneath the one they left (made if it is missing), named for them with a numeral ("Bea II", "Bea III"…), carrying one epic feat the old character held as an heirloom (chosen on the way), a tenth of their credits, and their count of escapes. The old character stays retired and marked as reborn; the new one's chronicle names who they came from, the generation and the heirloom. Once per retired character. One hidden achievement: Born Again.
- Migration 059 adds
characters.lineage.
1.44.0 — 2026-10-21
- The daily run. Every UTC day has one public ironman world of its own — "Daily Run — 21 October 2026" — on a seed everyone shares (nine digits hashed from the date, shown on the world like any seed), made the first time anyone lists the worlds. One life, one character per account. A Daily tab on the leaderboards shows how far each got: by the farthest ring walked (what you explored counts, not just where you stand), then level, then the time it took from making the character to their last turn; the fallen count where they fell. At midnight UTC the day closes: the best salvager carries a title for good ("Salvager of 21 October 2026") on their profile and beside their name on every board; the closed world stays to be walked but takes no new characters, and the next day's opens fresh. Yesterday's salvager and seed stay on the tab. The world list marks "Today's hulk" and "Daily, closed".
- Migration 058 adds
worlds.daily.
1.43.0 — 2026-10-21
- Numeric seeds. A world's seed is a number people can share. Creating a world takes a seed of one to nine digits (type one, roll one with the dice, or leave it blank for a rolled one); the same seed on the same server makes the same GigaDungeon — every square, monster, chest, vein, lair and haven — so a known good hulk can be passed around by its number. Every world shows its seed on its card (click to copy) and the play screen's title line; a +N world shows its parent's seed with the depth. Worlds from before keep their old 32-character seeds, which are shown and accepted too.
- No migration.
1.42.0 — 2026-10-21
- The seasonal ironman ladder. Every month has one public ironman world of its own — "Ironman Ladder — October 2026" — made the first time anyone lists the worlds and open to everyone: one life, no dragging back. A Ladder tab on the leaderboards shows the season's standing (by level, then by the farthest ring; the fallen count where they fell) and when the month closes. When it does, the season closes: the top ten carry a title for good — Ironlord (first), Ironborn (second and third), Top ten — on their profile and beside their name on every board; the closed world stays to be walked but takes no new characters, and the next month's opens fresh. The world list marks "This month's ladder" and "Season closed".
- Migration 057 adds
worlds.season,worlds.closed_atand thetitlestable.
1.41.0 — 2026-10-21
- Mounts. Every trader keeps a stable: a scout walker (150), a hoverbike (75), a cargo hauler (200), a heavy combat walker (400, level 3) and a dire wolf (1,500, level 7); one mount at a time, and a paladin of fifth level calls a combat walker for nothing. Led, it follows at your heel. Ridden — the new Mount button, in a corridor or a deck six tiles each way (four for a dog) — open ground is two tiles a turn (one with a foe within two), melee is +1 from the saddle, and a straight clear run of two to four tiles at a foe is a charge: +2 on the blow (+4 from a combat walker; a dire wolf bites for 1d8 of its own), −2 AC for a turn. One blow in three aimed at you lands on the mount instead; at no hit points it is gone. A cramped room has you swing down at its hatch; water, pits, rubble and skiffs want you on foot. A rest heals the mount. The rider shows on the map.
- Migration 056 adds
characters.mount.
1.40.0 — 2026-10-21
- Crafting wave two. A caster's own scrolls, potions and wands, made at a bench or with artisan's tools from the spells they can cast: three item-creation feats — Scribe Scroll (any caster; a wizard has it from level 1), Brew Potion (level 3) and Craft Wand (level 5) — put a recipe for every known spell under a new "Scrolls, potions and wands" heading of the crafting panel. A scroll of any level, a potion of a self-targeting spell up to 3rd, a wand of fifty charges up to 3rd; each costs a reagent of the spell's tier (marrow moss, ichor bloom, void lotus; a wand adds struts and silver) and half the item's price in credits, on a Spellcraft check (DC 10 + 2 × level; wands 15 + 3 × level). A failure by five or more ruins half the reagents as with any craft. Sorcerers and bards make only what they know; wizards anything in the book. Masterwork artisan's tools (DC 20, iron, silver and struts) add +2 to every Craft check made with them.
- No migration.
1.39.0 — 2026-10-21
- Prestige paths. Three SRD prestige classes, ten levels each, taken on top of your base classes through the "next level in" choice once their prerequisites are met (the sheet says what is still missing). They cannot be started with. Arcane Archer (base attack +6, Point Blank Shot, Precise Shot, Weapon Focus, a level of wizard, sorcerer or bard): every arrow from a bow is +1 to +5; then, one of each a day, a seeker arrow that cannot miss (4), a phase arrow that ignores armor (6), a hail of arrows at every foe in range (8) and the arrow of death (10, Fortitude DC 20 or die; 10d6 to bosses, Sentinels, undead and constructs). Assassin (8 ranks of Hide and Move Silently, 4 of Bluff): sneak attack dice of its own (+1d6 every other level, stacking with the rogue's), the death attack (a sneak attack on a foe that never saw you kills outright unless it saves at DC 10 + level + Int), +1 per two levels on saves against poison, and hide in plain sight at 8 (+4 Hide). Dragon Disciple (a level of sorcerer or bard, 8 ranks of Knowledge): natural armor +1/+2/+3/+4, Strength +2/+2/+4, Constitution +2, Intelligence +2, Charisma +2 by the SRD table, claws and a bite when unarmed, a breath of fire over everything within three tiles once a day (2d8/4d8/6d8, Reflex half), blindsense that finds lurkers, and at 9 wings — pits, water and rubble cost nothing to cross. New actions
breatheand the arrow modes onshoot; two new bar buttons. - No migration.
1.38.0 — 2026-10-21
- Company decks. A company may claim one room of a haven (not the arrival room) as its deck: an officer or the leader stands in the room and claims it from the company panel. The deck gets a banner (colour and sigil, set by officers), a notice board (any member posts up to 280 characters; everyone who walks into it reads it) and a chest of the company's own, opened from beside it with the ordinary stash/take drawer, in any ruleset. The room is named for the company on the map and the square line shows whose deck is here. In PvPvE worlds anyone outside the company can tear at the banner — twenty blows raze the deck and its chest is lost with it; in PvE it is only looked at. The leader can abandon the deck. One deck per company, one company per room.
- Migration 055 adds
company_hallsandcontainers.company_id.
1.37.0 — 2026-10-21
- Havens. Every sixteenth ring (16, 32, … 128) holds one square where nothing hunts: no monsters, no traps, no wanderers, no surges, no lair spill, no sieges, and no blood between players. A autodoc of pale stone stands in its arrival room: touch it once a day and the hulk lets go of you — hit points restored, diseases, poison, ability damage, negative levels and the rest lifted. A trader always keeps a stall there and a relay always stands there, so the eight havens are the backbone of every relay network. Resting there is a camp. Hashed from the world seed, never on a lair or a Sentinel's seat; the square line says "haven". In Frontier worlds a haven is holy ground: nothing is dug or built. One achievement: Pilgrim.
- No migration.
1.36.0 — 2026-10-21
- The Vault of the Nine. Beyond the Heart Gate, under the centre of every world, nine squares cut by hand. Once the gate has opened for you, stepping into it again is the passage down: the Antechamber, then the Deck of Echoes (five levers, pulled in the order a verse gives), the Gallery of Masks (four braziers lit within a held breath of each other), the Flooded Vessel (an altar on an island, dire sharks and a kraken in the water), the Hub (a riddle at the crossroads), the Furnace (an altar past channels of fire and a primal fire elemental), the Ossuary (a lich and its arrangements), the Library of Lies (three altars, three plaques, two of them lying) — and the Throne of the Ninth, behind a Nine-sided Hatch that opens to eight seals. The Ninth, Sentinel of the Vault (CR 24, SR 32, with four death knights), sits at the far end; three rich chests stand by the throne. Riddles are answered from a new Answer box; seals are yours alone (each worth 2,000 XP), kept across deaths, listed on your sheet. The antechamber's north hatch leads back up beside the Gate. Three hidden achievements: The First Seal, Eight of Nine, The Ninth Falls.
- Migration 054 adds
characters.vault.
1.35.0 — 2026-10-21
- Veins. Ten veins wind across every world, square to square, from one edge of the map toward the far one (about five percent of squares). In a vein square a channel two tiles wide runs from the vein's mouth on each edge it crosses to a bend near the middle, carved through walls and rooms alike. The mouth is an exit of its own, so the vein is a road for anyone who can swim it. The arrival room is never flooded (the vein runs under it), and one old stone gangway is left where the channel cut a floor or corridor. Veins never touch the centre squares or the Sentinels' seats, and they are carved last on their own seeded streams: the rooms, monsters and chests of the squares you already know are exactly as they were.
- Boats. A Frontier build: six struts and two hide, on a water tile beside you. Step aboard from beside it and it carries you and your retinue along any water — vein, pool, or through a vein mouth into the next square — with no Swim checks. Step ashore and it stays moored on the water you left, yours (in Private Resources only you and your company may board it). The skiff shows under you on the map and as "⛵ aboard" on the square line.
- Aquatic monsters. Sixteen water-bound creatures from the SRD — octopus, squid, sharks from CR 2 to the dire shark, leech swarm, sahuagin, skum, tojanida, water naga, elasmosaurus, dragon turtle, kraken — spawn in the water of any square with enough of it (veins, vessel pools), away from the arrival room, and never leave it; they strike whatever stands beside them. Crocodiles, the giant octopus, aboleth, chuul and the sea hag are amphibious and come and go. Knowledge (dungeoneering) names them water-bound or amphibious. 203 monsters.
- No migration.
1.34.0 — 2026-10-21
- Frontier seasons. A 28-day year turns on the real clock for every Frontier world at once: a week each of spring, summer, autumn and winter. Spring: pools run clean and hydroponics beds put up two rations a night. Summer: thirst comes twice as fast. Autumn, the harvest festival: plots yield double, every gathering node gives one more, and the trader pays a fifth again for materials. Winter: lights burn half again as fast, hunger comes faster, and a rest away from a hab core (or without a bedroll) risks waking fatigued (Fortitude DC 12, Endurance −4). The square line names the season; hover it for what it does and when it turns. Standard worlds are unchanged.
- No migration.
1.33.0 — 2026-10-21
- Dynamic lairs. A boss left alone gathers strength: every fortnight it draws two more of its kind into the lair (three levels at most), and from the second level they spill into the squares around it. Slay it and the clock restarts. A lair whose master has been dead a month is reclaimed by a new, deeper one under a new name. The square line says which it is: gathering strength, swollen, a stronghold, a new master.
- No migration.
1.32.0 — 2026-10-21
- Factions. The people of the hulk belong to four bands — the Lamplighters, the Cargo Guild, the Marrow Court and the Red Hand — and each remembers what you do for them. Jobs for their people, credits spent with their traders: your standing climbs through Known, Friend, Ally and Champion, and with it their jobs pay more, their rumours come free, their hirelings cost less and the Guild's prices drop. Walking out on a job costs standing. The sheet shows where you stand with each.
- Faction wars. A new world event the admin can start (or let fall at random between two sides): jobs for either side pay half again, and every job done for one costs standing with the other.
- Migration 053 adds
characters.standing.
1.31.0 — 2026-10-21
- Traps wave two. From CR 4 on, some traps are magical: fireball and lightning runes that burn everything in reach (monsters included), sleeping gas, alarm glyphs that wake the whole area, and teleport runes that drop you somewhere else in the level with your pursuers lost. Spiked pits now have a bottom: climb out (DC 15) or scrabble for three turns. Existing squares keep their traps where they were; only some kinds change.
- Traps of your own. Snare kits and blade trap kits — crafted or bought — are set on a floor tile beside you; the first monster to step there takes the damage (a snare holds it), and never you.
- No migration. Two sprite keys.
1.30.0 — 2026-10-21
- Staves: fire, frost, healing and life — several spells on fifty charges, one button per spell in your pack, for any caster whose list holds one of them. Metamagic rods: empower, extend, maximize and quicken without the feat, three times between rests, from the pack (lesser rods take spells to 3rd level, the full rods to 6th). Cursed items: one piece of magic gear in sixteen is cursed — −2, and it will not come off until remove curse (new for clerics, wizards, bards and druids) is cast over it. Special ammunition: flaming, frost, shock and slaying arrows, flaming and shock bolts, thunderstones — a quiver of twenty in your pack rides on every shot.
- 17 new sprite keys. No migration. New consumables shift unopened chests, as always.
1.29.0 — 2026-10-21
- Bestiary wave three. Sixty more monsters from the SRD — 187 in all: dark elves and deep dwarves, cyclopes and troll hunters; ghoul lords, a banshee, a death knight, a dread wraith; dire boars, lions and tigers, crocodiles, locust, bat and hellwasp swarms; griffons, bulettes, behirs, winter wolves; aboleths and will-o'-wisps, treants and yellow mold; elementals up to elder, animated armor, flesh golems and shield guardians; lemures, dretches, quasits, succubi, erinyes and night hags; dragons from a black wyrmling to an adult credits. Spawn pools, lairs, surges and wanderers all draw on them from here on; squares you have already opened stay as they were.
- 60 new sprite keys under Sprites → Generate missing. No migration.
1.28.0 — 2026-10-21
- Conditions wave two. Nausea (troglodyte and ghast stench, the new stinking cloud): you can stumble about and drink, nothing more; a nauseated monster never swings. Confusion (the new confusion spell): your actions go astray — a random step, a swing at whatever is next to you, a turn spent babbling; a confused monster wanders or turns on its neighbour. Deafness: one casting in five fails unless the spell is silent, and Listen is gone; the new blindness/deafness spell blinds a monster instead. Exhaustion: −6 Strength and Dexterity, from raging while already fatigued; a rest brings it down to fatigue. Sound burst for clerics and bards.
- Negative levels now bite. At rest each one is judged with a Fortitude save: made, it fades; failed, the level is gone for good (hit points, attack bonus, XP and the class with the most levels pay for it). A raised character who fails is a level lower, as the SRD has it. Restoration before the rest still removes them outright.
- No migration.
1.27.0 — 2026-10-21
- Feats wave three. Combat Reflexes (a free swing at any monster that moves while beside you — one plus your Dexterity bonus a turn), Manyshot (the first arrow of a volley is two), Improved Unarmed Strike (1d4 fists), Deflect Arrows (dart and arrow traps knocked aside), Endurance (+4 against hunger, thirst and cold), Diehard (the blow that would fell you leaves 1 hit point, once between rests), Spell Penetration, and three metamagic feats: Quicken (the spell does not take your turn), Still (cast in armor) and Silent.
- Spell resistance. Fiends and dragons of adult age and older now shrug off spells unless your caster level check beats their SR — a pit fiend at 32 is nearly beyond a level-20 wizard without Spell Penetration.
- Armor and arcane casting: a wizard in a chain shirt keeps their slots now, but every casting fizzles (the slot is spent) unless the spell is stilled. Shed the armor or learn Still Spell.
- No migration.
1.26.0 — 2026-10-21
- Spells of levels 8 and 9 — the top of the SRD lists, for the deepest hulks. Wizards and sorcerers: horrid wilting, polar ray, iron body and Summon Monster VIII at 8; meteor swarm, power word kill, time stop (the room stands still for 1d4+1 of your turns), wail of the banshee, energy drain and Summon Monster IX at 9. Clerics: fire storm (which spares your friends), earthquake and mass cure critical at 8; implosion, mass heal, gate (a hezrou for two turns a level) and true resurrection at 9 — any gravestone that still bears a name, however old, and the fallen rise whole, for 1000 credits and 100 a level. Druids reach 9 as well. Scrolls of all of them.
- No migration.
1.25.0 — 2026-10-21
- Summoning. Summon Monster I–VII for wizards, sorcerers and clerics (bards to VI) and Summon Nature's Ally I–VI for druids: a creature from the bestiary — a celestial wolf, an earth elemental, a hell hound, a bearded devil, a vrock; a wolf, a bear, a dire bear — fights at your side for one turn per level, on top of your retinue, and fades when its time is up or when you rest. Scrolls of every one of them turn up as loot.
- Raise dead. The road back from an ironman grave. A cleric of level 9 standing beside a gravestone less than a day old casts it for 250 credits plus 50 a level of the fallen; they rise with 1 hit point and a negative level (restoration mends it), the stone goes, their name leaves the Ironman board's list of the fallen, and their owner is told. It is refused — without spending the spell — if the owner has already made a new character in that world, if the grave is older than a day, or if the credits is short. Stones from before 1.25 cannot be read a name from.
- Migration 052 adds
graves.raised_at. New consumables shift the contents of chests in squares nobody has opened yet, as every item added does; what is saved stays.
1.24.5 — 2026-10-20
- Building silently did nothing in two cases, both fixed: choosing Hab core (or anything) from the build menu and then pressing the on-screen D-pad walked you a step instead of building — the pad did not know about dig/build mode; and a build direction pressed while a move was still on its way was dropped without a word. The pad now builds, and a build waits for the move to land. Every refusal in the engine now says why, including the edge of a level.
1.24.4 — 2026-10-20
- A hab core refused for a room that already had one (or for a corridor) still took the 4 stone and 2 struts; the refusal now comes first and costs nothing, and the message says what it means: one hab core per room, any other room will take one. Hearths in other rooms and other squares were always allowed.
1.24.3 — 2026-10-20
- The rubber band. Walking with squad-mates (or anyone in the square) could snap you back three or four steps: every time someone else moved or arrived, your game refetched its state, and when that answer came back from before the server had processed the moves you had already sent, the older picture replaced the newer one. Now a refresh waits until your queued moves have landed, every view carries the server's own timestamp and an older view than the one on screen is dropped, and the steps still queued are drawn back on top of whatever arrives. Movement is predicted on the client as before, so it feels instant; it just stops being undone.
1.24.2 — 2026-10-20
- If the Realtime socket is not connected (a blocked network, a hiccup, a project without it), the game polls its state every 20 seconds so squad-mates' moves and arrivals still show up; with the socket up nothing changes.
1.24.1 — 2026-10-20
- The character sheet's button said "C", but C has always been the south-east diagonal; the sheet opens with Tab (as it did) and now also @, the roguelike's own key for "me". The key list under the toolbar says so. Every letter is spoken for, so no plain letter is offered.
1.24.0 — 2026-10-19
- Spells of levels 6 and 7. For the deep hulk, where CR 20+ has been waiting: wizards (and sorcerers) get chain lightning, disintegrate, flesh to stone and greater heroism at 6, delayed blast fireball, finger of death, prismatic spray and power word stun at 7; clerics get heal, harm, blade barrier, banishment and mass cure moderate at 6, destruction, regenerate, holy word and mass cure serious at 7. Druids reach 7 (heal, finger of death among them), bards reach 6. Scrolls of all of them turn up as deep loot.
- Epic feats. Level 20 now brings a capstone feat, and the SRD's epic list opens with it: Epic Toughness, Epic Prowess, Epic Weapon Focus, Epic Fortitude, Epic Reflexes, Epic Will, Armor Skin, Damage Reduction, Fast Healing and Epic Spell Focus (✦ on the sheet). The level cap stays 20.
- ROADMAP.md carries the expanded list of what comes next. No migration.
1.23.0 — 2026-10-19
- The character chronicle. A public page per character to show off or remember them by:
/chronicle/<id>— name and classes, where they stand (or where they fell), level and experience, the deepest ring and a map of every square they have seen, lairs cleared with the boss and the ring, Heart Gate passages, jobs done, achievements, and who walks at their side. Off for everyone until you share it: 📜 on the character sheet or the profile page turns it on and copies the link; the same button takes it down again. Nothing about the account is on the page. - Migration 051 adds
characters.chronicle. SetSITE_URLin hPanel for absolute links (relative ones work too).
1.22.0 — 2026-10-19
- Animated sprites. Classes, monsters and the people of the hulk can breathe: the Sprites tab's new
animgroup holds an idle animation for each of them — a six-frame sheet made by Retro Diffusion from the existing still ($0.14 each; the still must exist first, and "Generate missing" makes stills before sheets). The game plays a sheet wherever one exists and shows the still elsewhere, so the set can be filled a few at a time. A ⟳ button in the toolbar turns animation off (remembered per browser; off by default for people who have asked their system for reduced motion). - No migration. New dependency
pngjs(pure JavaScript; Hostinger'snpm installhandles it).
1.21.0 — 2026-10-19
- Ironman worlds. Tick Ironman when you make a private world and death there is final: a character who falls is laid to rest where they fell, a gravestone marks the tile (and tells whoever steps on it who lies there and what did it), their name goes on the new Ironman leaderboard with the level they reached and the blow that ended them, and the world's card and your profile show the grave. You may make a new character in the same world (one living at a time). No travelling into or out of an ironman world — the Heart Gate is the only road home. The setting is made with the world and never changes. Two achievements: Ironborn (level 5 in an ironman world) and Iron Nerve (ring 20).
- Migration 050 adds
worlds.ironman,characters.died_at/deathand thegravestable. One sprite key (tiles/grave) under Sprites → Generate missing.
1.20.0 — 2026-10-19
- Multiclassing. Every level-up now goes to the class chosen on your sheet (Next level in — any of the eleven, changed at any time; your first class until you choose). The new level brings that class's hit die, skill points and, every fourth level, its ability point; base attack and saves add up class by class as in the SRD, and class features go by class level: sneak attack by rogue levels, rages by barbarian, smites by paladin, wild shape by druid, flurry by monk, and so on. Bonus feats by fighter, monk and ranger levels; class skills from every class you hold. Spells come from one class — the casting class you have most levels in — at that class's level. A fighter who takes up wizardry may keep the chain shirt on, but casts nothing while wearing it (the sheet says so); a druid in metal likewise loses spells and wild shape. Single-classed wizards, sorcerers and druids are refused armor as before. The sheet, the HUD and your profile show "Fighter 3 / Rogue 2"; the sprite stays your first class's. No XP penalty for uneven classes.
- Migration 049 adds
characters.classesandcharacters.next_class; existing characters are unchanged (their single class at their level).
1.19.0 — 2026-10-19
- Epic depth. Seven monsters past CR 20 for the deeper strata — the titan (21), the great wyrm black, blue, red and credits dragons (22–27), the atropal (30, an undead abomination that drains two levels a touch and regenerates) and the primal fire elemental (35, eleven hundred hit points). They spawn and keep lairs only in +1 worlds and below, where the curve already runs past 20; the surface world is unchanged, and so are its bosses. The level cap stays at 20: the deep is a place to be outmatched. Lairs in existing deep worlds may change keeper as the pool widens.
- No migration. Seven sprite keys (
monsters/<key>) under Sprites → Generate missing.
1.18.0 — 2026-10-19
- The market. A listing board at every trader (toolbar button in a trader's room). Put an item from your pack or a stack of materials up for a price; anyone in the world buys it from any trader's board — not your own, not beyond their carry capacity. The board keeps 5%; your share waits on the listing and is paid out the next time you open the board at any trader. Twenty open listings a character; a listing lasts fourteen days, then comes back to your pack the next time you look. Take a listing down any time before it sells.
- Migration 048 adds
listings.
1.17.0 — 2026-10-19
- Companies. A band that lasts across worlds. Found one from your profile page — a name and a two-to-five-letter tag, a motto if you like — and invite by link (
/company/CODE, 7 days, 10 uses). A leader, officers who can invite and remove members, and members; the lead can be handed over; a company is disbanded by its leader with its name typed. One company per account. - A company channel in chat (the scope menu gains Company when you are in one), across every world.
- Shared holdings. In Private Resources worlds a company-mate's hatches, chests, furniture and hab cores open for you as if they were yours, and you cannot besiege them; a hab core lit among a mate's furniture is no capture.
- Leaderboard → Companies: companies by their members' renown together.
- Migration 047 adds
companies,company_members,company_invites.
1.16.0 — 2026-10-19
- The squad shares its map. In a squad, what your mates have seen fills in your own: the tiles they have walked in the square you are in appear on your map within half a minute (and the moment you enter a square), and the squares any of them have set foot in are shaded squad-green on the world map, with a green dot where each mate is now. It works both ways and stops when you leave the squad; what you learned stays on your own map.
GET /api/game/squad-map. No migration.
1.15.0 — 2026-10-19
- Push notifications. From the profile page, turn on pushes in a browser and the hulk reaches you with the game closed: a siege on one of your holdings (who, what, where), a world event beginning, the week's new hunt. Each kind is a tick box; one push per kind every ten minutes at most; a test button shows what they look like. Needs VAPID keys in hPanel — Admin → Health has a Generate VAPID keys button that prints the three variables to paste.
- A daily email digest (opt-in): sieges on your holdings in the last day, jobs done with credits waiting, events on now, and your place in the hunt — sent once a day around a set hour, only when there is something to say. Needs
RESEND_API_KEYandEMAIL_FROM(a sender verified at resend.com);DIGEST_HOUR_UTC(default 13) andSITE_URL(for absolute links) are optional. Ticking the box shows what today's would have said. - Admin → Health shows both channels' status, how many browsers are subscribed and how many asked for the digest, and has Run the notifier now.
/healthzreportsnotify.pushandnotify.email. The Privacy Policy's default text mentions both channels. - New dependency
web-push; migration 046 addspush_subscriptions,profiles.notifyandworld_events.announced_at.
1.14.0 — 2026-10-19
- World events. From Admin → Events, something happens to a band of rings for a span of days, in one world or every world: Rising (a family swarms — a third again as many of them in every square first entered or respawned in the band, and they break your rest more often, and it is them), The deep gives up its dead (every chest in the band holds one more thing; the fallen drop loot twice as often), The king's purse (jobs and bounties in the band pay double credits). Name and announcement optional — a good one is made up. Events can be scheduled ahead and ended early.
- Players see the event's name as a credits chip on the HUD while inside the band (hover for the details and the end), a line in the log when they cross into it, and the event on their world's card on the worlds screen. Twenty-five kills during any event earn Stormwatcher (114 achievements).
- Migration 045 adds
world_events.
1.13.1 — 2026-10-19
- Fix: since 1.12 the profile, the character list and the admin console failed with "more than one relationship was found for 'characters' and 'worlds'". The new
bountiestable carried foreign keys to both inside its primary key, which the database API reads as a junction table and so could no longer tell which relationship an embed meant. Migration 044 drops that foreign key (the app removes a character's bounty rows itself and trims old ones), the embeds now name their key explicitly, and the test suite lints every migration for the pattern.
1.13.0 — 2026-10-19
- Relays. Standing stones in some safe rooms — one in four of the rooms with a trader or a hermit in them, and always in the centre square. Walk into one to touch it: the stone remembers you and opens the Relays panel (toolbar button beside a stone), listing every stone you have touched with the toll to each — five credits and two a square. Step, and you arrive beside the far stone, followers and all; it costs the turn and nothing else. Not mid-fight. Stones you know are marked on the world map in credits. Each salvager's network is their own: find them.
- Migration 043 adds
characters.waystones. One sprite key,tiles/waystone(Sprites → Generate missing).
1.12.0 — 2026-10-19
- Bounties. Every world posts three a day, rolled from its seed: thin a family of monsters, empty chests, work the nodes, walk the maze. They count as you play and pay on their own the moment they close — 30 + 2×ring credits and 50 + 10×ring experience — with a line in the log. The sheet's Bounties today shows progress bars; the day turns at midnight UTC.
- The weekly hunt. One target a week per world: a lair's keeper to slay (every kill scores, the first stands highest), a family to cull (most slain), or the long walk (deepest ring reached). The sheet shows the target, the top three and your place; the Leaderboard has the full board under the hunt, with the closing time. The board carries the week's title for its top ten when it turns.
- Admin → Quests → The weekly hunt sets this or next week's hunt by hand for every world (a boss hunt names the public world's boss on that ring); clearing it goes back to the roll.
- Migration 042 adds
bountiesandhunt_scores.
1.11.0 — 2026-10-18
- The first hour. A new character gets a guide: a card above the HUD with one step at a time — walk a dozen paces, draw blood, open a chest, rest, read the maps, cross into the next square, take a job, spend some credits — each with a line that points at the nearest way to do it ("the nearest is a dire rat 6 tiles to the north-east", "someone with work 2 squares to the east, at (130, 128)"). Steps close on their own from what you do. Skip hides it; the sheet brings it back. Finishing pays 50 credits, a potion and the Apprentice achievement (113 in all). Characters from before 1.11 are left alone.
- Migration 041 adds
characters.tutorial.
1.10.3 — 2026-10-17
- A picture for every pile. Materials set down (or spilled from a sacked chest) draw as what they are: 26 pile sprites, one per material, plus a jumbled pile for mixed heaps and a spilled-goods pile for chest contents. They are in the sprite manifest — Admin → Sprites → Generate missing makes the 28 at $0.18 each — and until they exist each pile falls back to a glyph coloured for its material (grey stone, rust ore, green moss, bone white…), so the floor already says what lies there.
1.10.2 — 2026-10-17
- Rename a world. The card's ⋯ menu has Rename… for the owner (with the 🎲 if you want another roll); the maze stays, deeper strata below it follow the new name. Before creation the chooser's name field was always yours to edit; it now says so.
- Rename a character. ✎ Rename on the character sheet in play, and ✎ beside each character on your profile. 2–24 characters, independent of your username and profile name. Other players see it at once; old chat lines, boss kills and leaderboard entries keep the name they were made under.
PATCH /api/worlds/:id {name}andPATCH /api/characters/:id {name}. No migration.
1.10.1 — 2026-10-17
- Fix: the worlds screen failed to load on a real database (
boss_kills.created_at does not exist; the column isslain_at). The in-memory test database stampscreated_aton every row, which hid it. Every other column the summary reads was checked against the migrated schema.
1.10.0 — 2026-10-17
- The worlds screen is about you now. Each world is a card: your character there (name, class, level, ring, hit points, when you last played) and a Continue as … button, or Make a character; who else is in it (faces and a count); what is alive — players here this hour, the deepest ring reached and by whom, the last boss slain; for Frontier worlds, walls dug, things built, rooms claimed and, where players may fight, sieges this week. One line of news per world: a boss slain, a siege on your holding, a finished job with credits waiting. A thumbnail of every square anyone has set foot in, zoomed to what has been walked, with the Heart Gate in credits and your square outlined. Sorted by what you played last; the most recent is the big card.
- Badges in plain words — Frontier, Private resources, PvPvE, Unpowered, Depth +1 — each with a hover line.
- A new world is a chooser, not four dropdowns: which game (GigaDungeon or Frontier) and who can hurt whom as cards with a three-line pitch each, Private Resources and Unpowered as toggles with their consequences spelled out, and a 🎲 that rolls a hulk name.
- Invites are links. Inviting shows a link (
/join/CODE, 7 days, 5 uses) with a copy button; opening it brings a friend straight to the worlds screen and joins them. The in-game Invite button copies the link too. Members can Leave a private world from the card's ⋯ menu (their character stays for a later invite); owners delete. GET /api/worlds/summaryandPOST /api/worlds/:id/leave. Migration 040 addscharacters.last_played_at.
1.9.1 — 2026-10-17
- Footer text (and page subtitles, which share the same inline Markdown) now passes numeric character references through —
■■,•• — and a few named ones (,·,•,…,—,–,©,®,™). Tags and everything else are still escaped.
1.9.0 — 2026-10-17
- Editable footers. Admin → Site edits the footer of the game and the legal pages, and the footer of the admin console: left and right text, inline Markdown (links, bold, italics, code) and
[version]for the running version, with a preview and a reset to the shipped text. Saved in thesitesetting; every page picks it up within a minute. Keep a link to the Open Game License somewhere — it is the licence's requirement. - A favicon, at last. The site ships one (a lit doorway,
/favicon.png); on the same tab upload your own PNG (32×32 or 64×64, under 256 KB), have Retro Diffusion draw one from a prompt ($0.18, needsRETRO_DIFFUSION_KEY), or pick any recent generation on the account and use it. Uploaded icons live in the sprites bucket undersite/favicon.png, so nothing is written to the server;/favicon.icoredirects to whichever is current. - No migration. Both shells (game and admin) are now rendered per request with the footer and icon filled in.
1.8.0 — 2026-10-17
- Chat goes through the server. Every line you say — here or to your squad — is checked (240 characters, the word filter, your mute), kept for thirty days so a report can be read in context, and relayed to the square or squad from the server. A word on the filter list goes out starred, and you are told.
- Report a message. A flag (⚑) beside every line that is not yours: pick a reason (abuse, spam, cheating, other), add a note, send. One report per message per player.
- Admin → Chat. Open reports with the message, who reported it and why, and the reported player's last ten lines; from there: delete the line, mute for an hour, a day, a week or for ever (with a reason the player sees when they try to speak), mark the report actioned or dismiss it. The word list is edited on the same tab; recent messages are searchable; muted players are listed with an Unmute. Chat is limited to 20 lines a minute per player (Health tab).
- A sacked chest is destroyed (changed from 1.7): when it splits open, everything in it — materials and items — spills as a pile where it stood, picked up by whoever steps on it first, its owner included.
- The Privacy Policy's default text now says chat is kept thirty days for moderation. Migration 039 adds
chat_messages,chat_reportsand the profile's mute columns.
1.7.0 — 2026-10-17
- Sieges. In a Frontier world where players may fight (PvP or PvPvE), what someone else built can be broken: dig mode (1) against their hatch, hab core, bench or other furniture hammers at it — six hits for a hatch, hab core or chest with a tier 2 tool, four for the rest with any hammer or pick — and a wall of theirs is a breach when it comes down. A hatch or furniture is wrecked; a razed hab core frees the room, and lighting your own there captures it (their furniture still opens only for them until it is broken); a chest's lock is smashed and it opens to anyone, its owner included. Shared chests cannot be touched. A Fortifier's (masonry_3) hatches, hab cores and chests need one tool tier more, as their walls already did. Nothing of this applies in PvE worlds, where another's things stay as they were.
- Alerts. The owner hears of it: the HUD shows Under siege: n this week with the list on hover, and the log tells each event once — who, what, which square, how long ago — wherever in the world they are. Siege notes keep a month.
- Admin → Frontier counts breaches, chests sacked, hab cores razed and rooms captured, per world and with the twenty most recent. Three achievements: Breach, Sacked, Usurper (112 in all).
- Built walls now record their builder (older walls without a record are dug as before). Migration 038 adds
sieges.
1.6.0 — 2026-10-17
- A retinue. More than one can walk with you: one place at level 1, two from level 5, three from level 10. Hirelings and a druid's animal share the places; the HUD shows Retinue n/N with everyone's hit points, and Dismiss asks who goes when there is more than one. A hire is refused when the retinue is full or that person is already with you. Everyone in the retinue fights, follows through hatches and squares, is healed by rest, and dies for good as before.
- Escort quests. A giver may hand you a traveller to see through to another person up to two squares away. They take a place in your retinue (the offer says so if you have none free), walk at your side with little health and no weapon, and are paid for by the person they reach — if they arrive alive. The job fails the moment they die, in your turn or the monsters'; abandoning it sends them off alone. Dismiss will not let an escort go.
- Boss hunts. From ring 50 on, a giver's third and last job may be the lair's keeper of that ring (or ring 60's, nearer the centre): slay the boss while you stand in its square, by anyone's hand, and return for four times the credits, three times the experience, and an item. Both kinds are in the admin Quests catalogue with how they are judged.
- Map labels for hirelings show their first name. Migration 037 adds
characters.retinue(jsonb, default[]).
1.5.1 — 2026-10-16
- Set materials down. The sheet's Materials list has Drop 1 and Drop all; what you drop stays as a pile on the floor where you stood, in every world, and comes back up when anyone steps on it (or presses H there) — as much as they can carry, the rest waits. Piles never expire in Frontier worlds; in the public hulk they go with the square's respawn. Stage your stone next to the build site, or hand things to a friend without a chest.
1.5.0 — 2026-10-16
GigaDungeon Frontier, part five: polish. Migration 036 is a marker only.
- Distiller (Alchemy 2) now does what it says: every brew in a Frontier world costs one ichor bloom or marrow moss less, and the sheet shows the reduced cost.
- Admin Frontier tab: every Frontier world with its settlers, squares edited, walls dug, walls, hatches, furniture, claims, chests and things stored; furniture standing by kind; which trades characters take; trade xp and points.
- The seventeen Frontier and hireling sprites are ready for Generate missing on the Sprites tab.
1.4.0 — 2026-10-16
GigaDungeon Frontier, part four: the trades tree. Migration 035 (characters.trades) — run it before deploying.
- Frontier work — digging, building, crafting, smelting, harvesting — earns trade experience; every 10 is a **trade point. Spend them on the sheet's new Trades** section: six branches (Mining, Masonry, Carpentry, Smithing, Alchemy, Husbandry) of three nodes each, in order.
- Effects include one hit fewer per wall, double ore, a pick that bites a tier harder, hammers that wear half as fast, cheaper walls and woodwork, walls others need neutronium to breach, 80-slot chests, double bed healing, +2 Craft at a Frontier bench, three alloy a smelt, longer-lasting tools, richer gathering, plots that ripen two a rest, and hunger and thirst limits half again as long. All Frontier-only; the 3.5 character underneath is untouched.
- Two achievements (109 in all).
1.3.0 — 2026-10-16
GigaDungeon Frontier, part three: tiers. Migration 034 is a marker only.
- Stations. Smelting and alloy or neutronium tools need a fabricator beside you; every potion needs an chem bench. A trader's bench still does everything. Standard worlds are unchanged.
- Alloy. 3 ferrite ore + 1 brimstone → 2 alloy at the fabricator. Alloy pick and the new alloy hammer (300 uses) and the neutronium pick are made from it. The fabricator needs an iron hammer, so: stone → iron → fabricator → alloy → neutronium.
- Repair kits, three a craft at any bench, mend the most worn tool in your pack anywhere (Mend button in the pack).
- Farm plots in a claimed room ripen a ration every rest, up to three; walk into the plot to harvest.
- Two achievements (107 in all); sprite prompt for the hydroponics bed.
1.2.1 — 2026-10-16
- Standing on a tile you dug (or in a doorway you built) no longer sends you back to the arrival room on the next action: the position check on load now consults the square's Frontier edits before deciding a tile is a wall.
1.2.0 — 2026-10-16
GigaDungeon Frontier, part two: claims and furniture. Migration 033 (containers) — run it before deploying.
- Hab core. Build one and the room is yours: nothing spawns there again, and resting there is a camp. One per room.
- Furniture, placed with a hammer: workbench, fabricator and chem bench (craft from beside them), bed (a real sleep; more in a claimed room), floodlight (five tiles of light in the dark), well (clean water, fills waterskins).
- Chests hold 40 things and any materials. Walk into one to open it; stash and take from the Chest panel. In Private Resources a chest is its builder's; a shared chest opens for anyone in the world — how holdings trade.
- Take anything built apart with a hammer for half its materials (empty a chest first).
- Four achievements (105 in all); sprite prompts for the nine pieces.
1.1.2 — 2026-10-16
- Delete a private world. On the world list, the owner of a private world has a Delete button; a dialog spells out what goes (every character in it, theirs and their members', with packs and progress; everything built; the squares' state; jobs; leaderboard entries; any deeper stratum below it) and the world is deleted with its +1 worlds.
DELETE /api/worlds/:id {confirm: <name>}; the public hulk and other people's worlds are refused.
1.1.1 — 2026-10-16
- World creation: the Shared / Private Resources choice is always shown (greyed out unless GigaDungeon Frontier is picked) instead of appearing on a change event, and the choices are in order: game, mode, ownership, difficulty.
- The app shell and
app.jsare now served with the version stamped on their script and module URLs and marked no-cache, so a deploy is picked up on the next page load. Previously a browser could keep the oldapp.jsfor a while after the HTML changed — the likely reason the ownership choice did not appear on 1.1.0.
1.1.0 — 2026-10-16
GigaDungeon Frontier, part one. Migration 032 (worlds.ruleset, worlds.ownership) — run it before deploying. The public hulk is untouched; everything here is behind the Frontier ruleset of a private world.
- World creation now asks which game: GigaDungeon (the roguelike) or GigaDungeon Frontier, then PvE / PvP / PvPvE as before and, for Frontier, Shared Resources or Private Resources.
- Digging. Walls have a hardness by style (marrow 1, decks 2, masonry 3); a pick of that tier takes them down in a few hits for stone, sometimes ore or bone. The edges of a level, the safe rooms and the Gate's chamber are bedrock.
- Building. Stone walls, hatches (monsters cannot pass; in Private Resources only the builder can) and gangways over pits and pools, plus clearing rubble. Walls and hatches block sight.
- Tools that wear. Stone, iron, alloy and neutronium picks; stone and iron hammers. Every use in a Frontier world costs one; at zero the tool breaks and a bench mends it for an ferrite ore. Tools do not wear in standard worlds.
- Frontier settlers start with a stone pick and hammer; seven Frontier recipes appear only in Frontier worlds.
- Keys: 1 dig, 2 build, then a direction. HUD shows the ruleset, ownership and your tools' uses left.
- Admin: the Worlds tab marks Frontier worlds and their ownership; sprite prompts for built walls and hatches.
1.0.0 — 2026-10-16
GigaDungeon 1.0: the public hulk as a complete turn-based roguelike on the 3.5 System Reference Document — a 256 × 256 maze of 128 × 128 levels generated from a seed; eight classes with skills, feats, spells and saving throws; monsters, bosses, Sentinels and the Heart Gate; traders, people and their jobs; gathering, crafting, hunger, thirst, light, and hirelings; private worlds, squads, PvP arenas, leaderboards and achievements; the Hero subscription; an admin console with telemetry, content overrides, sprites, health and editable pages. No code changes from 0.29.0.
Before announcing: fill in the governing-law state (Pages → Terms) and the Open Game License text (Pages → Open Game License), and walk docs/LAUNCH-CHECKLIST.md.
What comes next, as 1.x releases inside this deployment: GigaDungeon Frontier — a ruleset for private worlds with destructible walls, building, tool durability, resource tiers and a trades tree.
0.29.0 — 2026-10-16
Launch hardening, part two. Migration 031 (billing_events.event_created/object_id, subscriptions.past_due_since).
- Load test:
npm run loadtestsimulates up to hundreds of players against the in-memory database, in-process or through the HTTP layer, and reports latency per operation. 100 players: p95 2.5 ms (engine), 70 ms (HTTP) on a single process. The per-address API rate limit was too tight for several players behind one address; raised to 3000/min. - Stripe: late, older webhook events can no longer overwrite newer subscription state; a failed renewal keeps Hero for 7 days from the failure (not a whole extra period), then locks the extra characters until it is paid, and unlocks them the moment it is.
- Server errors older than 90 days are trimmed daily, as the Privacy Policy promises.
docs/RUNBOOK.mdanddocs/LAUNCH-CHECKLIST.md.
0.28.1 — 2026-10-16
- Admin Pages tab: previewing or saving the Updates page failed with "request entity too large" — the whole changelog is bigger than the API's 32 KB body limit. The pages routes now accept up to 1 MB; everything else keeps the small limit.
0.28.0 — 2026-10-16
- Updates page at
/updates.html, linked from the footer: every release and what changed in it, newest first. Its default text is the changelog shipped with the running version, so it keeps itself current; it is also editable from the admin Pages tab like the legal pages (Reset to default picks up new releases after an edit). - The page shell no longer inherits the game's two-column layout at desktop widths (the 0.26 legal pages did).
0.27.0 — 2026-10-16
- Pages tab in the admin console: the Terms of Service, Privacy Policy, Open Game License and About pages are now Markdown you edit in the console — title, the line under it, and the body — with a live preview, Save, and Reset to the shipped text. The live page changes within a minute, no deploy. Fill in the governing-law state and paste the OGL text there. Migration 030 is a marker only.
0.26.0 — 2026-10-16
Launch hardening, part one (the planned 0.26 and 0.27 together). Migration 029 adds server_errors; the app runs without it (errors are then kept in memory only).
- Legal pages. Terms of Service, Privacy Policy and About/credits at
/legal/, with the OGL page, linked from the footer, the sign-up form and the Hero page. The Terms describe the $3.00/month Hero plan, cancellation, locked characters, refunds and price-change notice; the Privacy Policy lists exactly what is stored (email, names, sign-up and last IP, Stripe ids, play telemetry, error logs) and how to delete it. Two things to fill in before launch: the governing-law state in Terms §11 (highlighted), and the full OGL 1.0a text on/license.html. - Deleting an account closes billing: the Stripe subscription is cancelled and the customer deleted before the account goes, whether the player or an admin deletes it.
- Rate limits on every API route, by player or by address, with a 429 and
Retry-Afterover the limit; the Stripe webhook is exempt. Editable on the new admin Health tab without a restart. - Request ids on every API response and in the error message players see ("ref 9e48d65e"), one JSON log line for every failed or slow call, and a server error log (ring + table) with stack traces on the Health tab.
/healthzreports database reachability, Stripe mode/price state, request and error counters and the schema doctor, so an uptime monitor sees something real.
0.25.1 — 2026-10-16
- Maps panel (M): the explanatory lines under the level map and the maze map are gone; the same notes remain as hover titles on the two maps.
0.25.0 — 2026-10-16
Company. Migration 028 is a marker only — nothing new to store.
- Hirelings. Half the safe rooms with someone in them also hold a person for hire: a mercenary, a shield-bearer (+1 AC at your side), an medic (prays over your wounds between fights, three times a rest) or a lamp-bearer (five tiles of light in the dark). Walk up for the pitch, Y to hire — 20 + 5 × ring credits, once. They take the companion's slot, fight with the companion's rules, scale with your level, die for good. Dismiss from the toolbar.
- Camps. Rest in a safe room with someone in it and nothing comes for you. A bedroll (1 gp) halves the odds elsewhere and adds your level in hit points.
- Foul water. A pool is Survival DC 15 to drink clean; otherwise Fortitude or filth fever.
- Four achievements (101 in all). Sprite prompts for the four hirelings.
0.24.1 — 2026-10-16
- Artisan's tools work from the pack; the pack no longer offers to equip them (0.23 did, and then refused), and the item and the refusal both say so.
0.24.0 — 2026-10-16
Survival: hunger, thirst and light. Migration 027 (characters.needs) — run it before deploying. Every existing character is handed three rations, a canteen and three torches the first time they load.
- Hunger and thirst on the SRD's clocks, a turn a minute: a day plus Con hours without water, three days without food, then hourly (or daily) Con checks or 1d6. It never kills outright — it stops at one hit point — but past the limit you are fatigued and rest heals nothing until you eat and drink. "Hungry"/"Thirsty" warn at three-quarters; the HUD shows both and your light.
- Provisions from every trader: trail rations (K to eat), waterskins with four drinks (V), torches; the chandler and deeper traders add hooded lamps, oil, flares and, in the deep, the fusion lamp. Any pool is free water and refills your skins.
- Light in unpowered worlds: nothing lit, you see one tile; a torch five, a lamp or flare seven. O lights or douses. A doused torch keeps its minutes, a lamp its oil, and resting douses the light for you. Standard worlds are lit as before.
- Rest is eight hours of all three clocks.
- Admin: the Quests tab carries a catalogue (the four kinds, pay by ring, and "jobs around a square" — every job the people near any square in any world would hand out); a new Recipes tab lists all 79 recipes and 24 materials with how many players have made each.
- Four achievements (97 in all): Well Provisioned, Firekeeper, Vessel Water, A Light in the Dark.
0.23.0 — 2026-10-15
Crafting. Migration 026 is a settings marker only — no new columns, nothing to backfill.
- Somewhere to work. Every trader's chamber has a bench; artisan's tools (50 gp, traders stock them) are a bench you carry. Without one or the other the sheet says where to find them.
- 79 recipes across five craft skills, listed on the sheet with a skill filter and an "only what I can make now" toggle: Craft (weapons) and Craft (bows) make every weapon in the game, plain (DC 12 simple, 15 martial) and masterwork (DC 20, silver in the alloy or giant sinew in the bow: +1 to hit); Craft (armor) every armour and shield (masterwork lightens the check penalty by one); Craft (alchemy) brews sixteen potions and a bone-dust salve from reagents and monster parts (DC 15 + 5 × spell level); Spellcraft, casters only, enhances a weapon or armour +1 to +5 one step at a time (DC 20–40, 100–2500 gp) and imbues one ability per weapon — flaming, frost, keen, holy (DC 25–30).
- Failure makes nothing; a failure by 5 or more ruins half the materials, as the SRD has it.
- The five craft skills are class skills for every class. Four achievements: Smith, Master smith, Brewer, Enchanter.
- API:
POST /api/game/craft {recipe, item_id?}; the state'scraftblock carries bench/tools, your gear, your craft bonuses and every recipe with what stands in its way.
0.22.0 — 2026-10-15
Resource gathering. Migration 025 (characters.materials) — run it before deploying.
- Nodes in the rooms. Ore veins in marrow, reagent beds in vessels, bone piles in ossuaries, collapsed struts in decks — one in roughly every third room, drawn as a glyph until the Sprites tab makes
tiles/node_*. Walking onto one is the first try (Knowledge for ore, Survival for reagents, Search for bone and salvage; DC 10 + 3 per tier); H tries again. A success takes 1–3 units — iron, silver or neutronium ore, marrow moss, ichor bloom or void lotus, bone, marrow dust or relic weave, struts, scrap plating or cable, richer kinds deeper — and empties the node until the square respawns. Nodes roll on their own random stream, so nothing about the squares you already know has moved. - Monster parts. A Survival check on a kill (DC 10 + CR) takes something by family: hide or fang, chitin, a beast pelt, giant sinew, brimstone, ooze residue, an plasma core, a strange gland, fibrous stalk, undead ash — and a dragon scale. Bosses always leave two or three.
- Carrying. Every material weighs something; the limit is 20 + 4 per point of Strength over 10. Past it you are laden and nothing more fits. The sheet's Materials list shows what you hold with weight and worth, and at a trader each kind has Sell all (value × (50% + Appraise)).
- Five achievements: Gatherer (100 units), Neutronium! and Scaled (hidden), Laden, Collector (twelve kinds). 89 in all.
- Crafting comes next (0.23) and spends all of this.
0.21.0 — 2026-10-15
Quests. Migration 024 (quests table) — run it before deploying.
- Work on offer. The people in the safe rooms hand out jobs, each hashed from the giver and the world and always about the hulk within two squares: clear a named room, open a particular chest (it fails if someone beat you to it), hunt a kind of monster, or carry a package to another person nearby. Talking to someone shows their offer with pay; J (or the badge button) takes it. Three jobs in hand at most; three jobs per giver.
- Progress and pay. Jobs are judged after every action and the log says when one is done. A finished job pays when you talk to the giver again — credits and XP scaled to the ring, an item for clears and hunts — and a delivery pays at the recipient. Each job finished raises your standing with that person.
- Quest log on the character sheet (Work) with progress, giver, pay and a Drop button; target squares are marked
!on the maze map. - Four achievements: Hired Hand, Reliable (ten jobs), Courier (five deliveries), Work in the Deep (hidden, ring 100+). 84 in all.
- Admin → Quests: jobs taken, paid, in hand, failed and dropped; completion rate and median time to finish; by kind, by ring band, the busiest givers, and the last fifty.
- Room names no longer read "a echoing reservoir".
0.20.2 — 2026-10-15
Sprite generation that pays off, and a way to recover what was already paid for. No migration.
- Why "Generate missing" charged you and delivered nothing. When Retro Diffusion's queue is busy it accepts a request as an asynchronous task and answers at once with a task id instead of an image. The server read that as "returned no image", marked the sprite failed and moved on to the next one — twelve requests in three seconds, all charged, all finished a minute later on Retro Diffusion's side, none fetched. The server now recognises a task id, polls the task every five seconds (up to seven minutes), and then fetches the retained image.
- Recover. Retro Diffusion keeps each finished image for a day. A Recover panel on the Sprites tab lists the account's recent finished generations with a preview of each; pick which sprite it is from a list (missing ones first) and Claim puts it in the bucket — no new generation, no new charge. For the batch that went astray that is the gate, the three terrain tiles and the eight people.
GET /api/admin/sprites/recent,/sprites/preview/:id,POST /api/admin/sprites/claim.
0.20.1 — 2026-10-15
Textures back; sprite generation runs in the background. No migration.
- Tile textures were painted over. 0.19's terrain overlay was inserted between the "draw the sprite" line and the "else paint a flat colour" line, so the flat colour landed on top of every floor, wall and corridor texture. Monsters and classes still drew. Fixed; the browser test now checks that a texture survives rendering.
- Generate missing no longer hangs. A batch takes seconds per sprite, longer than a request may stay open behind Hostinger's proxy, so the page used to wait on a connection that had already been cut. The request now starts the batch and returns at once; the Sprites tab polls every three seconds and shows *Generating 7/25: monsters/roper — $1.26 so far*, refreshes the grid as sprites land, and reports the result (and anything that failed) when it ends. You can leave the tab; it carries on. One batch at a time.
GET /api/admin/sprites/job. - The
npcsgroup is listed in the bucket and the Sprites filter. - Self-test gains a sprites step: how many sprites the bucket lists, how many the manifest wants, whether a sprite is publicly readable (a HEAD request to one), and whether generation is enabled.
0.20.0 — 2026-10-15
Shops and people. Migration 023 (characters.social) — run it before deploying.
- Traders with names, trades and memories. Every trader is a named weaponsmith, armorer, alchemist or chandler whose trade leans the weekly stock, with a line of their own at the top of the shop panel. They remember you: 5% off once you have spent 100 credits with them, 10% at 500, 15% at 2,000 — and Haggle (Diplomacy, DC 15 + 2 per tier, once a week per trader) takes a further tenth off until the stock turns over. Prices on the panel are what you pay.
- People in the safe rooms. About one square in six without a trader has a hermit, archivist, pilgrim, surveyor, undertaker, prospector, deserter or relic-seller sitting in its first chamber, drawn with their name. Walk into them or press G. Diplomacy gets them talking (DC 10 + ring/8), Gather Information draws out a second and third rumour, Sense Motive tells true from false — and deserters and relic-sellers do lie, turning directions around. Ten credits buys one rumour from anyone. Rumours are real: the nearest lair and its vault, a Sentinel's bearing, the nearest trader, the make of the hulk one square over, the gate. What you were told is remembered and repeated, never re-rolled.
- Three new skills — Diplomacy, Gather Information, Sense Motive (25 in all) — on the SRD classes that have them.
- Four achievements: Good Company (five people talked to), Silver Tongue (five haggles won), Regular Custom (2,000 credits with one trader), Not Born Yesterday (hidden: see through a liar). 80 in all.
- Arriving in a square names the trader or the person in its first chamber. New action
talk({pay:true}to pay);POST /api/game/haggle;shop.merchant/discount/loyalty/haggleandsquare.npcin the state. - Sprite manifest:
npcs/<role>andtiles/pit|water|rubble, for the admin Sprites tab to generate.
0.19.0 — 2026-10-15
Every skill does something. No migration (skills are ranks in characters.skills; terrain is generated).
- Eleven new skills: Appraise, Use Magic Device, Knowledge (dungeoneering), Climb, Jump, Swim, Tumble, Escape Artist, Concentration, Intimidate, Bluff — 22 in all — and class skill lists now follow the SRD. Nothing already allocated is invalidated.
- The three that were only descriptions now work. Spot: thirteen ambushers (giant and phase spiders, darkmantles, cloakers, ropers, assassin vines, gricks, gelatinous cubes, grey oozes, carrion worms, stirges, shadows, chuuls) start hidden and off the map; Spot reveals one in view, otherwise it springs on whoever walks up to it with a surprise blow. Listen: entering a room, you may hear what waits in rooms nearby; the log gives a direction and a
?marks the room on the map until you see it. Spellcraft: magic found in the hulk is unidentified until a Spellcraft check on pickup or after a rest, or a trader's fee (25 gp + 25 per plus); until then it gives no bonuses and shows as "(unidentified)" with an Identify button at a trader. - Terrain. Marrow have chasms, vessels have pools, decks and ossuaries have rubble, drawn over the floor on the map and the level map. Jump clears a chasm (fall in on a failure; Climb out), Swim crosses water (armor drags), Climb crosses rubble. Terrain lies only on a room's own floor, leaves a way around, and never cuts a room off; monsters never cross it, which makes a pool or a chasm a place to fight from.
- In the fight. Intimidate (I) shakes an adjacent foe; Feint (N) sets up a flat-footed blow; Escape Artist (U) wrenches free of paralysis; Tumble avoids the parting blow on a step away; Concentration is rolled when you cast with a foe at your side — fail and the spell is lost; Use Magic Device lets anyone with ranks try wands and scrolls; Knowledge gates what
looktells you about a monster; Appraise raises what traders pay. - Tiles are now sent one base-36 character each so tile values above 9 fit. Monster view carries
shaken,feinted,known; the state carriessquare.heard. New actionsescape,intimidate,feint;POST /api/game/identify. - Tests: terrain placement and reachability across 400 squares, every new skill mechanic, veiled loot and the trader, Appraise at the counter.
0.18.0 — 2026-10-14
The map is remembered. Migration 022 (explored table) — run it before deploying; without it the game plays as before and simply forgets the map again.
- Explored tiles survive leaving and returning. Until now the fog of war lived only in the browser tab: your position, hit points, gear, the state of every square (what you killed, what you opened) and your discovered hatches were all saved, but what you had seen of each level was not, so coming back meant a dark map around you. Each square's seen-bitmap (2 KB) is now sent to the server a few seconds after it changes, when you leave the square, and when the tab goes to the background; the server merges it with what it already has, and hands it back whenever it sends a square's tiles. Per character, so two characters in the same world each remember their own exploring.
PUT /api/game/explored;square.exploredin the state.
0.17.12 — 2026-10-14
An Achievements tab in the admin console. No migration.
- Achievements tab. Tiles for the catalogue size, how many have been awarded, how many players hold at least one (of all non-guest accounts), the average per player, the most held by one player, and how many have never been earned. Then every achievement with its group, description, hidden flag, how many accounts have it (and what share of players), and who earned it first and most recently with the character they were playing; filter by group or to the never-earned ones, and click a row for the complete list of earners in order. Below: the ten most decorated players and a feed of the last fifty awards.
GET /api/admin/achievements,GET /api/admin/achievements/:key. - The players' side was already there since 0.16 (the profile page shows all 76, hidden ones as ???); this is the operator's view of the same data.
0.17.11 — 2026-10-14
Admin Subscriptions tab loads again. No migration.
- "Could not find a relationship between 'subscriptions' and 'profiles'." The tab asked Supabase to embed each subscription's profile, which only works when a foreign key links the two tables; both point at
auth.usersinstead, so the query had never worked on a real database (the in-memory test database was more forgiving). The list now reads the rows and the profiles separately and joins them in code; search by name, username or email still works.
0.17.10 — 2026-10-13
Ranged attacks read as shots. No migration.
- "You swing at the kobold with your light crossbow" is now "You shoot at the kobold with your light crossbow", and a hit reads Your bolt from your light crossbow strikes the kobold for 7 (arrow for bows, stone for a sling). The attack itself was already resolved as a ranged attack — Dexterity to hit, the weapon's range, the Point Blank / Precise / Rapid Shot feats — only the wording came from the melee path. Blind shots and shots through an incorporeal foe use the same words.
0.17.9 — 2026-10-13
Complimentary Hero from the Players tab. No migration.
- Hero button on every player row. Asks for a number of days,
forever(a hundred years), or 0 to take it away, and grants the Hero plan with no Stripe customer and no charge. It is the same complimentary mechanism the Subscriptions tab has had (Grant Hero days by username, +30 days per row), now reachable where you are looking at the player; that tab's input acceptsforevertoo, and the old ten-year cap is gone.
0.17.8 — 2026-10-13
A live/test switch for Stripe in the admin console. No migration (uses the settings table from 020).
- Two sets of Stripe variables.
STRIPE_TEST_SECRET_KEY,STRIPE_TEST_WEBHOOK_SECRET,STRIPE_TEST_PRICE_MONTHLYandSTRIPE_TEST_PRICE_YEARLYsit beside the liveSTRIPE_*set. The Subscriptions tab gains a Payment gateway panel with Live / Test radios showing what each set has configured; switching takes effect immediately, no restart, and is remembered across restarts. The price and subscription caches are dropped on a switch. - Test mode is safe for players. While test is selected, non-admin players see *Subscriptions are briefly offline for maintenance* and checkout refuses them (test keys decline real cards). Admins see the Become a Hero button regardless of their tier, with a banner saying test mode is on and which card to use.
- One webhook URL for both modes. The signature is checked against whichever secrets are configured, so the test-mode and live-mode endpoints in Stripe can both point at
/api/billing/webhook; every verified event is processed. - Self-test and the Subscriptions note now say which set is in use.
0.17.7 — 2026-10-13
Stripe API version. No migration.
- Checkout works on accounts with Managed Payments. Stripe refused to open Checkout — *Managed Payments is not supported on API version 2024-06-20* — because the server pinned that version on every request. It now pins
2025-03-31.basil, the first version such accounts accept. The server already reads the period end from either the subscription or its items, which is the one change in that version that touches the game, so nothing else moves.
0.17.6 — 2026-10-13
A Stripe step in the admin self-test. No migration.
- Run self-test → stripe reports what the server sees: the key's mode (live/test) and kind (restricted/secret), whether the webhook secret and
APP_URLare set, and for eachSTRIPE_PRICE_*id either the price Stripe returned (livemode, active, amount, interval) or Stripe's error. It fails loudly when a price is missing, archived, not recurring, or from the other mode than the key, and it clears the price cache so the Hero page re-reads straight after you fix a variable. Also checks that the key can read customers. The key itself is never shown. - The Subscriptions tab shows the error instead of staying blank when its data cannot be loaded.
0.17.5 — 2026-10-13
The Hero page says why it has no plan to offer. No migration.
- "You are on the free Salvager plan" with no button happened whenever Stripe could not return the prices — a test-mode
price_…id with a live key, a restricted key without Products read, or a price archived in Stripe — and, worse, the empty answer was cached for an hour, so fixing the variables looked like it had not worked. The page now shows *Plans cannot be offered right now* (admins see Stripe's reason after the dash), the admin Subscriptions tab shows the same, and a failed lookup is retried after thirty seconds instead of an hour. A missingSTRIPE_PRICE_MONTHLYis reported the same way.
0.17.4 — 2026-10-13
Admin account deletion and a full guest purge. No migration.
- Delete account on every non-admin player row (type DELETE to confirm): removes the auth user, so the profile, characters, inventory, subscription row and everything else go with it. Admin accounts must have admin removed first; your own account is deleted from your profile page, not here.
POST /api/admin/delete-account. - Purge all guests next to Purge now: deletes every guest account at once, including trials still in progress (those players are signed out and lose the sample fighter), after a confirmation that says how many. Purge now still honours the chosen delay.
POST /api/admin/guest-purge {run:true, all:true}.
0.17.3 — 2026-10-13
Switching Stripe from test to live no longer strands the accounts that subscribed in test mode. No migration.
- Records from the other Stripe mode reset themselves. When Stripe answers *No such customer/subscription … a similar object exists in test mode*, the server clears that player's Stripe ids (status back to none, complimentary days kept) and tells them: That plan is no longer on file with Stripe … Subscribe again from this page if you want Hero. Checkout checks the stored customer first and starts a fresh one if Stripe no longer knows it, so "Become a Hero" works straight away for those accounts instead of failing on a dead customer id.
- Admin → Subscriptions → Unlink Stripe does the same on demand for any row with a customer id (
POST /api/admin/unlink-stripe).
0.17.2 — 2026-10-13
Billing errors say what happened. No migration.
- Stripe's own message reaches the player. A failed Stripe call used to come back as a generic "Something broke on our side" (it was a 502 and the error handler hid everything above 500). It now reads Stripe said: … with Stripe's wording, so a missing portal, a wrong key or a subscription that no longer exists is obvious at a glance. Admins still get the stack hint on real server errors.
- Cancel repairs an incomplete subscription row. A Hero whose row has the customer but no subscription id (checkout done before 0.16.4, or the
customer.subscription.*webhooks never arrived) can still cancel: the server asks Stripe for the customer's live subscription, stores it, then applies the change. - Manage billing without the portal activated explains that the customer portal must be switched on in the Stripe dashboard and that cancelling still works from the page, instead of failing with a bare error.
0.17.1 — 2026-10-13
Client addresses for abuse control. Migration 021 (profiles.signup_ip/last_ip/last_seen_at, ip_blocks) — run it before deploying; without it nothing is recorded or blocked and the cap is not enforced.
- Addresses recorded. Guest trials and sign-ups store the address they came from; every authenticated request refreshes the last-seen address and time (at most once a minute per account). The admin Players tab shows "from" and "last" addresses on each row; clicking one searches for every account seen from it, and the search box accepts an address.
- Trials per address. A second radio row in the guest panel caps guest trials per IP per day — 1, 2, 3, 5, 10 or no cap (default 3). Over the cap, "Try it now" answers *Too many trials from this address today. Create an account to keep playing.* Sign-ups are not capped.
- Block IP. Each player row has a Block IP button (with an optional reason); a blocked address can start no guest trial and make no sign-up, but accounts that already exist keep working — a shared address should not lock out a household, and the ban button is there for the accounts themselves. The guest panel lists blocked addresses with Unblock.
GET /api/admin/ip/:ipreports the accounts behind an address;POST/DELETE /api/admin/ip-blocks. - Integration test: the cap (third trial refused, sign-up allowed, another address allowed, cap off), block/unblock, the address report, and IPv4-mapped address normalisation.
0.17.0 — 2026-10-13
Guest purge control and plan-locked characters. Migration 020 (settings table) — run it before deploying; without it the purge still runs at the 24-hour default and the admin panel says the setting cannot be saved.
- Guest purge delay (admin). The top of the Players tab has a radio row — 4, 8, 12 or 24 hours — for how long a guest account lingers after its ten-minute trial before the server deletes it (auth user, profile and sample fighter). The purge now runs on a timer (thirty seconds after boot and every fifteen minutes) as well as when a new guest starts, and Purge now runs it on demand. The panel shows guests on the books, how many the next run will remove, and the last run. Guest accounts are flagged in the player list, with "trial over" once their ten minutes are up.
GET/POST /api/admin/guest-purge;src/settings.jsis a small cached key/value store for future runtime settings. - Characters wait for the Hero plan when a subscription lapses. The Salvager limits used to apply only when creating things, so a lapsed Hero could keep playing twelve characters. Now the two oldest unretired characters stay playable and the rest are locked: the profile shows them with a 🔒 Hero plan button instead of Play/Travel, and loading one directly answers with
needs_hero(the client opens the plan page). Nothing is deleted; everything unlocks the moment the account is a Hero again, including through complimentary days.GET /api/charactersand the profile list carrylocked. - Integration test: locked characters on the free plan and the unlock; guest purge delay, counts and a purge against the fake database (which now has
auth.admin.deleteUser).
0.16.4 — 2026-10-13
Two fixes from the first Stripe test run. No migration.
- Duplicate emails are caught before the account is touched. "Keep this character" (guest → account) and sign-up now check whether another account already uses the email and answer *That email already has an account. Sign in with it instead, or use a different email.* Supabase's admin update does no duplicate check of its own, so a clash used to surface as a bare "Error updating user"; if it ever gets that far again, the same message is shown instead of the raw error.
- Cancel from the game. The Hero page shows Cancel my plan (with a confirmation that says exactly what changes) and Resume my plan while a subscription exists; both call the new
POST /api/billing/cancel, which setscancel_at_period_endon the Stripe subscription. Hero lasts to the end of the paid period either way. Manage billing (the Stripe portal, for receipts and card changes) now shows whenever a subscription exists rather than only once a period end was known. - Newer Stripe API versions. Since Stripe API 2025-03,
current_period_endlives on the subscription items, not the subscription; webhooks from an account on a new default version therefore never gave the game a renewal date, which hid "Manage billing" and the "renews on" line. The server reads either shape, andcheckout.session.completednow fetches the subscription itself so the renewal date is known as soon as checkout finishes. - Integration test: the fake DB understands
ilike; new billing block (duplicate email, items-level period end, cancel/resume round-trip through a mocked Stripe).
0.16.3 — 2026-10-13
A difficulty switch for new worlds. Migration 019 (worlds.difficulty, characters.found) — run it before deploying.
- Unpowered worlds. The private-world form has a difficulty next to the mode: Standard (as before: the maze map shows every hatch around you and the Heart Gate is marked from the start) or Unpowered: the maze map shows a hatch only after your character has seen it from inside a square or walked through it, and the Heart Gate is unmarked — and not even drawn — until you have stood where you can see it. Discoveries are kept on the character on the server, so they survive sessions and cannot be peeked at from the client; walking through a hatch finds it on both sides, and what you can see from where you stand is checked on every action and on login. Deeper (+N) hulks inherit the parent's difficulty. The world list and the HUD mark unpowered worlds.
0.16.2 — 2026-10-13
Phones. No migration.
- The direction pad is now an overlay on the map — bottom-right corner, translucent, with the tiles showing through — instead of sitting below the log. On narrow screens the map is a little taller (22 rows) and the camera keeps your character up and to the left of centre, so the pad never covers you. The pad toggle in the action bar still hides it; hold a direction to keep walking as before.
0.16.1 — 2026-10-13
Maps panel. No migration.
- The two maps are stacked instead of side by side, and This level now fills the panel's width — about twice its old size. A Zoom row beneath it (1×, 2×, 4×, 8×; the mouse wheel over the map steps it too) magnifies the level centred on you; the credits frame is still what the main map shows. The zoom is remembered on the device. The Heart Gate shows on the level map as a credits mark. The maze around you is unchanged.
0.16.0 — 2026-10-13
The GigaDungeon has an ending: the Heart Gate. Migration 018 (keys and retirement on characters, deeper worlds, gate passages, achievements, the bump_stats counter function) — run it before deploying.
- The Heart Gate. The centre square — where everyone begins — holds a sealed gate of black alloy with four keyholes, in its first chamber, visible from the first minute. Four Sentinels hold the keys: hardened, named CR-20 bosses at the four edges of the world — an old red dragon at the far north, a pit fiend east, a balor south, a nightwalker west — each in its seat with a vault beside it. Slaying a Sentinel hands its key to everyone standing in the square. With four keys the gate opens for that character; they are 128 rings from it, and the hulk knows what they carry (rests are broken far more often). Stepping through is the win: a gate passage is recorded, the account's legend counts an escape, and the character chooses — retire with honours (sealed, name kept on the legend) or **walk back down** into a deeper stratum.
- Deeper hulks (+1, +2, …). The first character to pass a world's gate creates its +1 world beneath it: generated from the parent's seed, same mode and ownership, named GigaDungeon +1 (and so on), reachable only through the gate — no fresh characters, no Travel. Everything in it is harder: area CR is ×(1 + depth/4) + 2·depth, so a +1 hulk runs from CR 2.3 at the centre to 27 at the rim and its Sentinels have half again the hit points and +1 to everything per depth. Keys are cleared on the way in; find the Sentinels again.
- Achievements. Seventy-six of them, judged on the server from the account's lifetime counters and the facts of each action, so they cannot be faked: descent milestones, bosses and Sentinels, the keys and the gate (and passing it from a +3 hulk), combat feats (Dragonbane, Ghostbreaker, By a Hair, Shrapnel), every class to 5/10/20, every affliction suffered, loot and credits, squads and PvP, and a set of oddities. Twenty-four are hidden until earned. They land as a line in the log the moment they happen and live on the profile in groups with dates.
- Leaderboards: Through the Gate — every finisher in order, with class, level and the depth of the hulk they escaped. Profile: escapes on the legend line, keys and gate state on each character, ✦ Escaped on retired ones.
- Fix: the Perform skill showed an undefined modifier on the sheet (0.15); skills are now derived from the table, so any skill added later is covered.
- Sprites:
tiles/gateis in the manifest (generate it from the Sprites tab); until then the gate draws as a credits Ω.
0.15.0 — 2026-10-13
The deep hulk: the rim is CR 20, every ring from 60 out has a named boss guarding a vault, and the game keeps leaderboards. Migration 017 (boss kills, ring firsts, a bosses counter on the legend; it replaces the add_renown function) — run it before deploying.
- CR curve to 20. Rings 0–64 are exactly as before (CR 1/4 to 5); from there the curve bends up to CR 10 at ring 96 and 20 at the rim. Loot tiers, trader stock, trap DCs and chest credits all follow the area CR as they did.
- 22 new monsters, CR 10–20 (110 in all, 16 families). Clay, stone and iron golems; adult black, green, blue and red dragons and an old red dragon; hezrou, glabrezu, nalfeshnee, marilith and balor; ice devil, horned devil and pit fiend; lich and nightwalker; storm giant; roper, purple worm and a twelve-headed hydra. Two new specials: breath weapons (a cone over everyone within six tiles, Reflex — or Fortitude/Will — for half, then a few turns to recharge: all the adult dragons, the iron golem's poison gas, the ice devil's frost, the lich's wail, the storm giant's lightning) and the balor's death burst (10d6 fire on everyone within three tiles when it dies, Reflex half). The carrion crawler is now the carrion worm (the old name is Product Identity, not OGL).
- Bosses and vaults. From ring 60 outward one square per ring — hashed from the world seed, so it is the same lair for everyone in that world — holds a named boss: a monster from the ring's CR band with double hit points, +2 attack and AC, +2 damage and at least DR 5, with a seeded name like Ysolde, Queen of Ash or Kragmaw the Unburied. It lairs in the room farthest from the entrance, which is otherwise cleared, beside the ring's vault: three chests with 150–300 credits × (1 + CR), a potion and a guaranteed item rolled a tier deeper than the ring. Killing it always drops an item too. A slain boss and its emptied vault stay down for seven days, whoever comes by; everything else in the square respawns on the usual clock. Entering a lair square announces it; the HUD names the lair; the boss is boxed in credits on the map and named in Look.
- Leaderboards. A new Leaderboards page in the account menu: deepest ring, bosses slain, monsters slain and renown across all accounts (top ten, your own row highlighted), and for the world you are in, the first character to reach each ring (10 and out), each lair cleared with who got there first and how many times it has fallen, and the world's boss hunters. Boss kills credit everyone standing in the square; the legend counts them.
- Admin dashboard: total boss kills and the latest five. Sprites: prompts for all 22 new monsters are in the manifest (the Sprites tab generates them with
RETRO_DIFFUSION_KEY). - Fix: an animal companion standing on the far side of its druid now circles round to reach a foe at the druid's side instead of waiting for it to come.
0.14.0 — 2026-10-12
The game has a face and a voice: a full set of Retro Diffusion pixel sprites and synthesised sound. Migration 016 (the sprites storage bucket and its policies) — run it before deploying; then, once the sprite set is in the bucket, run supabase/lock-sprites.sql so only the server can write to it.
- 170 sprites, 32×32, one consistent top-down style (RD Pro
rd_pro__topdown, backgrounds removed): the eleven classes, all 88 monsters, 43 items (every weapon, armor, shield, ring, amulet, cloak, helm, glove, boot and belt, plus potion, scroll, wand and credits), 16 seamless floor/wall/corridor/exit tiles for the four level styles, chest, open chest and trap, and nine effect sprites (hit, miss, fire, cold, lightning, holy, heal, sleep, arrow). They live in the public Supabase bucketsprites/<group>/<key>.png; the whole set was generated and uploaded for this ship. - The renderer draws images. Tiles are drawn from the sheet and tinted by depth (hue and brightness drift with the ring), monsters, players, companions and chests are drawn as sprites, and anything missing from the bucket falls back to the old glyph — a half-finished or custom set is fine.
GET /api/spritestells the client where the bucket is and which files exist. The camera window is 40×25 tiles (24 px at 960 px wide; 32×32 sprites scale cleanly). - Sound.
public/audio.jssynthesises everything with WebAudio — no audio files to host. Hits, misses, kills, being hurt, death, spells by school, hatches, chests, traps, arrows, sleep and level-ups, and a looping ambience that changes with the level style (decks, marrow, ossuaries, vessel). "Sound: on/off" in the account menu; the choice is remembered on the device. - Admin › Sprites. Shows the whole set with what exists in the bucket, and with
RETRO_DIFFUSION_KEYset in hPanel lets an admin generate a missing sprite or redo one ($0.18 each, charged to your RD balance; the key never leaves the server).src/sprites/manifest.jsholds every entry with its prompt, so new monsters or items get art the same way. - Config:
RETRO_DIFFUSION_KEY(optional).
0.13.0 — 2026-10-12
Druid and bard: all eleven SRD base classes are in. Migration 015 (animal companion on the character; the two classes in the class constraint) — run it before deploying.
- Druid (d8, medium BAB, Wisdom casting, prepares). Own spell list to level 5 — entangle, produce flame, shillelagh, barkskin, call lightning, plus the cures, bull's strength, bear's endurance, lesser restoration, neutralize poison, remove disease, flame strike, ice storm, baleful polymorph and stoneskin. Animal companion: a wolf from level 1 (black bear at 4, dire wolf at 7, brown bear at 10, dire bear at 13) that stays at your side, bites anything adjacent that is after you, is targeted by monsters like any squad-mate, and if it falls, another answers your call after a rest. Wild shape from level 5 (1/day, up to 6/day at 18): wolf, black bear, dire wolf, brown bear or dire bear — the beast's Strength, Dexterity, Constitution, natural armor and natural attacks replace your own; armor and weapons are set aside and you cannot cast until you change back. Leather or studded only; no alloy shields.
- Bard (d6, medium BAB, Charisma casting, spontaneous). Learns a few spells per level like a sorcerer from a list that mixes cures with arcane tricks (sleep, shield, false life, haste, dimension hatch, greater invisibility, hold monster, mass cure light, phantasmal killer); a listed "0" in the bard's slot table still earns bonus slots from Charisma, as the SRD says. Inspire courage (needs 3 ranks of Perform — a new skill — and a use per level per day): +1 to attacks and damage for everyone in the square with you (+2 at 8, +3 at 14), ten turns, and it lifts fear.
- Companions appear on the map in green and in the HUD with their hit points; Look names them.
0.12.0 — 2026-10-12
Feats wave two, ranged weapons, weapon and armor special abilities, metamagic. No migration.
- Twenty-five new feats (40 in all). Improved Initiative, Combat Expertise, Mobility, Spring Attack, Whirlwind Attack, Blind-Fight; the Two-Weapon chain (Two-Weapon, Improved, Greater — any class may now fight with a weapon in each hand via the new Off hand button; rangers keep it free); Point Blank Shot, Precise Shot, Rapid Shot, Far Shot; Lightning Reflexes (and Iron Will and Great Fortitude now actually apply); Alertness, Stealthy, Investigator, Nimble Fingers, Self-Sufficient, Track (non-rangers track as well as rangers); Greater Spell Focus, Improved Turning, Extra Turning; and metamagic — Empower, Maximize, Extend. Prerequisites now include Int, a casting class and a turning class.
- Ranged weapons. Sling, shortbow, light and heavy crossbows, longbow (plus handaxe and rapier). The Shoot action (T, or the new bar icon) fires at a foe in range; walking into a foe with a bow fires point-blank; shooting into a melee costs −4 unless you have Precise Shot. Bows add Dexterity to hit and no Strength to damage; the HUD shows the ranged numbers while a bow is in hand.
- Parting blows. A foe you step away from gets one swing at you (the SRD's attack of opportunity). Mobility gives +4 AC against it; Spring Attack avoids it entirely. Shriekers, sleepers and held foes don't get one.
- Weapon and armor special abilities. Flaming, frost and shock (+1d6), keen (threat range doubled), holy (+2d6 against undead, outsiders, goblinoids and aberrations) and bane (+2d6 against one family), on weapons; light fortification (one blow in four halved), shadow and silent moves on armor. They appear on enhanced loot from tier 2 on; enhancements now climb to +3 at tier 3 (CR 6–9) and +4/+5 at the new tier 4 (CR 10+). Names read as the SRD does: "+2 holy longsword", "+1 undead-bane battleaxe".
- Metamagic. Toggle Empowered (×1.5 damage and healing, +2 slot levels), Maximized (every die at maximum, +3) or Extended (double duration, +1) in the spellbook before casting. Wizards and clerics prepare the metamagic version in the higher slot; sorcerers apply it on the fly.
- Removed the placeholder Combat Casting feat (it never did anything; characters who took it keep the slot filled).
0.11.5 — 2026-10-12
Patch: boot hardening. No migration.
/healthzalways answers 200 (the schema state is in the body); a 503 there could make a hosting platform's health probe take the app out of rotation.- The in-memory test database is imported statically instead of through a top-level
await, so the module graph has no asynchronous module at startup.
0.11.4 — 2026-10-12
Patch: the "Something broke on our side" bug. No migration.
- Every action since 0.10.0 failed with
Cannot read properties of null (reading 'length')atgame.js:377. The consumable bookkeeping added in 0.10.0 inserted two promises at the front of the save batch, which shifted the loot result out of its slot; the code then read.lengthon the "nothing consumed" null. Movement, waiting, resting, casting — everything that went through an action — broke. Fixed, and the loot slot is now read defensively. - New
npm run integration: the whole server-side loop (load, state, single and batched moves, rest, prepare, cast, potions, wands, equip, sell, feats, skills, the PvP arena) runs against an in-memory stand-in for Supabase. It fails on exactly this class of bug, and it is now part ofnpm run checkso no build ships without it.
0.11.3 — 2026-10-12
Patch: find the 500. No migration.
- Admins now see the real error inside "Something broke on our side." (message and the first stack frames), so a failing request can be reported verbatim. Players still get the plain message.
- Admin console: Run self-test walks the player code paths as you — schema, profile row, plan, legend, worlds, your characters and each one's full game state — and prints which step fails and why. The server log also tags every 500 with the method and path.
0.11.2 — 2026-10-12
Patch: admin world controls. No migration.
- Worlds tab: Reset (clear every visited square so monsters, chests and traps return; end fights and squads; every character back on their own spawn at full health), Regenerate (reset plus a brand-new maze from a fresh seed, with new spawn squares for everyone), Wipe characters (delete every character in the world; confirmed by typing the world's name) and Delete (private worlds only, typed confirmation; members, invites, characters, squares, squads and logs cascade). The public GigaDungeon can be reset or regenerated but not deleted. The tab also shows each world's mode (editable), owner and visited-square count. Endpoints:
POST /api/admin/world/reset,DELETE /api/admin/world/:id.
0.11.1 — 2026-10-12
Patch: a schema doctor. No migration.
- On boot and every ten minutes the server probes one marker per migration. If the database is behind the code, the server log says exactly which migrations are missing,
/healthzanswers 503 with the list, and the player-facing "Something broke on our side." gains " The database is missing migration 013, 014 — run the migrations SQL from this release." A deploy whose roll-up was not run is now self-explaining instead of a bare 500.
0.11.0 — 2026-10-12
Bestiary wave two and the condition system. No migration.
- Fifty more monsters (88 in all, 15 families). Elementals (air, earth, fire, water, small to huge), oozes (gelatinous cube, gray ooze, ochre jelly, black pudding), plants (shrieker, assassin vine, shambling mound), lycanthropes (wererat, werewolf, werebear), more undead (ghast, allip, vampire spawn, spectre, mohrg, devourer), the young white, green, blue and red dragons, swarms (spiders, rats, centipedes), darkmantle, stirge, cockatrice, medusa, gorgon, cloaker, otyugh, chuul, gibbering mouther, grick, imp, hell hound, bearded devil, vrock, bone devil, frost and cloud giants, dire bear, manticore, phase spider and a five-headed hydra.
- Conditions. Monsters now inflict what the SRD says they do: poison and touch attacks deal ability damage (Str, Dex, Con, Wis…), bites carry disease (filth fever, mummy rot: no natural healing and 1d3 Con lost every rest), undead drain levels (−1 to attacks, saves and skills and −5 hit points per level; as many negative levels as you have levels is death), dragons and cloakers cause fear (−2 attacks and saves), vrocks and mouthers stun, darkmantles blind (sight drops to the adjacent tiles, half your swings miss, −2 AC), and cockatrices, medusas, gorgons and basilisks petrify in two steps: the first failed save stiffens you for 20 turns, a second while stiff turns you to stone. Elementals and hell hounds burn, oozes corrode.
- Monster traits. Swarms take half weapon damage and cannot be sneak-attacked; shadows, allips, wraiths and spectres are incorporeal (half of non-magical blows pass through); grick hide turns 10 points of every blow; trolls, hydras and vampire spawn regenerate; a shrieker wails and wakes everything within 15 tiles; a hydra bites five times. Look (L) now lists each monster's traits.
- Cures. Poison, disease, energy drain and ability damage survive a rest; they are lifted by new cleric spells (lesser restoration at 2, remove disease and remove blindness at 3; neutralize poison and restoration now cure what their names say) or by the healer's care at any trader (25 credits per level, 50 minimum). Death still resets you.
- Afflictions show in red on the HUD with their numbers; the shop lists the healer only when something ails you.
- Engine:
specialon a monster is now a generic schema (paralysis, poison, abil, disease, drain, fear, stun, blind, petrify, burn, acid, swarm, incorporeal, dr, regen, heads, alert, noAttack); wight, shadow, wraith, mummy, basilisk, the young black dragon and the troll gained the specials they were missing.
0.10.0 — 2026-10-12
Spell preparation, the sorcerer, spell levels 4–5, scrolls and wands, natural healing. Migration 014 (prepared spells and spells known on characters; the sorcerer in the class constraint) — run it before deploying.
- Preparation. Wizards and clerics now prepare spells into their slots from the spellbook drawer ("Change" under Prepared spells; takes no time, enemies must be out of sight). Casting spends a prepared copy; rest refreshes them. Anyone who has never prepared gets a sensible automatic fill, so existing characters keep casting. Clerics can turn any prepared spell into a cure of that level or lower on the spot.
- Sorcerer (d4, poor BAB, Charisma casting): the wizard list, more slots, spontaneous casting, but only a handful of spells known — chosen in the spellbook as you level, like feats. Cannot wear armor.
- Spells 4–5. Wizard: stoneskin, ice storm, fire shield, dimension hatch, phantasmal killer, enervation, greater invisibility, cone of cold, hold monster, baleful polymorph, cloudkill — and haste at level 3. Cleric: cure critical, divine power, neutralize poison, restoration, flame strike, slay living, righteous might, mass cure light wounds. New effects behind them: damage reduction and absorption, a retaliatory fire shield, invisibility (half of attacks miss, foes do not see you cast), an extra hasted attack, negative levels on monsters, held monsters, and a polymorph that persists in the square.
- Scrolls, wands and more potions. Potions of every self-target spell of levels 1–3 (anyone may drink), scrolls of every spell up to level 5 and wands up to level 3 (scrolls and wands need a caster with the spell on their list). Loot is 40% consumables now; traders always stock three potions of level 1–2 plus the odd scroll or wand. Drink, Read and Use buttons in the pack.
- Rest heals naturally instead of fully:
level × (2 + Con mod) + Heal rankshit points per rest, every rest still risking a wandering monster. Spells and daily powers come back in full. Cure spells, potions and the Heal skill matter accordingly. - Legend perks Prepared and Learned now apply at character creation (they were defined but not wired in 0.9.0).
- Engine:
resolveActiongainsprepare,learnanduse; the view carries aspellbookblock; monster negative levels, holds and polymorphs persist in square deltas; monsters killed by a fire shield during their own turn are recorded.
0.9.0 — 2026-10-12
Subscriptions, the account-wide legend, world modes, and content editing from the console. Migration 013 (content overrides, subscriptions, renown and perks on profiles, worlds.mode, the add_renown RPC) — run it before deploying.
- Hero subscription (Stripe). No advertising; the Hero plan funds the game. Checkout, the billing portal and webhooks are plain HTTPS calls (no SDK); signatures are verified; events are idempotent. Free Salvager accounts get the public world, squads, invited worlds, two characters and one legend perk; Heroes host private worlds in any mode, carry characters between worlds, hold every perk and keep twelve characters. Gated actions answer
402 needs_heroand the client opens the plan page. New environment variablesSTRIPE_SECRET_KEY,STRIPE_WEBHOOK_SECRET,STRIPE_PRICE_MONTHLY,STRIPE_PRICE_YEARLY,APP_URL; with the key unset, billing is off and every account has Hero entitlements, so nothing changes until you turn it on. Admins always have Hero entitlements. A "Hero plan" page sits in the account menu and on the profile. - Legend. Renown accrues from every XP point any of your characters earns; each legend level (2000·L² renown) grants a permanent perk chosen on the profile page — Hardy, Keen, Lucky, Prepared, Learned, Vigilant, Sturdy, Deathless — that applies to every character you play in every world. Lifetime counters: monsters slain, salvagers bested, deaths, deepest ring.
- Travel. A character can move to another world you belong to from the profile page, keeping sheet, gear and feats; they arrive at that world's entrance and leave their squad behind.
- World modes. The world builder asks PvE / PvP / PvPvE, fixed at creation. PvP worlds spawn no monsters (and none wander in on a rest); in PvP and PvPvE, walking into an salvager outside your squad attacks them under the usual d20 rules, and a kill is worth 50 XP per level and a quarter of their credits. Hostile salvagers are drawn in red; being struck or slain between your own turns shows up in your log.
- Admin: Bestiary and Archetypes tabs. Every monster's name, family, CR, HD, HP, AC, attack, damage, weapon, glyph and undead flag, and every class's name, hit die, skill points, starting abilities and description, can be edited, switched off (out of spawn pools / off the create screen) or reset to the SRD values. Overrides live in
content_overridesand apply in place without a redeploy. - Admin: Subscriptions tab. Active / canceled / complimentary counts, the live prices, a searchable subscriber list, and complimentary Hero days by username. The stats row shows Hero subscribers.
- Engine:
derive()takes legend perks;resolveAction()takespvpandmonstersflags; PvP deaths merge with monster-turn deaths; the smoke test covers the legend curve, perk bonuses, a duel, squad safety and PvE safety.
0.8.0 — 2026-10-12
Four more classes and a bigger bestiary. Migration 012 (class constraint, ranger favored enemy; run before deploying).
- Barbarian (d12, full BAB, greataxe): Rage — +4 Str and Con, +2 Will, −2 AC for 3 + Con-mod turns, then 10 turns of fatigue (−2 Str and Dex). Rages per day grow with level. Temporary hit points from the Con boost come and go with the rage.
- Paladin (d10, full BAB, sword and shield): Smite — one attack adds Charisma to hit and level to damage; Lay on hands — a daily healing pool of Cha-mod × level; Divine grace — Charisma to all saves from level 2; a short divine spell list (bless, cure light/moderate, shield of faith, bull's strength) and turning from level 4.
- Ranger (d8, full BAB, two swords): fights with both weapons (off-hand at −2 with a light weapon); chooses a favored enemy family once, for +2 damage rising with level; Track reads nearby rooms. Survival is a new skill; anyone with ranks can Track at a harder DC.
- Monk (d8, medium BAB, no kit): unarmed strikes 1d6 → 2d10 with level; flurry of blows adds a second strike; Wisdom and level add to AC when unarmored; good saves all round; evasion from level 2.
- Bestiary: 38 monsters, up from 19, each tagged with a family (humanoid, goblinoid, undead, giant, animal, vermin, magical beast, monstrous, aberration, dragon). New: dire rat, wolf, worg, dire wolf, black and brown bear, giant spider, giant scorpion, carrion crawler, lizardfolk, troglodyte, shadow, wraith, mummy, gargoyle, basilisk, chimera, young black dragon, ogre mage.
- Action bar icons for rage, smite, lay on hands, track and favored enemy; a themed picker for the favored family; the HUD shows extra attacks.
- Fixed the real stutter. The action route was not forwarding
steps, so every multi-step move since 0.7.0 reached the server as a single wait: the client drew three steps, the server moved none, and the reconcile snapped the @ back. Steps are forwarded now and verified end to end. ROADMAP.md: the shipment plan from here to 1.0, with what the SRD still offers.
0.7.3 — 2026-10-12
Stutter, round two. Three real causes, all fixed; no migration.
- Lock contention with yourself. The square lock was released fire-and-forget after each reply, so the next keystroke often arrived while the previous request's lock was still on the books and slept 100 ms per retry. The lock holder is now the character itself, which re-acquires its own lock instantly; other characters are still kept out.
- Batches that stopped after one step. The multi-step walk treated "a monster within nine tiles" as an event, and with up to a hundred monsters per level that was nearly every step. It now stops only when the set of monsters in actual line of sight changes, an aware monster is within two tiles, you enter a room, or the rules write a real log line.
- Prediction that switched itself off. The client refused to predict a step whenever any aware monster was visible — including one fleeing or lagging eight tiles behind — so after the first fight every step waited a full round-trip. It now predicts unless an aware monster is within two tiles, and the predicted step recomputes line of sight locally, so the lit area moves with the @ instead of lagging behind it. Queued keys are dropped only for things that matter (square change, encounter, combat/loot/room lines, an adjacent aware monster).
- The direction-pad toggle no longer logs "Unknown action", and every browser confirm/alert (sell, delete character, delete account, errors) is replaced by a themed dialog with Enter/Esc.
0.7.2 — 2026-10-12
- Touch direction pad: a 3 × 3 pad (eight directions plus wait) sits beneath the chat bar on the right. It appears automatically on touch devices (coarse pointer, no hover, or touch points), can be toggled anywhere from a new bar icon, and remembers the choice. Hold a direction to keep walking (one step every 180 ms through the same queue as the keyboard). Each press is a move; nothing changes about the rules.
- Phone layout: the camera shows 24 × 18 tiles instead of 48 × 30 so tiles stay legible; the header hides the location line and shortens the trial pill; the HUD is two columns; drawers are full-width; the keyboard hint is hidden on touch devices.
- The character sheet nudges open once per session when a feat is waiting, not on every move.
0.7.1 — 2026-10-11
- Fixed the snap-back when pressing a direction several times. A reply from an earlier request was replacing the whole view, including steps that had been drawn but not yet sent. Replies are now reconciled: the server's confirmed position is taken, then the steps still waiting in the queue are redrawn on top of it. If the reply carried an event (a monster, a hatch, a room, anything non-trivial), the queued steps are discarded instead, since they were typed for a picture that no longer holds. Verified with a browser test: four quick presses with a 400 ms server now trace 31 → 30 → 29 → 28 → 27 with no reversal.
0.7.0 — 2026-10-11
Faster movement. No migration.
- Server: an action used to make eight to ten database round-trips in a row (character, world, inventory, feats, squad, lock, square state, party, save, save). Now the world (60 s) and the character's inventory and feats (30 s, invalidated on any change) are cached in memory, generated squares are cached before the overlay, the lock is acquired in parallel with the square loads (the version check on save still catches a stale read), and the saves run in parallel. The serial chain is about three round-trips.
- Multi-step moves:
POST /api/game/actionwithaction: "move", steps: [{dx,dy}, …](up to 12) walks several tiles in one request and stops at the first event — a monster noticed, a hatch, a chest, a trap, a new room, anything that writes a non-system log line. Not used during encounters. - Client: keys are no longer dropped while a request is in flight; they queue (up to 8) and go out as one multi-step request. Plain floor steps are drawn immediately, before the server answers, and the server's reply replaces the guess. Nothing is predicted next to monsters, exits, chests, traps or other players.
- Tip for the biggest remaining factor: put the Supabase project in the same region as the Hostinger server. Every round-trip is a network hop between them; same-region is ~5 ms, cross-continent ~100 ms.
0.6.1 — 2026-10-11
- A first visit opens straight into the trial: no sign-in screen, no button. The page shows a one-line splash while the fighter is rolled up, then the hulk. The sign-in screen is reachable from the guest's account menu ("Sign in to an existing account"), from the upgrade dialog ("I already have an account"), or at
/#signin; a browser that has already had a trial lands on the sign-in screen, which still offers the Try it button. - Fixed two client errors introduced in 0.6.0 (a missing button handler and a drawer variable used before it was declared) that could leave the page on the splash.
0.6.0 — 2026-10-11
Try it now. Migration 011 (guest columns; run before deploying). Supabase: turn on Authentication → Sign In / Providers → Allow anonymous sign-ins, or the button answers "Guest play is not enabled on this server yet."
- A Try it now — ten minutes, no account button on the sign-in screen. One click creates an anonymous Supabase user, a guest profile (
Guest XXXXXX,@guest_xxxxxx) and a ready-made character in the public world: a level-3 fighter with a +1 longsword, chain shirt, heavy shield, ring of protection, five potions, 120 credits, Weapon Focus, Power Attack and Toughness. The visitor lands in the hulk straight away. - A trial clock in the header counts down ten minutes (red for the last two). When it reaches zero the server refuses further play (
403, codetrial_over) and the client shows the upgrade dialog, which cannot be dismissed. A Keep this character button beside the clock, and an entry in the account menu, open the same dialog early. - Upgrading keeps the character.
POST /api/auth/upgradeturns the anonymous user into a real account (email, password, username, profile name) with the service role, flips the profile out of guest mode, and renames "Sample Salvager" to the new profile name. Nothing is copied or lost. - Guests cannot create worlds or squads or change profile names. Guests whose trial ended more than a day ago are deleted (20 per new trial), which cascades their character and inventory.
0.5.1 — 2026-10-11
- Admins can take staff names (DM, DungeonMaster…) for their own account: the reserved-name check is skipped for admins editing their own profile, so the super admin's names save. Uniqueness still applies. A failed save on the profile page now also raises an alert, not only the small note beside the button.
- "Delete this character" in the account menu rendered red-on-red; it is red text on the menu background again.
- Admin console has the same header (account pill with Back to the hulk, Profile, Sign out) and footer as the game, signs in by username / profile name / email, and the game's account menu shows an Admin console entry only for admins (the path comes from the profile API, so it is never sent to non-admins).
0.5.0 — 2026-10-11
Reserved and blocked names. Migration 010 (creates and seeds reserved_names; run before deploying).
- Usernames and profile names are checked against
reserved_namesat sign-up and on every change. Matching folds case, separators and leetspeak, soD-M,d_mandDungeonMa5terall hitdungeonmaster. Rules are exact / prefix / contains, scoped to usernames, profile names or both, with an optional owner: the one account allowed to use the name. - Seeded with staff and system impersonation terms (DM, DungeonMaster, GM, admin, moderator, support, official, system, root, bot, GigaDungeon…) and a starter set of hate, sexual-violence, child-safety, harassment and profanity terms. Ethnic and other slurs are deliberately not shipped as a word list; add your community's set from the console, where it lives as data rather than in the code.
- Admin console → Names tab: list, add/update, remove rules; a tester that shows how a name normalises and whether it is blocked; an audit of existing accounts whose names match a rule, with a one-click "make owner" for the legitimate holder (use it on the site DM's account for
dmanddungeonmaster). - Existing accounts are never renamed automatically; a reserved name already in use stays until the holder changes it or an admin acts.
0.4.0 — 2026-10-11
World is 256 × 256. Migration 009 — resets every world's explored state; run it before deploying.
- The maze is 256 × 256 squares (65,536 levels of 128 × 128 tiles: 2^30 tiles, 32,768 on a side), centre at (128, 128). Coordinates 0–255 fit a byte and every dimension is a power of two.
- Because the maze is generated from the centre, every existing world's layout changes. Migration 009 truncates
square_deltasandsquare_locks(monsters, chests, traps, encounters). Characters keep levels, gear, credits and squads; anyone whose tile is now inside a wall is moved to the arrival room of their square on next load, and the server now does that check on every load as a general safety net. - Difficulty curve unchanged in shape: CR ¼ at the centre rising to about 10 at the edge.
0.3.0 — 2026-10-11
Accounts. Migration 008 (usernames; run it before deploying).
- Sign in with a username, profile name or email plus password. The lookup and password check happen on the server (
POST /api/auth/login), so the browser never learns which email a name belongs to; only session tokens come back. Sign-up asks for email, username (lowercase handle, unique), profile name (unique, case-insensitive) and password, with live availability checks. "Forgot password" works from any identifier and always answers the same way; the reset link lands on the sign-in screen's new-password form. - Profile page replaces the modal: profile name and username, email change (confirmation links), password change, every character across every world with Play and Delete, account stats (characters, total XP, deepest ring), and a delete-account section that requires the username typed back. Accounts created before 0.3.0 are asked for a username and profile name on their next sign-in.
- Header pill shows the profile name only (the menu shows @username).
- Character names are required (2–24 characters) and may repeat freely across the hulk.
- Keys: WASD moves again (search had collided with S); search is now F, Tab opens the character sheet.
- Admin: player search matches name, username or email; list shows both names.
0.2.1 — 2026-10-11
- Migrations are now idempotent end to end: every
create policyis preceded bydrop policy if exists, so the rolled-upmigrations-<version>.sqlcan be re-run on a project that already has earlier migrations applied (the 0.2.0 roll-up failed withpolicy "own profile" already existson such a project). This is the one exception to "never edit a shipped migration": the change is mechanical and does not alter any schema.
0.2.0 — 2026-10-11
Interface rework for desktop play.
- Header with an account pill (top right): avatar, display name, dropdown with Enter the hulk, Create a character, Delete this character, Change world, Profile, Sign out. Profile modal sets a display name (
profiles.display_name, migration 007) and can change the password. Footer with version and licence link. - Directional pad removed; movement is keyboard only (arrows / WASD / QEZC).
- Action bar under the map with SVG icons and hover tooltips: potion (with count), look, search, wait, rest, and contextual icons for open lock, disarm trap, turn undead (with attempts left), follow leader; panel toggles for character sheet (badge when a feat or skill points are pending), spellbook, squad (member count), trader (when one is present) and maps. Keys: P L S Space R, B spellbook, M maps, Tab sheet, Esc closes.
- Panels open in a right-hand drawer, one at a time, instead of stacking in the sidebar. Squad is a drawer, not a permanent section. Spells are an icon grid; hover for the description, click to cast (auto-targets a lone foe).
DELETE /api/characters/:id,GET/PUT /api/profile./license.htmlcarries the OGL Section 15 notice with a placeholder for the full licence text.
0.1.1 — 2026-10-11
- Admin console moved out of
public/into its own directory, served at/<ADMIN_PATH>/(default/admin/). SetADMIN_PATHto something unguessable in production. Never indexed (robots.txt+X-Robots-Tag). - Optional hardening in front of the console and
/api/admin:ADMIN_GATE=user:passwordadds an HTTP basic-auth prompt before the Supabase sign-in;ADMIN_IP_ALLOWLISTrestricts who can load it at all (404 to everyone else). Both are on top of the existing Supabase JWT +is_admincheck, which remains the real authorisation. - Each ship now includes
migrations-<version>.sql, every migration rolled up for a fresh Supabase project.
0.1.0 — 2026-10-11
First deployable build.
- 255 × 255 maze of 128 × 128 levels in four styles (decks, marrow, ossuaries, vessel), three hatches per shared wall, all regenerated from
WORLD_SEED_SECRET + world.seed; only player changes are stored. - D&D 3.5 SRD rules: fighter, rogue, cleric, wizard; 19 monsters; 30 items with 3.5 body slots plus an ear slot; 15 feats as a prerequisite tree; 9 skills; 21 spells (levels 0–3); saves; traps, locks, stealth, sneak attack, turning, rest.
- Co-op: shared squares, party-targeted monsters, split XP, encounter mode with initiative and 30 s turns, per-square lease lock, Supabase Realtime presence and chat.
- Squads of up to four with a shared spawn, follow-the-leader through hatches, squad chat; public-world arrivals spawn in a random inner square.
- Respawn after six idle hours (chests after two days), traders in one square in five, admin console at
/admin.html. - Express on Hostinger managed Node; all configuration from environment variables; Supabase migrations 001–006.