Self-host RomM
updated Sep 2026deployed by usprices checked · Jul 2026Install verified on Ubuntu 26.04 · Sep 2026 · how we test
We earn commissions when you shop through the links below. Full disclosure →
A ROM manager that scans your retro game library, fetches metadata and artwork from providers such as IGDB and ScreenScraper, and lets you browse, download and play supported games in the browser through EmulatorJS.
Key facts
CategoryGame library
LicenseAGPL-3.0
StackPython, FastAPI, Vue
Min RAM2048 MB
Official imageyes
Difficulty
Websiteromm.app (opens in new tab)
What you need
- Any VPS with at least 2048 MB of RAM
- A domain you control — most self-hosted setups need HTTPS in front of them
- Under an hour if you've used Docker before
Where to host itaffiliate disclosure
Hetzner Cloudrun it on
From $23.59/mo · 2 vCPU / 4 GB / 80 GB · EU + USKamaterafree trial
From $4/mo · 1 vCPU / 1 GB / 20 GB · US + EU + AsiaDigitalOceanalso works on
From $6/mo · 1 vCPU / 1 GB / 25 GB · US + EU + AsiaPaid link — we earn a commission if you shop through it.
Install
Run these commands on your server:
# RomM + MariaDB — upstream's example compose, trimmed; put your ROMs under ./library/roms/<platform>/
mkdir -p romm/library/roms romm/assets romm/config && cd romm
DB_PASS=$(openssl rand -hex 24)
cat > docker-compose.yml <<EOF
services:
romm:
image: rommapp/romm:latest
restart: unless-stopped
environment:
DB_HOST: romm-db
DB_NAME: romm
DB_USER: romm-user
DB_PASSWD: $DB_PASS
ROMM_AUTH_SECRET_KEY: $(openssl rand -hex 32)
HASHEOUS_API_ENABLED: "true"
volumes: [romm_resources:/romm/resources, romm_redis_data:/redis-data, ./library:/romm/library, ./assets:/romm/assets, ./config:/romm/config]
ports: ["80:8080"]
depends_on: { romm-db: { condition: service_healthy } }
romm-db:
image: mariadb:latest
restart: unless-stopped
environment: { MARIADB_ROOT_PASSWORD: $(openssl rand -hex 24), MARIADB_DATABASE: romm, MARIADB_USER: romm-user, MARIADB_PASSWORD: $DB_PASS }
volumes: [mysql_data:/var/lib/mysql]
healthcheck: { test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"], start_period: 30s, interval: 10s, timeout: 5s, retries: 5 }
volumes: { mysql_data: {}, romm_resources: {}, romm_redis_data: {} }
EOF
docker compose up -d
# add IGDB/ScreenScraper/RetroAchievements keys to the env for richer metadata
# first visit runs a setup wizard that creates the admin user → http://SERVER_IP:80More self-hosted tools
Database admin
pgAdmin
PythonFlaskReact
easyRead guide →
Network-wide ad blocking
Pi-hole
C (pihole-FTL)
easyRead guide →
Photo backup & gallery
Piwigo
PHPMySQL
easyRead guide →
Monitoring
Speedtest Tracker
PHPLaravel
easyRead guide →