A playable, desktop-first, 12-minute browser prototype. You control The Hollow, a procedural creature that inherits the powers of demons it consumes. The world is the upgrade system: move to a habitat, hunt its demons, collect their essence. There are no level-up choices or permanent progression.
Requires Node.js 20 or newer. There are no dependencies to install.
npm startOpen http://localhost:5173 and select Awaken the Hollow. The server only serves static files on localhost. Gameplay runs entirely in the browser.
| Control | Action |
|---|---|
| WASD / arrow keys | Move; diagonal speed is normalized |
| Automatic | Lashes target nearby demons; a periodic pulse creates breathing room |
| Walk over essence | Consume it and automatically inherit threshold traits |
| Click minimap | Mark a hunting ground; a direction and distance appear |
| B / Demon codex | Pause to inspect all 11 types, 66 forms, and 33 inherited powers; mark a hunting ground |
| Inheritance arrows | Browse the three pages of bloodline progress |
| Esc | Pause / resume |
| M | Toggle synthesized sound |
| Enter / Space | Start, resume, or restart when the run is stopped |
Losing focus automatically pauses. There are no saves. Restart begins a fresh run.
The 6,200 × 6,200 world scrolls seamlessly. Broken paths connect the central Fallen Court to eleven habitats. Terrain provides cover and movement obstacles; tree canopies fade near The Hollow. The minimap shows habitats, the camera, your marker, and approaching elites. A spawn's location determines its demon population, so borders naturally mix. Inside a habitat, roughly 90% of rolls select its bloodline.
| Demon / role / artwork | Enemy ability | Hunting ground | Inherited powers at 5 → 15 → 30 essence |
|---|---|---|---|
| Boof Nitza · Melee · 1–6 | Quick repeated melee strikes | The Ashen March | Heavy hands → Double strike → Relentless |
| Gon G'ah · Sniper · 7–12 | Retreats and aims a dodgeable line shot | Hollow Watch | Soul snipe → Piercing soul → Deadeye |
| Ma'Zga · Poison · 13–18 | Pools apply lingering, stacking venom | The Venom Mire | Venom → Contagion → Miasma |
| Tor Tza · Fire / area damage · 19–24 | Marks an area before an eruption | Cinder Wastes | Ember touch → Wildfire → Pyre bloom |
| Vi'Zel · Bruiser · 25–30 | Armored hide and committed charge | The Ossuary | Steadfast → Brace → Bulwark |
| Goh Loomb · Assassin · 31–36 | Locked dash, bonus damage against wounded prey | Wraithwood | Fell stride → Frenzy → Death wish |
| Baobaw · Striker · 37–42 | A wide claw sweep with a fixed aim | The Claw Scar | Reaping arc → Follow through → Rending wave |
| Ko Pak · Counter tank · 43–48 | Direct hits trigger delayed thorns; no proactive attack | Briar Hollow | Ironbark → Spite → Dread shell |
| Chu Perk · Juggernaut · 49–54 | A slow ground slam with heavy knockback | The Spore Basin | Crushing blow → Concussion → Cataclysm |
| Ba Be'aga · Healer · 55–60 | Retreats and heals the ally missing the most HP; no attack | Pale Sanctuary | Mending → Siphon → Soul feast |
| Vee Scol · Chaotic · 61–66 | Scattered rifts with random damage rolls | The Violet Fracture | Chaos bolt → Unstable arc → Aftershock |
Roles and targeting are adapted from the main game's public/api/data/demon-types.json:
Goh Loomb is the assassin, Baobaw the cleaving striker, Vi'Zel the bruiser, and
Ko Pak the retaliating tank. Its turn-based abilities become readable real-time
attacks here; Boof Nitza and Vi'Zel's basic attacks get distinct tempo and armor
identities. The Hollow's three-step inheritance chains are prototype adaptations.
Further hunting gives smaller, capped stat gains. Hover a bloodline row for all three trait descriptions. The HUD pages through four bloodlines at a time and shows every inherited trait. The codex includes enemy abilities, trait descriptions, six rarity sprites per species, and a button to mark each habitat. Closing it restores the previous playing or paused state. Shields and venom appear under vitality.
Demons leave one essence pickup. Advanced demons provide two family essence; elites provide eight. Demons consumed counts creatures, while the eleven bloodline meters count essence. Pickups remain in the world until consumed.
Threat rises from consumption, unlocked traits, and elite kills. Thresholds at 14%, 30%, 50%, 75%, and 100% introduce successive artwork stages and higher spawn rates. Every rarity has its species ability; evolved forms gain durability, damage, speed, and stronger area coverage where applicable. Elites retain their species behavior, including ranged and support tactics. Shots lock their aim; sweeps mark an arc; ground attacks display a warning and countdown ring. Poison and burn bypass Ko Pak's reprisal and Vi'Zel's direct-hit armor. Chaos aftershocks deal their own damage without applying venom.
Survive 12 minutes to complete the awakening. Death or completion offers a restart.
npm run build
npm test
node scripts/playtest.mjs mixed 720dist/ contains a self-contained static build and all 66 required existing
WebP sprites. Serve it with node scripts/serve.mjs --dist, or place it on any
static host. No external fonts, asset services, backend, database, or authentication
are used. The original artwork remains unchanged.
tests/browser.html is a development-only browser harness, excluded from the build.
It checks the real start/input/pause/audio/map interface and desktop layouts. Its
separate synthetic stress scene loads all six forms and eleven bloodlines with up to
260 demons. Only that explicitly labeled stress scene uses invulnerability.
The ordinary game and headless pilot never do.
For optional automated browser QA, install Playwright and run
node scripts/browser-check.mjs (Microsoft Edge), or pass the absolute path to
a bundled Playwright index.mjs. Start the local server and build first. Results
and screenshots go to docs/verification/.
The deterministic pilot in scripts/playtest.mjs seeks essence and steers around
danger with regular movement inputs. It helps catch pacing and stability problems;
it does not substitute for human fun and difficulty feedback.
src/config.js: families, approved sprite IDs, thresholds, regions, shared constants.src/world.js: region lookup, deterministic terrain, and collision.src/engine.js: browser-independent combat, spawning, essence, traits, and Threat.src/renderer.js: procedural world and Hollow, existing demon sprites, effects, minimap.src/main.js: keyboard input, HUD, start/restart/pause, and read-only run diagnostics.src/audio.js: small synthesized combat and progression cues.scripts/: dependency-free static server, build, and deterministic playtest pilot.
window.hollow.snapshot() exposes read-only run diagnostics. Where supported, the
page also registers the read-only read_hollow_run WebMCP tool. Neither interface
grants powers or changes gameplay.
Out of scope: inventories, quests, dialogue, crafting, shops, multiplayer, saves, accounts, and any permanent progression.