Battlezone Online is a real-time multiplayer tank game built with Node.js, WebSockets, and Three.js.
There are two supported ways to run the game:
- Docker image from GitHub Container Registry
- Source release tarball or git checkout
For most users, Docker is the best install and update path.
Each tagged release publishes:
- a GitHub release with notes generated from CHANGELOG.md
- a source tarball
- a versioned Docker image at
ghcr.io/bzflag-dev/bzo:<version> - a moving Docker tag at
ghcr.io/bzflag-dev/bzo:latest
Use docker-compose.yml:
docker compose up -dThis starts the server on port 3000 and stores runtime config in ./data/server-config.json.
On first start, the server copies example-server-config.json to the configured runtime path if no config exists.
Then open:
http://localhost:3000
docker run -d \
--name bzo \
-p 3000:3000 \
-v bzo-data:/data \
ghcr.io/bzflag-dev/bzo:latestThe image defaults to SERVER_CONFIG_PATH=/data/server-config.json.
- Node.js 20+
- npm
npm installIf server-config.json does not exist, the server will create it from example-server-config.json on first start.
Production:
npm startDevelopment:
npm run devThen open:
http://localhost:3000
Runtime configuration lives in server-config.json by default.
You can override the path with:
SERVER_CONFIG_PATH=/path/to/server-config.json npm startSee example-server-config.json for the supported shape.
There is no built-in self-update path for source installs.
To update, download a newer release or pull newer source, then run:
npm installDocker is the recommended update path.
Manual update:
docker compose pull
docker compose up -dor:
docker pull ghcr.io/bzflag-dev/bzo:latestIf you want automatic container updates, use your preferred container update manager. That is not built into the game itself.
- Human-readable history is kept in CHANGELOG.md
- Tagged GitHub releases use the matching changelog section as release notes
W/S— move forward/backwardA/D— turn left/rightSpace— shootTab— jumpM— toggle mouse movementC— toggle cameraO— operator panel/orT— chat
npm run checkThis runs syntax and lint checks.
CI also runs these checks on pushes and pull requests.
Prepare a release locally:
npm run release:prepare -- 1.0.1That updates:
package.jsonpackage-lock.jsonCHANGELOG.md
Then edit the new changelog section so it contains the real user-visible changes.
Validate locally:
npm run check
npm run release:check -- v1.0.1Then commit, tag, and push:
git add package.json package-lock.json CHANGELOG.md
git commit -m "Release v1.0.1"
git tag v1.0.1
git push
git push origin v1.0.1The release workflow will:
- install dependencies
- run lint and validation
- fail if
package.jsondoes not match the pushed tag - fail if CHANGELOG.md does not contain a matching non-placeholder section
- publish a GitHub release
- attach a source tarball
- build and publish a multi-arch Docker image to GHCR
This project is licensed under the GNU Affero General Public License v3.0.
Network users can access the source code from the running app via /source, or directly at: