RomStore is a self-hosted game library manager and save synchronization system. It consists of a Dockerized Node.js backend, an Nginx frontend, and a cross-platform Electron desktop client.
- Centralized Library: Host your ROMs, BIOS files, and Save data on your own server.
- Save Synchronization: "Steam-like" save syncing with conflict detection (Cloud vs Local) and version history.
- Metadata: Automatically fetches game artwork and metadata (via IGDB).
- Secure Auth: Session-based authentication for multiple users.
- Cross-Platform Client: Electron app for Windows and Linux (AppImage).
- Backend: Node.js (Express), SQLite (via file system/JSON), Dockerized.
- Frontend (Web): Nginx serving static assets (legacy/admin panel).
- Client: Electron (Node.js + Chromium) with
chokidarfor file watching. - Data: Stored in
./data(User DB) and/emulation(ROMS/BIOS/Saves).
- Docker & Docker Compose: For running the server.
- Node.js (v18+) & NPM: For running/building the client.
- Git: For version control.
The server runs in Docker containers to ensure consistency and easy deployment.
-
Clone the repository:
git clone https://github.com/MAX96811/Romstore.git cd Romstore -
Start the Server:
docker-compose up --build -d
- Backend API:
http://localhost:3000 - Web Frontend:
http://localhost:1567 - Data Persistence: Data is stored in
./dataand your mapped emulation folders.
- Backend API:
The client is an Electron app that connects to your server.
-
Navigate to the client directory:
cd client -
Install Dependencies:
npm install
-
Run the Client:
npm start
- Ports: Defined in
docker-compose.yml. - Storage:
/emulation/roms/emulation/saves/emulation/bios- Note: Modify
docker-compose.ymlvolumes to map these to your host folders if needed.
- Settings: Click the "Settings" gear icon in the app.
- Server URL: Enter your server address (e.g.,
http://localhost:3000or your LAN IP). - Local Directory: Point this to your local emulation folder (e.g.,
C:\Emulationor/home/deck/Emulation).
To rebuild the server image (e.g., after code changes or for optimization):
# Rebuild and restart in background
docker-compose up --build -d- Optimization: The
dockerfileusesnode:20-alpineand.dockerignoreto keep image sizes small (<150MB).
To build the desktop application for distribution:
Windows (.exe):
cd client
npm run dist:win- Output:
client/dist/RomStore Setup <version>.exe
Linux (.AppImage):
- Note: Must be built on Linux or WSL (Windows Subsystem for Linux).
cd client
npm run dist:linux- Output:
client/dist/RomStore-<version>.AppImage
The client uses a smart sync system:
- Watcher: Monitors your local save directory for changes.
- Debounce: Waits 1 second after writing stops to prevent partial uploads.
- Conflict Detection:
- Safe Upload: Local changed, Server unchanged → Auto-Upload.
- Safe Download: Server changed, Local unchanged → Auto-Download.
- Conflict: Both changed since last sync → User Prompt (Keep Local vs Keep Cloud).
- Logs:
- Server:
docker-compose logs -f - Client: Check the VS Code terminal or DevTools Console (Ctrl+Shift+I).
- Server:
- Ignore Files:
.dockerignore: Excludesclient/,.git/,node_modules/from Docker builds..gitignore: Standard Node.js excludes.
Maintained by Maxime