Releases: mtkennerly/ludusavi
v0.26.0 (2024-10-29)
The Linux and Mac downloads are now provided in .tar.gz
format to better preserve the files' executable permissions.
- Added:
- Paths may now use the
<storeGameId>
placeholder. This is supported in Steam, GOG, and Lutris roots. For Steam roots, this also supports shortcuts to non-Steam games, where the placeholder will map to the shortcut's dynamic app ID. - Paths may now use the
<winLocalAppDataLow>
placeholder. - GUI: On the backup and restore screens, if you activate the filter options, then the backup/restore buttons will only process the currently listed games. This allows you to quickly scan a specific subset of games.
- You can now choose whether a custom game will override or extend a manifest entry with the same name. Previously, it would always override the manifest entry completely.
- GUI: Custom games can now be expanded/collapsed, sorted, and filtered.
- GUI: Custom games now have an icon to indicate when they override/extend a manifest entry.
- You can now configure redirects to be processed in reverse sequence when restoring.
- GUI: On the custom games screen, when you use the button to preview a custom game, the window will switch to the backup screen and show you the results for that game.
- GUI: There is now a button to quickly reset the game list filters, while still leaving the filter options open.
- Paths may now use the
- Fixed:
- Files on Windows network shares were not backed up correctly. For example, a file identified as
\\localhost\share\test.txt
would be backed up as<game>/drive-____UNC_localhost_share_test.txt
instead of the intended<game>/drive-____UNC_localhost_share/test.txt
. - When Steam was not installed, the logs would contain a
warning
-level message. This has been demoted to aninfo
-level message. - GUI: Fixed some inconsistent spacing between elements.
- CLI: On Linux, the
wrap
command's--infer steam
option would fail to find theSteamAppId
environment variable due to a case mismatch. - CLI: In some error conditions, the
wrap
command would show an alert and wait for the user to press a key, even if--force
was specified. Now, with--force
, Ludusavi will not wait for any input. - Old log files were not deleted when stored on a Windows network share.
- GUI: The title filter was case-sensitive.
- Files on Windows network shares were not backed up correctly. For example, a file identified as
- Changed:
- GUI: After successfully backing up or restoring a game, the status icons (new/updated/etc) will be cleared for that game.
- GUI: If the GUI fails to load, Ludusavi will try to log the error info.
- GUI: When you launch Ludusavi, the window now ensures that it gains focus.
- GUI: Modals now display on top of the app with a transparent background.
- GUI: On the backup and restore screens, the filter controls now wrap depending on the window size.
- GUI: The backup format and retention settings are now on the "other" screen, instead of being accessed via the gear icon on the backup screen.
- GUI: Some uses of "select"/"deselect" have been changed to "enable"/"disable".
- GUI: The game list filters now have a different background color.
- Updated translations. (Thanks to contributors on the Crowdin project)
v0.25.0 (2024-08-18)
- Added:
- You can now ignore specific manifests during scans. For example, if you only want to back up custom games, you can now disable the primary manifest's entries.
- GUI: On startup and once every 24 hours, Ludusavi will check if a new version is available and notify you.
- GUI: When left open, Ludusavi will automatically check for manifest updates once every 24 hours. Previously, this check only occurred when the app started.
- Manifests may now include a
notes
field. If a game has notes in the manifest, then the backup screen will show an info icon next to the game, and you can click the icon to display the notes. The primary manifest does not (yet) contain any notes, so this mainly applies to secondary manifest authors. - GUI: You can now filter scan results by which secondary manifest defined each game. You can also filter to display custom games only.
- CLI: The
api
command now supports acheckAppUpdate
message. - Linux: Added keywords to the
.desktop
file. (Contributed by Merrit)
- Fixed:
- CLI: Some commands would fail with relative path arguments.
- Changed:
- In the config file,
manifest.url
is now set tonull
by default to indicate that the default URL should be used, rather than explicitly putting the default URL in the file. - Updated translations. (Thanks to contributors on the Crowdin project)
- In the config file,
v0.24.3 (2024-07-01)
- Fixed:
- If two consecutive differential backups both ignored different save files and none of those files were ignored in the associated full backup, then the second differential backup would fail to redeclare the first differential backup's ignored saves.
- If you redirected all of the saves for a game that already had a backup, then the next scan would list the game as new instead of updated.
- GUI: On Mac, the file/folder selector would cause the app to crash.
v0.24.2 (2024-06-28)
- Fixed:
-
When multi-backup was enabled and Ludusavi backed up a game for the first time, it would first insert an empty backup in that game's
mapping.yaml
and then insert the real backup after. This behavior was meant for updating old backups from before multi-backup was added, but it was mistakenly being applied to brand new backups as well.Ludusavi will automatically detect and fix this. If the empty backup has a differential backup associated, then the oldest differential backup will replace the empty full backup. Otherwise, Ludusavi will remove the entry for the empty backup.
If you use Ludusavi's cloud sync feature, please run a preview in restore mode, which will automatically fix any of these incorrect initial backups, and then perform a full cloud upload on the "other" screen.
-
For Lutris roots, after reading
pga.db
, Ludusavi did not properly combine that data with the data from thegames/*.yml
files. (Verified by nihaals) -
Ludusavi assumed that a Lutris root would contain both
games/
andpga.db
together. That's true for new installations of Lutris, but older/existing installations would store them separately (e.g.,~/.config/lutris/games
and~/.local/share/lutris/pga.db
). To fix this, you can now specify a differentpga.db
path explicitly. In some cases, Ludusavi can prompt you to update the root automatically. -
CLI: The
find
command's--steam-id
and--gog-id
options only considered primary IDs from the manifest. They will now also consider secondary IDs (e.g., for DLC or different editions).
-
- Changed:
- Updated translations. (Thanks to contributors on the Crowdin project)
v0.24.1 (2024-06-15)
- Fixed:
- Symlinks were incorrectly traversed when applying redirects. For example, if you had a backup-type redirect from
/old
to/new
, but/new
happened to be a symlink to/newer
on your system, then the backup would incorrectly contain a reference to/newer
. - Redirects could match a partial folder/file name. For example, a restore-type redirect from
C:/old
toC:/new
would also redirectC:/older
toC:/newer
(C:/[old -> new]er
). - On Linux, if a file name contained a colon (
:
), it would fail to back up. - GUI: When using a game's context menu to create a custom entry, Ludusavi did not scroll down to the new entry.
- Symlinks were incorrectly traversed when applying redirects. For example, if you had a backup-type redirect from
- Changed:
- Updated translations, including a new translation for Finnish. (Thanks to contributors on the Crowdin project)
v0.24.0 (2024-06-08)
- Added:
- On the "other" screen, you can choose not to back up games with cloud support on certain stores. If a game is customized or already has local backups, then Ludusavi will continue backing it up regardless.
- For Heroic roots, Ludusavi now supports Amazon and sideloaded games.
- For Lutris roots, Ludusavi now scans
pga.db
in addition togames/*.yml
in case the YAML files do not contain all of the necessary information. - CLI: There is a new
api
command that can be used for bulk queries. Right now, it only supports looking up titles (analogous to thefind
command). - CLI: There is a new
schema
command to display some of Ludusavi's schemas. - CLI: The
find
command now accepts a--lutris-id
option. - CLI: The
backups
command output now includes each game's backup directory.
- Changed:
- Title normalization now ignores apostrophes and quotation marks (e.g.,
ludusavi find --normalized "Mirrors Edge"
will findMirror's Edge
). - Some additional fields in the config file have been made optional.
- Updated translations. (Thanks to contributors on the Crowdin project)
- Title normalization now ignores apostrophes and quotation marks (e.g.,
- Fixed:
- For Heroic and Lutris roots, if you had multiple copies of the same game, Ludusavi would only use the metadata from one of them.
- GUI: The game-level duplication badge did not always fade out when the conflicts were resolved.
v0.23.0 (2024-04-27)
- Added:
- CLI: The
wrap
command now supports some new arguments:--infer steam
,--infer lutris
, and--force
to skip confirmations - GUI: File sizes are now displayed for each file and directory. (Contributed by JackSpagnoli)
- When a save fails to back up or restore, you can now see a specific error message per save. Previously, this was only available in the log file. For the GUI, you can hover over the "failed" badge to view the error. Note that these errors are shown as-is for troubleshooting and may not be translated.
- You can now set aliases to display instead of the original name. This does not affect the CLI when using
--api
. - On Linux, for Steam roots that point to a Flatpak installation, Ludusavi now checks
$XDG_DATA_HOME
and$XDG_CONFIG_HOME
inside of the Flatpak installation of Steam. - Updated translations, including new in-progress translations for Traditional Chinese and Turkish. (Thanks to contributors on the Crowdin project)
- CLI: The
- Fixed:
- Ludusavi would crash when reading a non-UTF-8 mapping.yaml file. This wouldn't normally happen, but could arise from external modifications.
- GUI: On Linux with Wayland, the app ID property was not being set, which caused some issues like not showing the window icon and not grouping the window properly. (Contributed by ReillyBrogan)
- CLI: During slow processing (e.g., cloud upload or a game with huge saves), the progress bar timer wouldn't update.
- GUI: After performing a cloud upload preview on the other screen, the very next backup preview wouldn't do anything.
- GUI: You can now use undo/redo shortcuts for backup comments.
- CLI: The
wrap
command did not fail gracefully when the game launch commands were missing. - CLI: Several commands did not resolve aliases.
- CLI: The
cloud
commands did not reject unknown game titles. - If a game had more data that failed to back up than succeeded, then the backup size would be reported incorrectly.
- Changed:
-
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:
- You can now configure redirects that change Windows/Linux-style paths into the other format. For example, if you configure a backup redirect from
C:\games
to/opt/games
, then the backup will contain references to/opt/games
. (Previously,/opt/games
would turn intoC:/opt/games
when parsed on Windows, andC:\games
would turn into./C_/games
when parsed on Linux.) - On Windows, you can no longer write
/games
as an alias ofC:\games
. These are now treated as distinct paths. (Previously, on Windows, Linux-style paths were interpreted asC:
paths.) - If you try to restore Windows-style paths on Linux or vice versa, it will now produce an error, unless you've configured an applicable redirect.
- You can now configure redirects that change Windows/Linux-style paths into the other format. For example, if you configure a backup redirect from
-
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
andbackups
(notbackup
) commands would return an error if you specified a game that did not have any backups available to restore. This was inconsistent with thebackup
command, which would simply return empty data if there was nothing to back up. Now,restore
andbackups
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.
-
v0.22.0 (2023-12-26)
- Added:
- You can now configure additional manifests, which Ludusavi will download and use just like the primary one. This allows the community to create additional save lists for specific purposes that might not be covered by PCGamingWiki.
- You can now configure a custom game as an alias for another game, without having to make a copy of the other game's info. On the custom games screen, use the dropdown to toggle between "game" (default) and "alias".
- You can now configure roots for OS installations on other drives. New root types:
Windows drive
,Linux drive
,Mac drive
- Ludusavi can now scan Legendary games on their own without Heroic. New root type:
Legendary
- CLI:
wrap
command to do a restore before playing a game and a backup afterwards. (Contributed by sluedecke) - When a path or URL fails to open, additional information is now logged.
- On Windows, Ludusavi can now back up additional types of registry data:
REG_NONE
,REG_DWORD_BIG_ENDIAN
,REG_LINK
,REG_RESOURCE_LIST
,REG_FULL_RESOURCE_DESCRIPTOR
,REG_RESOURCE_REQUIREMENTS_LIST
. - On Windows, Ludusavi now recognizes if you've moved the
%USERPROFILE%\Saved Games
folder.
- Changed:
- GUI: A different icon is now used for the button to hide the backup comment field. The previous icon (a red X) could have been misinterpreted as "delete" rather than "close".
- GUI: When you click the filter icon on the backup/restore screen, the title search field is automatically focused.
- CLI: Help text is now styled a bit differently.
- Updated translations, including a new in-progress Czech translation. (Thanks to contributors on the Crowdin project)
- Fixed:
- GUI: On some systems using Wayland, Ludusavi would crash on startup.
- When storing file modified times in zip archives, if the year is too old for zip to support (i.e., before 1980), Ludusavi will now round up to the earliest supported date (1980-01-01).
- When backing up a malformed
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. - If Ludusavi encountered an error when restoring a specific file, it would retry up to 99 times in case it was just a temporary error. This was primarily intended to handle cases of duplicate backups that might cause a file to be busy, but it would also cause excessive delays for other, persistent errors. Now, Ludusavi will only try once per file.
- GUI: When a custom game was disabled, its refresh button would do nothing. The refresh button will now be disabled for that game.
v0.21.0 (2023-08-22)
- Added:
- GUI: Thanks to updates in Iced, there is now much better support for non-ASCII characters. This means that several translations are now properly supported: Simplified Chinese, Japanese, Korean, and Thai. Unfortunately, there are still technical limitations with Arabic, so that translation remains experimental via the config file.
- GUI: For custom games in scan results, you can click on the "custom" badge to jump to the corresponding entry.
- Changed:
- GUI: Rendering now uses DirectX/Vulkan/Metal instead of OpenGL. For systems that don't support those, there is a fallback software renderer as well.
- GUI: Ludusavi now bundles and uses the Noto Sans font for consistency, but some languages will still depend on your system fonts.
- Fixed:
- If an invalid manifest file were downloaded, Ludusavi would correctly show an error, but then after relaunching, it would get stuck on an "updating manifest" screen.
- On Linux, if Ludusavi were installed via Flatpak, then
XDG_CONFIG_HOME
andXDG_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). - For Heroic roots, Ludusavi now also checks the
legendaryConfig
folder used by Heroic 1.9.0. - Saves associated with the Ubisoft Game Launcher folder were not detected on Linux when installed with Steam and Proton.
- On non-Windows systems, when recursively finding files in a directory, file/folder names containing a backslash would cause an error. For now, these files will be ignored until they are properly supported.
- When using shift+click on a path selector icon to browse the path, it will now handle some manifest
<placeholder>
s. - In paths,
<storeUserId>
next to*
would trigger an error. - GUI: When switching screens and then expanding a section, the scroll position did not remain visually stable.
v0.20.0 (2023-07-10)
- Added:
- The restore screen now supports deselecting individual saves (like you already could on the backup screen).
- You can now use glob syntax for file paths in the "backup exclusions" section.
- CLI: Commands that take a list of games now support reading stdin (one game per line). For example,
ludusavi find --steam-id 504230 | ludusavi backup --preview
. - CLI: The
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. - Support for checking secondary/associated Steam IDs for a game. This is mainly useful for discovering Proton prefix folders of DLC, since DLC saves may be kept separately from base game saves. Specifically, this detection is based on the
steamExtra
field from the manifest. - A "custom" badge is shown next to custom games in scan results.
- Option to filter scan results by change status (new/updated/unchanged/unscanned). (Contributed by kekonn)
- For buttons that open a path selector dialog, shift+click will open the configured path in your file explorer.
- Fixed:
- When restoring registry saves, multi-string values would be restored as expandable string values, and expandable string values would be restored as multi-string values. This only affected the restore process; backups would still be correct. This issue was introduced in v0.18.0.
- For Lutris roots, the
<base>
placeholder was resolved generically instead of using the Lutris-specific logic. - For Lutris roots, when inferring the
<base>
from theexe
field, Ludusavi assumed that the path would be absolute, but it could also be relative. Now, Ludusavi will combine theprefix
andexe
fields if necessary.
- Changed:
- All path selectors now use the same icon.
- The button to find missing roots now uses a search icon instead of a refresh icon.
- Updated translations. (Thanks to contributors on the Crowdin project)