One simulation wherever it runs
sage-core holds the entity system, the event bus, and the fixed-tick simulation manager, with no Babylon and no DOM dependency. The same entity classes run on a server and under Babylon in a client.
A TypeScript engine built on BabylonJS, with a Babylon-free entity system, compiler-checked composition, and a fixed-tick simulation that runs on a server and in a client alike.

sage-core holds the entity system, the event bus, and the fixed-tick simulation manager, with no Babylon and no DOM dependency. The same entity classes run on a server and under Babylon in a client.
An entity class names its behaviors as a static tuple. An unknown operation, an unmet requirement, a duplicate operation name, or an incompatible shared state field is a compile error.
State is facts, operations are verbs, events are news. State persists and notifies nobody; operations answer immediately; events queue on the bus and drain once per fixed step.
A snapshot is the tick counter, the ID counter, and every entity's state. Replaying fixed steps from one reaches the same state as running straight through. Saves are a versioned envelope around it.
Bindings turn keyboard, mouse, and gamepad state into named actions. Every fired action is a broadcast event a behavior subscribes to, delivered once a frame before the fixed steps.
Levels load GLB scenes with spawn markers and entity markers. A marked node becomes an entity's own node; cameras, lights, environment, sounds, and post-processing come from the config.
Rigid body physics through BabylonJS and Havok. Static and dynamic bodies, forces, impulses, constraints, and colliders authored in Blender.
SageCanvas boots the engine and provides it to child components. The reactive composables are being rebuilt for 0.10.
