No audio filesEvery sound is synthesised
The seal's ding, the rune chimes, the rank-up harp, the curse box's three sagging notes — all oscillators through the Web Audio API, sharing one generated hall reverb. Nothing is downloaded, because there is nothing to download.
NetworkThree requests, all optional
The file fetches its typefaces, one 18 KB relic image, and — once a hall is open — the sync calls. Fonts load through a media="print" stylesheet that swaps to all on load, because a hung font request once froze the game on a blank screen. The image falls back to an emoji. The sync never blocks a tap; offline, the phone plays from its own save.
Playable without a mouseKeyboard paths and reduced motion
The seal arms on Enter and confirms on Enter. Confetti, the level-up pop and the rune twinkle all step aside for prefers-reduced-motion. Progress survives a closed tab.
Installs like an appA manifest and three icons
Open it on a phone, add it to the home screen, and it runs standalone with its own icon and splash colour. No store, no account, no build step — it deploys the moment it merges: the static file, plus one tiny serverless function for the weekly keep-alive.
TestingChecked by playing it
A quick tap must not seal; a held press must. Four sealed dailies summon the merchant; a fifth sweep day makes him bow; a second hero gets their own knock. Each is run in a browser at phone width before a merge. The hall online was tried on two origins against the live database — open, join, seal on each, remove, custom quest, leave, rejoin, wrong code, reset.
Two halls, one databaseA second household runs the same file
A second family plays a clone with its own chore list: the same HTML with only the seed block swapped, its own deploy, and saves that never mix. Both halls live in one database, keyed by their codes. Every game change is ported by hand — copy the file, swap the seed back — which is the honest cost of keeping it to one file.
What it doesn't do yetReferee one hero on two phones
Every phone keeps playing from its own save and syncs after each seal, so it works offline and the hall never blocks a tap. The trade is that the same hero playing on two phones at once resolves as newest-save-wins. Run one hero per phone and it never comes up.