Architectural overview of the Maya domain: library organization, polyglot technology choices, design patterns, and dependency graph.
Maya is Oshun's Infinite Virtual Universe Creation domain — the engineering stack that lets teams build interlinked metaverses, VR social platforms, liveable virtual cities, and games. Getting there requires a polyglot architecture: the parts of the engine that must be extremely fast (world simulation, rendering, physics, audio, NPC AI) live as Rust crates, while the parts that benefit from rapid iteration and broad ecosystem tooling (platform abstraction, services, schemas, tooling, developer documentation) live as TypeScript/Node.js libraries.
Today the domain ships 17 libraries under libs/maya/ — one Rust Cargo
workspace (engine-core) holding 28 crates, nine substantial TypeScript
libraries, and seven single-module TypeScript readiness-evaluation facades.
There is no apps/maya/ or services/maya/. The sections below explain how
these pieces fit together, why each technology boundary exists where it does,
and what the intended deployment topology looks like.
Guiding Principles#
- Polyglot by necessity — Performance-critical subsystems (engine kernel,
renderer, physics, audio, world partitioning, NPC AI, multiplayer, procedural
generation) are written in Rust as crates in the
engine-coreCargo workspace. Platform, service, schema, tooling, and reference layers are TypeScript/Node.js libraries. - One engine workspace, many crates — Rather than a separate
libs/maya/directory per engine subsystem, the engine is one Cargo workspace (engine-core) of 28 crates. Crate-to-crate dependencies are declared explicitly in the workspaceCargo.toml. - Readiness facades over runtimes — Seven single-module TypeScript
libraries (
genesis-*,physics,renderer,scene,world) provide typedevaluateMaya*readiness scoring for the correspondingengine-corecrates; they let orchestration code reason about engine configuration without depending on the Rust runtime directly. - AI-native —
maya-soulsintegrates LLM-powered NPCs behind a provider-neutral chat-completion layer; AI calls are async and latency tolerant outside the real-time tick loop. - Backend-agnostic abstractions — The renderer, physics, audio, and XR crates model their domains with vendor-neutral Rust types. Concrete GPU, physics-engine, audio, and headset SDK bindings are abstracted behind traits/structs and are not yet bound to a specific vendor.
An earlier draft listed a
wasm-bindgen/wasm-pack/napi-rs"WASM bridge" principle. No WASM or native-binding tooling is present in theengine-coreworkspace today; that bridge is(planned).
High-Level Architecture#
The diagram below shows the four main vertical layers — client, engine, server, and database — and the supporting TypeScript libraries that sit alongside them. Data flows from top to bottom at runtime: clients talk to the TypeScript SDK, which talks to the engine (Rust), which the server orchestrates, which the database persists.
┌─────────────────────────────────────────────────────────────────────────────┐
│ CLIENT LAYER │
│ Desktop · Mobile · WebGPU/WebXR browser · VR (Quest/SteamVR/Vision Pro) │
└──────────────────────────────────┬──────────────────────────────────────────┘
│
┌──────────────────────────────────▼──────────────────────────────────────────┐
│ @maya/client (TypeScript SDK) │
│ Platform abstraction · Per-platform builds · Asset loading · Input │
└──────────────────────────────────┬──────────────────────────────────────────┘
│
┌──────────────────────────────────▼──────────────────────────────────────────┐
│ @maya/engine-core — Rust Cargo workspace │
│ Kernel · ECS · jobs/fibers · math/alloc/spatial · world/time · renderer · │
│ physics · audio · atmosphere · embodiment · souls · nexus · immersion · │
│ genesis-terrain/urban/flora (28 crates; TS readiness facade on top) │
└──────────────────────────────────┬──────────────────────────────────────────┘
│
┌──────────────────────────────────▼──────────────────────────────────────────┐
│ @maya/server (TypeScript) │
│ Fixed-timestep world loop · sessions · zone handoff · social · economy │
└──────────────────────────────────┬──────────────────────────────────────────┘
│
┌──────────────────────────────────▼──────────────────────────────────────────┐
│ @maya/database (TypeScript) │
│ Schemas + validators + DDL generators · repository / query-builder layer │
└─────────────────────────────────────────────────────────────────────────────┘
@maya/games · @maya/inspirations · @maya/testing · @maya/tooling ·
@maya/documentation — supporting TypeScript libraries
@maya/{genesis-terrain,genesis-urban,genesis-flora,physics,renderer,
scene,world} — single-module readiness-evaluation facades
Library Organization#
17 libraries exist today under libs/maya/. There is no apps/maya/ or
services/maya/. The polyglot story is real but smaller than the planned
~120-library hierarchy earlier drafts of this document described: the engine
kernel, renderer, physics, audio, atmosphere, avatars, NPCs, multiplayer, VR/XR,
and procedural-generation runtimes all live as Rust crates inside the single
engine-core Cargo workspace — not as separate top-level libs/maya/engine,
libs/maya/nexus, libs/maya/souls, etc. directories.
The tree below uses indented comments to name the 28 engine crates and labels each TypeScript library with its primary responsibility:
libs/maya/
│
│ ── Polyglot Rust workspace ─────────────────────────────────────────
├── engine-core/ # Cargo workspace, 28 crates (~1074 files):
│ │ # maya-kernel, maya-ecs, maya-jobs,
│ │ # maya-fibers, maya-alloc, maya-math,
│ │ # maya-spatial, maya-scene, maya-resource,
│ │ # maya-hot-reload, maya-serialize,
│ │ # maya-reflect, maya-events, maya-world,
│ │ # maya-time, maya-renderer, maya-physics,
│ │ # maya-audio, maya-atmosphere,
│ │ # maya-embodiment, maya-souls, maya-nexus,
│ │ # maya-immersion, maya-genesis-terrain,
│ │ # maya-genesis-urban, maya-genesis-flora,
│ │ # maya-plugin-api, maya-integration-tests.
│ └── src/index.ts # Thin TS readiness facade over the engine.
│
│ ── TypeScript libraries (real domain code) ─────────────────────────
├── client/ # Client SDK: platform abstraction, per-platform builds
├── database/ # Schemas, validators, DDL generators, data-access layer
├── documentation/ # API-doc generation + tutorial modules
├── games/ # 19 sub-modules: combat, mmo, survival, quests, …
├── inspirations/ # City / fictional-universe / biome reference data
├── server/ # Node.js service modules (world loop, sessions, …)
├── testing/ # Unit / integration / visual test harness modules
├── tooling/ # World-editor, profiling, and asset-tool modules
│
│ ── TypeScript readiness-evaluation facades (single-module each) ─────
├── genesis-terrain/ # evaluateMayaGenesisTerrainEnvironment()
├── genesis-urban/ # evaluateMayaGenesisUrbanEnvironment()
├── genesis-flora/ # evaluateMayaGenesisFloraLandscape()
├── physics/ # evaluateMayaPhysicsSimulation()
├── renderer/ # evaluateMayaRendererPass()
├── scene/ # evaluateMayaSceneVirtualSet()
└── world/ # evaluateMayaWorldVirtualEnvironment()
The seven single-module libraries are readiness-evaluation facades, not
empty scaffolds and not full procedural-generation engines. Each exports a
domain-specific evaluateMaya* function with real scoring formulas plus its
input/issue/evaluation types — their package.json descriptions say so verbatim
(e.g. @maya/renderer is the "TypeScript facade for Maya renderer GI,
virtualized geometry, and neural rendering readiness"). The runtime engines
they describe are the maya-renderer, maya-physics, maya-world, and
maya-genesis-* Rust crates inside engine-core.
The earlier draft listed
engine-coreas a "TypeScript scaffold; Rust/WASM planned". That is stale:engine-coreis a 28-crate Rust Cargo workspace today. Theengine,genesis,embodiment,souls,nexus,immersion,forge,treasury,mirror,atmosphere,standards, andspatial-artop-level library groups described in older drafts do not exist aslibs/maya/directories — their functionality is either anengine-corecrate or(planned).
Rust Crate Architecture (@maya/engine-core)#
libs/maya/engine-core/ is a Cargo workspace configured for maximum
performance: edition = "2021", resolver 2, release profile lto = true /
codegen-units = 1 / opt-level = "s". It contains 28 member crates.
Importantly, the crates depend only on standard ecosystem crates — serde,
bincode, thiserror, libloading, notify, parking_lot, crossbeam-*,
uuid, semver, bitflags, glam, bytemuck. There is no wgpu,
rapier, cpal, wasm-bindgen, or vendor SDK in the workspace today; the
renderer, physics, and audio crates are backend-agnostic Rust modules with their
concrete vendor bindings still to come.
Engine Kernel — maya-kernel#
The kernel is the runtime's boot-and-plugin manager. It ties together three subsystems:
EngineKernelties together aPluginRegistry, aHotReloadWatcher(built on thenotifycrate), and aDependencyResolver(topological sort with circular-dependency detection).NativePluginLoaderloads dynamic native plugins vialibloading.- The frame loop runs phased plugin dispatch; inter-plugin messages travel over
crossbeam-channel.
ECS, Jobs, Fibers — maya-ecs / maya-jobs / maya-fibers#
These three crates form Maya's data and execution model: entities and components describe what exists; jobs and fibers describe how it runs.
maya-ecs— archetype-based ECS with generationalEntityindices, Structure-of-Arrays component columns (BlobVec), and an archetype graph. Systems iterate components with cache-friendly linear access.maya-jobs— Chase-Lev work-stealing job pool (crossbeam-deque) with DAG dependencies, job groups, scoped execution, and parallel-for. Distributes CPU-bound work across all available cores.maya-fibers— cooperative coroutine executor over Rustasync/await, tick-driven, suspension only at.await. Allows long-running async operations (e.g. network calls) to coexist with the real-time tick loop.
Renderer — maya-renderer#
The renderer is a frame-graph pipeline, meaning render passes are declared as nodes in a directed acyclic graph rather than hardcoded in a fixed sequence. This lets the runtime infer barriers, resource lifetimes, and pass ordering automatically.
- Frame-graph render pipeline:
render_graphbuilds a DAG of render passes with automatic resource lifetime, barrier, and ordering inference. - ~94 feature modules (shadows, anti-aliasing, adaptive resolution, async compute, auto-LOD, bindless, materials, …).
- Backend-agnostic — no concrete GPU API binding present in the crate.
Physics — maya-physics#
The physics crate provides a complete multi-physics layer covering rigid bodies, cloth, fluids, destruction, and character simulation. A backend-selection registry allows different solver implementations to be plugged in without changing the public API:
PhysicsBackendRegistryselects a backend from requested capabilities;PhysicsSceneConfig,CollisionLayerSet,PhysicsMaterialSet,ConstraintSet,RagdollArticulation,VehicleConfig,BuoyancySimulator,PhysicsInterpolator,CollisionEventDispatcher.- Cloth solvers (
MassSpringCloth,PbdCloth,GpuClothSolver), fluid (FLIP/GPU/cache), Voronoi destruction, and secondary-motion modules. - Backend-agnostic — no Rapier/Havok/PhysX FFI binding present in the crate.
World Partitioning — maya-world#
Large open worlds exceed the size where all data can live in memory. The world crate manages a streaming chunk grid so that only the player's local neighbourhood is ever loaded:
WorldGrid<T>ofChunk<T>addressed by integerChunkCoord.ChunkStatelifecycle FSM:Unloaded → Loading → Active ⇄ Frozen → Unloading → Unloaded.StreamingManager/StreamingPipelineschedule load/unload aroundFocusPoints;LodCalculatorassigns distance-based LOD;OriginRebaserebases the coordinate origin near the player for large-world floating-point precision.
TypeScript Service Architecture#
@maya/server#
server is a TypeScript Node.js library (src/index.ts barrel) of ~27 service
modules. The central runtime piece is WorldSimulationLoop
(world-simulation-loop.ts) — a fixed-timestep loop with spiral-of-death
prevention configured by SimulationLoopConfig (fixedTimestep_ms,
maxSubsteps, catchUpFactor) and emitting SimulationTicks to registered
callbacks.
Surrounding the simulation loop, the server library covers the full range of live-service concerns: game-server application lifecycle, player connection management, session management, anti-cheat, server-side physics, AI-NPC simulation, economy transactions, event broadcasting, server clustering, zone handoff, metrics, administration, hot-reload, social graph, matchmaking, achievements, leaderboards, content moderation, asset storage, analytics, user management, inventory, payment processing, and email integration.
No HTTP framework (Hono), WebSocket package, or Kafka event-bus import was found in
@maya/serversource. The earlier draft's claims of a Hono API,@oshun/websocketsync, worker-thread-per-zone, and a Kafka bus are (planned), not shipped.
UGC Scripting Sandbox — (planned)#
The Maya feature roadmap describes a capability-gated UGC scripting sandbox with
a MayaScriptingAPI global and per-tick resource limits. No scripting sandbox
library exists on disk (vm2 / isolated-vm are not in Maya's dependency
set); this remains (planned).
Nx Build Targets#
Nx orchestrates both the Rust and TypeScript builds through the
nx:run-commands executor. The engine-core project targets currently compile
a 10-crate subset of the full workspace for speed — the remaining 18 crates
are built via the package.json cargo scripts. The exact 10 crates in the Nx
subset are shown in the project.json snippet below:
{
"name": "maya-engine-core",
"tags": ["scope:maya", "type:rust", "layer:engine"],
"targets": {
"check": {
"executor": "nx:run-commands",
"options": {
"command": "cd libs/maya/engine-core && cargo check -p maya-kernel -p maya-renderer -p maya-scene -p maya-world -p maya-resource -p maya-ecs -p maya-math -p maya-plugin-api -p maya-jobs -p maya-time"
}
},
"build": {
"executor": "nx:run-commands",
"options": {
"command": "cd libs/maya/engine-core && cargo build --release -p maya-kernel -p maya-renderer -p maya-scene -p maya-world -p maya-resource -p maya-ecs -p maya-math -p maya-plugin-api -p maya-jobs -p maya-time"
}
},
"test": {
"executor": "nx:run-commands",
"options": {
"command": "cd libs/maya/engine-core && cargo test -p maya-kernel -p maya-renderer -p maya-scene -p maya-world -p maya-resource -p maya-ecs -p maya-math -p maya-plugin-api -p maya-jobs -p maya-time"
}
},
"test:integration": {
"executor": "nx:run-commands",
"options": {
"command": "cd libs/maya/engine-core && cargo test -p maya-integration-tests -- --nocapture"
}
},
"lint": {
"executor": "nx:run-commands",
"options": {
"command": "cd libs/maya/engine-core && cargo clippy -p maya-kernel -p maya-renderer -p maya-scene -p maya-world -p maya-resource -p maya-ecs -p maya-math -p maya-plugin-api -p maya-jobs -p maya-time"
}
},
"format": {
"executor": "nx:run-commands",
"options": {
"command": "cd libs/maya/engine-core && cargo fmt --all -- --check"
}
}
}
}
The full 28-crate workspace also builds via the engine-core/package.json
scripts cargo:check, cargo:build, cargo:test, cargo:test:integration,
cargo:clippy, and cargo:fmt. No wasm-pack target exists. Each TypeScript
library defines build (tsc -p tsconfig.lib.json), lint
(eslint src --ext .ts), typecheck, and test (vitest run) targets.
Design Patterns#
Entity-Component-System (ECS)#
maya-ecs implements an archetype-based ECS inspired by bevy_ecs / hecs /
legion. The key insight of an archetype ECS is that entities sharing the same
component signature are stored together in the same table, so iterating over all
"physics bodies" or all "renderable meshes" is a tight linear memory scan with
no pointer chasing.
Entities are generational indices; components live in Structure-of-Arrays
archetype columns (BlobVec) for cache-friendly linear iteration. The World
exposes spawn / despawn / add_component / remove_component and query /
query2 / query3 iteration over archetypes matching a component signature.
Frame-Graph Rendering#
maya-renderer's render_graph module models the renderer as a directed
acyclic graph of render passes. Rather than manually scheduling barriers and
resource transitions (a major source of GPU bugs in traditional engines), the
graph declares what each pass reads and writes — and the compiler infers correct
ordering.
The graph builder declares texture resources (TextureDesc, TextureFormat,
ResourceUsage flags) and per-pass read/write attachments; compile() infers
resource lifetimes and pass ordering. The renderer is currently backend-agnostic
— no concrete Vulkan/Metal/DX12/WebGPU backend is bound in the crate.
Spatial Acceleration#
Several engine systems need to answer proximity queries quickly: the renderer asks "which objects are in the camera frustum?", physics asks "which bodies might be touching?", AI asks "which NPCs are within perception range?". Maya provides three complementary data structures for these queries:
maya-spatialprovides a loose octree for dynamic scenes, a binned-SAH BVH for static geometry ray intersection, and a balanced k-d tree for nearest-neighbour queries.maya-worldadds chunk-grid streaming with distance-based LOD assignment for large worlds.
Mod Sandboxing — (planned)#
A capability-gated mod sandbox (permissions declared at install time, no runtime
escalation) is part of the Maya roadmap. No modding library exists on disk; this
pattern is (planned).
Cross-Domain Dependencies#
Maya is deliberately a mostly self-contained domain at this stage of development. It owns its engine, services, and data schemas internally rather than depending on shared Oshun infrastructure. This keeps the engine build hermetic and ensures that iterating on the Maya stack does not require changes in other domains.
The only implemented cross-domain coupling today is the Hathor integration:
games/src/hathor/* imports worldbuilding data (world data, cultural rules,
religion/belief, language/naming, economic model) into Maya's game systems.
Hathor owns the narrative simulation layer that gives Maya worlds cultural
depth, so the dependency flows in one direction — Maya consumes Hathor data, not
vice versa. A Yemaya integration surface exists as test fixtures
(inspirations/src/yemaya-integration-test-fixtures.ts), establishing the
reference handoff shape for when creative-asset integration is built out.
All other cross-domain connections are planned but not yet implemented. No
@oshun/database, @oshun/event-bus, @oshun/auth, @oshun/storage,
@oshun/queue, @oshun/proto, @oshun/contracts, @aje/*, @isis/*, or
@bellona/* package imports were found in Maya source. Those integrations —
shared persistence, a cross-domain event bus, generative-AI job dispatch,
blockchain, and the Blender/Unity asset bridge — are (planned).
The table below summarizes the intended cross-domain boundary for reference:
| Dependency | Direction | Status | Purpose |
|---|---|---|---|
@hathor/* |
maya → hathor | Implemented | Worldbuilding data import (games/hathor) |
@yemaya/* |
maya → yemaya | Test fixtures | Creative-asset reference handoff |
Shared/@oshun |
maya → shared | (planned) | Persistence, events, auth, storage, queue |
@isis/* |
maya → isis | (planned) | Generative-AI job dispatch |
@aje/* |
maya → aje | (planned) | Optional blockchain/NFT |
@bellona/* |
maya → bellona | (planned) | Build pipeline / DCC asset bridge |
Scaling Strategy#
The scaling architecture distributes the world simulation across many server
processes, each owning a spatial zone. The maya-nexus crate models this
topology through its mesh_topology, load_balancing, capacity_scaling,
edge_server_deployment, and cross_region_connectivity modules. The
deployment pipeline (CDN, Kubernetes pods) is an operational concern rather than
source code and remains a design target.
- World zones are the intended unit of horizontal scaling, each running as
an independent process.
maya-nexussimulation nodes own authoritative state for an authority domain (NexusAuthorityDomainId). - Server mesh routes players to a zone server;
mesh_topologyandload_balancingmodel the routing and rebalancing. - Stateless assets are intended to be CDN-served; only world state and player sessions sit on the server mesh.
- Physics is intended to run server-side per zone at a fixed tick;
WorldSimulationLoopprovides the fixed-timestep driver. - NPC AI calls are asynchronous and do not block the simulation tick;
maya-souls' LLM integration layer is async by construction.
Implementation Phases#
The crate/library names below refer to engine-core Cargo crates and
libs/maya/ TypeScript libraries. The phases are sequential: each phase builds
on the foundation laid by the one before it.
| Phase | Focus | Key Deliverables |
|---|---|---|
| 1 | Engine foundation | maya-kernel, maya-ecs, maya-jobs, maya-renderer, maya-physics, maya-audio, maya-immersion |
| 2 | World generation | maya-genesis-terrain / -urban / -flora, maya-atmosphere, maya-world, maya-time |
| 3 | Avatars and characters | maya-embodiment, maya-souls, maya-nexus |
| 4 | TypeScript platform | @maya/client, @maya/server, @maya/database, @maya/games |
| 5 | Tooling and references | @maya/tooling, @maya/testing, @maya/inspirations, @maya/documentation |
| 6 | (planned) | UGC scripting sandbox, economy, governance, modding, shared-domain integration |