An engine for living worlds - not a game, but the simulation games run on. Here it is booting for real: seven processes, four tiers, dozens of live modules.
Everything is Entity./Everything is connected./Everything is simulated.
ASE simulates individuals, not averages - every leaf, every worm, every bacterium is a first-class entity. Scale isn’t a slider you push; it’s the shape of the architecture.








ASE’s founding axiom is an architecture, not a slogan: everything is connected, everything is Entity, everything is simulated. Pure ECS is what turns that axiom into something a CPU can actually run.
Every component carries a status in its VERSION registry - and it isn't claimed, it's auto-derived from the component's commit count. This is exactly where ASE stands today, not a promise.
seed → poc → init → core → feat → refine is computed automatically from each component's commit count; alpha · beta · stable are set by hand. Click any status to see exactly which components sit there - straight from the VERSION registries.
Every module lives in one graph. Click a tile below - the live graph re-wires to that module’s real downstream chain, pulled straight from the engine’s causality docs.
No script wrote this. The chain below is what one module's output does to every module downstream - because they share one graph.
ASE splits its runtime into four planes - Engine, Replica, World and Reasoning - so a simulation crash, a lifecycle command and an LLM call can never block one another. The split isn’t cosmetic; it’s how the engine stays observable and scalable.
Because the browser is attached to the Replica and not the World, ASE can move, split and merge the compute behind a region - a topic-subscription handoff - while the player keeps walking. The seamlessness isn’t a trick; it falls out of the topology.
ase-codegen parses the C++ backend and generates the becsy client - components, systems and constants - at 1:1 parity. The same deterministic logic then runs on the server and in your browser, which is exactly what lets the wire ship a seed instead of a picture.
class AtmoSimPrsChgSystem
: public ecs::System {
void tick(Registry& r, float dt) {
auto v = r.view<AtmoStPrsChgComponent,
AtmoStPrsBaseComponent>();
for (auto [e, chg, base] : v.each()) {
chg.timer_s += dt;
if (chg.timer_s >= 60.0f)
chg.delta = std::min(base.p, MAX_P);
}
}
};
@system(s => s.after(AtmoSimPrsAltSystem)
.inAnyOrderWithWritersOf(AtmoStPrsChgComponent))
export class AtmoSimPrsChgSystem extends System {
private readonly query = this.query(q => q.current
.with(AtmoStPrsChgComponent).write
.with(AtmoStPrsBaseComponent).read);
execute(): void {
const dt = this.delta;
for (const e of this.query.current) {
const chg = e.write(AtmoStPrsChgComponent);
const base = e.read(AtmoStPrsBaseComponent);
chg.timer_s += dt;
if (chg.timer_s >= 60.0)
chg.delta = Math.min(base.p, MAX_P);
}
}
}
registry.view<A,B>()→this.query(q => q.with(A).with(B))view.each()→query.currentstd::min / std::sin→Math.min / Math.sinfloat x = 0.0f→let x: number = 0.0float field→@field.float32constexpr PI→const PI · imported (SSOT)Two hand-written engines drift apart the first time someone fixes a bug on one side only. So ASE never writes two: the logic is authored once in C++ and the TypeScript twin is transpiled from it. One logic on both sides is what lets the browser recompute the world from a seed instead of streaming the picture, predict through a latency spike without stuttering, and stay locked to the server. It still drifts - floating-point and prediction always do - but the authoritative server pulls it back with tiny deltas, the way NTP disciplines a quartz clock against an atomic reference. Same logic is what keeps the drift small and the correction tiny.
Components and deterministic systems that exist on server and client with identical fields. State that has to render - position, pressure, health. The transpiled systems live here.
Buffers, requests, broadcast, persistence and Hub access. They stay in C++ and never cross the wire, so the client carries none of the server’s weight.
NetworkInput, RenderSync and EntityExport systems the codegen writes for you - the plumbing that applies network data to the ECS and syncs it into React.
float to @field.float32, uint32_t to @field.uint32. Change a field in C++ and the client type reshapes on regenerate.ASE’s Reasoning-Edge daemon drives the CLI you already pay for - so the heavy iteration cost of building an LLM-driven MMORPG stays a fixed monthly subscription during development, not a metered API bill.
In ASE a skill isn’t a markdown file or a registered microservice. It’s an ECS entity born at runtime from a declarative manifest and picked up by a query - the same Everything-Can-Nothing-Must principle, extended to reasoning.
id: lore-consistency-checker subscriptions: [ DialogueIntent, LoreState ] reads: [ CharacterMemory, WorldFacts ] writes: [ AnomalyIntent ] # nothing outside this is allowed work_type: reasoning_heavy # a need, not a model name cost_layer: game communication_pattern: standard memory: [ episodic, semantic, procedural ] quota: { usd, rate, concurrency, … } # 10 axes, checked before spend
The Reasoning Tier gates every LLM call behind ten orthogonal quota axes. A prompt-injected or runaway skill can’t rack up a bill, because the spend never begins. Indie-friendly caps are a property of the architecture, not a promise.
Anti-cheat is a built-in reasoning use-case with a three-tier authority hierarchy that escalates in irreversibility - and stops short of ever letting an LLM ban a player on its own.
Every MMO fights the same rot: bot farming, exploits, griefing, duped items, runaway inflation. EVE Online, World of Warcraft, Star Citizen: every long-running world has fought them in the open, and the lesson repeats. Enforcement bolted on after launch arrives too late; the economy is already poisoned, the wipe follows, and the players leave. ASE is built against that history from hour one, with three decades of MMO experience folded into the architecture: detection, quarantine and human-signed sanctions are engine primitives, not a post-launch patch.
These aren’t features of ASE - they’re worlds built WITH it. Aetheria is the proof taking shape, the way Fortnite proves Unreal. Mythic on the surface, mechanical underneath.
The engine isn’t a monolith - it’s a star of independent L3 modules that write outputs and read each other through a Communication Hub, with zero direct coupling. Every L3 module in the tree below - each its own marker, with its real maturity.
ASE is built in strict layers, L0 to L5 - and the line between engine and game runs right through them. Engine developers own L0–L3; you build your game in L4 and L5, and see nothing but the ase-sdk header.
ASE is sharply targeted, and it’s worth being honest about who should build on it today - and who shouldn’t. Complementary by design, not competitive.





We onboard solo developers and small studios in waves - leave your address and we'll send one signal when your wave opens. No spam, no card, no commitment.