Skip to main content

Architecture

Xindeler is a voxel MMORPG in Rust with a 3D graphical client, a monolithic server, and the game's own AI systems (ORACLE, AURORA) integrated in.

Overview​

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Client (Voxygen) β”‚
β”‚ wgpu renderer Β· egui UI Β· audio β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ Xindeler Protocol (QUIC/Quinn)
β”‚ port 14004
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Server (single process) β”‚
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ ECS β”‚ β”‚ rtsim β”‚ β”‚ ORACLE / AURORA β”‚ β”‚
β”‚ β”‚ (specs) β”‚ β”‚ world β”‚ β”‚ (world director β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ sim β”‚ β”‚ + NPC AI) β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚
β”‚ Persistence: rtsim/data.dat (MessagePack) β”‚
β”‚ Events: chronicle/*.jsonl β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ REST (port 8010)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ FastAPI (separate process) β”‚
β”‚ /api/waitlist Β· /api/contribute β”‚
β”‚ Persistence: CSV on VPS β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

The server is a monolithic process​

The server is a single Rust binary. There are no microservices, no separate "Login Server" or "Combat Server". The subsystems (combat, economy, world simulation, ORACLE, AURORA) are modules within the same process that share memory and communicate directly.

This simplifies deployment, state consistency, and local development β€” with cargo run --bin xindeler-server you have everything running.


ECS (Entity Component System)​

The core of the game uses the ECS paradigm via the specs crate. Instead of objects with inheritance, everything is modeled as:

  • Entity β€” a numeric ID (a player, an NPC, an item in the world)
  • Component β€” data attached to an entity (Health, Pos, Vel, Stats, Inventory)
  • System β€” logic that operates on sets of components (CombatSystem, PhysicsSystem, AISystem)

Systems run in parallel when they have no dependencies on each other. Components are simple structs serializable with serde.


rtsim β€” World simulation​

rtsim is the module that maintains the world's persistent state between sessions:

  • Sites (cities, dungeons, points of interest)
  • Factions and their relationships
  • NPCs with long-term state (position, relationships, inventory)
  • The event chronicle (JSONL rotated by size)

The state is serialized to rtsim/data.dat in MessagePack format. There is no relational database β€” everything lives in that file.


Client-server communication​

The client and server communicate exclusively via the Xindeler protocol β€” a proprietary binary protocol over QUIC (using the Quinn crate). There is no REST API, no WebSockets for the game.

The only REST API is FastAPI (port 8010), which handles the waitlist and contributors β€” it has no access to the game state.


ORACLE and AURORA​

These are the two AI systems that run inside the server as extensions of rtsim:

  • ORACLE β€” World director: generates narrative events, manages the ecosystem, controls weather and long-term story arcs.
  • AURORA β€” NPC AI: each NPC has a mind with values, fears, episodic memory, and social relationships. AURORA uses an optional LLM layer for generative dialogue.

Both are controlled via admin chat commands (/oracle, /aurora). Their detailed documentation is in the corresponding sections.


FastAPI (web, separate process)​

An independent Python process exposes a minimal REST API for the website:

EndpointDescription
POST /api/waitlistRegister an email on the waitlist
POST /api/contributeContributors form
GET /api/statusServer status (online/offline, players)

Persistence: CSV files on the VPS. Does not share a database with the game.