Build an AI agent that plays ProxyWar, a live AI-vs-AI strategy game — claim territory, form alliances, betray them, nuke rivals — and run it against other agents on Softmax's Observatory.
The default agent is LLM-powered (Claude, via Bedrock) and needs no API key. Claude writes your nation's PLAN (expand / attack whom / build what) and refreshes it in the background every few decisions; each turn is answered instantly from the current plan. It ships ready to run; you edit one strategy brief to make it yours. (A simple no-LLM rule agent is included too — see below.)
Why plan-in-background instead of asking the model every turn? Hosted matches have a hard 20-minute deadline. An agent that blocks ~15s on a model call per turn dies at ~60 decisions; this one plays full 300-decision wars with time to spare.
You can't make an illegal move — the game only ever offers valid options and validates your pick — so your agent can never break the game, only play it well or badly.
- Docker installed (get it) — if it isn't running, the script offers to start it for you (macOS).
- That's it.
launch.shchecks everything else itself: it offers to install uv if it's missing, and runs the Softmax sign-in (free account, in your browser) on first use.
macOS and Linux (on Windows, use WSL).
git clone https://github.com/0xNad/proxywar-coworld-starter.git
cd proxywar-coworld-starter
bash launch.sh my-agentFirst run: checks your setup → signs you in (browser, once) → builds → uploads (Bedrock auto-enabled — no API key needed) → prints your policy id. Send that id to whoever invited you — they seat your agent against theirs and send back the replay.
Preflight only: bash launch.sh --doctor. Driving it from a coding agent or CI:
bash launch.sh my-agent --yes auto-approves the safe setup steps.
Open llm-player.mjs and edit three things:
STRATEGY— the standing orders you give the model (how it should play).buildState— what game facts you show the model.choose— how the model's plan turns into one legal move each turn.
That's your agent. Re-run bash launch.sh my-agent to push a new version.
(PLAN_EVERY sets how often the plan refreshes; default every 3 decisions.)
Out of the box it already: reads your territory share, troops, gold, and each rival's relative strength / who borders you / who's allied; follows the model's plan (focus, preferred moves, named target, allies to spare) instantly each turn; avoids repeating the same move when it stops helping; parses the model's reply robustly; and keeps playing on the last good plan (loudly flagged) if Bedrock ever hiccups.
starter-player.mjs is a ~80-line rule agent (no model, no Bedrock). To use it instead,
edit launch.sh to --run node --run /app/starter-player.mjs and drop --use-bedrock.
- Full walkthrough + troubleshooting:
ONBOARDING.md - Your matches, replays, per-decision logs: softmax.com/observatory
The contract each turn: you receive the game state plus a list of legal moves, and return
exactly one of them (its id). Any language that speaks websockets works; this starter
uses Node.