Project brief · 2026-10-13 · design v0.2 · server M1 passed · lore → · beta download → · wiki →

OpenMAG

256 players. One war. Eight-man squads under real leaders. A server anyone can host.

In 2010, Zipper Interactive shipped MAG on the PS3: 256 players on one map, organized into squads, platoons and companies with a working chain of command. Sony closed the studio in 2012 and turned the servers off in January 2014. Nothing has replaced it. OpenMAG is that game rebuilt from scratch, with the things that killed it fixed and a dedicated server you can run yourself, the way people run Minecraft servers.

256players, one map, four sectors
84kbps per client, measured
54×realtime headroom on one box
01

Why it works and why it died

Keep: the tree

8 soldiers make a squad, 4 squads a platoon, 4 platoons a company of 128. Squad leaders mark FRAGO objectives that pay double XP. Platoon leaders call scans and strikes. One Officer in Charge per side shapes the whole battle. Leader powers come from map assets you can destroy, so cutting the enemy's command is itself an objective. Every match feeds a persistent three-faction war.

Fix: everything else

MAG's gunplay, visuals and audio were "phoned in"; scale was its only hook. Faction lock split friends. Lone wolves drowned. Leader selection was opaque and vote-kick was abused. The population shrank and queues died. And when Sony switched the servers off, the game ceased to exist. OpenMAG puts gun feel before scale, lets parties pick a faction together, backfills with bots, and ships the server.

02

The Grey War, 2034

Full lore page → The Kessler Accord of 2031 bans nations from sending armed forces, manned or autonomous, beyond their borders. It says nothing about corporations. Three private military companies now fight each other off the map, under contract to the governments that outlawed war, over the three things that matter: compute, chip fabrication, and autonomy. Every match is a raid on a data center, a fab, or a drone works.

Zürich · high-tech

HALCYON Dynamics

A defence-AI firm that bought an army. Low recoil, high rate of fire, light rounds, optics on everything. Many small, quiet drones. See first, shoot first; weak when the sensors go down.

Yekaterinburg · brutal

VRG · Volkhov Response Group

Three national armies re-flagged as a corporation overnight. Heavy calibers, hard recoil, the widest roster. Few big armored drones. Close the distance, kill the sensors, make it a brawl.

Anchorage · traditional

MERIDIAN Security

The Pentagon's contractor, spun out. Balanced, reliable, by the book. One standard drone per platoon, always there. Strongest with vehicles and forward spawns.

03

The ladder: size decides the fight

Vehicle and drone availability scales with sector count. Small maps are pure infantry; big maps are combined arms. Every four-sector map also ships as a two-sector and a one-sector variant, so one map build serves three tiers. Drones are leader-called abilities and destroyable objectives, never something every player flies.

TierSectorsPlayersFightVehiclesDronesModes
Skirmish164infantry, one-on-one gunplaynonenoneSuppression, Sabotage
Battle2128fronts, bunkers, asset beltAPCsSL loitering munition, PL recon swarmAcquisition, Interdiction
War4256four sectors and a core, full command treeAPCs, helicopters, parachute plane, prototype vehicle+ PL strike, OIC heavy wing, jammingDomination
Three-way396no assets, no strikesspawn points onlynoneEscalation
04

Chain of command

OIC · 1 per side spawn rates, jamming, drone wing Platoon 1PL · 32 Platoon 2PL · 32 Platoon 3PL · 32 Platoon 4PL · 32 16 squads × 8 soldiers, each with a Squad Leader (FRAGO, squad spawn) = 128 per side · one sector per platoon PL: sensor sweep, strike. OIC: unaffected by the counter-drone battery.
  • Squad · 8Squad Leader sets a FRAGO; everything done there earns double XP. Squad spawns on its bunker, or on the leader.
  • Platoon · 32Platoon Leader: all SL powers, plus recon swarm (the sensor mast) and strikes (the launcher). Owns one sector.
  • Company · 128Officer in Charge: alters defender spawn rates, blocks or restores enemy leader abilities, commands the heavy drone wing.
  • AssetsCounter-drone battery kills air insertion and strikes. Launcher gives artillery. Sensor mast gives the sweep. All destroyable, all repairable, so the enemy's command is an objective.
  • LeadersEarned: level 15 to lead a squad, leadership points from winning while leading to go higher. Volunteers first, mic users favored, kick needs 6 of 8.
