RomM logo

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.