Releases: mtkennerly/ludusavi
v0.19.0 (2023-06-02)
- Added:
-
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
,
-
- Fixed:
-
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 ofgog_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.
-
v0.18.2 (2023-05-21)
- Fixed:
- When a Lutris game file does not include the
game > working_dir
field, Ludusavi will now try to fall back to thegame > exe
field and cut off the file name. Ludusavi will also log a more specific message when an expected field is missing.
- When a Lutris game file does not include the
v0.18.1 (2023-05-21)
- Fixed:
-
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:
- An empty console window would stay open along with the GUI.
- Asynchronous Rclone commands would fail.
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.
-
v0.18.0 (2023-05-20)
- Added:
-
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
andXDG_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://
andssh://
since these are not supported and will be mangled into a local path. -
CLI: A standalone
manifest update
command.
-
- Changed:
-
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 thebackup
,backups
, andrestore
commands. You can use thefind
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
, andrestore.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
, andscan.showUnscannedGames
. -
Updated translations. (Thanks to contributors on the Crowdin project)
-
- Fixed:
- Significantly improved performance of zip file extraction. Ludusavi had been unnecessarily reopening the zip for each file inside. In the most extreme case tested (40,864 files and 8.70 GB for a single game), the time was reduced from 12+ hours to 4 minutes.
- In secondary manifests, relative paths (beginning with
./
and../
) were not correctly resolved. - GUI: In some cases, the scroll position would be set incorrectly when changing screens or when closing a modal.
- CLI: A bare
manifest
command was allowed, even though it did nothing. You can still usemanifest --help
for subcommand info. - The log message "ignoring unrecognized Heroic game" could be recorded incorrectly when doing partial scans.
v0.17.1 (2023-04-10)
- Fixed:
- GUI: As part of the thread configuration feature in v0.17.0, Ludusavi started defining a custom Tokio runtime initialization. However, this did not enable Tokio's IO and time features, resulting in a crash when attempting to display timed notifications.
- GUI: When using the "customize" option from the scan list, the new custom game's fields were not filled in properly.
- GUI: If a game was disabled, then the "back up" option in that game's "..." menu would not do anything.
- GUI: If you scanned a few specific games in the list, but there were others in an unscanned state (recent games from a previous session), then the next full backup would only process the few games that were scanned.
v0.17.0 (2023-04-09)
- Added:
- A new "removed" status (icon:
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. - Support for secondary manifests bundled with games. If a game includes a
.ludusavi.yaml
file, then it will be incorporated into the backup scan. - Option to sort games by status: new -> different -> same -> unscanned. This is now the default sort order for new installations of Ludusavi.
- Option to override the maximum threads used for scanning games in parallel. You can also override this via the
LUDUSAVI_THREADS
environment variable. - GUI: On the backup/restore screen, you can click on the "duplicates" badge next to a game to filter the list down to just the games that conflict with it. You can click the badge again to reset the filter. If the badge is faded out, that means the conflicting saves have been resolved.
- GUI: On the backup/restore screen, you can use the filter icon to show games based on whether they are enabled and whether they have duplicate or ignored saves. These filters are reset when you close the program.
- GUI: On the other screen, there are new options to hide certain kinds of games. You can now hide games that are deselected, unchanged, and unscanned. These settings are saved between sessions.
- CLI: Backup comments are now included in the output of the
backups
command. - CLI: Registry values now have the
duplicatedBy
field, like files and registry keys.
- A new "removed" status (icon:
- Changed:
-
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.
-
- Fixed:
- Ludusavi only pruned old backups that exceeded your retention settings when making a new full backup, but not when making a new differential backup. Now, pruning is also performed as needed after a differential backup.
- The
backups
command needlessly performed a full restoration preview when determining the available backups. Now, it only reads themapping.yaml
file for each game. - When using Heroic on Linux to run Windows games, save paths in the game install folders are now checked case-insensitively.
- When a registry key was toggled off, but one of its values was toggled on, the key and value would not be backed up. Now, the key will be included along with just the selected values. The inverse (key toggled on and values toggled off) was working correctly.
- GUI: The window would lock up briefly at the start of a backup/restore. This was more noticeable on slower systems.
- GUI: On the backup screen, in the list of saves for each game, you can now toggle the file system root when it is on a line of its own. Previously, it did not have a checkbox in this case.
- GUI: On the other screen, backup exclusions could be formatted incorrectly if you tried to undo/redo before making any changes to them.
- GUI: On Mac, if a backup included multiple direct children of the root directory, then the first entry in the list would be displayed blank. It now correctly shows "/" to indicate the root directory.
- GUI: On Mac, undo now uses the standard shortcut cmd+z instead of ctrl+z.
v0.16.0 (2023-03-18)
- Added:
-
Registry values are now listed individually, not just keys. This also means you can exclude specific values from the backup.
-
Registry backups now include binary values.
-
Registry backups now handle alternatives to
HKEY_LOCAL_MACHINE\SOFTWARE
. For example, when Ludusavi tries to findHKEY_LOCAL_MACHINE\SOFTWARE\example
, it will now also look for:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\example
HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\SOFTWARE\example
HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\SOFTWARE\Wow6432Node\example
-
GUI: In restore mode, you can create a comment on each backup. You can use this to keep track of how each backup reflects your game progress.
-
GUI: You can now reorder custom games, roots, redirects, and ignored paths/registry.
-
CLI:
manifest show
command. -
CLI:
--compression-level
option for thebackup
command. -
Updated translations, including new/partial translations for Dutch, French, Russian, and Ukrainian. (Thanks to contributors on the Crowdin project)
A translation for Japanese has also 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
ja-JP
,
-
- Fixed:
- When a save file failed to be backed up, Ludusavi would still record that file in the backup's
mapping.yaml
. Because of this, when Ludusavi would later check whether a new backup was needed, it would assume that the failed file had been backed up previously. Now, failed files are not recorded inmapping.yaml
, so subsequent scans will detect that they still need to be backed up. - Heroic Wine/Proton prefixes containing a
pfx
subfolder were not detected. - Along with any explicit
installDir
entries in the manifest, Ludusavi tries to find each game's install directory based on that game's title. However, if that title was not valid as a folder name, then Ludusavi would never find it. Now, Ludusavi will ignore characters like:
and?
that cannot appear in folder names. - For native Linux games installed with the Heroic launcher, the
<storeUserId>
path placeholder is now handled in order to detect more saves. (Contributed by sluedecke) - Ludusavi currently cannot back up registry keys whose names contain a forward slash. This limitation still exists, but now such keys are no longer listed incorrectly as two separate keys. This was only a display issue, because such keys were not included in the backup regardless.
- GUI: If some saves failed to back up, then the scan buttons would stay deactivated, and you would have to reopen the program in order to do another scan.
- GUI: If a game had a new registry value inside of a key that also contained other keys, then the game would be flagged as changed, but not the key with the new value. Now that values are listed individually, you can tell what changed.
- GUI: Scrollbar position on the other screen overlapped some content.
- GUI: Scroll position is once again preserved when switching between screens.
- GUI: Some inconsistent element sizes and spacing.
- When a save file failed to be backed up, Ludusavi would still record that file in the backup's
- Changed:
- GUI: Moved roots to the other screen.
- GUI: Thanks to updates in Iced:
- Text fields now have a blinking cursor.
- Text fields now support shift+click to select text.
- Thanks to updates in steamlocate, the titles of Steam shortcuts for non-Steam games are now looked up case-insensitively.
v0.15.2 (2022-12-22)
- Fixed:
- Native registry saves on Windows were not restored.
- When switching between dropdowns, they would briefly flicker with incorrect content.
- Game titles starting with a lowercase letter were listed after all titles starting with an uppercase letter.
- When using the folder picker for roots and custom game files, glob special characters were not escaped.
v0.15.1 (2022-11-25)
- Fixed:
- The placeholder
<winProgramData>
was incorrectly interpreted asC:/Windows/ProgramData
when it should have beenC:/ProgramData
. This affected the lookup of the normal location on Windows, but it did not affect Wine/Proton or VirtualStore paths. - For Wine prefixes from Heroic and Wine prefixes passed by CLI, the prefix's
*.reg
files were backed up even if the game in question was not known to have registry-based saves.
- The placeholder
- Changed:
- Updated translations. (Thanks to contributors on the Crowdin project)
v0.15.0 (2022-11-07)
- Added:
- Steam shortcuts for non-Steam games are now detected. On all platforms, the shortcut's "start in" folder is used as the
<base>
path. On Linux, the shortcut's app ID is used to checksteamapps/compatdata
for Proton saves. - In Heroic roots, Ludusavi can now recognize games by their GOG ID. This helps resolve cases where Heroic and Ludusavi use different titles for the same game. The CLI
find
command now also has a--gog-id
option. - GUI: On the Steam Deck, an "exit" button has been added to the other screen, to make it easier to exit the program while using game mode. Ludusavi checks if
/home/deck
exists in order to determine whether it is running on the Steam Deck. - CLI:
--config
option to set a custom config directory. (Contributed by sluedecke) - Updated translations. (Thanks to contributors on the Crowdin project)
- Steam shortcuts for non-Steam games are now detected. On all platforms, the shortcut's "start in" folder is used as the
- Changed:
- Manifest updates now use gzip compression, cutting the download size to about 10% (e.g., 11.4 MiB -> 1.5 MiB).
- Fixed:
- GUI: Notifications did not disappear when the window was inactive.