install.json

install.json tells the OpenMods Manager desktop app how to lay your release files into the player's game folder. It's optional — without it, the Manager extracts the release archive straight into the game root.

folder Where to put it

Preferred location is .openmods/install.json. A root-level install.json is also accepted as a fallback. The file ships in your release artifact (zip), so the Manager can read it without re-fetching the repo.

data_object Schema

Two optional fields, both relative to the player's game install root:

path string · optional

Base directory where the contents of the release should be unpacked. If set on its own, every file in the archive lands here.

custom-path object · optional

Per-file or per-folder mapping. Each key is a path inside the archive; each value is the destination relative to the game root. Trailing slashes mark folder copies.

Example:

{
  "path": "BepInEx/plugins/MyMod",
  "custom-path": {
    "src/plugin.dll": "BepInEx/plugins/",
    "config/": "BepInEx/config/MyMod/"
  }
}

rule Default behavior

  • check_circle No install.json → release contents are copied into the game root, skipping install.json itself and any .openmods/ folder bundled in the zip.
  • check_circle Only path set → everything goes under that directory.
  • check_circle Only custom-path set → mapped files/folders go to their destinations; anything not listed is dropped at the game root.
  • check_circle Both set → custom-path wins for the entries it covers; the rest fall under path.
lightbulb

Forgiving parser

Comments (//) and trailing commas are tolerated, so you can leave notes for collaborators directly inside the file. The Manager records every file it copied, which lets it cleanly uninstall the mod later.

Ready to distribute your mods?

Join hundreds of other developers using OpenMods to deliver their creations to players faster.

Rejoining the server...

Rejoin failed... trying again in seconds.

Failed to rejoin.
Please retry or reload the page.

The session has been paused by the server.

Failed to resume the session.
Please retry or reload the page.