2,251
stars
13,207
commits
TypeScript
primary language
Sep 10, 2026
updated
Quest, group up, and raid a hand-built world, free in your browser. Open source, web3, and online right now.
Official website: https://worldofclaudecraft.com/
English · Español · Español (España) · Français · Français (Canada) · Italiano · Deutsch · 简体中文 · 繁體中文 · 한국어 · 日本語 · Português (Brasil) · Русский · Čeština · Nederlands · Polski · Bahasa Indonesia · Türkçe · Svenska · Tiếng Việt · Dansk
Play now · Host your own world · Train an agent · Web3 · Contributing · Discord

World of ClaudeCraft is a complete classic-era MMO you can play right now in your browser, host yourself with one command, and even train AI agents to play. It is free, open source, and live at worldofclaudecraft.com.
One shared world runs in three places, all from the same game core:
Same seed, same world, everywhere. Much of what you see is still drawn from code at runtime, and the rest is a curated asset set that ships with the project, so a fork runs out of the box.
/wiki, generated straight from live game content so it cannot drift from the world it documents.
![]() Lantern-light in Mirefen Marsh at night | ![]() A dungeon pull goes loud under the green torches |
![]() A crowded hour on the live world | ![]() Every leaf burns gold on the Amberfall road |
![]() Rift warnings roll in on the Palmreach road | ![]() Snowbound lamplight in the Frostveil Reach |
Weather is biome-driven and render-only, so it never touches the deterministic sim:
![]() Clear over the Vale | ![]() Rain over Mirefen Marsh | ![]() Snow on Thornpeak Heights |
Play in your browser at worldofclaudecraft.com, or install the native app for Windows, Linux, macOS, iOS, or Android. Every client connects to the same online world.
Create an account, create a character, and enter the live world. To run that same client/server stack yourself, see Host your own world below.
Offline mode is a local single-player world with no account and no server authority, so it ships in development builds only. Run the dev server and it appears in the mode picker:
# once per machine (match package.json packageManager; Corepack not required;
# full install policy: CONTRIBUTING.md)
npm install -g pnpm@10.34.5
pnpm install --frozen-lockfile
pnpm run dev # then open http://localhost:5173 and choose Play Offline
Name your character, pick any of the nine classes, and you start in Eastbrook Vale (levels 1-7), a market town ringed by hubs: wolf runs to the north, boar meadows east, the Sableweb woods west, Mirror Lake northwest, a burrower-ridden copper dig southwest, and a ruined chapel of restless dead northeast, with Gorrak's bandit camp to the southeast. The north road climbs a mountain pass into Mirefen Marsh (6-13, hub Fenbridge) and on up to Thornpeak Heights (13-20, hub Highwatch). The road no longer ends there: the Ferrywalk sandbar leads east from the vale to the Farshore, a besieged island of rift breaks, and past Thornpeak a thinned seal beneath the mountains opens into the Veiled Hollow and the realms beyond, out to the level-cap frontiers. The world seed is fixed in src/sim/world_seed.ts, so it is the same place every visit.
World of ClaudeCraft ships as full desktop apps for all three major desktop platforms: signed Windows installers, Linux AppImage and deb packages, and signed and notarized universal macOS builds. They use the same game client and online world as the browser, with native packaging and automatic updates.
Online sign-in is Discord and email only, exactly the web flow: email/password logs in inside the app, and "Continue with Discord" opens your default browser on the /desktop-login page, which hands a one-time code back to the app over a worldofclaudecraft:// deep link that the app exchanges for a normal World of ClaudeCraft session token.
npm run electron:dev # Vite + Electron dev shell
npm run electron:pack # local unpacked desktop app
npm run electron:build # website-channel installers (self-updating)
npm run electron:build:steam # SteamPipe depot layouts (in-app updater off)
Point the shell at a different API with VITE_DESKTOP_API_ORIGIN, for example a local server or a staging host:
VITE_DESKTOP_API_ORIGIN=http://127.0.0.1:8787 npm run electron:dev
Override the production API origin for staging builds with VITE_DESKTOP_API_ORIGIN=https://dev.worldofclaudecraft.com (a BUILD-time value: it is baked into the bundle and stamped into the packaged app, and installed builds ignore it as a runtime env var). Steam is a distribution channel (the same Electron bundle, uploaded via SteamPipe), and desktop players can link a Steam account to mirror the deeds they earn into Steam achievements; sign-in itself stays email and Discord. The full release runbook (signing, notarization, publishing an auto-update, SteamPipe depots, the server deploy) is docs/desktop-release.md. iOS and Android ship through Capacitor, with their own runbook in docs/mobile-store-release.md.
cp .env.example .env
# edit .env and set a long random POSTGRES_PASSWORD
docker compose up -d --build # postgres and the game server, fully built
# open http://localhost:8787 for accounts, characters, and the whole world
For remote hosting, put the compose stack on any VPS, set a real POSTGRES_PASSWORD in the environment, and front port 8787 with a TLS reverse proxy. Caddy makes this a handful of lines; WebSockets are proxied automatically and the client auto-selects wss:// on https pages. Auth endpoints are rate-limited, passwords are scrypt-hashed, and login sessions expire. Never set ALLOW_DEV_COMMANDS=1 in production, since it enables the full /dev cheat set: the level and teleport cheats the test bots use, plus item grants, mob spawns, instance teleports, and the in-game dev command GUI. DEPLOY.md is the full production guide, including the reverse-proxy configuration that keeps the health and metrics endpoints off the public edge.
# pnpm and dependencies installed as in the Offline section above (policy: CONTRIBUTING.md)
cp .env.example .env
# set POSTGRES_PASSWORD and point DATABASE_URL at the same password
pnpm run db:up # postgres 16 in docker (port 5433, volume-persisted)
pnpm run server # authoritative game server on :8787 (REST + WebSocket)
pnpm run dev # client dev server on :5173 (proxies /api, /admin/api, and /ws)
Open http://localhost:5173, choose Play Online, create an account, create a character, and Enter World. The character-select screen shows the latest release news in its News & Updates panel, with NEW badges for anything you have not seen. Open a second tab and log in again to see each other in town. Enter opens chat. The player wiki is the in-repo Guide, served at http://localhost:5173/wiki and at /wiki in production; its content is generated from current game data by npm run wiki:content.
What persists and how the server stays in charge:
Sim and returns interest-scoped snapshots plus per-player events. Every combat roll, loot drop, quest credit, and vendor transaction resolves server-side. The client is a renderer.The same deterministic core runs as a Gymnasium environment, so an agent learns against the actual game, not a reimplementation of it. The env server (headless/env_server.ts) wraps one Sim and speaks newline-delimited JSON over stdio; the Python bindings in python/ launch it as a subprocess and expose the usual reset / step / close loop.
npm run build:env # bundle the env server to dist-env/env_server.cjs
npm run env # run it directly (NDJSON on stdio)
npm run bench # in-process throughput benchmark (no IPC)
# drive it from Python
pip install gymnasium numpy
python python/example_random_agent.py
from wow_env import WoWClassicEnv
env = WoWClassicEnv(player_class="warrior") # any of the nine classes
obs, info = env.reset(seed=42)
obs, reward, terminated, truncated, info = env.step(env.action_space.sample())
env.close()
info reply at startup rather than hardcoding; they grow with the game. The action space is a Discrete covering movement, target, attack, the full ability kit, interact, and eat/drink; the observation is a Box covering self, abilities, target, nearby mobs, the nearest interactable, and quest progress.step applies one action and advances five sim ticks by default, so roughly four decisions per simulated second.Math.random. Seed the reset and the episode replays exactly.The protocol and bindings are documented in headless/CLAUDE.md and python/CLAUDE.md.
World of ClaudeCraft is web3-native around $WOC, our community token on Solana. Connect a Solana wallet, link it to your account with one signature (non-custodial, no transaction to approve), and your read-only $WOC balance shows up in the HUD alongside a cosmetic holder-tier badge.
$WOC also has optional utility in the live game:
docs/prd/woc/marketplace.md).None of this is needed to play. Wallet linking is optional and non-custodial, and the game never sells power: nothing bought from us, in any currency, grants stats, gear, or progression. The marketplace, when it enables, is players trading their own earned items with each other. The whole game plays fine without ever connecting a wallet.
$WOC contract address (Solana):
3WjLscH2JsXLEFJZRA9z8ti8yRGxWGKbqymPd7UicRth
More on the token at worldofclaudecraft.com.
Every class runs on classic-era MMO mechanics implemented from first principles, and learns ranked spells across the whole climb to the level cap.
Heals and buffs land on party members, healing can crit, and absorb shields soak damage before health. Spend points across three talent specs per class; allocation is server-validated and exportable as a build string. Every spellbook, rank, and talent tree is listed in the wiki.
The Gravecaller storyline runs through five-player elite instances at every stage of the climb, a solo crypt sits off to the side for explorers, and the endgame keeps going past the authored set into procedural rift floors.
The elite instances and the raid also run on Heroic: higher-level enemies, sharper mechanics, and their own loot and vendor currency. Past the authored set, ranked rift portals tear open onto seed-generated floors capped by the hand-authored Infernal Citadel, with rare, epic, and legendary loot riding on the rank of the clear. The lead-up quest chains are soloable, so the story is never gated behind finding a group. Boss-by-boss mechanics, loot tables, and the rest of the depth live in the wiki. Our automated five-bot raid (warrior, paladin, priest, mage, hunter with focus-fire and healer AI) clears the Hollow Crypt in about five minutes (node scripts/crypt_raid.mjs, needs ALLOW_DEV_COMMANDS=1).
Delves are a separate, scalable small-group mode for one or two players, rebuilt from randomized chambers on every run and ending on a locked reliquary chest that opens through a lockpicking minigame rather than a loot roll. The Collapsed Reliquary (level 7 and up) ends at Deacon Varric, with an AI companion, Tessa, fighting at your side if you go alone. The Drowned Litany (level 12 and up) follows the trail into a flooded shrine at the edge of Mirefen Marsh. A delve board sets the tier: Heroic raises enemy levels and adds a random affix for richer rewards.
Press G or the arena button to queue. Matchmaking teleports fighters into a private pit, a short countdown heals and resets everyone for a fair start, and the bout ends when a side yields. Nobody dies, and you return exactly where you queued. Protect Yumi is fought in its own maze rather than the Coliseum pit.
Ranked wins and Fiesta takedowns pay Honor, which the quartermaster in town trades for a set of Warfare gear. Warfare is a PvP-only stat, so the set wins duels without ever out-gearing same-tier dungeon loot in PvE.
Press G to open the PvP window (Thornhollow Fields is its primary tab, beside the 1v1 and 2v2 arena brackets) and Enter the Queue, solo or with a party of up to five (parties stay together; solos fill the rest). Two teams of five fight over a walled, open-air field with a keep at each end: steal the enemy banner with a deliberate press of the battleground action key and run it to your own stand. First to 3 captures wins inside a 12-minute cap.
GET /api/battleground/leaderboard), and Honor for played-out wins and losses.Shift+I to browse dungeons and raids, inspect bosses and loot, join an automatic tank/healer/DPS role queue, or create a premade listing. Finder-made groups still travel to the entrance together./p for party chat, /roll to settle loot./afk and /dnd mark you away with an auto-reply to whispers.Shift+P): four gathering trades (mining, logging, herbalism, fishing) feed ten crafts, from cooking and alchemy to weaponcrafting, jewelcrafting, and enchanting. Gathering tools come in tiers that decide which nodes you can work, crafting runs at town workstations with a chance at masterwork quality that carries your maker's mark, and there is an archetype system to discover as you specialize./wiki covering classes, creatures, zones, and deeds, generated straight from live game content so it cannot drift from the world it documents.Shift+Z) of quests, kills, clears, and delights, paying out cosmetic titles you can wear on your nameplate, in chat, and on the boards, plus a HUD tracker for the deeds you are chasing, per-zone Chronicles kept by Chronicler NPCs, and a lifetime Renown leaderboard; the public list lives at /wiki/deeds.| Input | Action |
|---|---|
W / S | run / backpedal. A/D turn (strafe with right mouse held), Q/E strafe |
| right-drag / left-drag | mouselook / orbit camera. Wheel zooms, Space jumps |
Tab / Shift+Tab | cycle nearest enemies forward / backward. left-click to target, right-click to attack, loot, or talk |
1-9, 0, -, = | action bar |
F | interact (loot a corpse, pick up an object, talk) |
C P L M B N T | character, spellbook, quest log, world map, bags, talents, crafting |
G O K I Shift+I Shift+P Shift+Z Shift+X | arena, friends and guild, leaderboard, calendar, Dungeon Finder, professions, deeds, the Reliquary |
Z / X / ` | sheath or draw your weapons, emote wheel, mount or dismount |
V / R / Esc | nameplates, autorun, close the top window (or open the game menu) |
Every binding is remappable in the keybinds panel, and mouse buttons bind like keys: press the middle button (M3) or a thumb button (M4, M5) while binding. Left and right stay reserved for the camera, click to move, and clicking things in the world. Touch controls (a movement stick, camera drag, and on-screen action buttons) come up automatically on mobile.
Three ideas hold the project together:
src/sim/ code runs the offline browser world, the online server, and the RL env. Behavior must be identical everywhere, and the tests exist to keep it that way.IWorld is the only seam. IWorld is defined as per-domain facet interfaces under src/world_api/, aggregated by src/world_api.ts. The offline Sim satisfies it structurally and the online ClientWorld implements it by mirroring server snapshots. The renderer and HUD talk only to IWorld, never to a concrete world, so a new feature extends the matching facet first and then both worlds.The sim is a fixed 20 Hz tick (DT = 1/20), all randomness flows through one seeded Rng, and src/sim/ carries zero DOM, browser, or Three.js imports. That is what lets the same code bundle into a Node env server, an authoritative game loop, and a browser tab without changing a line.
| Path | What it is |
|---|---|
src/sim/ | Deterministic game core, the source of truth. No DOM or Three dependencies. |
src/sim/content/ | Data as code: the nine classes, abilities, zones, dungeons, delves, items, recipes, enchants, talents, professions, deeds. |
src/world_api.ts + src/world_api/ | IWorld, the seam the renderer and HUD depend on: one facet interface per domain. |
src/ (rest) | Three.js renderer, HUD + styles, input/audio, online mirror, and the admin, guide, and editor SPAs. |
server/ | Authoritative server: HTTP and WS, world loop, Postgres, auth, social, moderation. |
server/http/ | The REST request pipeline: table router, middleware, and per-domain route definitions. |
headless/ + python/ | RL env server (env_server.ts) and Python Gym bindings. |
bot/ | Discord bot (roles, relay, activity feed). |
electron/, android/, ios/ | Desktop (Steam) and native mobile shells. |
tests/ | Vitest suite. |
scripts/ | Build, asset, i18n, SFX, screenshot, and browser E2E tooling. |
deploy/ · mediawiki/ | Production first-boot assets and the player-wiki container. |
public/ · docs/ | Static assets (deployed verbatim to the site) and design docs. |
None of this is honour-system: tests/architecture.test.ts scans every sim file for a
forbidden import, a DOM global, or a stray clock or Math.random call, and
tests/world_api_parity.test.ts pins the seam so the two worlds cannot drift.
Most directories carry their own CLAUDE.md with local conventions, and the full set of
project invariants lives in the root CLAUDE.md. Agent contributors start
there, then pick up their runtime's entry point: AGENTS.md plus the
Codex operator guide for Codex, GEMINI.md for Gemini. All
of them route into the same canonical architecture.
Combat, leveling, and threat all run on authentic classic-era rules: rage and energy, hit and dodge tables, armor mitigation, the real XP curve, swing timers, and the global cooldown. It feels the way you remember rather than approximating it. The exact numbers live in src/sim/ if you want to read them.
The world is authored in code rather than in a 3D editor, which is what keeps it small, deterministic, and easy to fork:
scripts/assets/ export deterministic GLBs through the project's image-to-GLB pipeline, alongside a curated library of CC0 model kits. Rigged creature and character families carry full walk, attack, cast, sit, and death animations.Every shipped asset and its license is recorded in CREDITS.md, and bundled third-party dependencies carry their notices in THIRD_PARTY_NOTICES.md.
Besides the game client, the build produces the operator dashboard, the world editor at
/editor, and the public Guide at /wiki, all served from the same dev server.
Every FFmpeg path the gate and the audio tests exercise resolves the bundled
ffmpeg-static/ffprobe-static npm packages, so a normal contribution needs no system
FFmpeg install. The conformance-measuring paths (npm run sfx:check, the audio tests, the
Studio's export validation) bind to the static binaries directly, with no PATH fallback:
rerun pnpm install --frozen-lockfile if a scripts-skipped install left them missing. The Studio's playback and
encode spawns and the npm run gate preflight resolve via scripts/sfx/ffmpeg_paths.mjs,
which does fall back to PATH. Some standalone audio generator scripts (for example
scripts/gen_ui_sfx.mjs) still default to PATH ffmpeg.
npm test # vitest: formulas, combat, AI, quests, all 9 classes, parties, duels, trades, dungeons
node scripts/gate_select.mjs # the selective pre-merge gate (the merge bar, per docs/qa-gate.md)
npm run gate # complete CI-equivalent contribution gate (the deeper check)
npm run build # production web build
npm run sfx:studio # local SFX authoring, runtime mix, and production export
node scripts/smoke_browser.mjs # warrior end-to-end (needs npm run dev)
node scripts/smoke_mage.mjs # mage: casting, polymorph, conjure and drink, death and release
node scripts/visual_tour.mjs # screenshot tour of the zone and UI into tmp/
node scripts/tour_temple.mjs # screenshot tour of the Glimmermere and Drowned Temple into tmp/
node scripts/mp_integration.mjs # API, WS, and persistence checks (server running)
node scripts/social_e2e.mjs # trade and duel over the wire (ALLOW_DEV_COMMANDS=1)
node scripts/arena_visual.mjs # two clients queue and fight a ranked 1v1
node scripts/squad_visual.mjs # several clients queue and play Thornhollow Fields 5v5 CTF (ALLOW_DEV_COMMANDS=1)
node scripts/crypt_raid.mjs # five bots clear the Hollow Crypt (ALLOW_DEV_COMMANDS=1)
Logic and unit tests use Vitest. While iterating, run a single file: npx vitest run tests/sim.test.ts. Interface changes also have an opt-in real-browser suite covering accessibility, keyboard navigation, and touch targets: npm run test:browser. The screenshot and smoke scripts drive real browsers via puppeteer-core and need npm run dev running; the wire-level scripts (mp_integration.mjs, social_e2e.mjs, crypt_raid.mjs) talk to the server directly and need npm run server instead. Browser agents can drive movement through window.__game.controller instead of simulating held keys, for example controller.move({ forward: true }, facingRadians) or compact flags like { f: 1, sr: 1 }.
Checks run in layers, described in docs/qa-gate.md: point your clone at
the shared hooks with git config core.hooksPath .githooks and a fast floor runs before
anything leaves your machine.
For the server commands see Develop online above, CONTRIBUTING.md for the contribution workflow, the SFX Studio tutorial for sound authoring and artifact export, DEPLOY.md for production, and CREDITS.md for asset licenses.
Every player-visible string resolves through t(), and the game ships in 22 locales (English, two Spanish, two French, English Canada, Italian, German, Simplified and Traditional Chinese, Korean, Japanese, Brazilian Portuguese, Russian, Czech, Dutch, Polish, Indonesian, Turkish, Swedish, Vietnamese, and Danish). The sim and server stay language-agnostic: they emit stable keys or English that the client re-localizes at the boundary, which keeps determinism intact. Contributors add English only; the maintainer batch-fills the other locales before each release. The workflow is documented in docs/i18n-scaling/translation-workflow.md.
Contributions of every kind are welcome: code, translations, bug reports, and documentation. Start with CONTRIBUTING.md for setup, read the Code of Conduct, and check SECURITY.md before reporting a vulnerability. New here? Look for issues labeled good first issue, open an issue, or say hello on Discord.
Active development runs on the newest release/vX.Y.Z branch. Look it up rather than assuming, then branch from it and target it with your pull request. Never branch from or target main, which only receives a release branch once that version ships. CONTRIBUTING.md has the one-line command that finds the current one.
The code is MIT licensed, so fork it, remix it, and host your own world. That is the whole point, and nothing else on this page or on our website takes it back.
Three things are licensed separately, so it is worth thirty seconds to know which is which:
| What | License | Can you redistribute it? |
|---|---|---|
| Source code, meaning all of it except the media assets carved out below | MIT | Yes. Commercially too. |
Media assets: models, textures, HDRIs, icons, sounds, fonts (mostly under public/) | Per asset, recorded in CREDITS.md | Mostly yes (most are CC0). Some are not, see below. |
| Name and branding: "World of ClaudeCraft", "Levy Street", the logos | Not licensed | No. |
Fork it and host your own world. That works, and the assets are not in your way. Most of what you see is CC0 public domain (KayKit, Quaternius, Kenney, ambientCG, Poly Haven), and our own generated props, creatures, backdrops and interface sounds ship with the project so a fork runs out of the box. You just can't lift those out and sell them as standalone art.
What you would need to remove or replace before redistributing:
public/ui/skills/ were purchased by Levy Street and may not be redistributed, so buy your own licence if you want to ship them;CREDITS.md is the authoritative list, with a redistribution column per asset. Where an asset is listed there, that license controls over the project's MIT license. That register is still being completed, so a media asset missing from it is unrecorded rather than free: ask before relying on it. Source code is the other way around, and everything not carved out is MIT.
Our Terms of Service cover the hosted game that we run at worldofclaudecraft.com: accounts, conduct, virtual items. They do not restrict the rights the MIT License gives you in this source code.
(top 30 of 59)
TypeScript
91.3%
JavaScript
6.3%
CSS
1.4%
2,251
stars
13,207
commits
TypeScript
primary language
Sep 10, 2026
updated
Quest, group up, and raid a hand-built world, free in your browser. Open source, web3, and online right now.
Official website: https://worldofclaudecraft.com/
English · Español · Español (España) · Français · Français (Canada) · Italiano · Deutsch · 简体中文 · 繁體中文 · 한국어 · 日本語 · Português (Brasil) · Русский · Čeština · Nederlands · Polski · Bahasa Indonesia · Türkçe · Svenska · Tiếng Việt · Dansk
Play now · Host your own world · Train an agent · Web3 · Contributing · Discord

World of ClaudeCraft is a complete classic-era MMO you can play right now in your browser, host yourself with one command, and even train AI agents to play. It is free, open source, and live at worldofclaudecraft.com.
One shared world runs in three places, all from the same game core:
Same seed, same world, everywhere. Much of what you see is still drawn from code at runtime, and the rest is a curated asset set that ships with the project, so a fork runs out of the box.
/wiki, generated straight from live game content so it cannot drift from the world it documents.
![]() Lantern-light in Mirefen Marsh at night | ![]() A dungeon pull goes loud under the green torches |
![]() A crowded hour on the live world | ![]() Every leaf burns gold on the Amberfall road |
![]() Rift warnings roll in on the Palmreach road | ![]() Snowbound lamplight in the Frostveil Reach |
Weather is biome-driven and render-only, so it never touches the deterministic sim:
![]() Clear over the Vale | ![]() Rain over Mirefen Marsh | ![]() Snow on Thornpeak Heights |
Play in your browser at worldofclaudecraft.com, or install the native app for Windows, Linux, macOS, iOS, or Android. Every client connects to the same online world.
Create an account, create a character, and enter the live world. To run that same client/server stack yourself, see Host your own world below.
Offline mode is a local single-player world with no account and no server authority, so it ships in development builds only. Run the dev server and it appears in the mode picker:
# once per machine (match package.json packageManager; Corepack not required;
# full install policy: CONTRIBUTING.md)
npm install -g pnpm@10.34.5
pnpm install --frozen-lockfile
pnpm run dev # then open http://localhost:5173 and choose Play Offline
Name your character, pick any of the nine classes, and you start in Eastbrook Vale (levels 1-7), a market town ringed by hubs: wolf runs to the north, boar meadows east, the Sableweb woods west, Mirror Lake northwest, a burrower-ridden copper dig southwest, and a ruined chapel of restless dead northeast, with Gorrak's bandit camp to the southeast. The north road climbs a mountain pass into Mirefen Marsh (6-13, hub Fenbridge) and on up to Thornpeak Heights (13-20, hub Highwatch). The road no longer ends there: the Ferrywalk sandbar leads east from the vale to the Farshore, a besieged island of rift breaks, and past Thornpeak a thinned seal beneath the mountains opens into the Veiled Hollow and the realms beyond, out to the level-cap frontiers. The world seed is fixed in src/sim/world_seed.ts, so it is the same place every visit.
World of ClaudeCraft ships as full desktop apps for all three major desktop platforms: signed Windows installers, Linux AppImage and deb packages, and signed and notarized universal macOS builds. They use the same game client and online world as the browser, with native packaging and automatic updates.
Online sign-in is Discord and email only, exactly the web flow: email/password logs in inside the app, and "Continue with Discord" opens your default browser on the /desktop-login page, which hands a one-time code back to the app over a worldofclaudecraft:// deep link that the app exchanges for a normal World of ClaudeCraft session token.
npm run electron:dev # Vite + Electron dev shell
npm run electron:pack # local unpacked desktop app
npm run electron:build # website-channel installers (self-updating)
npm run electron:build:steam # SteamPipe depot layouts (in-app updater off)
Point the shell at a different API with VITE_DESKTOP_API_ORIGIN, for example a local server or a staging host:
VITE_DESKTOP_API_ORIGIN=http://127.0.0.1:8787 npm run electron:dev
Override the production API origin for staging builds with VITE_DESKTOP_API_ORIGIN=https://dev.worldofclaudecraft.com (a BUILD-time value: it is baked into the bundle and stamped into the packaged app, and installed builds ignore it as a runtime env var). Steam is a distribution channel (the same Electron bundle, uploaded via SteamPipe), and desktop players can link a Steam account to mirror the deeds they earn into Steam achievements; sign-in itself stays email and Discord. The full release runbook (signing, notarization, publishing an auto-update, SteamPipe depots, the server deploy) is docs/desktop-release.md. iOS and Android ship through Capacitor, with their own runbook in docs/mobile-store-release.md.
cp .env.example .env
# edit .env and set a long random POSTGRES_PASSWORD
docker compose up -d --build # postgres and the game server, fully built
# open http://localhost:8787 for accounts, characters, and the whole world
For remote hosting, put the compose stack on any VPS, set a real POSTGRES_PASSWORD in the environment, and front port 8787 with a TLS reverse proxy. Caddy makes this a handful of lines; WebSockets are proxied automatically and the client auto-selects wss:// on https pages. Auth endpoints are rate-limited, passwords are scrypt-hashed, and login sessions expire. Never set ALLOW_DEV_COMMANDS=1 in production, since it enables the full /dev cheat set: the level and teleport cheats the test bots use, plus item grants, mob spawns, instance teleports, and the in-game dev command GUI. DEPLOY.md is the full production guide, including the reverse-proxy configuration that keeps the health and metrics endpoints off the public edge.
# pnpm and dependencies installed as in the Offline section above (policy: CONTRIBUTING.md)
cp .env.example .env
# set POSTGRES_PASSWORD and point DATABASE_URL at the same password
pnpm run db:up # postgres 16 in docker (port 5433, volume-persisted)
pnpm run server # authoritative game server on :8787 (REST + WebSocket)
pnpm run dev # client dev server on :5173 (proxies /api, /admin/api, and /ws)
Open http://localhost:5173, choose Play Online, create an account, create a character, and Enter World. The character-select screen shows the latest release news in its News & Updates panel, with NEW badges for anything you have not seen. Open a second tab and log in again to see each other in town. Enter opens chat. The player wiki is the in-repo Guide, served at http://localhost:5173/wiki and at /wiki in production; its content is generated from current game data by npm run wiki:content.
What persists and how the server stays in charge:
Sim and returns interest-scoped snapshots plus per-player events. Every combat roll, loot drop, quest credit, and vendor transaction resolves server-side. The client is a renderer.The same deterministic core runs as a Gymnasium environment, so an agent learns against the actual game, not a reimplementation of it. The env server (headless/env_server.ts) wraps one Sim and speaks newline-delimited JSON over stdio; the Python bindings in python/ launch it as a subprocess and expose the usual reset / step / close loop.
npm run build:env # bundle the env server to dist-env/env_server.cjs
npm run env # run it directly (NDJSON on stdio)
npm run bench # in-process throughput benchmark (no IPC)
# drive it from Python
pip install gymnasium numpy
python python/example_random_agent.py
from wow_env import WoWClassicEnv
env = WoWClassicEnv(player_class="warrior") # any of the nine classes
obs, info = env.reset(seed=42)
obs, reward, terminated, truncated, info = env.step(env.action_space.sample())
env.close()
info reply at startup rather than hardcoding; they grow with the game. The action space is a Discrete covering movement, target, attack, the full ability kit, interact, and eat/drink; the observation is a Box covering self, abilities, target, nearby mobs, the nearest interactable, and quest progress.step applies one action and advances five sim ticks by default, so roughly four decisions per simulated second.Math.random. Seed the reset and the episode replays exactly.The protocol and bindings are documented in headless/CLAUDE.md and python/CLAUDE.md.
World of ClaudeCraft is web3-native around $WOC, our community token on Solana. Connect a Solana wallet, link it to your account with one signature (non-custodial, no transaction to approve), and your read-only $WOC balance shows up in the HUD alongside a cosmetic holder-tier badge.
$WOC also has optional utility in the live game:
docs/prd/woc/marketplace.md).None of this is needed to play. Wallet linking is optional and non-custodial, and the game never sells power: nothing bought from us, in any currency, grants stats, gear, or progression. The marketplace, when it enables, is players trading their own earned items with each other. The whole game plays fine without ever connecting a wallet.
$WOC contract address (Solana):
3WjLscH2JsXLEFJZRA9z8ti8yRGxWGKbqymPd7UicRth
More on the token at worldofclaudecraft.com.
Every class runs on classic-era MMO mechanics implemented from first principles, and learns ranked spells across the whole climb to the level cap.
Heals and buffs land on party members, healing can crit, and absorb shields soak damage before health. Spend points across three talent specs per class; allocation is server-validated and exportable as a build string. Every spellbook, rank, and talent tree is listed in the wiki.
The Gravecaller storyline runs through five-player elite instances at every stage of the climb, a solo crypt sits off to the side for explorers, and the endgame keeps going past the authored set into procedural rift floors.
The elite instances and the raid also run on Heroic: higher-level enemies, sharper mechanics, and their own loot and vendor currency. Past the authored set, ranked rift portals tear open onto seed-generated floors capped by the hand-authored Infernal Citadel, with rare, epic, and legendary loot riding on the rank of the clear. The lead-up quest chains are soloable, so the story is never gated behind finding a group. Boss-by-boss mechanics, loot tables, and the rest of the depth live in the wiki. Our automated five-bot raid (warrior, paladin, priest, mage, hunter with focus-fire and healer AI) clears the Hollow Crypt in about five minutes (node scripts/crypt_raid.mjs, needs ALLOW_DEV_COMMANDS=1).
Delves are a separate, scalable small-group mode for one or two players, rebuilt from randomized chambers on every run and ending on a locked reliquary chest that opens through a lockpicking minigame rather than a loot roll. The Collapsed Reliquary (level 7 and up) ends at Deacon Varric, with an AI companion, Tessa, fighting at your side if you go alone. The Drowned Litany (level 12 and up) follows the trail into a flooded shrine at the edge of Mirefen Marsh. A delve board sets the tier: Heroic raises enemy levels and adds a random affix for richer rewards.
Press G or the arena button to queue. Matchmaking teleports fighters into a private pit, a short countdown heals and resets everyone for a fair start, and the bout ends when a side yields. Nobody dies, and you return exactly where you queued. Protect Yumi is fought in its own maze rather than the Coliseum pit.
Ranked wins and Fiesta takedowns pay Honor, which the quartermaster in town trades for a set of Warfare gear. Warfare is a PvP-only stat, so the set wins duels without ever out-gearing same-tier dungeon loot in PvE.
Press G to open the PvP window (Thornhollow Fields is its primary tab, beside the 1v1 and 2v2 arena brackets) and Enter the Queue, solo or with a party of up to five (parties stay together; solos fill the rest). Two teams of five fight over a walled, open-air field with a keep at each end: steal the enemy banner with a deliberate press of the battleground action key and run it to your own stand. First to 3 captures wins inside a 12-minute cap.
GET /api/battleground/leaderboard), and Honor for played-out wins and losses.Shift+I to browse dungeons and raids, inspect bosses and loot, join an automatic tank/healer/DPS role queue, or create a premade listing. Finder-made groups still travel to the entrance together./p for party chat, /roll to settle loot./afk and /dnd mark you away with an auto-reply to whispers.Shift+P): four gathering trades (mining, logging, herbalism, fishing) feed ten crafts, from cooking and alchemy to weaponcrafting, jewelcrafting, and enchanting. Gathering tools come in tiers that decide which nodes you can work, crafting runs at town workstations with a chance at masterwork quality that carries your maker's mark, and there is an archetype system to discover as you specialize./wiki covering classes, creatures, zones, and deeds, generated straight from live game content so it cannot drift from the world it documents.Shift+Z) of quests, kills, clears, and delights, paying out cosmetic titles you can wear on your nameplate, in chat, and on the boards, plus a HUD tracker for the deeds you are chasing, per-zone Chronicles kept by Chronicler NPCs, and a lifetime Renown leaderboard; the public list lives at /wiki/deeds.| Input | Action |
|---|---|
W / S | run / backpedal. A/D turn (strafe with right mouse held), Q/E strafe |
| right-drag / left-drag | mouselook / orbit camera. Wheel zooms, Space jumps |
Tab / Shift+Tab | cycle nearest enemies forward / backward. left-click to target, right-click to attack, loot, or talk |
1-9, 0, -, = | action bar |
F | interact (loot a corpse, pick up an object, talk) |
C P L M B N T | character, spellbook, quest log, world map, bags, talents, crafting |
G O K I Shift+I Shift+P Shift+Z Shift+X | arena, friends and guild, leaderboard, calendar, Dungeon Finder, professions, deeds, the Reliquary |
Z / X / ` | sheath or draw your weapons, emote wheel, mount or dismount |
V / R / Esc | nameplates, autorun, close the top window (or open the game menu) |
Every binding is remappable in the keybinds panel, and mouse buttons bind like keys: press the middle button (M3) or a thumb button (M4, M5) while binding. Left and right stay reserved for the camera, click to move, and clicking things in the world. Touch controls (a movement stick, camera drag, and on-screen action buttons) come up automatically on mobile.
Three ideas hold the project together:
src/sim/ code runs the offline browser world, the online server, and the RL env. Behavior must be identical everywhere, and the tests exist to keep it that way.IWorld is the only seam. IWorld is defined as per-domain facet interfaces under src/world_api/, aggregated by src/world_api.ts. The offline Sim satisfies it structurally and the online ClientWorld implements it by mirroring server snapshots. The renderer and HUD talk only to IWorld, never to a concrete world, so a new feature extends the matching facet first and then both worlds.The sim is a fixed 20 Hz tick (DT = 1/20), all randomness flows through one seeded Rng, and src/sim/ carries zero DOM, browser, or Three.js imports. That is what lets the same code bundle into a Node env server, an authoritative game loop, and a browser tab without changing a line.
| Path | What it is |
|---|---|
src/sim/ | Deterministic game core, the source of truth. No DOM or Three dependencies. |
src/sim/content/ | Data as code: the nine classes, abilities, zones, dungeons, delves, items, recipes, enchants, talents, professions, deeds. |
src/world_api.ts + src/world_api/ | IWorld, the seam the renderer and HUD depend on: one facet interface per domain. |
src/ (rest) | Three.js renderer, HUD + styles, input/audio, online mirror, and the admin, guide, and editor SPAs. |
server/ | Authoritative server: HTTP and WS, world loop, Postgres, auth, social, moderation. |
server/http/ | The REST request pipeline: table router, middleware, and per-domain route definitions. |
headless/ + python/ | RL env server (env_server.ts) and Python Gym bindings. |
bot/ | Discord bot (roles, relay, activity feed). |
electron/, android/, ios/ | Desktop (Steam) and native mobile shells. |
tests/ | Vitest suite. |
scripts/ | Build, asset, i18n, SFX, screenshot, and browser E2E tooling. |
deploy/ · mediawiki/ | Production first-boot assets and the player-wiki container. |
public/ · docs/ | Static assets (deployed verbatim to the site) and design docs. |
None of this is honour-system: tests/architecture.test.ts scans every sim file for a
forbidden import, a DOM global, or a stray clock or Math.random call, and
tests/world_api_parity.test.ts pins the seam so the two worlds cannot drift.
Most directories carry their own CLAUDE.md with local conventions, and the full set of
project invariants lives in the root CLAUDE.md. Agent contributors start
there, then pick up their runtime's entry point: AGENTS.md plus the
Codex operator guide for Codex, GEMINI.md for Gemini. All
of them route into the same canonical architecture.
Combat, leveling, and threat all run on authentic classic-era rules: rage and energy, hit and dodge tables, armor mitigation, the real XP curve, swing timers, and the global cooldown. It feels the way you remember rather than approximating it. The exact numbers live in src/sim/ if you want to read them.
The world is authored in code rather than in a 3D editor, which is what keeps it small, deterministic, and easy to fork:
scripts/assets/ export deterministic GLBs through the project's image-to-GLB pipeline, alongside a curated library of CC0 model kits. Rigged creature and character families carry full walk, attack, cast, sit, and death animations.Every shipped asset and its license is recorded in CREDITS.md, and bundled third-party dependencies carry their notices in THIRD_PARTY_NOTICES.md.
Besides the game client, the build produces the operator dashboard, the world editor at
/editor, and the public Guide at /wiki, all served from the same dev server.
Every FFmpeg path the gate and the audio tests exercise resolves the bundled
ffmpeg-static/ffprobe-static npm packages, so a normal contribution needs no system
FFmpeg install. The conformance-measuring paths (npm run sfx:check, the audio tests, the
Studio's export validation) bind to the static binaries directly, with no PATH fallback:
rerun pnpm install --frozen-lockfile if a scripts-skipped install left them missing. The Studio's playback and
encode spawns and the npm run gate preflight resolve via scripts/sfx/ffmpeg_paths.mjs,
which does fall back to PATH. Some standalone audio generator scripts (for example
scripts/gen_ui_sfx.mjs) still default to PATH ffmpeg.
npm test # vitest: formulas, combat, AI, quests, all 9 classes, parties, duels, trades, dungeons
node scripts/gate_select.mjs # the selective pre-merge gate (the merge bar, per docs/qa-gate.md)
npm run gate # complete CI-equivalent contribution gate (the deeper check)
npm run build # production web build
npm run sfx:studio # local SFX authoring, runtime mix, and production export
node scripts/smoke_browser.mjs # warrior end-to-end (needs npm run dev)
node scripts/smoke_mage.mjs # mage: casting, polymorph, conjure and drink, death and release
node scripts/visual_tour.mjs # screenshot tour of the zone and UI into tmp/
node scripts/tour_temple.mjs # screenshot tour of the Glimmermere and Drowned Temple into tmp/
node scripts/mp_integration.mjs # API, WS, and persistence checks (server running)
node scripts/social_e2e.mjs # trade and duel over the wire (ALLOW_DEV_COMMANDS=1)
node scripts/arena_visual.mjs # two clients queue and fight a ranked 1v1
node scripts/squad_visual.mjs # several clients queue and play Thornhollow Fields 5v5 CTF (ALLOW_DEV_COMMANDS=1)
node scripts/crypt_raid.mjs # five bots clear the Hollow Crypt (ALLOW_DEV_COMMANDS=1)
Logic and unit tests use Vitest. While iterating, run a single file: npx vitest run tests/sim.test.ts. Interface changes also have an opt-in real-browser suite covering accessibility, keyboard navigation, and touch targets: npm run test:browser. The screenshot and smoke scripts drive real browsers via puppeteer-core and need npm run dev running; the wire-level scripts (mp_integration.mjs, social_e2e.mjs, crypt_raid.mjs) talk to the server directly and need npm run server instead. Browser agents can drive movement through window.__game.controller instead of simulating held keys, for example controller.move({ forward: true }, facingRadians) or compact flags like { f: 1, sr: 1 }.
Checks run in layers, described in docs/qa-gate.md: point your clone at
the shared hooks with git config core.hooksPath .githooks and a fast floor runs before
anything leaves your machine.
For the server commands see Develop online above, CONTRIBUTING.md for the contribution workflow, the SFX Studio tutorial for sound authoring and artifact export, DEPLOY.md for production, and CREDITS.md for asset licenses.
Every player-visible string resolves through t(), and the game ships in 22 locales (English, two Spanish, two French, English Canada, Italian, German, Simplified and Traditional Chinese, Korean, Japanese, Brazilian Portuguese, Russian, Czech, Dutch, Polish, Indonesian, Turkish, Swedish, Vietnamese, and Danish). The sim and server stay language-agnostic: they emit stable keys or English that the client re-localizes at the boundary, which keeps determinism intact. Contributors add English only; the maintainer batch-fills the other locales before each release. The workflow is documented in docs/i18n-scaling/translation-workflow.md.
Contributions of every kind are welcome: code, translations, bug reports, and documentation. Start with CONTRIBUTING.md for setup, read the Code of Conduct, and check SECURITY.md before reporting a vulnerability. New here? Look for issues labeled good first issue, open an issue, or say hello on Discord.
Active development runs on the newest release/vX.Y.Z branch. Look it up rather than assuming, then branch from it and target it with your pull request. Never branch from or target main, which only receives a release branch once that version ships. CONTRIBUTING.md has the one-line command that finds the current one.
The code is MIT licensed, so fork it, remix it, and host your own world. That is the whole point, and nothing else on this page or on our website takes it back.
Three things are licensed separately, so it is worth thirty seconds to know which is which:
| What | License | Can you redistribute it? |
|---|---|---|
| Source code, meaning all of it except the media assets carved out below | MIT | Yes. Commercially too. |
Media assets: models, textures, HDRIs, icons, sounds, fonts (mostly under public/) | Per asset, recorded in CREDITS.md | Mostly yes (most are CC0). Some are not, see below. |
| Name and branding: "World of ClaudeCraft", "Levy Street", the logos | Not licensed | No. |
Fork it and host your own world. That works, and the assets are not in your way. Most of what you see is CC0 public domain (KayKit, Quaternius, Kenney, ambientCG, Poly Haven), and our own generated props, creatures, backdrops and interface sounds ship with the project so a fork runs out of the box. You just can't lift those out and sell them as standalone art.
What you would need to remove or replace before redistributing:
public/ui/skills/ were purchased by Levy Street and may not be redistributed, so buy your own licence if you want to ship them;CREDITS.md is the authoritative list, with a redistribution column per asset. Where an asset is listed there, that license controls over the project's MIT license. That register is still being completed, so a media asset missing from it is unrecorded rather than free: ask before relying on it. Source code is the other way around, and everything not carved out is MIT.
Our Terms of Service cover the hosted game that we run at worldofclaudecraft.com: accounts, conduct, virtual items. They do not restrict the rights the MIT License gives you in this source code.
(top 30 of 59)
TypeScript
91.3%
JavaScript
6.3%
CSS
1.4%