RetroArch Cloud Sync
RetroArch has save syncing built in. Point its Cloud Sync at SaveSync and your saves and states follow you between your handheld, PC, and Steam Deck, with every version kept. Nothing to install.
Cloud Sync arrived in RetroArch 1.16 for Apple devices, reached Linux in 1.19 and Windows in 1.20, and HTTPS on Android in 1.22. On the current stable release (1.22.2) it is in:
The Mac build from retroarch.com doesn't have it in 1.22.2; use the Mac App Store version. Linux handheld systems vary: muOS has the setting, and others depend on how they build RetroArch.
With Sync Mode on Automatic, RetroArch syncs when it starts and each time you close a game. It compares what changed on the device and on the server since the last sync, uploads and downloads the difference, and skips any file that changed on both sides (it says "finished with conflicts").
It syncs your saves and states, and if you want, configuration files (core options, shader presets), thumbnails, and system files such as BIOS. It never syncs retroarch.cfg or your playlists, so each device keeps its own paths.
https://savesync.fastwater.app/saves/, with the slash at the end, then enter the Username and Password from SaveSync.cloud_backups folder before it overwrites or deletes it.RetroArch syncs saves by their path inside its saves folder. Two devices only share a save when the path matches, so check these settings in Settings, Saving on every device:
The game's file name matters too: Pokemon Emerald (USA).srm only matches a ROM with the same name. Rename the ROM on one device if they differ. Use the same core for a game on each device as well, since a core's saves sit in its own folder when sorting by core name is on.
RetroArch syncs when it starts and when you close a game, not while you play. Close the game before you put a device down, and let RetroArch start on the next one before you load the game there.
If two devices change the same save between syncs, RetroArch skips that file and says "Cloud Sync finished with conflicts". To keep the copy in the cloud, delete the save on the device and sync again (in Settings, Saving, Cloud Sync, Sync Now). SaveSync keeps the 20 newest versions of every save either way, so you can restore one from the dashboard.
Typing a URL and a long password with a controller is slow. Instead, with RetroArch closed (it rewrites its config when it quits), open retroarch.cfg in RetroArch's config folder and set:
cloud_sync_enable = "true" cloud_sync_driver = "webdav" webdav_url = "https://savesync.fastwater.app/saves/" webdav_username = "savesync" webdav_password = "<your SaveSync password>" cloud_sync_sync_saves = "true" cloud_sync_destructive = "false"
Not sure where the file is? In RetroArch, Main Menu, Configuration File, Save Current Configuration shows its path.