Releasing to Steam
RenMori protects an already built Ren'Py distribution build. Publishing to Steam takes three ordered steps, and the order matters:
If you protect first and then re-run the Ren'Py launcher's Build Distributions on your project, the launcher rebuilds from source and produces a fresh unprotected distribution build, and the protection is lost. Protect the launcher's output, and never feed a protected folder back into the launcher.
This guide uses the Ren'Py SDK sample project the_question and its market build as the example, because that build contains all three platforms.
Which build to upload
The Ren'Py launcher can produce the following builds:
- pc: Windows and Linux
- mac: macOS
- market: one universal package with Windows (
.exe), macOS (.app) and Linux (.sh) launchers sharing a singlegame/
Both patterns work on Steam:
RenMori's protection is platform-agnostic: the renmori.rpe loader runs inside Ren'Py's own bundled Python on each operating system. As a result, one protect run on the market build covers Windows, macOS and Linux at once.
Step 1: Protect
Extract the launcher's market archive to a folder (RenMori takes a directory, not a .zip), then run:
Only game/ changes; the per-platform launchers are untouched:
The plaintext .rpa archives and .rpyc files that were under game/ are gone, leaving unrpa and unrpyc nothing to work with.
Step 2: Upload with SteamPipe
Steam does not accept a single file. A build is the contents of a folder, uploaded to a depot with SteamPipe. Therefore:
- Do not upload the
.zip - Do not upload only
renmori.rmc - Do point the depot's
contentrootat the protected folder and let SteamPipe upload everything in it (game/,lib/,renpy/and the launchers)
app_build_<APPID>.vdf:
The Steamworks SteamPipe GUI performs the same operation; point it at the protected folder.
For per-platform depots, protect each platform build separately and give each its own depot with its own contentroot.
Step 3: Launch options
In the Steamworks web interface (Installation → General Installation → Launch Options), set one launch option per operating system, each pointing at the corresponding launcher inside the build:
The launcher boots Ren'Py, and renmori.rpe then takes over asset loading and decrypts assets in memory. The process is transparent to players.
Steam compatibility notes
- Do not add Steam DRM on top (the DRMToolkit executable wrapper): it rewrites the launcher binary, can conflict with runtime self-checks, and is weak on its own, whereas RenMori already protects the data layer
- The Steam overlay works normally: RenMori only hooks Ren'Py's file loading and never performs process or DLL injection, so the overlay is unaffected
- Achievements and Cloud save data go through Ren'Py's Python API and are unaffected;
renmori.rmcis a static file, so Steam's file verification and delta updates work normally steam_appid.txtis read by the Steam SDK directly, outsiderenpy.loader, so RenMori keeps it as plaintext by default (DEFAULT_KEEP_ON_DISK); keeping it in the distribution build is harmless, and other externally read files can be added throughkeep_on_diskinrenmori.toml(see Configuration)
Checklist
- Built from source in the Ren'Py launcher (Build Distributions)
- Ran
renmori protecton the extracted build folder -
renmori verifypassed - SteamPipe
contentrootpoints at the protected folder, not a.zip - Launch options set per operating system (
the_question.exe/.sh/.app) - No Steam DRM wrapper applied
- Did not re-run the launcher on the protected folder