05

One war, three clocks

MAG scored each mode separately, so a Sabotage win meant nothing to the big battle. In OpenMAG small-map wins feed big-map bonuses, and every week's skirmishes matter to Sunday's war.

Daily · personal

Contract of the day

XP, ribbons, one featured mode and map. Streaks. The reason to log in.

Weekly · theatre

Skirmish bonuses

Win the 64 and 128 fights in a theatre and your faction enters that theatre's 256 battle next week with up to two strategic bonuses: a forward spawn pre-unlocked, an extra ability tier, the enemy's counter-drone battery already damaged. Capped, visible, decays. Never damage or health.

Monthly · season

The war itself

Only 256-player wins move map ownership. Standings reset each season; medals and veteran insignia carry; the story advances. The underdog faction gets an extra bonus slot until it wins a war.

06

The test is the game

M2 · in progress

Zipper built MAG's servers before its client. So do we, but the bots play the actual game: faction weapons with range falloff and reloads, buildings and walls that block shots, cover that bots dive behind when hit, 8-man squads following their leader's FRAGO, medics reviving, and objectives captured in MAG's order (burn-off towers → cooling towers → lettered objectives) that fill a damage bar and decide the match. Every run below is a real match from Harbor. Each one says what it was testing and what it found.

t = 0:00 loading replay…
damage bar 0%
attacker defender downed dead building / wall bunker (squad spawn) · ✕ broken, squad spawns at the rear ◯ zone open · ● captured · ◌ locked shot (bright = hit)
Attack alive–
Defend alive–
Downed–
Zones captured–

This run: what it tests

  • QuestionWith real weapons, cover and objectives, does a 256-player Domination match actually get decided, and how fast?
  • SetupVRG attacks (36 dmg, 7.5 rps, 700 m/s) against HALCYON defending (22 dmg, 13 rps, 900 m/s). Real bullets with spread, line of sight through 144 obstacles, 24 zones in 4 sectors of 500 m. 30 s bleed-out, 20 s spawn wave, 3 s revive. 15 min clock.
  • Spawn rulesDefenders spawn on their squad's bunker until attackers break it (400 hp, rifle fire chips it); then that squad spawns at the rear. Attackers spawn at their edge until they hold ground; the most forward captured zone becomes their spawn, and they lose it if it is retaken. MAG's rules.
  • Pass looks likeBurn-off towers fall in the first minutes, bunkers start breaking, the fight moves inward, the damage bar moves, and the match ends with a MAG-style result before the clock does. Time-to-kill near 0.3 to 0.5 s in a fair duel.

What it found

  • Result–
  • Objectives–
  • Combat–
  • Time to kill–
  • Server–
  • Reading–

Run log

