Claude of Tanks: a fixed 60 Hz authority for 217 procedural tanks
A World of Tanks-style, Vite-powered, engine-free pure Three.js armored combat simulator resolving plate-level armor, ballistics, modules, spotting, and physics, with 121 tanks and 20 destructible battlefields. Playable entirely in the browser on desktop and mobile devices. Built end-to-end by a multi-agent Claude/Codex pipeline.
At a glance
- What is it?
- A browser-native Three.js armor simulator whose numbers disagree with each other. The GitHub summary counts 121 tanks and 20 battlefields, the project copy counts 217 and 33, and no GitHub release sits behind either number.
- Who is it for?
- Claude of Tanks suits a reader who wants to argue with a physics model rather than install one: plate-level armor, per-vehicle autoloader timings and a fixed-step authority are described in enough detail to check. Treat the fleet count as unsettled until you see the build you are actually served, since the repository summary and the project copy disagree, and assume there is no version pinning, since nothing has been released and the package is private.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository received new commits within the last day.
- What is it written in?
- Mainly TypeScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 3, 2026, and from our analysis. They are not legal advice.
Editorial analysis
The GitHub summary counts 121 tanks and 20 maps, the project copy counts 217 and 33
The GitHub summary for this repository advertises 121 tanks and 20 destructible battlefields. The copy inside the project advertises 217 production-visible first-party procedural vehicles across 33 battlefields. Both sentences describe the same repository, and nothing here explains the gap. The Current release table repeats the larger pair, 217 vehicles for the fleet and 33 authored battlefields for the worlds, and a provenance gate reports 217 first-party procedural battle playables and 0 GLB-sourced playables, with comparison inputs stripped from public builds. That wording carries weight: production and local development means the 217 mixes vehicles that are playable with vehicles that exist only in a local build, so the headline count is not a count of what a player can drive today. The worlds row is equally concrete about what a battlefield carries, shared structures, wrecks, utility networks, loose props, placement, collision and destruction. Anyone sizing this project from the repository landing page gets a smaller and different number than the one printed above the game's own link.
A Current release table with no release attached to it
The copy has a section titled Current release, laid out as a table of runtime facts, and the repository has published no GitHub releases at all. The package side is closed too: package.json is marked private and pinned at version 1.0.0 under the name claude-of-tanks, so there is nothing to install from a registry and no version history to diff. A visitor cannot tell which build of the game they are playing, because the hosted site is the only distribution channel and it carries no version marker a player can read. The table also mixes shipped product with process. The Tools row lists release gates as a feature next to Scene Studio and the Tank Gallery, and the localization guide is said to cover coverage, intentional exclusions, a General Translation workflow and release gates. Two lock files sit at the repository root, gt.config.json and gt-lock.json, next to skills-lock.json, which is what a gated translation and agent pipeline look like from outside. Read the table as a build description, not a changelog.
The dev fleet key that reaches the browser on purpose
One switch decides whether a local build loads the complete vehicle archive, and it lives in a variable the browser can read. The example environment file gives the reasoning itself: Vite exposes VITE_* values to the browser, so this is a development switch rather than an authentication key, and production builds ignore it even when present. The value is a plain string in the same file.
# Local-only complete vehicle archive. Vite exposes VITE_* values to the
# browser, so this is a development switch rather than an authentication key.
# Production builds ignore it even when present.
VITE_COT_DEV_FLEET_KEY=claude-of-tanks-local-devNothing about that key is secret, which is correct for a flag that only turns on local content. The same file draws the opposite line for material that does need to stay private: relay credentials are commented out, and the TypeSafe key is described as server-only, read from the deployment environment by the hosted function, never to be placed in that file or in a VITE_ variable. The contrast is the useful part. A local build with the complete archive is not a leaked fleet, while a real credential copied into a browser-visible variable would be one.
Two clocks: a fixed 60 Hz authority and a measured 120 FPS test path
Movement, ballistics, armor, damage, spotting, bots, destructibles and the match result all run at a fixed 60 Hz, and that list is what the project calls the authority. Presentation is accounted separately: a direct Three.js/WebGL renderer, adaptive quality, stable shadows, SMAA and FSR, GPU recovery, and a measured 120 FPS test path. Two numbers for one game, and the second belongs to a test path rather than to a match. The copy does not say what the render loop does between authority ticks, so on a 120 Hz display the frames above 60 are unaccounted for. Performance work is scripted rather than asserted, with a terrain streaming benchmark and a garage entry probe wired into package.json.
"perf:terrain-stream": "node tools/terrain-stream-benchmark.mjs",
"perf:garage-entry": "node tools/garage-entry-performance-probe.mjs",The word authority also governs outcomes: guided missiles steer toward an authority-owned aim point, results are authority-owned, and multiplayer rooms report to the same owner of truth, so a match cannot be won by a client that disagrees with the simulation.
Strv 103A, Strv 103B and UDES 03 aim by pitching the hull
Three Swedish siege vehicles have no traverse, so they aim their fixed guns by pitching the physical hull, with wheels and both loaded track runs reshaping around the solved pose. Couple that to plate-level armor and it stops being a cosmetic trick: the same hull carries the plates incoming rounds are resolved against, so pitch changes both where the gun points and what faces the shooter. The rest of the fleet varies along the same axis. The MBT-70 fires the Shillelagh as its primary round, and infantry fighting vehicles carry vehicle-specific TOW, MILAN, Spike, Konkurs, Arkan and Jyu-MAT launchers. The Tank Gallery opens any vehicle, articulates the live rig, isolates armor or internal anatomy, and exports an exact-surface review packet from the same specification used in combat, which is a claim you can check, because the anatomy view and the battle view read one vehicle definition. What is missing is any number: pitch rate, traverse time and suspension travel appear nowhere in the copy.
Per-vehicle magazine timings and a paragraph that stops mid-word
Magazine autoloaders are modeled as their own systems rather than a gun attribute: ready rounds, intra-magazine cycle time, full replenishment, manual magazine reloads, shell changes, and damage to the loading mechanism, with the Leclerc, Type 90, PL-01 and the four-round PL-01 105 each carrying their own timings. That last pairing is the interesting one, a four-round vehicle and an autoloader sharing a code path with different numbers. Balance is not left to feel. Three scripts exist for it, simulating matchups, writing updates, and checking fleet balance plus balance matchups on demand. The guided missile paragraph then breaks off mid-word after naming launcher damage, rack damage and ammunition count, so the missile damage chain is documented only as far as the copy goes. Nothing past that point is recoverable from this repository record, and the paragraph is the one place where the physics stops being inspectable.
Private rooms need relay addresses you host yourself
Rooms can be created in the browser, shared by link, or played over a LAN, with room chat, spectators, respawns and rematches, and results owned by the same fixed-step authority that runs the match. The transport is where the work lands. Production keeps Cloudflare TURN, with coturn as an optional self-hosted alternative, and the environment file shows the shape of a self-hosted relay.
# COT_TURN_URLS=turn:turn.example.test:3478,turns:turn.example.test:5349
# COT_TURN_SHARED_SECRET=
# COT_TURN_USERNAME=cot
# COT_TURN_TTL_SECONDS=28800Those example hosts sit on the reserved .test domain, so they are documentation placeholders, and an operator has to supply real relay addresses, a shared secret and a username. The credential TTL is 28800 seconds, which is eight hours of issued credentials. Two managed alternatives are commented in the same place, a Cloudflare key id with an API token, or a static ICE server list. Transport details are deferred to docs/MULTIPLAYER-V2.md, which is where a self-hosting reader has to go before a room connects behind a restrictive network.
One game, two hostnames, and a server boundary drawn across four directories
The homepage field for the repository points at claudeoftanks.kevinliu.studio. Every link in the project copy points at the shorter cot.kevinliu.studio, with paths for play, the field manual, the gallery and Scene Studio, plus one relative link to docs/INDEX.md for the engineering docs. Two names for one deployment works, but it means a link copied from one source can disagree with the other. The file tree shows how wide the deployment is: api/, cloudflare/, server/, middleware.ts, vercel.json and vite.config.ts sit side by side, so the app, an edge worker and a server-side function are three surfaces backed by one repository. That boundary is drawn explicitly where it matters. The Jev commander key is described as server-only, read by the hosted function from the deployment environment, and VITE_JEV_URL is meant to stay unset so requests keep using the same-origin /api/jev path, which the dev server forwards to 127.0.0.1:8794. The same tree carries AGENTS.md, CLAUDE.md, SKILL.md, .agents/ and .agent-docs/, which fits the summary line that the game was built end to end by a multi-agent Claude and Codex pipeline.
Editorial conclusion
Claude of Tanks suits a reader who wants to argue with a physics model rather than install one: plate-level armor, per-vehicle autoloader timings and a fixed-step authority are described in enough detail to check. Treat the fleet count as unsettled until you see the build you are actually served, since the repository summary and the project copy disagree, and assume there is no version pinning, since nothing has been released and the package is private. Anyone self-hosting multiplayer rooms should budget time for the TURN relay configuration before the first room connects.
Frequently asked questions
How many tanks and battlefields does Claude of Tanks actually have?
The copy inside the project says 217 first-party procedural vehicles and 33 authored battlefields, and a provenance gate reports 217 procedural battle playables with 0 GLB-sourced ones. The GitHub summary for the same repository says 121 tanks and 20 destructible battlefields.
Does Claude of Tanks have published releases or an installable package?
No GitHub releases are published, and package.json is marked private at version 1.0.0 under the name claude-of-tanks, so there is no package to install from a registry. The copy points players at the browser build instead.
Can I run Claude of Tanks on my own machine?
The copy gives no install or start command, and the visible part of package.json lists audit, benchmark and self-test scripts before it cuts off. The example environment file documents a local-only complete vehicle archive switch and a dev server that forwards /api/jev to 127.0.0.1:8794.
What license is Claude of Tanks released under?
MIT is the license recorded for this repository, and the tree carries LICENSE, LICENSE-POLICY.md, a LICENSES/ directory and NOTICE.md at the root. The copy does not say how those extra files relate to the MIT terms.
Does Claude of Tanks need a relay server for multiplayer rooms?
Production keeps Cloudflare TURN, with coturn offered as an optional self-hosted alternative configured in the deployment environment rather than in a browser-visible variable. A self-hosted operator supplies relay URLs, a shared secret, a username and a credential TTL.
Is Claude of Tanks still being worked on?
The last push recorded for the repository is 2026-10-01 and it is not archived, but nothing has ever been tagged as a release, so activity shows up as commits rather than as versions.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/kevin-liu-01-claude-of-tanks)