Skip to content

Self-host RomM

updated Sep 2026prices 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

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 + US
Get Hetzner Cloud (opens in new tab)
Kamaterafree trial
From $4/mo · 1 vCPU / 1 GB / 20 GB · US + EU + Asia
Start free on Kamatera → (opens in new tab)
DigitalOceanalso works on
From $6/mo · 1 vCPU / 1 GB / 25 GB · US + EU + Asia
Deploy on DigitalOcean → (opens in new tab)

Paid 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:80

More self-hosted tools

We use analytics cookies (Google Analytics, PostHog) to see which guides are useful. No ad networks, no cross-site tracking. See our privacy policy.