RetroSaveManager is a self-hosted save sync manager for retro gaming setups.
It is built for homelab users who want to run one Docker container, keep all save data on their own storage, and use compatible helper apps with MiSTer, RetroArch, and other supported systems.
- One runtime container
- One web UI
- One API for helper apps
- One save root you can back up
- Docker-first self-hosting
This is the smallest useful Docker Compose setup.
services:
retrosavemanager:
image: ghcr.io/joeblack2k/retrosavemanager:latest
container_name: retrosavemanager
restart: unless-stopped
ports:
- "80:80"
environment:
AUTH_MODE: disabled
SAVE_ROOT: /saves
STATE_ROOT: /config
PORT: 80
volumes:
- /srv/retrosavemanager/config:/config
- /srv/retrosavemanager/saves:/savesStart it:
docker compose up -dOpen it:
http://YOUR-DOCKER-HOST-IP/
image: ghcr.io/joeblack2k/retrosavemanager:latest
Uses the published container image from GitHub Container Registry.
container_name: retrosavemanager
Gives the container a fixed and easy-to-recognize name.
restart: unless-stopped
Starts the container again after a reboot or Docker restart.
ports:
Publishes the web UI and API to your Docker host.
- "80:80"
Maps host port 80 to container port 80.
AUTH_MODE: disabled
Disables login requirements. This is the default and is intended for trusted internal networks.
SAVE_ROOT: /saves
The container stores all managed save data under /saves.
STATE_ROOT: /config
The container stores app state, indexes, and internal metadata under /config.
PORT: 80
Tells the app to listen on port 80 inside the container.
/srv/retrosavemanager/config:/config
Persistent config and app-state storage on your Docker host.
/srv/retrosavemanager/saves:/saves
Persistent save storage on your Docker host. This is the most important volume for backups.
These are the two important host folders:
/srv/retrosavemanager/config/srv/retrosavemanager/saves
What they contain:
config- internal app state
- save index metadata
- helper-related state
- settings used by the service
saves- the actual save files
- per-system folders
- per-game folders
- metadata for each stored save version
If you only care about protecting save history, back up both folders.
If you want the shortest answer to “where are my saves?”, it is this:
/srv/retrosavemanager/saves
RetroSaveManager keeps save data under one backup-friendly root:
SAVE_ROOT/<System>/<Game>/<save-id>/
Example:
/srv/retrosavemanager/saves/Nintendo Super Nintendo Entertainment System/Super Mario World/save-123456/
Inside each save folder you will typically see:
payload.*metadata.json
By default, RetroSaveManager uses:
- Container port
80 - Host port
80in the example above
That means:
- Web UI:
http://YOUR-HOST-IP/ - API:
http://YOUR-HOST-IP/
There is no required separate frontend port.
There is no required separate API port.
There is no built-in HTTPS requirement inside the container.
If you want to use a different host port, change only the left side:
ports:
- "8080:80"Then the service will be available at:
http://YOUR-HOST-IP:8080/
You only need the minimal compose above to get started.
These extra variables are optional:
BASE_URL
Set this if you want a fixed public or internal base URL.
PUBLIC_HOST
Useful if you use an internal DNS name such as retrosavemanager.lan.
IGDB_CLIENT_ID
Optional metadata and cover-art enrichment.
IGDB_CLIENT_SECRET
Optional metadata and cover-art enrichment.
RAWG_API_KEY
Optional metadata and cover-art fallback enrichment.
BOOTSTRAP_DEMO_DATA
Set to true only if you want demo data in a fresh environment.
services:
retrosavemanager:
image: ghcr.io/joeblack2k/retrosavemanager:latest
container_name: retrosavemanager
restart: unless-stopped
ports:
- "80:80"
environment:
AUTH_MODE: disabled
PORT: 80
SAVE_ROOT: /saves
STATE_ROOT: /config
PUBLIC_HOST: retrosavemanager.lan
volumes:
- /srv/retrosavemanager/config:/config
- /srv/retrosavemanager/saves:/savesPull the latest image and recreate the container:
docker compose pull
docker compose up -dPoint helper apps to your RetroSaveManager host:
http://YOUR-HOST-IP/
If your helper supports an API URL variable, use:
RSM_API_URL=http://YOUR-HOST-IP/
If you use an internal DNS name:
RSM_API_URL=http://retrosavemanager.lan/
- This project is designed for internal and self-hosted use.
- Default auth mode is disabled for trusted LAN setups.
- The standard deployment is exactly one container.
- The web UI and helper API are served by the same container.
Container images are published here: