Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
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
BepInEx pack for Mono Unity games. Preconfigured and ready to use.
Preferred version: 5.4.2100README
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
- Quit to the main menu (or close the game).
- Open the backups folder — by default
Documents\REPO RunBackups. The exact path is also printed inLogOutput.logat startup. - Pick the backup from the level you want.
- Copy its contents back into the
savesfolder, replacing what's there. - 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/.