RunAddedTested forFoundVerdict
M1-1256 bodies, hitscan, no covercan the server carry it2 ms of a 33 ms tick, 126 kbps (snapshots were going out at 30 Hz by mistake)load ok, bandwidth over
M1-220 Hz snapshot cadencebandwidth target84 kbps per client at 256; 37 of 256 alive after a minute, bots far too lethalM1 gate passed
M2-1weapons, cover, LOS, squads, medics, objectivesdoes a match get decided0 of 24 zones in 5 min: both sides stood on the same zone, capture netted to zerostalemate
M2-2defenders hold 20 m behind the zone from cover; attackers form up inside the radiussame2 of 24 zones; attackers walk into defenders in cover and get farmed, 36 shots per down, 15% accuracyattackers lose
M2-3real bullets: velocity, spread, line of sight, lag-compensated hit formula; bots use it tooserver cost of ballistics; does combat still worktick p99 0.5 ms after optimising the path test (15 ms before); 32% accuracy, TTK 0.7 s; still no capturesballistics in
M2-4MAG spawn rules (bunkers break, rear spawn; attackers spawn on captured ground) + 15 min clockdoes a match get decidedMINOR VICTORY for attackers at 12:57: 12 of 24 zones, 8 of 16 bunkers broken, 23% accuracy, TTK 0.2 s median. First bar tuning let one sector win alone at 7:23; now 4 zones take ~11 mindecided match
M2-53-D: capsule hitboxes with head / body / arms / legs (×1.8 / 1.0 / 0.7 / 0.75), aim pitch, bullet drop, 3-D line of sight, chest-high walls, faction armor and speed profilesdoes the hit formula hold up in 3-D; what the client will getFirst pass: 12% accuracy and legs everywhere, a hidden bug: weapon spread was 25 mrad (±3 m at 120 m). At 4–9 mrad: 46% accuracy, TTK 0.27 s (design target 0.3–0.5), probe zones head 6 / body 10 / arms 13 / legs 18, hit-reg 19 ms loopback. Match now undecided: accurate defenders behind chest-high walls stop every attack. Bandwidth 113 kbps at 20 Hz with z, delta compression is due3-D in · balance open
M2-6interiors: hollow buildings with doors and roof slabs, ladders onto roofs and bunkers, server halls with rack aisles as the lettered objectives (captured from inside), bots route through doors; client prediction; jump / sprint / crouch; first human playtestsdoes the map have places to go into and up onto, and does that unblock the stalemate15-min match: damage bar 75%, 6 of 24 zones (a whole sector including its hall), 4 of 16 bunkers broken, 34% accuracy, TTK 0.3 s. On the flat map the same bots sat at 0%. Ben played it: joined dead at first (fixed), shot his own squad (friendly-fire hint added), fired above the rifle's rate (rejected, matched)match moves again

What this is for: the bots exist to generate honest traffic, not to prove bots can beat bots. The next runs put the server on Harbor and real clients on the laptop, on Rome, and across the internet, and measure what matters for feel: round-trip time, jitter, packet loss, snapshot arrival, and how much of that prediction and lag compensation can hide. Those numbers go in this table next, per path.

07

Net: the numbers that decide feel

M2-net · running

This is the test that matters. A real UDP server runs the bot match; a probe client on another machine drives one soldier with inputs at 60 Hz and records what a player would feel: round trip from a key press to the snapshot that reflects it, the spacing of snapshots (jitter is what makes other players stutter), loss, and bandwidth. The server sits on Harbor. Probes run from Harbor itself, from this laptop over the LAN, and from Rome over the Nebula mesh, which crosses the real internet.

Paths, before any game traffic (ICMP ping)

PathRound tripWhat it stands for
laptop → Harbor4–6 msLAN. Best case; a player in the same house as the server.
laptop → Rome61–104 ms, avg 79Across the internet through the mesh. A normal player, with 20+ ms of jitter to hide.
Harbor → Rome54–101 ms, avg 70Same. If Rome is the front door, this is the hop it adds unless it only relays.

Probe runs (game traffic)

RunServerRTT p50 / p90 / p99Snapshot gap p50 / p99JitterLosskbpsHit-reg p50 / p99Shots: hit / blocked / miss / rejected
loading probes.js…

