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
Command a single nation through World War II on a strategic global map
Translation pending
AI summary · website content
GamesTypeScript · JavaScriptGitHub @ZoandeOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Hey! Ironfronts is an authoritative multiplayer grand-strategy prototype with a native WebGPU world renderer. It combines a persistent server simulation, account/country-seat flow, fog-filtered real-time replication, directional combat, and a deterministic offline compiler for a 3,303-province world.Read the full README ↗Hey! Ironfronts is an authoritative multiplayer grand-strategy prototype with a native WebGPU world renderer. It combines a persistent server simulation, account/country-seat flow, fog-filtered real-time replication, directional combat, and a deterministic offline compiler for a 3,303-province world.
The repository is an npm-workspace monorepo:
| Component | Role |
|---|---|
apps/client + src/client, src/ui, src/renderer* | Browser login/menu, authoritative replica, HUD, audio, WebGPU presentation |
apps/auth-server | Accounts, sessions, public lobby facade, gameplay-ticket issuance |
apps/game-server | Country seats, commands, simulation, fog projections, game persistence |
packages/protocol | Shared v3 gameplay schemas/types and ticket signing |
packages/game-core + src/game | Browser-free authoritative rules and plain game state |
scripts/world, scripts/infrastructure | Offline world compiler |
material | Immutable source geometry/topology/movement/metadata |
Default local ports are client 5173, auth 3001, and game 3002. The browser authenticates with the auth service, claims a country, receives a 30-second game ticket, then connects directly to the authoritative gameplay WebSocket. The game server sends only that country's filtered projection.
Read Repository architecture for the complete ownership/data flow.
The auth server uses Node's built-in SQLite API. There is no WebGL renderer fallback.
Install dependencies:
npm install
Review .env.example. Vite reads VITE_* values from its environment/files; the Node services read process.env and need variables exported by your shell/process manager when overriding defaults.
Start the complete local stack from the repository root:
npm run dev:all
This runs the world build/game watcher, auth watcher, and Vite client together. Press Ctrl+C once to stop all three. To run them separately instead:
npm run build:world
npm run game:dev
npm run auth:dev
npm run dev
Then open:
http://127.0.0.1:5173/login.html
Create an account, choose an unclaimed living country, and begin the operation.
Local defaults use insecure development secrets. When NODE_ENV=production, both services refuse to start until TICKET_SECRET and INTERNAL_SERVICE_SECRET are changed.
| Path | Contents |
|---|---|
data/auth.sqlite* | Accounts, password hashes, browser sessions |
data/game.json | Authoritative simulation and permanent account-country seats |
public/world | Generated world package used by client and server |
artifacts | Road cache and QA reports/screenshots |
These paths are gitignored. Game saves use serialized atomic JSON replacement; auth uses strict SQLite tables in WAL mode. The world compiler promotes through a staging directory and restores the previous package if promotion is interrupted.
Deleting the game save resets the world and country assignments. Deleting auth SQLite resets accounts/sessions. Back up before doing either.
| Command | Purpose |
|---|---|
npm run dev:all | Start the client, auth server, and game server together |
npm run dev | Start Vite client |
npm run game:dev | Watch authoritative game server |
npm run auth:dev | Watch auth server |
npm run reset:data | Confirm, then erase all local accounts and game runtime data |
npm run build:world | Generate public/world |
npm run build | Generate world, check workspaces/root TypeScript, build production client |
npm run check | Workspace/root checks, script lint, architecture test, full Vitest suite |
npm test | Generate world and run Vitest |
npm run visual-check | Playwright renderer captures/report |
npm run performance-check | Playwright renderer benchmark/report |
See Development and QA for environment details, focused checks, debug mode, output paths, and the current QA authentication-harness limitation.
| Input | Action |
|---|---|
| Left drag | Orbit and tilt |
| Middle drag | Pan |
| One-finger drag | Pan |
| Right click | Issue the selected army's order (never moves the camera) |
| Wheel / ctrl+wheel / pinch | Cursor-centered zoom |
| Two-finger trackpad swipe | Pan (auto-detected) |
| WASD or arrow keys | Pan relative to camera |
= / - (or numpad + / -) | Zoom in / out |
| N | Arm a strategic strike (if a warhead is ready), then click an enemy province |
| Escape | Deselect / cancel the current targeting context |
Move, Attack, Retreat, Split, Stop, and Extract are issued from the army action panel and then a map click — there are no per-command keyboard shortcuts. Map modes, production/construction, rally points, resources, battle summaries, and artillery state are exposed through the HUD.
On deployments with IRONFRONTS_DEBUG_CONTROLS_ENABLED=true, an authenticated
player can open the hidden inspector with Ctrl+D+E. [/] cycle renderer
views while it is open. URL parameters and development mode do not grant debug
access, and there is no visible debug button.
npm run build:world compiles immutable material/ data into a version-12 static package. The pipeline rasterizes province topology, generates terrain, preserves/drapes movement and visual waterways, compiles direct dirt roads/cities, places props, precomputes normals/navigation/albedo/AO, chunks render data, writes audit reports, and atomically promotes the result.
The game server loads a local copy for province lookup/pathfinding/resources; the browser loads the package URL announced during its handshake. They must be identical.
See World generator and artifact reference.
The full handbook is indexed at docs/README.md:
Third-party asset terms are recorded in visual/UI credits and audio credits.
The two Node services bind loopback only and expect a reverse proxy. Production needs HTTPS/WSS, exact CLIENT_ORIGIN, private internal game routes, high-entropy independent shared secrets, writable auth/game persistence, and an immutable world package/CDN with appropriate CORS.
There is currently one authoritative game process, no horizontal scaling/leader election, no offline simulation catch-up, and no supplied container/proxy/service manifests. See Deployment before exposing a build.
packages/protocol.src/game / packages/game-core.These boundaries are documented and partly enforced by architecture tests.