⚔ RTS
Top-down StarCraft energy. Command centers, hex resource nodes, little visored workers with marching legs, and territory that visibly grows as a project levels up.
Every project is a tribe. Every session is an avatar that marches out and works. Every subagent is a drone. Tools become resources to harvest, errors make units stumble, compaction summons a storm. It draws itself — live — from your Claude Code hooks.
Claude Arena turns that firehose into something you actually want to glance at. Leave it open on a second monitor and check on it like a fish tank — except the fish are your own sessions grinding through your real work. It's an ambient, curatable record of where your attention actually went.
Same simulation, same data, three completely different ways to look at it. Swap any time — the toggle's right up there in the hero.
Top-down StarCraft energy. Command centers, hex resource nodes, little visored workers with marching legs, and territory that visibly grows as a project levels up.
A cozy reef tank. Bases are coral, units are fish, tools are anemones, light shafts drift through the water. The leave-it-open-and-feel-calm mode.
Dark grid, neon everything, glowing motion trails, energy conduits pulsing packets between nodes. Engineered to look unfairly good in a screenshot.
The whole thing is a state machine fed by Claude Code's hook events. Nothing scripted, nothing faked — your actual workflow choreographs the world.
SessionStarta worker awakens — spawns from the base in a burstUserPromptSubmitthat worker perks up with a ! — new ordersPreToolUse · Bashmarches to the gas geyser to run commandsPreToolUse · Edit/Writeharvests mineral crystals — building thingsPreToolUse · Read/Grepheads to the watchtower to scoutPreToolUse · Taskspawns a drone that fans out — your subagentPostToolUsehauls the resource home, +1, stockpile growsPostToolUse · errorthe unit stumbles in a puff of redSubagentStopa drone zooms back to base and mergesStopthe worker heads home and takes a nap (z)SessionEndit salutes and walks back in — but its work counts foreverPreCompacta memory storm swirls units around the baseThis isn't a dashboard that resets when you blink. The server keeps lifetime stats per tribe — tools harvested, sessions ever run, subagents deployed — and each tribe levels up. Higher level means bigger territory, more outlying buildings, taller coral, a longer neon perimeter.
Leave it running a week and your busiest repo becomes a sprawling capital while that thing you touched twice stays a humble outpost.
Click any base. Rename it, give it a motto, pick its color and one of twelve procedural crests. async-armada becomes Async Armada, Breaker of Builds and stays that way. Build your little lore. Nobody's stopping you.
Names default from your folder, prettified — my-cool-app → "My Cool App".
A hook drops a line in a file, a tiny local server reads the file, your browser draws a world. That's the whole trick. Zero dependencies — Node built-ins and a canvas.
Claude Code ──fires a hook on every event──▶ arena-hook.sh (tiny, fast, never blocks Claude) │ appends one line ▼ ~/.claude/claude-arena/events.ndjson │ tailed + normalized ▼ server.js ──static UI + live SSE stream──▶ your browser (lifetime tribe stats) (one sim · three skins · all canvas)
The server binds to 127.0.0.1 only. The browser is told that something happened — event type, project name, tool name — but never what. Your prompt text and tool output never leave the server. Nothing is sent anywhere; there's no analytics. The arena genuinely doesn't need to know what you're working on to draw a fish.
Node 18+. No npm install, no build step, no account. It backs up your settings before touching anything.
# 1. wire the capture hook into Claude Code (backs up settings first) node install.js # 2. start the arena node server.js # 3. open it open http://localhost:4787
Then go use Claude Code like you normally would. The world fills itself in.