Skip to content

Five On It ​

CIDocsReleaseVersionProduct codepackages/simTests

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.

Riverbend, the city that ships, seen from above

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).

console
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:5173

Both 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 ​

KeyDoes
W SThrottle; brake, then reverse (double-tap and hold W to boost)
A DSteer
SpaceHandbrake (drift); on foot, jump
ShiftRun, on foot
EGet out; on foot, what the prompt says (get in, carjack, pick up, open, …)
MouseAim; the left button fires
1–9Select an inventory slot, and with it the weapon in hand
QTake cover at the wall or car ahead
VNext vehicle class
TTake out the phone
EnterChat
EscPause menu
RBack to the nearest spawn

Every key, the HUD and the legend: Controls.

Development ​

console
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 editor

The 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):

console
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.

WorkspaceWhat it is
packages/sharedTick constants, the seeded PRNG, the state hash, pose math.
packages/worldLevel data, the ground queries, the road graph, the navigation and the levels' registry (@foi/world/levels).
packages/simThe bitECS + Rapier simulation: vehicles, people, the fixed step, the determinism hash.
packages/protocolThe wire contract: binary input and snapshot codecs, the welcome message, the Transport interface.
packages/net-clientPrediction and reconciliation, remote interpolation, the client clock.
packages/missionsThe game document and the deterministic mission interpreter the server runs; the bundled games.
packages/aiThe NPC brains (profiles, perception, paths, chasers, traffic, the crowd, the police), run by the server.
packages/catalogueWhat a game may name: the level spec's schema and solvers, buildings, places, vehicles, the mission blocks.
apps/apiThe platform API: accounts, drafts, builds, published games, rooms, the catalogue, moderation.
apps/workerThe generator worker: a level spec through headless Blender to level data (POST /generate).
apps/mcpThe five-on-it MCP server for Claude Code, a thin adapter over the platform API.
apps/nakamaNakama's runtime module: public rooms' chat moderated, the party's and direct messages kept.
apps/serverThe authoritative Node server: 60 Hz simulation, 20 Hz snapshots, WebSocket and /health.
apps/clientElectron + Vite + Babylon.js renderer; also runs in a plain browser (FOI_WEB=1).
apps/level-editorThe Babylon.js Editor project: the levels as placed pieces, the block scripts.
apps/toolsThe 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).

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).