Multiplayer Everything

Work with the launcher

One small file next to your GitHub release can tell us how your mod installs. When we approve your mod, we can offer it in the launcher, so friends install the same version and play together.

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

  1. You add one file to your release. It is called multiplayereverything.json and 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.
  2. 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.
  3. 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.
  4. 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
format is 1. repo is owner/name and 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, its executable (a file name, no folder), its steamAppId (digits, as text), validationFiles and processNames, and detection: only a Steam entry or a path entry.
mod.install
targetDir must start with ${GAME_DIR}. You can also give preserve (paths inside it to keep on update), requires (what has to be there first, with the message a player sees) and uninstallCleanup (files your mod makes while it runs).
mod.components
Each has an id, a name, a source (a folder or file in your release, or the file itself for a single-file mod), a target that starts with ${GAME_DIR}, and required.
mod.launch
Only { "uri", "hint" }. The address must be steam://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

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

Not signed up yet? Go to the developers page. Questions about the format? Write to us from the chat there.