---
title: "Civitas"
url: "https://aigamehub.app/ja/games/civitas-f09314"
source: "https://github.com/reneodlt/civitas"
source_type: "github"
play_url: "https://civitas.reneo.app"
platform: "desktop"
login_required: false
pricing: "free"
origin: "original"
ai_tools: ["Claude Code"]
game_languages: ["en"]
author: "reneodlt"
author_handle: "reneodlt"
category: "シミュレーション"
categories: ["simulation"]
tags: ["city-builder", "multiplayer", "open-source", "three.js", "typescript"]
added: "2026-10-19T13:22:30.741Z"
updated: "2026-10-19T13:22:30.741Z"
locale: "ja"
content_locale: "ja"
---

# Civitas

Civitas は、クライアントに three.js、WebSockets 上に権威的な TypeScript シミュレーションサーバーを備えた、ブラウザベースのマルチプレイヤー都市建設ゲームです。プレイヤーは土地を購入・管理し、土地をゾーニングし、道路を建設し、税率を設定します。市民は個別にシミュレーションされ、スポーンした場所に住み、接続された道路網上で最も近い仕事を見つけ、毎日通勤し、働く区画の所有者に所得税を、住む区画の所有者に固定資産税を支払います。ブラウザで動作し、リポジトリ経由でセルフホストすることもできます。

## Description

Civitas（README では msimcity とも呼ばれる）は、ウェブベースのマルチプレイヤーで無限の都市建設ゲームです。クライアントは three.js を使用し、権威的な TypeScript シミュレーションサーバーは WebSockets を介して通信し、共有パッケージが両側のワールド形式を定義しています。プレイヤーは土地を購入・管理しますが、市民はプレイヤーに所有されません。市民はそれをスポーンした住宅建物に住み、接続された道路網上のどこでも最も近い仕事を探し、毎日そこへ通勤し、働く区画の所有者に所得税を、住む区画の所有者に固定資産税を支払います。競争と協力は、壁ではなく、ゾーニング、道路、税率を通じて行われます。同じサーバーに参加する複数のブラウザは 1 つのワールドを共有します。建物はデータファイルとして定義され、ゲームが読み取るテーブルにコンパイルされ、ビューアページがすべての種類、レベル、デザインを表示します。このプロジェクトは AGPL-3.0 ライセンスで、npm install と npm run dev でローカルに実行するか、本番環境では npm run build と npm start で実行できます。Dockerfile が含まれており、/data をマウントすることでワールドを永続化できます。環境変数はポート、ホスト、シード、ワールドファイル、静的ディレクトリをカバーし、読み取り専用のショーケースモード（SPECTATE=1）も利用できます。作者は、このプロジェクトが Claude Code で構築されたと述べています。

## Original post

Civitas: a browser-based multiplayer city builder in three.js and TypeScript where every citizen is simulated. Built with Claude Code. AGPL-3.0.

Topics: city-builder, claude-code, game, multiplayer, simulation, threejs, typescript

# msimcity A web-based, multiplayer, unbounded city builder platform. three.js on the client, an authoritative TypeScript simulation server over WebSockets, and a shared package so both sides agree on the world format. The core idea: players buy and manage **land parcels**, but **citizens are not theirs**. A citizen lives in whichever residential building spawned them, looks for the nearest job anywhere on the connected road network, commutes there every day, pays income tax to whoever owns the parcel they work in and property tax to whoever owns the parcel they live in. Players compete and cooperate through zoning, roads and tax rates, not through walls. ## Run it ```sh npm install npm run dev # server on :8080 and Vite client on :5173, both bound to 0.0.0.0 ``` Open `http://<your-lan-ip>:5173/` (the Vite banner lists the addresses), pick a name, and you are in. Every browser that joins shares the same world. Buildings are data: `packages/shared/src/buildings/` holds one file per kind family, and `npm run buildings:compile` (run automatically by dev and build) turns it into the tables the game reads. `/viewer.html` shows every kind, level and design on a turntable by day and night. Format and a worked example: `docs/buildings.md`. `npm run buildings:check` is its snapshot test. Production: `npm run build` then `npm start`. The server then serves the built client and the WebSocket on one port (default 8080). A `Dockerfile` is included; mount `/data` to keep the world across restarts. Environment: `PORT`, `HOST`, `SEED` (new worlds only), `WORLD_FILE`, `STATIC_DIR`. Dev knobs: `SIM_STEPS=10` fast-forwards (ten simulation ticks per interval), `SEED_BUILT=3` starts a new world with the Commons already built to that level, and a file named `RESET` next to the world file makes the next start discard it. Client: `VITE_WS_URL` to point at a server on another host, or `?ws=host:port`. `TEST_CITY_BASE_PORT` (default 8100) moves the test-city ports. A public showcase (`docs/demo.md`, "A public showcase"): `SPECTATE=1` makes the whole deployment read-only for every client, the live world and every demo child alike (the children inherit it). The server refuses every intent that changes the world with a "Read-only showcase" toast (a whitelist in `net.ts`, `READ_ONLY`: subscriptions, inspects, the lines list, the charts), and the HTTP API refuses demo stop and reset and test-city start and stop (403); starting a demo still works, as that is how a visitor gets in. The page hides the tool bar, the treasury, the tech tree, Reset demo and the context menu's changes, and joins at once as a made-up "Visitor 1234" instead of showing the join form. `DEFAULT_DEMO=<id>` (e.g. `london`) sends a page opened without `?demo=`, `?ws=` or `?city=` to that demo instead of the live world, and the server starts it as it starts; with `SPECTATE` it is then the only demo the server lists, starts or joins (a `?demo=<other>` link opens it instead). The page reads both from `GET /api/
