A modern Swift port of XBolo, a Cocoa clone of Stuart Cheshire's classic multiplayer tank game Bolo. This project is designed as an engine-forward platform (built as the BoloKit framework package) supporting future expansions, mods, and AI agents, with the playable Mac app target built on top named Bolo 2026.
This repository exists to learn modern Xcode, Swift, on-device AI (FoundationModels), and multiplayer networking, and to end up with a Bolo engine you can play natively on modern macOS (macOS 26+ / Darwin 27+).
Bolo is not otherwise unmaintained — WinBolo 2 shipped in 2026 with native Mac support. This project is a personal learning vehicle, not a competing distribution.
This is a derivative Swift port of XBolo (MIT-licensed),
itself a clone of Stuart Cheshire's original Bolo. Reference/c holds XBolo's C/Objective-C
source in-tree as a git submodule — kept there permanently, not as a historical artifact pending
removal, because it's a live, executable oracle: every ported module is checked against it with
differential tests. See LICENSE for the full attribution chain and license terms.
Current tagged drop: v1.6.9 — a patch fixing two guest-only accounting defects: a guest builder's tree spends being refunded by the host's stale count, and a guest builder's placed mine never costing the host a mine. Release notes: docs/RELEASE_NOTES_v1.6.9.md.
The C-oracle port is done. Open work lives on GitHub, not in wave numbers. Conventions: issue #43. Live board: docs/STATUS.md.
| Layer | Role |
|---|---|
| Issue | One unit of work (CosmicCEO/BoloKit). Types: Feature, Bug, Task. |
| Milestone | Time box. v1.x.0 = release (tag when every issue closes). v1.x.y = patch between planned sprints. Decide: = ruling, no code. |
| Sprint | Two weeks, Monday start, due Friday of week 2. Skip US federal holidays. |
| Project | Grouping only. 1.* = path to 2.0.0. 2.* = Decide items. |
Next release: v1.7.0 gameplay packs, then v1.8.0 LAN/WAN discovery. 2.0.0 is the tag when that path is done.
Engineering rules: docs/CONSTRAINTS.md. Wave history: git tag legacy-agent-process.
Host or join over LAN from the app's Host/Join screens. Cmd-N opens a second window (macOS tabs it automatically); each window runs its own independent game session, so you can host in one tab and join in another on the same Mac -- a convenient way to drive two tanks solo, no second machine required. See #144 for follow-up on formalizing this into a supported mode.
swift run BoloArena runs a real headless host+guest game behind two independent local HTTP
control ports (default 9101/9102) — a soak/anomaly-hunting tool, not shipped game functionality,
built so two agents (or a human via curl) can actually play a real match and surface unexpected
behavior. Supports the built-in test map or a real .map file via BOLO_ARENA_MAP_PATH. See
Sources/BoloArena/main.swift for the command protocol.
Reference/holds the original xbolo C/Objective-C source as a git submodule. It is kept building throughout the port and used as an executable oracle: every ported module is checked against it with differential tests before its callers switch over.Sources/BoloKitis the target: a pure Swift simulation with no AppKit dependency, shared by both the client and server roles (the original kept two separate copies).- Fidelity to the original 1993 Macintosh Bolo (version 0.99.7bv) is tracked in
docs/CONSTRAINTS.md, against the C oracle — not from other GPL-licensed Bolo implementations, to keep this project's license clean. - All sprite/tile art is generated from Unicode/ASCII glyphs rather than reproduced from the original's copyrighted assets.
Human + AI pair-programming. Project instructions for agents are in AGENTS.md.
This repository is MIT-licensed — see LICENSE, which retains the original XBolo
copyright notice as required by its terms.
XBolo itself bundles a separate dependency, TCMPortMapper, under the GPLv3, used for UPnP/NAT-PMP port mapping. That dependency is not used here. Any NAT-traversal functionality in this port will use a permissively-licensed alternative or manual port forwarding, specifically to avoid GPL-encumbering this codebase.