Preview. The launcher does not read this file yet.
The format below is agreed with the launcher's maker, but the launcher cannot read it until its next release, and it can still change. Nothing here is a promise. Today an approved mod gets a page on the site; offering it in the launcher comes after the launcher can read this.
How it works
- You add one file to your release. It is called
multiplayereverything.jsonand is a separate file on your GitHub release, next to your zip, not inside it. That way a mod that is a single file, such as one DLL, works the same way. - We read it when we approve your mod. We check it against the rules below, and we note the release tag and the SHA-256 checksums of your file and of the manifest, as GitHub records them.
- We pin that release. The launcher installs exactly the file we checked, and verifies it against the checksum before it installs anything. You never write the download address or the checksum yourself.
- A person approves it. Nothing reaches players without a review by hand. The approved record is kept in our public mods-info repository, under its own folder for mods by other people. A new version of your mod is a new review, never automatic.
The file
{
"format": 1,
"repo": "owner/name",
"mod": {
"id": "mymod",
"publisher": "Author",
"website": "https://github.com/owner/name",
"game": {
"name": "Game",
"executable": "Game.exe",
"steamAppId": "123456",
"validationFiles": ["${GAME_EXE}"],
"processNames": ["Game.exe"],
"detection": [ { "type": "steam", "appId": "123456", "installDir": "Game" } ]
},
"install": {
"targetDir": "${GAME_DIR}\\BepInEx\\plugins\\MyMod",
"requires": [ { "path": "${GAME_DIR}\\BepInEx\\core", "message": "Install BepInEx 5 first" } ]
},
"components": [ { "id": "mod", "name": "MyMod", "source": "Mod.dll", "target": "${INSTALL_DIR}", "required": true } ],
"launch": { "uri": "steam://rungameid/${STEAM_APP_ID}", "hint": "Host from the pause menu." }
}
}
Paths use backslashes for now, as in the example, and the launcher will accept forward slashes later. A JSON schema will be published in the mods-info repository as community-mod.schema.json when the launcher can read these files.
- format, repo
formatis1.repoisowner/nameand must be the repository the release is in.- mod.id
- Lowercase letters, digits and dashes. It must match your mod's id on this site.
- mod.publisher, mod.website
- Your name, shown as the credit, and your repository address,
https://github.com/owner/name. - mod.game
- The game's
name, itsexecutable(a file name, no folder), itssteamAppId(digits, as text),validationFilesandprocessNames, anddetection: only a Steam entry or apathentry. - mod.install
targetDirmust start with${GAME_DIR}. You can also givepreserve(paths inside it to keep on update),requires(what has to be there first, with the message a player sees) anduninstallCleanup(files your mod makes while it runs).- mod.components
- Each has an
id, aname, asource(a folder or file in your release, or the file itself for a single-file mod), atargetthat starts with${GAME_DIR}, andrequired. - mod.launch
- Only
{ "uri", "hint" }. The address must besteam://rungameid/${STEAM_APP_ID}.
You can use these variables in paths: ${GAME_DIR}, ${INSTALL_DIR}, ${MOD_ID}, ${GAME_EXE} and ${STEAM_APP_ID}.
What is not allowed
- A
packageblock. We fill in the version, download address and checksum from the release we approved. A manifest that has one is refused. allowedRoots,stateDirandsourceGame.- Registry or Epic detection, for now.
- Starting a program of your own. The game starts through Steam, with no executable and no arguments.
- Writing anywhere outside the game's folder.
- Game files in your release. Only your mod.
The players, how they connect, the description and the picture are not part of this file. You give them on the developers page when you add your mod.
A release that installs cleanly
- Your release is on GitHub, under your own repository. Nothing is downloaded from anywhere else.
- One zip, or one file, with the version in its name, such as
YourMod-v1.2.0.zip. Everyone playing together needs the same version, so tag every release. - Add
multiplayereverything.jsonas its own file on the same release. - Keep debug files, symbols and source out of the zip.
- Mark a test build as a pre-release on GitHub. Normal players stay on your latest full release.
Not signed up yet? Go to the developers page. Questions about the format? Write to us from the chat there.