Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
Find skill gems, shape your build, and explore a dangerous frontier in Hollow Wake, a free action RPG in development. Play solo, online, or in couch co-op.
GamesTypeScript · JavaScriptGitHub @arianna-arpgOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
A top-down action RPG where every system is open, modular data. TypeScript, Canvas 2D, Electron.
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
A top-down action RPG where every system is open, modular data.
Skills, monsters, statuses, passives, items and zones are plain data entries composed by one shared engine. The player, monsters and minions all act through a single skill pipeline, so a fireball behaves the same whether a sorcerer casts it, a monster breathes it, or your summon throws it. Classes are starting points, not cages.
Built in TypeScript and Vite on an HTML5 Canvas 2D renderer, wrapped in an Electron desktop shell. It runs on Windows, Linux and Steam Deck, and in the browser.Read the full README ↗Current development focus: the offline seamless world. Read CURRENT.md for the vision, playable path, main/seamless roles, unfinished work and deferred shard/MMORPG scope. The game references there are inspiration, not generation rules.
Skills, monsters, statuses, passives, items and zones are plain data entries composed by one shared engine. The player, monsters and minions all act through a single skill pipeline, so a fireball behaves the same whether a sorcerer casts it, a monster breathes it, or your summon throws it. Classes are starting points, not cages.
Built in TypeScript and Vite on an HTML5 Canvas 2D renderer, wrapped in an Electron desktop shell. It runs on Windows, Linux and Steam Deck, and in the browser.
Status: a playable prototype in active development. Deep, working systems under deliberately placeholder geometry art. No audio yet. Saves can be reset between versions.
The numbers above are live. They are read from the same data the game ships, so they are never out of date and nobody maintains them by hand.
main. Saves stay in that browser's local storage..AppImage from the same page, chmod +x it and run. STEAM.md has the one-line Deck installer and the controller notes.The desktop launcher checks for a new stable release on start and can update itself in place. Nightly release candidates are published as pre-releases on the Releases page for anyone who wants the newest build; installed stable copies never see them.
Play with keyboard and mouse or any controller (Xbox, DualSense, Steam Deck). Every binding can be changed in Options.
Requires Node.js and npm.
npm install
npm run dev # browser dev mode at http://localhost:5173
npm run game # the desktop app: the launcher, then the game in its own window
npm run build # type-check + production build to dist/
On Windows, Play Game.bat (browser) and Launch Game.bat (desktop app) do the same and run npm install for you the first time. The launcher opens as a plain game launcher. Tick Developer mode on its page for DevTools, the in-game dev panel and hot reload straight from src/.
There is no unit-test runner. Changes are gated by the type-check plus headless harnesses that boot the engine itself: regression probes, smoke boots, a seeded balance sim, generation QA and a frame-time sweep. CI runs the type-check and the probe gate on every push, and the nightly job runs the full lane before it cuts a release candidate. The commands and their contracts are in CLAUDE.md.
Skills are loot. Your build is the skills you find and the supports you socket into them, not a menu unlocked by character level. Character levels feed the passive tree instead.
One pipeline for everyone. The player, monsters and minions all resolve their actions through World.useSkill(). A summoner's skeletons run on the same skills monsters do.
One modifier engine. Every number flows through one layered, tag-scoped formula (flat → increased → more → override), implemented once and shared by every system. Content composes behavior out of tags and modifiers instead of new engine code.
Data in, no engine changes. Adding a skill, support, monster, passive, item, biome or class means adding an entry under src/data/. The engine already knows how to run it.
This page stays short on purpose. The project moves fast, and each kind of detail has one maintained home:
| If you want | Go to |
|---|---|
| What is in the game right now: every skill, support, monster, class, unique and biome | The Database, regenerated from src/data/ on every push |
| The passive tree | The tree viewer |
| How the systems feel from the player's side | The website and its Systems page |
| Current vision, active/deferred work, branch roles and seamless playtest | CURRENT.md |
| The repository map, every command, the verification gates and the working conventions | CLAUDE.md, maintained continuously. AGENTS.md points there too |
| One system in depth | docs/, one contract per system, grouped by area |
| Packaging, releases, Steam Deck and controller layout | STEAM.md |
| What changed between versions | Releases and docs/releases/ |
The short map: the engine lives in src/engine/, all content in src/data/, the renderer in src/render/, the desktop shell in launcher/, the website in site/ and the headless harnesses in balance/.
Hollow Wake is a prototype. The systems are broad and working, and the presentation is deliberately minimal for now:
PolyForm Noncommercial 1.0.0. Read it, run it, mod it, fork it and share it for any noncommercial purpose. Commercial use needs the author's permission first. The name and the insignia stay with the project.
Made by Arianna.