CLAUDE ARENA
LIVE · this demo is running right now

Your Claude Code sessions,
as a living world.

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.

6
0
0
↑ that's a real game running. drag to pan · scroll to zoom. each tribe is seeded at a different stage of life.

A town for every project, built from the work you actually did.

Leave it open on a second monitor. Glance at it across days and weeks. A repo you've poured months into is a walled Citadel with a gilded keep and mossy walls; one you touched last weekend is a thatch Outpost. The busy ones bustle; the neglected ones go quiet and grey — until you return to them and colour floods back. It's an ambient, honest record of where your attention actually went.

Made to watch evolve.

Everything below is derived from real data — lifetime tool & session counts, first-seen dates, and the clock. No faked activity, no invented numbers.

A walled town grown from a project's history

🏰 It grows through eras

Outpost → Hamlet → Walled Town → Citadel → Capital. Each tier unlocks real structure: palisades become stone walls, the keep gains a gilded roof, towers rise. Cross a threshold while you're away and the town is structurally different when you come back.

A dormant town greyed and mossy

🍂 It weathers & revives

Banners droop, colour drains, and moss creeps over the walls of a project gone quiet — honest neglect, never deletion. The instant a real session fires, life floods back over a couple of seconds and a worker spawns. Age leaves a permanent patina; idleness only veils it.

The strategic overview of several towns

🗺️ It reads at a glance

On the overview, each town is sized by its lifetime work and ringed by a colour that says worked-today vs idle-for-weeks. A Bash-heavy project grows forge chimneys; a Read-heavy one sprouts watchtowers. You learn each town's silhouette like a fingerprint.

And when you open it after time away, a town crier greets you with exactly what changed — “4 days away: +3 sessions, +812 tools, Null Pointers reached Citadel.”

Every hook becomes a move.

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 burst
UserPromptSubmitthat worker perks up with a ! — new orders
PreToolUse · Bashmarches to the gas geyser to run commands
PreToolUse · Edit/Writeharvests mineral crystals — building things
PreToolUse · Read/Grepheads to the watchtower to scout
PreToolUse · Taskspawns a drone that fans out — your subagent
PostToolUsehauls the resource home, +1, stockpile grows
PostToolUse · errorthe unit stumbles in a puff of red
SubagentStopa drone zooms back to base and merges
Stopthe worker heads home and takes a nap (z)
SessionEndit salutes and walks back in — but its work counts forever
PreCompacta memory storm swirls units around the base

It grows. That's the point.

This 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.

Curate your tribes.

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".

How it actually works.

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 · eras)            (sim + procedural renderer · all canvas)

🔒 Private by construction

The server binds to 127.0.0.1 only. The browser is told that something happened — event type, project name, tool name, and which projects interacted — but never the file paths, prompt text, or tool output. Paths are resolved to a project identity on the server and never leave it. Nothing is sent anywhere; there's no analytics. The arena doesn't need to know what you're working on to draw your world.

Install in 30 seconds.

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.