Two halves:
In-game — the Advanced Schedule item. A drop-in replacement for Create's schedule (conductors, station auto-schedule and Create Railways Navigator options all work) that adds:
- Simulate — projects your schedule against every train on the network with a deterministic,
Minecraft-free engine that mirrors Create's movement, signalling and
ScheduleRuntimesemantics. - Conflicts and root causes — section contention, deadlocks, headway violations and platform clashes, each traced back to the train that actually caused it.
- Time–distance diagram and simulated arrival/departure times drawn on the schedule cards.
- Map — right-click a track with the item to open a 2D view of that network, with conflict badges.
On the server — an embedded web interface (off by default) at Web Enabled in the config:
- Live map of every network with real-time train positions, plus notifications for deadlocks, extreme signal waits and detours — with replays of what led up to them.
- Corridor diagrams overlaying what trains actually did against what the simulator predicted, self-calibrating as it learns each train's drift.
- Planner — a preset library, drag-and-drop assignment of schedules to trains, headless simulation of the result, and Deploy to apply it to the real trains.
- Discord OAuth or one-time login links, with
viewer / planner / deployertiers.
Zero new runtime dependencies: the JDK's own HTTP server, SSE, and a hand-rolled Svelte frontend
that the build compiles itself — Node is only needed on machines that run ./gradlew build
(such as CI), never by players.
If you only want the web interface, use the -server jar (…-forge-server.jar /
…-fabric-server.jar). It ships the same code but registers no item, so players do not need to
install anything — a plain Create client joins normally. The web interface, planner, headless
simulator, deploy and /dispatcher web … all work; what you give up is the in-game half (the
Advanced Schedule item, its editor, the map screen, the simulation window, the preset GUI).
Schedules deployed from the web are ordinary Create schedules, so a mod-less player can still read
them at a station.
The rule that makes this work: the server's registry has to be a subset of the client's — a
client missing a registry entry the server has is disconnected during login, which is exactly what
the Advanced Schedule item was causing. So the same caution applies to every other content-adding
mod you run server-side, not just this one. DragonLib is a plain library and is declared as a
required external dependency on both loaders (a normal mod jar on Fabric, not jar-in-jar).
The -server jar keeps it as a dependency even though only the client GUI uses it.
The normal jar can be switched over without re-downloading — create an empty
config/createdispatcher/server-only.marker, or pass -Dcreatedispatcher.serverOnly=true. Either
way the server logs one line at startup saying the item was not registered.
docs/web-interface.md— enabling the web server, login, TLS, deploy semantics, full config tableSPEC.md— the Advanced Schedule design and its milestone historySPEC-WEB.md— the web interface design and its milestone historySIM_DIVERGENCES.md— where the simulator knowingly differs from Create at runtime
./gradlew build # both loaders -> forge/build/libs, fabric/build/libs
./gradlew :forge:runClient # dev client
./gradlew :common:test # the simulator's JUnit suite (no Minecraft)
./gradlew :common:test --tests '*Benchmark*' -Dsim.benchmark=true # opt-in perf benchmarkJava 17 is enough (that is what CI builds on); a 21 JDK works too. Bytecode target is 17. The Gradle daemon is disabled, so every invocation cold-starts — allow a couple of minutes.
Frontend (only needed when you change web/src; ./gradlew build already runs this via
:common:npmCi + :common:buildWebDist):
cd web && npm run build # writes web/dist — gitignored; Gradle packages it into the jar:common:verifyWebDist was dropped when the frontend moved back into the Gradle build: dist/ is
no longer committed, so there is nothing to keep honest — the jar always ships the UI the build
just produced.
This started life on a branch of Create Realism and was
split out in August 2026. The two mods are independent — install either, or both. When Realism is
present its reduced acceleration is picked up automatically, because the simulator snapshots each
train's live acceleration; set Sim Acceleration Multiplier to match Realism's own multiplier so
phantom trains accelerate like the real ones. Realism's time_of_day_realistic wait condition is
understood by the simulator when that mod is installed.
Create Railways Navigator (train separation, travel sections, prioritized destinations, station tags), Create Tramways (speed sign zones, modelled the way Tramways actually applies them — carried on the train through junctions), Steam 'n' Rails (waypoints, redstone links).