RomM
Beautiful, powerful, self-hosted rom manager and player
Alternative to: antstream arcade
RomM lets you scan, enrich, browse, and play your game collection from a clean, responsive web interface. It enriches your library with metadata and artwork from IGDB, ScreenScraper, MobyGames, and SteamGridDB, and supports in-browser play for 400+ platforms via EmulatorJS and RuffleRS.
RomM Docker Compose example
Self-host RomM on your own server, homelab, or VPS starting from this Docker Compose example.
It runs RomM in Docker containers using the official rommapp/romm:latest, mariadb:latest images, with persistent volumes and automatic restarts preconfigured.
Review the environment variables and adjust them to your setup, save the file as compose.yml (or docker-compose.yml), and start the stack with docker compose up -d.
services:
romm:
image: rommapp/romm:latest
restart: unless-stopped
environment:
# Hostname of the bundled MariaDB service.
DB_HOST: "romm-db"
# Database name; must match MARIADB_DATABASE on the db service.
DB_NAME: "romm"
# Database user; must match MARIADB_USER on the db service.
DB_USER: "romm-user"
# Database password; must match MARIADB_PASSWORD on the db service (internal to the compose network).
DB_PASSWD: "romm"
# Secret key used to sign auth sessions. Generate one with `openssl rand -hex 32`.
ROMM_AUTH_SECRET_KEY: "changeme"
# (Optional) ScreenScraper username for richer game metadata. https://docs.romm.app/latest/Getting-Started/Metadata-Providers/#screenscraper
SCREENSCRAPER_USER: ""
# (Optional) ScreenScraper password.
SCREENSCRAPER_PASSWORD: ""
# (Optional) RetroAchievements API key. https://docs.romm.app/latest/Getting-Started/Metadata-Providers/#retroachievements
RETROACHIEVEMENTS_API_KEY: ""
# (Optional) SteamGridDB API key for cover art. https://docs.romm.app/latest/Getting-Started/Metadata-Providers/#steamgriddb
STEAMGRIDDB_API_KEY: ""
# Enable the Hasheous metadata provider (no account required).
HASHEOUS_API_ENABLED: "true"
volumes:
# Resources fetched from metadata providers (covers, screenshots, etc.)
- romm_resources:/romm/resources
# Cached data for background tasks (bundled Redis).
- romm_redis_data:/redis-data
# Your game library. See https://docs.romm.app/latest/Getting-Started/Folder-Structure/
- library:/romm/library
# Uploaded saves, states, screenshots, etc.
- assets:/romm/assets
# Optional config.yml location.
- config:/romm/config
depends_on:
romm-db:
condition: service_healthy
restart: true
romm-db:
image: mariadb:latest
restart: unless-stopped
environment:
# Root password for MariaDB (internal to the compose network).
MARIADB_ROOT_PASSWORD: "romm-root"
# Database created on first start; must match DB_NAME on the romm service.
MARIADB_DATABASE: "romm"
# Application database user; must match DB_USER on the romm service.
MARIADB_USER: "romm-user"
# Application database password; must match DB_PASSWD on the romm service.
MARIADB_PASSWORD: "romm"
volumes:
- mysql_data:/var/lib/mysql
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
start_period: 30s
start_interval: 10s
interval: 10s
timeout: 5s
retries: 5
volumes:
mysql_data:
romm_resources:
romm_redis_data:
library:
assets:
config:
Values set to changeme are required — replace them with your own
values before starting RomM.
Prefer a managed setup? WinterFlow installs, configures, and updates RomM for you using this same Docker Compose configuration.