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.)Quick Example
Section titled “Quick Example”{ "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" ] }}Fields
Section titled “Fields”identifier (required)
Section titled “identifier (required)”A unique pack identifier for your mod in the format domain/pack-name.
version (required)
Section titled “version (required)”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
name (required)
Section titled “name (required)”Display name shown to users. Can contain any characters.
author (optional)
Section titled “author (optional)”Creator’s name or handle.
description (optional)
Section titled “description (optional)”Brief description of what the mod provides.
url (optional)
Section titled “url (optional)”Website URL (must be valid HTTP/HTTPS).
license (recommended)
Section titled “license (recommended)”License name or copyright statement. We recommend:
scope (optional)
Section titled “scope (optional)”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 likeunscoped, but not required: it loads (and itsMain.rlruns) 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.
dependencies (optional)
Section titled “dependencies (optional)”Specifies relationships with other mods:
required: Must be installed; your mod won’t load without themoptional: Load before yours if present; missing ones don’t prevent loadingincompatible: 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 (optional)
Section titled “load (optional)”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 is0. 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.
exports (optional)
Section titled “exports (optional)”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".
Dependency Syntax
Section titled “Dependency Syntax”Format: domain/pack-name [constraints...]
| Operator | Meaning |
|---|---|
>= | Greater than or equal |
> | Greater than |
<= | Less than or equal |
< | Less than |
== or none | Exact 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.
Examples
Section titled “Examples”Minimal
Section titled “Minimal”{ "identifier": "myhandle/simple-car", "version": "1.0.0", "name": "Simple Car Pack"}With Dependencies
Section titled “With Dependencies”{ "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"] }}With Script Exports
Section titled “With Script Exports”{ "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" }}© 2026 Giraffe Lab LLC. All rights reserved.