Logo Ludusavi

Ludusavi is a tool for backing up your PC video game save data, written in Rust. It is cross-platform and supports multiple game stores.

Features

This tool uses the Ludusavi Manifest for info on what to back up, and it will automatically download the latest version of the primary manifest. The data is ultimately sourced from PCGamingWiki, so please contribute any new or fixed data back to the wiki itself, and your improvements will be incorporated into Ludusavi's data as well.

If you'd like to help translate Ludusavi into other languages, check out the Crowdin project.

Demo

GUI

GUI demo of previewing a backup

CLI

CLI demo of previewing a backup

Installation

Requirements

Methods

You can install Ludusavi one of these ways:

Notes

If you are on Windows:

If you are on Mac:

Usage

Roots

Roots are folders that Ludusavi can check for additional game data. When you first run Ludusavi, it will try to find some common roots on your system, but you may end up without any configured. You can click add root to configure as many as you need, along with the root's type:

You may use globs in root paths to identify multiple roots at once.

Backup retention

You can configure how many backups to keep by pressing the gear icon on the backup screen.

A differential backup contains just the changed files since the last full backup, and differential backup retention is tied to the associated full backup as well.

If you configure 2 full and 2 differential, then Ludusavi will create 2 differential backups for each full backup, like so:

When backup #7 is created, because the full retention is set to 2, Ludusavi will delete backups 1 through 3.

Selective scanning

Once you've done at least one full scan (via the preview/backup buttons), Ludusavi will remember the games it found and show them to you the next time you run the program. That way, you can selectively preview or back up a single game without doing a full scan. Use the three-dot menu next to each game's title to operate on just that one game.

You can also use keyboard shortcuts to swap the three-dot menu with some specific buttons:

Backup structure

During a restore, Ludusavi only considers folders with a mapping.yaml file.

Search

You can click the search icon and enter some text to just see games with matching names. Note that this only affects which games you see in the list, but Ludusavi will still back up the full set of games.

Sorting options are also available while the search bar is open.

Duplicates

You may see a "duplicates" badge next to some games. This means that some of the same files were also backed up for another game. That could be intentional (e.g., an HD remaster may reuse the original save locations), but it could also be a sign of an issue in the manifest data. You can expand the game's file list to see which exact entries are duplicated.

Restoration redirect

You can use redirects to restore to a different location than the original file. Click add redirect on the restore screen, and then enter both the old and new location. For example, if you backed up some saves from C:/Games, but then you moved it to D:/Games, then you would put C:/Games as the source and D:/Games as the target.

Tip: As you're editing your redirects, try running a preview and expanding some games' file lists. This will show you in real time what effect your redirects will have when you perform the restore for real.

Custom games

You can create your own game save definitions on the custom games screen. If the game name exactly matches a known game, then your custom entry will override it.

For file paths, you can click the browse button to quickly select a folder. The path can be a file too, but the browse button only lets you choose folders at this time. You can just type in the file name afterwards. You can also use globs (e.g., C:/example/*.txt selects all TXT files in that folder) and the placeholders defined in the Ludusavi Manifest format.

Backup exclusions

Backup exclusions let you set paths and registry keys to completely ignore from all games. They will not be shown at all during backup scans.

Configure exclusions on the other screen.

Command line

Run ludusavi --help for the full CLI usage information.

Configuration

Ludusavi stores its configuration in the following locations:

Alternatively, if you'd like Ludusavi to store its configuration in the same place as the executable, then simply create a file called ludusavi.portable in the directory that contains the executable file. You might want to do that if you're going to run Ludusavi from a flash drive on multiple computers.

If you're using the GUI, then it will automatically update the config file as needed, so you don't need to worry about its content. However, if you're using the CLI exclusively, then you'll need to edit config.yaml yourself.

Ludusavi also stores manifest.yaml (info on what to back up) here. You should not modify that file, because Ludusavi will overwrite your changes whenever it downloads a new copy.

Logging

Log files are stored in the config folder (see above). By default, only warnings and errors are logged, but you can customize this by setting the RUST_LOG environment variable (e.g., RUST_LOG=ludusavi=debug). The most recent 5 log files are kept, rotating on app launch or when a log reaches 10 MiB.

Interfaces

CLI API

CLI mode defaults to a human-readable format, but you can switch to a machine-readable JSON format with the --api flag.

Click to expand

For the backup/restore commands:

The backups command is similar, but without overall, and with each game containing {"backups": [ {"name": <string>, "when": <string>} ]}

Note that, in some error conditions, there may not be any JSON output, so you should check if stdout was blank before trying to parse it. If the command line input cannot be parsed, then the output will not be in a stable format.

Example:

json { "errors": { "someGamesFailed": true, }, "overall": { "totalGames": 2, "totalBytes": 150, "processedGames": 1, "processedBytes": 100, }, "games": { "Game 1": { "decision": "Processed", "files": { "/games/game1/save.json": { "bytes": 100 } }, "registry": { "HKEY_CURRENT_USER/Software/Game1": { "failed": true } } }, "Game 2": { "decision": "Ignored", "files": { "/games/game2/save.json": { "bytes": 50 } }, "registry": {} } } }

Configuration file

Here are the available settings in config.yaml (all are required unless otherwise noted):

Click to expand

Example:

yaml manifest: url: "https://raw.githubusercontent.com/mtkennerly/ludusavi-manifest/master/data/manifest.yaml" etag: null roots: - path: "D:/Steam" store: steam backup: path: ~/ludusavi-backup restore: path: ~/ludusavi-backup

Comparison with other tools

There are other excellent backup tools available, but not a singular cross-platform and cross-store solution:

Development

Please refer to CONTRIBUTING.md.