Skip to content

Installation

ResoniteIO has two halves that install separately: the C# mod (runs inside the Resonite client) and the resonite-io Python client (imported as resoio, runs wherever your Python code runs). They connect over a Unix Domain Socket, so both halves must run on the same host (or share the socket directory).

Linux only

ResoniteIO targets Resonite running on Linux through Steam Play (Proton) and communicates over a Unix Domain Socket. Windows is not supported, and there are no plans to support it.

Documentation versions

These docs are versioned with mike and deployed to GitHub Pages by CI: pushing to main updates the dev version, and a stable release tag publishes a numbered version and moves the latest alias. Use the version selector (top of the page) to switch. To build locally, run just docs-serve / just docs-build.

C# mod — GitHub Releases

The mod is distributed as a zip on GitHub Releases and installed into Gale via Import > Local mod....

1. Download the latest mod zip. It lands in the current directory by default; change the output path with -o / -O.

curl -L -o ResoniteIO.zip https://github.com/MLShukai/ResoniteIO/releases/latest/download/ResoniteIO.zip
# or:
wget -O ResoniteIO.zip https://github.com/MLShukai/ResoniteIO/releases/latest/download/ResoniteIO.zip

2. Install the supporting plugins first. A local import does not resolve dependencies automatically (unlike a Thunderstore install), so add these to your Gale profile from the mod manager before importing ResoniteIO:

  • ResoniteModding-BepisLoader
  • ResoniteModding-BepInExResoniteShim
  • ResoniteModding-BepisResoniteWrapper
  • ResoniteModding-BepInExRenderer — Camera v2 (Renderite framebuffer)
  • ResoniteModding-RenderiteHook — injects doorstop into the renderer process
  • Nytra-InterprocessLib — shared-memory queue between engine and renderer

3. Import the mod. In Gale, choose Import > Local mod... and select the downloaded ResoniteIO.zip.

4. Set the Steam launch option so BepisLoader can hook the client:

WINEDLLOVERRIDES="winhttp=n,b" %command%

The repository README explains why the launch option is mandatory. Prefer to build the mod yourself? See Build from source below.

Python client — PyPI

pip install resonite-io

or, inside a uv project:

uv add resonite-io

The distribution is named resonite-io on PyPI but imports as resoio (import resoio). It requires Python ≥ 3.12, is pyright-strict, and ships type information (PEP 561).

Optional: resoio launch needs umu-launcher

The resoio launch / resoio terminate commands start and stop the Resonite client as host processes, instead of launching it yourself through Steam. They invoke umu-launcher's umu-run, so it must be on your PATH — install it from your distribution's packages or the upstream release (the dev container already ships it). The rest of the client — connecting to a Resonite you start via Steam — does not need it.

Build from source

Building from source is the path for contributing to ResoniteIO or running an unreleased version. The full development environment — .NET 10, uv, protoc, and tooling — lives inside a dev container; see the repository README for the one-time just init host setup and how to open the dev container.

C# mod

From inside the dev container:

just build        # dotnet build -c Release
just deploy-mod   # pack the Thunderstore zip and unpack it into the Gale profile

deploy-mod builds the Thunderstore package (just mod-pack) and unpacks it into gale/ exactly the way Gale's installer lays it out, so the local mod matches what users install — the engine plugin lands at gale/BepInEx/plugins/ResoniteIO/ResoniteIO/ and the renderer plugin at gale/Renderer/BepInEx/plugins/ResoniteIO/ResoniteIO.Renderer/.

The mod requires a Gale profile with BepisLoader and the supporting plugins, plus the Steam launch option WINEDLLOVERRIDES="winhttp=n,b" %command%. The README documents the exact plugin list and why the launch option is mandatory.

Python client

cd python
uv sync --all-extras   # creates python/.venv with the resoio package and deps

Socket location

By default the client resolves the socket under ~/.resonite-io/. Override it with RESONITE_IO_SOCKET (full path) or RESONITE_IO_SOCKET_DIR (directory). See ConnectionClient for the resolution order.