Your game saves, on every device you play on.
Save sync for the games Steam Cloud does not cover, on a server you own.
Download · Get started · Server · Steam Deck · Windows, Mac and Linux
You play on the PC, pick up the Steam Deck later, and the save is not there. Steam Cloud covers some games and not others. Emulators, games from other stores and anything added to Steam by hand are left to you. A sync folder that copies files both ways will happily put the older save over the newer one.
BlockSlot fixes that for the games Steam misses:
- Before a game starts, it restores the newest save from any of your devices.
- When the game closes, it uploads the save. Offline, the save waits in a queue and goes up later.
- Every save is kept as a snapshot with its history. Nothing is ever overwritten.
- Two devices played from the same save? It asks which one to keep. It never guesses.
- Emulators too. A RetroArch, RetroBat or RetroDECK saves folder is split into one save per game, and each game keeps its own history.
- Each OS keeps its own history. A Mac never restores a Linux save of the same game, because the two builds save different files in different places. A Windows game under Proton on the Deck shares its history with Windows.
Windows PC Steam Deck Mac, Linux desktop
BlockSlot.exe BlockSlot for Decky Blockslot.app, a checkout
\ | /
\ upload on exit, restore before start /
`---------------. | .--------------'
v v v
blockslot-server (your NAS, one container)
S3 store (Garage) + web UI on :8761
- The server holds every save and has a web page for your games, devices and the settings they share. One Docker container. Unraid has a template.
- Each device runs a small daemon that uploads and restores. On Windows it is a service with a tray icon. On the Deck it lives inside the Decky plugin. On a Mac it is a LaunchAgent, and on a Linux desktop a systemd user unit.
- Steam starts the game through BlockSlot. Turning sync on for a game sets its launch option, and BlockSlot then runs the game itself. Steam's files are never edited by hand.
A streamed game runs on the machine that streams it (the host), not on the one in your hands, and the host's Steam starts it with the host's own launch option. So where BlockSlot is installed on the host and the game is turned on there, a stream syncs exactly like a local launch: the newest save is restored before the game starts and uploaded after it quits.
- No dialogs on the host. Nobody sits there during a stream, so nothing is asked and nothing waits. Two saves that were both played are left for the next launch in front of a screen to decide, and warnings go to the log.
- A game already running on the host is joined, not started. Steam turns the Play button into "Stream from" that machine and nothing is restored. Quit it there first if you played somewhere else since.
- The client needs BlockSlot only if you also play on it locally.
On Unraid, search for BlockSlot in the Apps tab. Anywhere else:
docker run -d --name blockslot-server --restart unless-stopped \
-p 3900:3900 -p 8761:8761 \
-v /path/to/blockslot:/data \
ghcr.io/datbird/blockslot-server:latest
Open http://<server>:8761. A short guide asks for what it needs: an admin
account, the address devices use, and your emulators if you have any. Then it
adds your first device. More in the server's README.
- Download
BlockSlot-<version>-windows-x64.zipfrom the latest release. - Unzip it to a folder of its own and run
BlockSlot.exe. It needs nothing else installed. Settings offers to fetch ludusavi. - On the server's Devices page, add this PC. In BlockSlot, open Store, enter the address and pairing code it shows, and choose Pair with the server.
- On Games, turn sync on for the games you play.
The plugin is not in the Decky store yet. Install the release's zip:
- In Decky, open Settings and turn on Developer mode.
- Under Developer, choose Install Plugin from URL and give it the
...-decky.ziplink from the latest release. To build it yourself instead, see install from source. - On the server's Devices page, add the Deck. In the plugin, open Server, enter the address and the code, and pair.
- On Games, turn a game on.
- Download
BlockSlot-<version>-mac-arm64.zipfrom the latest release (from 1.0.3 on) and unzip it. - Put
Blockslot.appin/Applicationsand open it from there. Launch options and the LaunchAgent name the app by its path, so a copy run from Downloads or a disk image is refused. The app is signed ad hoc, not notarized. A copy your browser downloaded opens the first time only through System Settings, Privacy & Security, Open Anyway. - Pair it on Store, as on Windows. Secrets go into the login Keychain.
- In Settings, install ludusavi if it is missing.
- Install the daemon as a LaunchAgent:
/Applications/Blockslot.app/Contents/MacOS/Blockslot --install-service. - On Games, turn sync on. A game gets the launch option
/Applications/Blockslot.app/Contents/MacOS/Blockslot --pick -- %command%. The app carries the engine, so the Mac needs no python.
Run BlockSlot from a checkout with python3 gui/blockslot.py (the window needs
tkinter, python3-tk on Debian and Ubuntu), and install the daemon as a
systemd user unit with python3 gui/blockslot.py --install-service. Pair it on
Store, then in Settings install the engine (it goes to
~/.local/bin/savepick.py) and ludusavi. Games get the python form of the
launch option, which names that engine.
Steam from the snap, the flatpak or the distribution is found. What works
under snap Steam and why is in docs/linux-desktop.md.
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
- Not a replacement for Steam Cloud. Games Steam Cloud covers can stay with Steam. BlockSlot hides them by default.
- Not a cloud service. There is no account and nothing leaves your network unless you put the server behind something like Cloudflare Access. The server supports that, for sign-in and for device tokens.
- Not a backup of your whole PC. It carries game saves, and only for the games you turn on.
Everything on a device is the Python standard library. Nothing is installed with pip to run it.
| Part | Where | Build |
|---|---|---|
| Server | server/ |
docker build -f server/Dockerfile -t blockslot-server . |
| Windows app | gui/ |
python tools/build_exe.py (PyInstaller, build time only) |
| Mac app | gui/ |
python3 tools/build_exe.py --zip on an Apple silicon Mac (see below) |
| Decky plugin | decky/ |
pnpm install && pnpm build && python3 scripts/package.py |
| Engine | engine/ |
nothing to build: one file per job, shared by every device |
The Mac build needs python.org's Python (universal2, with its own Tcl/Tk) and
Apple's Command Line Tools (xcode-select --install), because PyInstaller
calls lipo and install_name_tool. It writes dist/Blockslot.app, a
self-contained arm64 folder bundle signed ad hoc, and --zip packs it into
dist/Blockslot-mac-arm64.zip. Only the build needs any of this. The app runs
on a Mac with no python and no developer tools.
engine/ the save picker Steam starts, the store client, the device daemon
gui/ the desktop app. gui/core holds every rule; gui/ui draws them
decky/ the SteamOS plugin. It carries a staged copy of gui/core
server/ the container: Garage and the web UI
index/ games.json: which files are saves, which games Steam Cloud covers
tools/ the index generator and the Windows and Mac builds
Tests run on every push, on Windows, macOS and Linux:
python engine/test_savepick.py
python gui/tests/run.py
python -m unittest discover server/tests
The store, the daemon and the save splitter have suites of their own, run
from engine/: python3 -m unittest test_slotstore test_slotd test_saveunits.
In daily use by its author on a Windows PC and a Steam Deck. On 2026-09-28 a Mac (macOS 26.6, running the release's Mac app) and an Ubuntu 26.04 laptop with snap Steam each ran a game through BlockSlot, each exit backup reached the store, each kept its own save history, and a Remote Play stream hosted by the laptop synced like a local launch. The server is new. One gap is known: the Emulator games screen still keys each folder by the older Syncthing device folder, so a device set up with only a store cannot give an emulator its folder yet. Bug reports and pull requests are welcome in issues.
MIT. See LICENSE.
BlockSlot drives ludusavi for every backup and restore. Its game index is derived from ludusavi-manifest, which is compiled from PCGamingWiki. The server stores saves with Garage. Full notices are in THIRD-PARTY-NOTICES.md.
















