A civilisation aboard a worldship, simulated tick by tick, inside a galaxy that runs on something far cheaper.
The player governs a civilisation across centuries as its worldship travels between the stars.
There is no WebGL in it. The interface is React and SVG, with server-sent events pushing live updates.
Two runtimes, one system
An ECS for the simulated ark, and a scripted runtime for the wider galaxy, with a defined boundary between them. The ark is dense, tick-driven and needs the parallelism; the galaxy is sparse and event-driven and does not.
Worldview and intel
A worldview and intel model keeps what a player knows separate from what is actually the case. Fog of war falls out of that separation. Layering it over a fully-known world instead means the client holds state the player is not supposed to have.
Centuries without centuries of state
The simulation runs for hundreds of years at a time. It does not retain hundreds of years of state.
Live truth is current-state only, and the historical record is what a player believes. That is the worldview separation above doing a second job: it decides what has to be kept, so eviction becomes a designed mechanism rather than a limit that gets hit.
The long run began as a test of that claim rather than as a feature. It ended up in the world generator, so a game starts a century in, on a history baked once offline and shared by everyone who arrives.
Protobuf, with the generator rewritten
The wire format is ordinary protobuf. The C# comes from a Roslyn source generator I wrote instead of from protoc, because every generator I tried allocated, and none of them could be made not to. That is fine for a web server answering a request. It is not fine for a simulation server ticking continuously, where the garbage from decoding messages is garbage collected inside the tick.
It reads the .proto files as AdditionalFiles, links references across them, validates, and emits during the normal build. Reads come back as a ref struct view over a ReadOnlySpan<byte>, which cannot escape to the heap, so decoding a message costs nothing.
Documentation as part of the design
A vision document, design pillars, and a set of laws every feature has to satisfy. A graveyard of rejected ideas with the reasoning kept, which gets consulted more than any of the others.
Simulation documents do not mention implementation and architecture documents do not specify gameplay. One law names the single interface where the two meet.