Five On It
A top-down, satirical open-city driving game at GTA2's pace, in a real 3D city of low-poly cars and people. Anyone can describe a game (a city and the missions in it) to Claude in Claude Code, through the game's MCP server, and play it with friends minutes later. One curated game ships; players make the rest from the same building blocks.

Status: proof of concept. The driving feel comes first (Roadmap).
What's in it
- Riverbend, the city that ships: thirteen districts round a river's loop, seven bridges, nine hundred buildings, and "Smart City Pilot", a game of four missions. The full tour: What the game has.
- Twenty-three vehicle classes, each with its own engine placement, drivetrain, axles and seats, built to drift (Driving model).
- A city that lives: traffic that stops at the lights, pedestrians and dogs, police up to three stars, weather and nights (AI, The city, Time and weather).
- On foot: five weapons, cover, stealth against guards and cameras, items, locked cars and garages, a phone (Stealth, Items, Phone).
- Missions as data, checked before anyone plays them and run on the server (Missions).
- Levels from a spec: cities drawn freely, towns on a grid, regions of 64 m tiles with hills, lakes, volcanoes and tunnels (Levels, The city spec, Tiles).
- Made with Claude, played together: drafts, builds and published games, rooms of up to 32 players, friends, parties and chat, on an authoritative server with client-side prediction (Creating games, Social, Netcode).
Quick start
Requirements: Node 24+, npm 11+ (it uses allowScripts) and Git; editing levels also needs the Babylon.js Editor 5.5.2 (Getting started).
npm install
npm run dev # the game server on :7777 and the Electron client
npm run dev:web # or the game server and the game in a browser, http://localhost:5173Both open on the main menu; ?play goes straight into the game, and every window is a player. Codespaces, the server alone and a released build: Getting started.
Keys
| Key | Does |
|---|---|
W S | Throttle; brake, then reverse (double-tap and hold W to boost) |
A D | Steer |
Space | Handbrake (drift); on foot, jump |
Shift | Run, on foot |
E | Get out; on foot, what the prompt says (get in, carjack, pick up, open, …) |
| Mouse | Aim; the left button fires |
1–9 | Select an inventory slot, and with it the weapon in hand |
Q | Take cover at the wall or car ahead |
V | Next vehicle class |
T | Take out the phone |
Enter | Chat |
Esc | Pause menu |
R | Back to the nearest spawn |
Every key, the HUD and the legend: Controls.
Development
npm run validate # every quality gate, in the order CI runs them
npm test # vitest, unit and integration, with coverage
npm run test:e2e # Playwright, the core tier (the browser against a real server)
npm run test:e2e:smoke # builds the client, boots Electron
npm run docs:dev # the documentation site: the guides and the API reference
npm run dev:platform # game server with rooms, the platform API on 8080, the web client on 5173
npm run dev:mcp # the MCP server over HTTP on 8091 (Claude Code here starts it over stdio)
npm run level:play -- test-core-gameplay # a level, re-exported on every save in the editorThe environment variables each app, tool and test reads are in .env.example (the Compose stack's in deploy/.env.example, the fleet scripts' in deploy/fleet/.env.fleet.example). Conventions and the definition of done are in AGENTS.md; the gates in Quality gates; what to try in the running game, level by level, in Testing by hand.
The platform online
The platform runs at https://play.fiveonit.online on Hetzner Cloud, made and kept up to date from a checkout by the scripts in deploy/fleet, with their settings in deploy/fleet/.env.fleet (copied from deploy/fleet/.env.fleet.example; the domain is FOI_DOMAIN there):
node deploy/fleet/stack-server.mjs # the platform's server: made, or brought to this release and to .env.fleet
node deploy/fleet/add-server.mjs --name game1 # one game server more
node deploy/fleet/fleet-status.mjs # the game servers, their players, what they cost
node deploy/fleet/teardown.mjs # what taking it all away would delete (--yes does it, after a backup)What runs where, how to reach it and what to do when it goes wrong: Operations. How it is built: Deploying. How the scripts work: deploy/fleet.
Workspaces
Plain npm workspaces. The packages are isomorphic (no DOM, no Node APIs) and never depend on the apps; how the pieces fit is in Architecture, the rules in AGENTS.md.
| Workspace | What it is |
|---|---|
packages/shared | Tick constants, the seeded PRNG, the state hash, pose math. |
packages/world | Level data, the ground queries, the road graph, the navigation and the levels' registry (@foi/world/levels). |
packages/sim | The bitECS + Rapier simulation: vehicles, people, the fixed step, the determinism hash. |
packages/protocol | The wire contract: binary input and snapshot codecs, the welcome message, the Transport interface. |
packages/net-client | Prediction and reconciliation, remote interpolation, the client clock. |
packages/missions | The game document and the deterministic mission interpreter the server runs; the bundled games. |
packages/ai | The NPC brains (profiles, perception, paths, chasers, traffic, the crowd, the police), run by the server. |
packages/catalogue | What a game may name: the level spec's schema and solvers, buildings, places, vehicles, the mission blocks. |
apps/api | The platform API: accounts, drafts, builds, published games, rooms, the catalogue, moderation. |
apps/worker | The generator worker: a level spec through headless Blender to level data (POST /generate). |
apps/mcp | The five-on-it MCP server for Claude Code, a thin adapter over the platform API. |
apps/nakama | Nakama's runtime module: public rooms' chat moderated, the party's and direct messages kept. |
apps/server | The authoritative Node server: 60 Hz simulation, 20 Hz snapshots, WebSocket and /health. |
apps/client | Electron + Vite + Babylon.js renderer; also runs in a plain browser (FOI_WEB=1). |
apps/level-editor | The Babylon.js Editor project: the levels as placed pieces, the block scripts. |
apps/tools | The level pipeline: editor scene ⇄ level data (level:export, level:check, level:play, …). |
Documentation
Published at https://docs.fiveonit.online, one version a release with next for develop and a version switcher on every page (Versions, how it is published).
- Playing: Getting started, Controls, What the game has, Testing by hand.
- The engine: Architecture, Driving model, Netcode, Performance, AI, Animation.
- The world and its games: Levels, Tiles, The city spec, Missions, Items, Phone, Stealth, Vehicles, The city, Time and weather.
- The platform: Platform, Creating games, Social, Moderation, Deploying, Operations (the live platform: what runs where, access, runbook),
deploy/fleet(the Hetzner scripts). - The project: Testing, Quality gates, Releasing, Roadmap, AGENTS.md.
- Design: Game design document (what) and Technical specs (how).
npm run docs:devserves all of it with the API reference generated from the doc comments.
Releases
Installers for Windows, macOS and Linux and the server bundle are on the releases page: Getting started says how to play one, Releasing how one is cut (git flow, semantic versions).