This document describes the info.json file used by BeamNG levels.
info.json is the main metadata file for a level. It is used by the level selector, loading logic, spawn point UI, big map/POI systems, environment presets, traffic/gameplay systems, minimap display, and some region-specific gameplay logic.
It does not store level geometry. Scene objects are stored separately in files such as main/items.level.json.
Each level should contain an info.json file in the level root folder:
levels/<levelName>/info.json
Example:
levels/west_coast_usa/info.json
If info.json is missing, the level may still be detected if it has a valid entry point, but UI metadata will be incomplete and warnings may be logged.
The level manager scans:
/levels/
Each directory is treated as a potential level.
A level is considered usable if the loader can find a valid entry point. The current preferred format is the main/ scene tree folder:
levels/<levelName>/main/
Older entry points such as .mis files or .level.json files may still be handled for compatibility, but modern levels should use the main/ folder layout.
During discovery, the loader reads info.json, adds runtime metadata, resolves preview paths, processes spawn point data, and applies defaults for missing optional fields.
A simplified info.json file:
{
"title": "levels.example.info.title",
"description": "levels.example.info.description",
"authors": "BeamNG",
"defaultSpawnPointName": "spawns_default",
"country": "levels.common.country.usa",
"region": "northAmerica",
"size": [2048, 2048],
"previews": [
"preview.jpg"
],
"spawnPoints": [
{
"translationId": "levels.example.spawnpoints.default",
"description": "levels.example.spawnpoints.default.description",
"objectname": "spawns_default",
"preview": "spawns_default.jpg"
}
]
}
| Field | Type | Description |
|---|---|---|
title |
string | Level title. Usually a translation ID. |
description |
string | Level description. Usually a translation ID. |
authors |
string | Author name or names. |
features |
string | Translation ID or string describing level features. |
suitablefor |
string | Translation ID or string describing what the level is suitable for. |
roads |
string | Translation ID or string describing road network or road types. |
biome |
string | Translation ID or string describing the biome/environment type. |
country |
string | Country translation ID. |
region |
string | Region identifier, such as northAmerica. |
size |
array[2] | Approximate level size in meters, usually [width, height]. |
defaultSpawnPointName |
string | Object name of the default spawn point. |
previews |
array[string] | Level preview image paths relative to the level folder. |
spawnPoints |
array[object] | Spawn point metadata shown in UI/big map. |
minimap |
array[object] | Minimap image tile definitions. |
roadRules |
object | Level-specific road rule metadata. |
localUnits |
object | Local unit preferences used by gameplay/UI systems. |
supportsTraffic |
bool | Whether the level supports traffic. Defaults to true if missing. |
supportsTimeOfDay |
bool | Whether the level supports time-of-day options. Defaults to true if missing. |
timeOfDayPresets |
array[object] | Optional level-specific time-of-day presets. |
excludeDefaultTimeOfDayOptions |
bool | If true, default time-of-day presets are not added. |
isAuxiliary |
bool | Marks the level as auxiliary/internal depending on UI usage. |
Most user-facing text fields should use translation IDs instead of hardcoded display text.
Example:
"title": "levels.west_coast_usa.info.title",
"description": "levels.west_coast_usa.info.description"
This allows the UI to localize level names, descriptions, spawn point names, and other text.
Common translated fields include:
titledescriptionfeaturessuitableforroadsbiomecountryspawnPoints[].translationIdspawnPoints[].descriptionspawnPoints[].logbookEntryThe previews array defines level preview images.
"previews": [
"spawns_industrial.jpg",
"west_coast_usa_preview1.jpg",
"west_coast_usa_preview2.jpg"
]
Paths are relative to the level folder. During loading, they are converted to full virtual paths.
Example:
"west_coast_usa_preview1.jpg"
becomes:
/levels/west_coast_usa/west_coast_usa_preview1.jpg
The first preview image is generally used as the main level thumbnail.
If previews is missing or empty, fallback preview paths are attempted from the level entry point.
The spawnPoints array defines spawn choices shown in the UI and big map.
Example:
"spawnPoints": [
{
"translationId": "levels.west_coast_usa.spawnpoints.industrial",
"description": "levels.west_coast_usa.spawnpoints.industrial.description",
"logbookEntry": "levels.west_coast_usa.spawnpoints.industrial.logbookEntry",
"objectname": "spawns_industrial",
"preview": "spawns_industrial.jpg"
}
]
| Field | Type | Description |
|---|---|---|
translationId |
string | Spawn point display name translation ID. |
description |
string | Spawn point description translation ID. |
logbookEntry |
string | Optional logbook/discovery text translation ID. |
objectname |
string | Name of the scene object used as the spawn transform. |
preview |
string | Preview image path relative to the level folder. |
previews |
array[string] | Optional list of preview images. Internally generated if only preview is used. |
The objectname should match an object in the level, usually a SpawnSphere.
Example scene object:
{"class":"SpawnSphere","name":"spawns_industrial","position":[0,0,1],"rotationMatrix":[1,0,0,0,1,0,0,0,1]}
The default spawn point is selected using:
"defaultSpawnPointName": "spawns_industrial"
This should match one of the spawnPoints[].objectname values.
When a spawn point matches defaultSpawnPointName, it is marked internally as the default spawn and receives the level’s main preview list.
If no matching spawn point is found, the loader inserts a fallback default spawn entry using the level preview images.
Spawn points can be exposed as POIs in the big map.
For each spawn point with an objectname, the system looks up the matching scene object and uses its position as the marker position.
If the object cannot be found, an error may be logged.
The minimap array defines one or more minimap image tiles.
Example:
"minimap": [
{
"file": "minimap/terrain.png",
"size": [2048, 2048],
"offset": [-1024, 1024]
},
{
"file": "minimap/island.png",
"size": [4096, 2048],
"offset": [-1536, 3072]
}
]
| Field | Type | Description |
|---|---|---|
file |
string | Minimap image path relative to the level folder. |
size |
array[2] | Tile size in world/map units. |
offset |
array[2] | Tile offset in world/map units. |
During loading, file is prefixed with the level directory.
Example:
minimap/terrain.png
becomes:
/levels/west_coast_usa/minimap/terrain.png
info.json must be valid JSON. Do not use trailing commas in minimap entries or anywhere else in the file.The roadRules object stores level-specific driving rules used by navigation, AI, and traffic-related systems.
Example:
"roadRules": {
"rightHandDrive": false,
"turnOnRed": true
}
If roadRules is missing, the default values are:
{
"rightHandDrive": false,
"turnOnRed": false
}
| Field | Type | Default | Description |
|---|---|---|---|
rightHandDrive |
bool | false |
Controls lane-side assumptions when lane data is generated or interpreted. false means right-side traffic layout, true means left-side traffic layout. |
turnOnRed |
bool | false |
Indicates whether turning on red is allowed for this level. Used by traffic/navigation logic where applicable. |
rightHandDrive affects how the navigation graph interprets/generated lane directions.
Internally, lane directions are represented with strings:
+ = lane direction from inNode to outNode
- = lane direction from outNode to inNode
For two-way roads, the lane order depends on whether the level uses right-side or left-side traffic.
Use:
"rightHandDrive": false
for regions with right-side traffic.
Use:
"rightHandDrive": true
for regions with left-side traffic.
rightHandDrive does not visually change road geometry. It affects navigation/lane interpretation and automatic lane generation.The localUnits object defines level-specific unit preferences used by gameplay/UI systems.
Example:
"localUnits": {
"gasoline": "gallonUS",
"diesel": "gallonUS"
}
This is currently used by systems such as fuel price display logic. Internally, prices may be stored in metric units, while display objects can convert values depending on the level’s local unit settings.
For example:
"gasoline": "gallonUS"
allows gasoline price signage to use US gallon-style display.
| Field | Value | Description |
|---|---|---|
gasoline |
gallonUS |
Display gasoline-related values using US gallons. |
diesel |
gallonUS |
Display diesel-related values using US gallons. |
If no local unit override is provided, systems use their default behavior.
localUnits affects presentation and gameplay/UI logic. It should match the real-world region represented by the level when possible.If supportsTraffic is missing, it defaults to:
"supportsTraffic": true
Set it to false if the level should not expose traffic-related systems.
Example:
"supportsTraffic": false
If supportsTimeOfDay is missing, it defaults to:
"supportsTimeOfDay": true
Set it to false if the level should not expose time-of-day options.
Example:
"supportsTimeOfDay": false
Levels can define custom time-of-day presets.
Example:
"timeOfDayPresets": [
{
"key": "sunrise",
"value": 0.23,
"label": "ui.environment.time.sunrise"
},
{
"key": "noon",
"value": 0.5,
"label": "ui.environment.time.noon"
}
]
| Field | Type | Description |
|---|---|---|
key |
string | Unique preset key. |
value |
number | Time value used by the environment system. |
label |
string | Display label or translation ID. |
By default, the game starts with common time-of-day presets and then applies/overrides level-specific presets.
To exclude default presets:
"excludeDefaultTimeOfDayOptions": true
If this is set, provide your own timeOfDayPresets or the level may have no selectable time-of-day options.
Older metadata may use:
"hidden": true
This field is deprecated.
Use:
"isAuxiliary": true
If hidden is found, the loader maps it to isAuxiliary for compatibility and logs a warning.
{
"features": "levels.example.info.features",
"suitablefor": "levels.example.info.suitablefor",
"authors": "BeamNG",
"roads": "levels.example.info.roads",
"title": "levels.example.info.title",
"description": "levels.example.info.description",
"defaultSpawnPointName": "spawns_default",
"country": "levels.common.country.usa",
"region": "northAmerica",
"biome": "levels.example.info.biome",
"size": [2048, 2048],
"localUnits": {
"gasoline": "gallonUS",
"diesel": "gallonUS"
},
"previews": [
"preview.jpg",
"preview_1.jpg"
],
"spawnPoints": [
{
"translationId": "levels.example.spawnpoints.default",
"description": "levels.example.spawnpoints.default.description",
"logbookEntry": "levels.example.spawnpoints.default.logbookEntry",
"objectname": "spawns_default",
"preview": "spawns_default.jpg"
}
],
"roadRules": {
"rightHandDrive": false,
"turnOnRed": true
},
"supportsTraffic": true,
"supportsTimeOfDay": true,
"minimap": [
{
"file": "minimap/terrain.png",
"size": [2048, 2048],
"offset": [-1024, 1024]
}
]
}
When the level list is built, the level manager:
/levels/.info.json.info.json in the level root.defaultSpawnPointName matches a valid spawn point object.objectname values stable once used by gameplay/career data.roadRules to match the real-world traffic side of the region.localUnits for regional unit display behavior.hidden; use isAuxiliary.supportsTraffic or supportsTimeOfDay to false only when those systems are not supported.Possible causes:
titleinfo.jsonPossible causes:
previews is emptyPossible causes:
objectname does not match a scene objectitems.level.jsondefaultSpawnPointName does not match any spawn pointPossible causes:
objectnamePossible causes:
file pathPossible causes:
supportsTimeOfDay is falseexcludeDefaultTimeOfDayOptions is true and no custom presets are providedCheck:
"roadRules": {
"rightHandDrive": false
}
Use the correct value for the traffic side represented by the level.
Check:
"localUnits": {
"gasoline": "gallonUS",
"diesel": "gallonUS"
}
Only set local unit overrides when the level region requires them.
info.json is the primary metadata file for a level.
It defines:
A complete and valid info.json is essential for proper level discovery, UI display, spawning, minimap support, and gameplay integration.
Was this article helpful?