zoltan-RunBackup icon

RunBackup

Automatically backs up your save every level, so a team wipe doesn't end the run. Rotating copies, restore by hand.

By zoltan
Last updated 2 hours ago
Total downloads 231
Total rating 0 
Categories Mods Tools Server-side AI Generated
Dependency string zoltan-RunBackup-1.1.0
Dependants 0 other packages depend on this package

This mod requires the following mods to function

BepInEx-BepInExPack-5.4.2100 icon
BepInEx-BepInExPack

BepInEx pack for Mono Unity games. Preconfigured and ready to use.

Preferred version: 5.4.2100

README

RunBackup

Automatically copies your save every time a level starts, so a team wipe doesn't have to end the run.

Built and compiled against game build v0.4.4 (Cosmetics Update line).

Why

R.E.P.O. deletes the save file when every player dies, and there's no in-game undo. It also writes a save at the moment you die, so quitting from the death screen rescues nothing. The only protection is a copy made beforehand — which means remembering to make one.

This does the remembering.

What it does

Hooks RunManager.ChangeLevel, which covers both moments the game auto-saves: arriving at the Service Station, and the instant a new level begins. Every save the game writes gets a copy.

Copies land in a timestamped folder named after the run, e.g. 2026-07-24_11-42-08_L4-Manor, so you can find the right one at a glance. Oldest are pruned once you pass MaxBackups.

Restoring

  1. Quit to the main menu (or close the game).
  2. Open the backups folder — by default Documents\REPO RunBackups. The exact path is also printed in LogOutput.log at startup.
  3. Pick the backup from the level you want.
  4. Copy its contents back into the saves folder, replacing what's there.
  5. Load the game — you'll be at the start of that level.

Restoring is deliberately manual. Doing it automatically would mean writing to the save folder while the game may be reading it, and getting that wrong costs you the run it was meant to protect.

Host only

In multiplayer only the host has a save file at all, so only the host needs this. Clients running it will simply never find a saves folder to copy.

Config

BepInEx/config/benjamin.runbackup.cfg

Key Default Notes
Enabled true Master switch
MaxBackups 10 Oldest pruned first. A few hundred KB each
WriteDelay 5.0 Seconds to wait after a level change before copying
BackupDirectory (empty) Absolute path override. Empty = Documents\REPO RunBackups
Verbose false Logs every backup and prune

WriteDelay exists because the game writes its save around the level change, and copying mid-write would capture a truncated file. Raise it if a backup ever looks incomplete.

Notes

The saves path is derived from Unity's Application.persistentDataPath rather than a hardcoded AppData path, so it resolves correctly on Windows and under Proton or a native Linux build.

Backups default to Documents\REPO RunBackups — somewhere you'll actually find them — and are never written inside the game's saves folder, where they'd risk being picked up by the game's own save list. If Documents doesn't resolve (unusual setups), it falls back to a RunBackups folder beside the saves folder.

Files are opened with ReadWrite sharing, so a backup can never block the game from writing its own save even if the timing overlaps.

Tests

Unlike a gameplay patch, the file handling here is testable outside the game, and it is. FileOps.cs has no Unity or BepInEx references so the same source file compiles into a test harness covering recursive copying, byte-for-byte integrity, copying while another process holds a save file open, prune ordering and edge cases, and a 12-level rotation against a cap of 10.

Building

Requires .NET SDK 8.0+. Add the NuGet feeds in nuget.config, then:

dotnet build -c Release

Output lands in bin/Release/netstandard2.1/RunBackup.dll. Drop it in BepInEx/plugins/.