Skip to content
You're reading the docs for Railroader 0.6 (the MoW Update), currently available on the Experimental branch.

Info.json

Asset packs (mods) must have an Info.json file to identify themselves to Railroader when it launches. The Info.json file is in the root directory of the asset pack:

Documents\Railroader\ModDev
my-great-mod-1.0
Info.json
Definitions.json
(etc.)
{
"identifier": "myhandle/antarctic-freight",
"version": "1.0.0",
"name": "Freight Cars of Antarctica",
"author": "Your Name",
"license": "CC BY-NC 4.0",
"description": "Adds 5 new freight cars",
"dependencies": {
"required": [
"rr/game >=0.6.0"
]
}
}

A unique pack identifier for your mod in the format domain/pack-name.

Version in major.minor.patch format, with optional single lowercase letter suffix. Minor and patch each go up to 99.

Examples: 1.0.0, 0.6.0, 1.0.0a

Display name shown to users. Can contain any characters.

Creator’s name or handle.

Brief description of what the mod provides.

Website URL (must be valid HTTP/HTTPS).

License name or copyright statement. We recommend:

Controls which multiplayer peers load this pack and whether it’s required to match. One of:

  • unscoped (default, or if omitted) — checked for mismatches and must be resolved, recorded in saves, and required to match across all multiplayer peers.
  • optional — recorded in saves like unscoped, but not required: it loads (and its Main.rl runs) wherever it happens to be installed, and a peer missing it, or holding a different version, is never blocked from joining or loading. Good for cosmetic or UI-only mods that don’t need to be present everywhere.

An unrecognized scope value is a load error.

Specifies relationships with other mods:

  • required: Must be installed; your mod won’t load without them
  • optional: Load before yours if present; missing ones don’t prevent loading
  • incompatible: Conflicts; your mod won’t load if these are present

Special dependency: rr/game represents the game itself, and depending on it implicitly covers rr/shared too, so you never need to list rr/shared separately. We recommend every mod declare an rr/game version requirement in required (for example rr/game >=0.6.0) so your mod won’t load against a game version it wasn’t built and tested for. (You don’t need it purely for ordering: every mod is automatically loaded after rr/game regardless. See Load Order.)

Load-order hints. Unlike dependencies, these affect when your mod loads relative to others, not whether it loads: a named pack that isn’t installed is ignored.

  • after: Load your mod after these packs, when they’re present. Use this for a patch or compatibility mod that overrides another pack without requiring it.
  • before: Load your mod before these packs, when they’re present.
  • priority: Integer tiebreak among packs that nothing else orders. Lower values load earlier; the default is 0. Priority never overrides a dependency or a hint.

after and before take bare domain/pack-name identifiers — no version constraints (a version requirement belongs in dependencies).

"load": {
"after": ["otherauthor/enhanced-visuals"],
"before": ["otherauthor/legacy-shim"],
"priority": 0
}

See Load Order for how packs are ordered and how these hints interact.

Makes Relay modules available for other mods to import.

"exports": {
"./utility": "Scripts/utility.rl"
}
  • Keys use ./modulename (recommended) or {domain}/modulename. Must be a legal Relay symbol name (no dashes, etc.). Dot (.) means “this domain”.
  • Paths must start with Scripts/ and end with .rl

If your mod is myhandle/my-mod, the export ./utils becomes importable as "myhandle/utils".

Format: domain/pack-name [constraints...]

OperatorMeaning
>=Greater than or equal
>Greater than
<=Less than or equal
<Less than
== or noneExact version
~Pin major.minor, allow patch to float (~1.2.3 == >=1.2.3 <1.3.0)
^Pin major, allow minor.patch to float (^1.2.3 == >=1.2.3 <2.0.0). Below 1.0, it pins the minor instead (^0.6.2 == >=0.6.2 <0.7.0; ^0.0.3 == >=0.0.3 <0.1.0)

Combine constraints with spaces: rr/game >=0.6.0 <0.8.0

rr/game is a virtual pack whose version is the game version, so rr/game >=0.6.0 means 0.6.0 or later. Use >= to keep loading on later releases; ^0.6.0 loads on 0.6.x only.

Built-in packs (rr/ identifiers) have their own versions, independent of the game’s, starting at 0.1.0. A mod that depends on one is checked against that pack’s version, for example rr/ld-gp9 >=0.1.0. Below 1.0, a breaking change bumps the minor version.

{
"identifier": "myhandle/simple-car",
"version": "1.0.0",
"name": "Simple Car Pack"
}
{
"identifier": "myhandle/freight-cars",
"version": "1.2.0",
"name": "Custom Freight Cars",
"author": "Your Name",
"description": "Adds 10 new freight cars with custom paint schemes",
"dependencies": {
"required": ["rr/game >=0.6.0"],
"optional": ["otherauthor/enhanced-visuals"],
"incompatible": ["otherauthor/legacy-mod <2.0.0"]
}
}
{
"identifier": "myhandle/advanced-mod",
"version": "2.0.0",
"name": "Advanced Mod Pack",
"author": "Your Name",
"license": "CC BY 4.0",
"dependencies": {
"required": ["rr/game >=0.6.0"]
},
"exports": {
"./superOps": "Scripts/superOps.rl",
"./utils": "Scripts/utils.rl"
}
}