Found so far

  • Server costWith no network at all, a key press takes 12 to 15 ms to show up in a snapshot: input waits for the next tick, then the next snapshot. That is the floor every path adds to.
  • Cadence20 Hz snapshots on a 30 Hz tick alternate 33 and 67 ms gaps: 16.7 ms of jitter with nothing wrong on the wire. 30 Hz and 15 Hz are steady at 0.5 ms. The snapshot rate must divide the tick rate; 20 Hz only makes sense with a 60 Hz tick.
  • PacingOS sleep overshoots by 1 to 15 ms on WSL and Windows. Sleeping to 2 ms before the deadline and spinning the rest removed that.
  • BandwidthStill at the relevance cap: 63 / 84 / 126 kbps at 15 / 20 / 30 Hz. Delta compression decides whether 30 Hz is affordable.
  • LANlaptop → Harbor: 10 ms round trip, 0.8 ms jitter, 0% loss. A player next to the server feels nothing.
  • InternetRome → Harbor over the mesh: 76 ms median, p99 146 ms, and one snapshot in a hundred arrives 100+ ms late (three ticks). Without 2–3 snapshots of interpolation delay other players would stutter. That delay, 66–100 ms, is the central netcode trade-off and now has a number.
  • DirectionSame path, server on Rome instead: jitter drops from 22 ms to 7 ms and the p99 gap from 100 to 60 ms. Snapshots leaving Harbor toward the internet are the rough direction, Harbor's home uplink or its mesh client. Rome as the front door is measurably smoother for players.
  • Hit registrationTrigger to confirmed hit: 26 ms on LAN, ~95 ms across the internet, which is the round trip plus one tick. The hit formula (rewind the world to what the shooter saw, fly the bullet, both sides' lag windows) resolves a shot in well under a millisecond of server time.
  • RejectionsHonest shots were refused on internet paths when jitter pushed them past the rewind window. Widened the window from one-way to full round trip plus interpolation and the cap to 267 ms; the remaining rejections are the next thing to break down by cause.

Next

  • ShotsThe probe fires like a player. Measure hit registration: the delay from trigger to the server confirming a hit, and what lag compensation makes of an 80 ms player shooting a moving target.
  • RepeatSame probes at different times of day and for 10 minutes, so the p99 numbers are trustworthy and the evening uplink shows up.
  • ThenClient prediction and server lag compensation in the probe, so the number reported is what the player sees after the netcode has hidden what it can, not the raw wire.
  • TargetA player at 80 ms with 20 ms jitter should see other players move smoothly and their own shots register where they aimed. That is the whole M2-net gate.
08

Where it runs

proposed
Players Godot client · PC companion app later ROME public VPS · 10.42.0.1 website · accounts matchmaking · war service relay / front door HARBOR 2× Xeon · 80 threads · 240 GB game servers (Rust, WSL) builds · benches Alexandria vault also: Minecraft, LLM router Community servers same binary, anyone's box Laptop docs · design · client dev ALEX Gitea · Vault · 192.168.88.200 UDP hand-off

Rome: the front door

Already public (Caddy, Docker, plabs.cloud). Serves this site, accounts, matchmaking and the war service, and is the address players connect to. It hands a match to a game server, on Harbor or anyone else's box. Rome never runs the simulation, so it stays cheap.

Harbor: the muscle

Where the server is built, benchmarked and run. Today's M1 ran here in WSL on one of 80 threads. It also carries Alexandria, the Minecraft servers and the model router, so the game gets a slice, not the box.

Everyone else: the Minecraft model

One Linux binary and one config file. Open a port and your friends join. If OpenMAG ever has official servers they run the same binary. If it never does, the game still works.

09

Milestones

#MilestoneDone whenStatus
M0Design + lore + engine decisionBen signs offv0.2, reviewers next
M1Server first: 256 bots, 4 sectors, relevance, telemetry≤100 kbps per client, 30 Hz with headroompassed 2026-10-13
M2Gun feel slice: 32v32 Suppression, one sector, 3 weapons per faction, Godot client on a real UDP linkplaytest says shooting feels goodnext
M3Sabotage 64 + squad layer, FRAGO, spawn waves, bunkersa full match with win tiersplanned
M4Acquisition 128 + platoon layer, assets, APCs, forward spawnstwo platoons per sideplanned
M5Domination 256 + OIC, damage bar, helicopters, parachute256 humans and bots, one mapplanned
M6Backend on Rome: accounts, progression, matchmaking with bots, war service, community server packagea stranger hosts a server and a party queuesplanned
M7Alpha: 3 home maps per PMC (each in 3 tiers), Interdiction, Escalationpublic testplanned

Decided: Rust server, Godot 4 client, PC first, hostable by anyone, launch cap small and grown with the player base. Open: the license (no royalties), bot lethality and time-to-kill after humans play it, and the PMC names, which are placeholders.

OpenMAG · docs in open-mag/DESIGN.md, LORE.md, research/ · server in open-mag/server · built with Claude · original code and assets, inspired by MAG (Zipper Interactive, 2010)