Backup tool for PC game saves
wrap
command now supports some new arguments: --infer steam
, --infer lutris
, and --force
to skip confirmations--api
.$XDG_DATA_HOME
and $XDG_CONFIG_HOME
inside of the Flatpak installation of Steam.wrap
command did not fail gracefully when the game launch commands were missing.cloud
commands did not reject unknown game titles.The way Ludusavi parses file paths internally has been overhauled. The majority of the observable behavior is the same, but it is now more predictable and correct when parsing Linux-style paths on Windows and vice versa.
Some behavioral changes worth noting:
C:\games
to /opt/games
, then the backup will contain references to /opt/games
. (Previously, /opt/games
would turn into C:/opt/games
when parsed on Windows, and C:\games
would turn into ./C_/games
when parsed on Linux.)/games
as an alias of C:\games
. These are now treated as distinct paths. (Previously, on Windows, Linux-style paths were interpreted as C:
paths.)GUI: On Windows, the way Ludusavi hides its console in GUI mode has changed, in order to avoid a new false positive from Windows Defender.
Instead of relaunching itself, Ludusavi now detaches the console from the current instance. This reverts a change from v0.18.1, but care has been taken to address the problems that originally led to that change. If you do notice any issues related to this, please report them.
GUI: Previously, when you changed settings, Ludusavi would save each change immediately. It now waits for 1 second in case there is another change, so that typing and other fast, successive edits are batched.
CLI: Previously, the restore
and backups
(not backup
) commands would return an error if you specified a game that did not have any backups available to restore. This was inconsistent with the backup
command, which would simply return empty data if there was nothing to back up. Now, restore
and backups
will also return empty data if there are no backups.
CLI: Some deprecated flags have been removed from the backup
command: --merge
, --no-merge
, --update
, and --try-update
.
When synchronizing to the cloud after a backup, Ludusavi now instructs Rclone to only check paths for games with updated saves. This improves the cloud sync performance.
The following are now configured as default arguments for Rclone: --fast-list --ignore-checksum
. These should improve performance in most cases. You can change or remove these on the "other" screen.
GUI: During a backup or restore, if the "synchronize automatically" cloud setting is enabled, then the progress bar will display "cloud" instead of "scan" during the cloud operations.
Differential backup names now end with "-diff". This does not affect existing backups.
Windows drive
, Linux drive
, Mac drive
Legendary
wrap
command to do a restore before playing a game and a backup afterwards. (Contributed by sluedecke)REG_NONE
, REG_DWORD_BIG_ENDIAN
, REG_LINK
, REG_RESOURCE_LIST
, REG_FULL_RESOURCE_DESCRIPTOR
, REG_RESOURCE_REQUIREMENTS_LIST
.%USERPROFILE%\Saved Games
folder.dword
-type value from the registry, Ludusavi would silently convert it to a default 0, which could result in data loss when restored. Now, invalid registry values are backed up and restored as-is.XDG_CONFIG_HOME
and XDG_DATA_HOME
would be set inside of the Flatpak environment, preventing it from finding some saves. Now, Ludusavi will also check the default paths (~/.config
and ~/.local/share
respectively).legendaryConfig
folder used by Heroic 1.9.0.<placeholder>
s.<storeUserId>
next to *
would trigger an error.ludusavi find --steam-id 504230 | ludusavi backup --preview
.find
command will now report multiple results if you don't specify a name or ID. The command also has new options for filtering these results: --disabled
and --partial
. For example, ludusavi find --restore --disabled
will list all games that can be restored and are disabled.steamExtra
field from the manifest.<base>
placeholder was resolved generically instead of using the Lutris-specific logic.<base>
from the exe
field, Ludusavi assumed that the path would be absolute, but it could also be relative. Now, Ludusavi will combine the prefix
and exe
fields if necessary.On the restore screen, there is a "validate" button to check whether your backups are missing any files declared in their mapping.yaml. This is intended to help rectify a bug identified below.
Automatic detection of non-Flatpak Lutris roots (~/.config/lutris
).
Updated translations. (Thanks to contributors on the Crowdin project)
A partial translation for Thai has been added, but it only has experimental support because of a technical limitation. You can enable it by editing the config file directly with language code th-TH
,
If you had configured a backup-only or bidirectional redirect and you were using simple backups, then the first backup for a game would complete successfully, but a subsequent backup would fail because Ludusavi would mark the redirect target as a removed file.
If you had configured a backup-only or bidirectional redirect and you were using zip-based backups, then the redirected files would not be included in the backup.
You can check if this affects you by going to the restore screen and clicking the "validate" button. If it finds any issues, it will prompt you to make new full backups for the games in question.
Compatibility with Heroic 2.7.0+, which now uses store_cache/gog_library.json
instead of gog_store/library.json
.
For Lutris, the game_slug
field is no longer required, since Ludusavi only uses it for logging when available.
The Spanish and Russian translations were set incorrectly in the config file. If you selected Spanish, it would display normally, but the config file would be set to Russian. If you selected Russian and restarted the app, it would display in Japanese.
game > working_dir
field, Ludusavi will now try to fall back to the game > exe
field and cut off the file name. Ludusavi will also log a more specific message when an expected field is missing.Cloud backups would fail if the cloud path contained a backslash (\
).
On Windows, if the default terminal application was the Windows Terminal (as opposed to the older Windows Console Host), then a couple of problems would happen when Ludusavi was launched from Windows Explorer:
This was ultimately related to how Ludusavi hides the console in GUI mode. Now, instead of removing the console from the currently running instance, Ludusavi simply relaunches itself in a detached state.
You can now upload backups to the cloud. This integrates with Rclone, so you can use any cloud system that it supports, and Ludusavi can help you configure some of the more common ones: Google Drive, OneDrive, Dropbox, Box, FTP servers, SMB servers, and WebDAV servers.
For the GUI, refer to the "cloud" section on the "other" screen. For the CLI, use the cloud
command group (e.g., ludusavi cloud upload
).
The Lutris launcher is now supported as a root type. Ludusavi can find saves from Wine prefixes configured in Lutris.
The EA app is now supported as a root type.
On the restore screen, you can lock a backup so that it is kept indefinitely regardless of your retention settings.
Progress bars now show additional information (operation label, elapsed time, exact progress count).
Backups now record the operating system on which they were created. For the GUI, this is shown as a badge on the restore screen if you select a non-native backup. For the CLI, this is included in the output of the backups
command.
Ludusavi now supports Flatpak IDs (if present in the manifest) in order to infer the correct XDG_DATA_HOME
and XDG_CONFIG_HOME
. At this time, the primary manifest does not specify Flatpak IDs for any games, but any such additions can be supported transparently in the future.
GUI: You can use (shift+)tab to cycle through text fields.
GUI: Input fields show an error icon for paths like http://
and ssh://
since these are not supported and will be mangled into a local path.
CLI: A standalone manifest update
command.
The "merge" option has been removed, and merging is now always enforced. This option made sense before Ludusavi supported differential and cloud backups, but there was not much reason to turn off merging anymore.
The CLI backup
command's --merge
/--no-merge
flags are now ignored and will be removed in a future release.
CLI: The backup
command's --update
/--try-update
flags are deprecated and will be removed in a future release. It was confusing because Ludusavi could still update the manifest without either flag, and other commands would also update the manifest but without equivalent flags to adjust the behavior.
To simplify this and for consistency with the GUI, now the CLI will update the manifest automatically by default. To disable this, use the new --no-manifest-update
global flag, which works across commands. To ignore errors in the update, use the new --try-manifest-update
global flag.
CLI: The deprecated --by-steam-id
option has been removed from the backup
, backups
, and restore
commands. You can use the find
command to replicate this functionality.
CLI: Using --api
mode would silence some human-readable errors that would otherwise go on stderr. Since the API output itself goes on stdout, there's no harm leaving the other messages on stderr, so they are now allowed to print. In the future, these messages may be integrated into the API output directly.
GUI: If you try to close the program while an operation is ongoing, Ludusavi will cancel the operation cleanly first before closing. To skip the cleanup and force an immediate close (like in previous versions), you can simply try to quit a second time, but this isn't recommended if you can help it.
GUI: Subsections now have a slightly distinct background color to help tell them apart.
GUI: Adjusted some spacing/padding. A few more scanned games can fit on screen now.
Log files now include timestamps.
Some obsolete fields were removed from the config file. This won't have any effect on you unless you were using a version older than v0.14.0. If so, then just update to v0.17.1 first so that Ludusavi can migrate the affected settings. Fields: manifest.etag
, backup.recentGames
, restore.recentGames
, and restore.redirects
.
Some config fields weren't serialized if they matched the default value. Now they're serialized anyway in case the default value were to ever change. Fields: backup.filter.excludeStoreScreenshots
, scan.showDeselectedGames
, scan.showUnchangedGames
, and scan.showUnscannedGames
.
Updated translations. (Thanks to contributors on the Crowdin project)
./
and ../
) were not correctly resolved.manifest
command was allowed, even though it did nothing. You can still use manifest --help
for subcommand info.x
) is now displayed for saves. This indicates that a save from the latest backup no longer exists on the system. If a game has some removed saves, then that game will be marked as updated and will trigger a new backup. If 100% of a game's saves are removed, then the game won't be listed, and no backup will be performed..ludusavi.yaml
file, then it will be incorporated into the backup scan.LUDUSAVI_THREADS
environment variable.backups
command.duplicatedBy
field, like files and registry keys.The standalone Linux release is now compiled on Ubuntu 20.04 instead of Ubuntu 18.04 because of a change by GitHub.
When making a new backup for a game, if the backup retention limits are reached for that game, but your full backup limit is only 1 and you have differential backups enabled, Ludusavi will now prune only the oldest differential backup and then make a new differential.
Previously, Ludusavi would prune the full backup along with its associated differentials and then make a new full backup. That is still the case when your full backup limit is 2 or more, but there is now a special exception when it is only set to 1.
GUI: In the save file hierarchy, if a folder is disabled, it will now be collapsed by default. Also, when you re-scan a single game, its folders remain expanded or collapsed as you had them instead of reverting to the default state.
GUI: On the backup and restore screens, the search icon has been replaced with a filter icon, which reveals the existing title search along with the new filters described above. The sort settings are now always visible, and the "reversed" checkbox is replaced with an ascending/descending icon.
GUI: On the backup screen, the gear icon is now on the top row.
backups
command needlessly performed a full restoration preview when determining the available backups. Now, it only reads the mapping.yaml
file for each game.