Sync your PC game saves between machines using a USB drive as the go-between: no cloud account, no per-game launcher sync, just a fast, config-driven CLI that knows where each game hides its saves.
Different games scatter their saves across a dozen locations: %APPDATA%, Unity's LocalLow, Documents/My Games, Steam userdata, Windows Saved Games, and more. Moving your progress between a desktop and a laptop by hand is tedious and error-prone. SaveSync catalogs those locations once in a YAML file, then backs them up to a USB drive, restores them on another machine, or reconciles the two, verifying every copy with a checksum and never deleting a save it hasn't already backed up.
- Config-driven. Every save location lives in
config.yaml; adding a game is a few lines, no code. - Per-device path overrides. The same logical game can map to different physical paths on each machine (
device_overrides), with the current device auto-detected from its hostname. - Integrity-checked. Every file is verified with SHA-256 after copying; modification times are preserved so future comparisons stay accurate.
- Non-destructive. Backup/restore only ever overwrite; the USB always keeps a copy, and conflicts (both sides changed) are surfaced for you to decide.
- Three modes. One-way
backup, one-wayrestore, and interactive two-waysync. - Readable output. A
richterminal UI with status tables, progress bars, and per-game detail.
git clone <this-repo>
cd savesync
pip install .Requires Python 3.8+. Runtime dependencies: PyYAML and rich.
cp config.example.yaml config.yaml # then edit to taste (or run: savesync init)
savesync scan --detail # show detected local saves
savesync status E:\ # compare local vs the USB drive
savesync backup E:\ # copy local saves -> USB
savesync restore E:\ # copy USB saves -> local
savesync sync E:\ # interactive two-way reconciliationEvery command accepts --engine / --game filters; see savesync <command> --help.
config.example.yaml is a fully-worked, ready-to-copy example. It demonstrates the format with mainstream engines and titles (RenPy, Unity, Godot, Documents/My Games, Stardew Valley, Balatro, Baldur's Gate 3, …), the path_vars indirection, hostname→device mapping, and a device_overrides block. Copy it to config.yaml and adjust the paths and device names for your own machines.
The code is split by responsibility:
| Module | Responsibility |
|---|---|
scanner.py |
Discover save files (path-var resolution, device overrides, os.walk with pruning) |
manifest.py |
Track backed-up state on the USB drive (JSON manifest, SHA-256) |
sync.py |
Compare local vs USB and decide backup/restore/conflict |
ui.py |
rich-based presentation, fully decoupled from logic |
savesync.py |
CLI (argparse) wiring the commands together |
pip install -r requirements-dev.txt
pytestMIT, see LICENSE.

