Skip to content

LemanuelPC/savesync

Repository files navigation

SaveSync

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.

savesync scan --detail listing the local game saves it found

savesync sync reconciling local saves against a USB drive

Why

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.

Features

  • 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-way restore, and interactive two-way sync.
  • Readable output. A rich terminal UI with status tables, progress bars, and per-game detail.

Install

git clone <this-repo>
cd savesync
pip install .

Requires Python 3.8+. Runtime dependencies: PyYAML and rich.

Usage

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 reconciliation

Every command accepts --engine / --game filters; see savesync <command> --help.

Configuration

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.

Architecture

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

Tests

pip install -r requirements-dev.txt
pytest

License

MIT, see LICENSE.

About

Config-driven CLI that syncs PC game saves between machines using a USB drive as the go-between, checksummed and non-destructive.

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages