diff --git a/4.0.1/404.html b/4.0.1/404.html new file mode 100644 index 0000000..48ff745 --- /dev/null +++ b/4.0.1/404.html @@ -0,0 +1,1691 @@ + + + +
+ + + + + + + + + + + + + + + + + + +
+
+
+
+ RomM provides support for various forms of authentication, granting flexibility in securing access to its features.
+You'll want to set the following environment variable before starting RomM:
+ROMM_AUTH_SECRET_KEY is required and can be generated with openssl rand -hex 32When the /login endpoint is called with valid credentials, a session_id is generated, stored as a cookie and sent to the browser. The same token is used to create a cache entry in Redis (or in-memory if Redis is disabled) which maps the token to the user. This way no sensitive information is stored on the client.
A user can have one of the following roles:
+As permissions are additive, editors will have all permissions of the viewer role, and admins all those of the editor role.
Requests can be made to protected API endpoints with an authorization header. The token is the base64 encoded value of username:password.
Example using cURL:
+ +Along with the above forms of authentication, we've added an endpoint to generate expiring, scope-limited authentication tokens (/api/token). Successfully authenticating with that endpoint with return an access_token valid for 15 minutes, and a refresh_token valid for 2 weeks. The refresh_token can be used to generate a new access_token when needed.
The /api/token endpoint requires a username, password, and a list of scopes in the format read:roms write:roms read:platforms .... The list of scopes and endpoints are available to browse via Swagger UI or ReDoc (see next section).
Note: As of now, only the legacy password grant type is supported. We plan to eventually add support for Client Credentials.
+The API endpoints are fully documented and compliant with the OpenAPI specification. Explore the API endpoints using the Swagger UI interface at /api/docs and the ReDoc interface at /api/redoc, or view the raw JSON at /openapi.json.
For more information on OpenAPI, visit the OpenAPI Specification website.
+No, authentication is required and enabled by default.
+At this time, fine-grain control over permissions within a role is not supported. This decision was taking in order to simplify user management in the client, and authentication/permission code on the server.
+We've done our best to build an authentication system that is simple, clear and comprehensible. We have automated tests which verify that access is granted when it should be, and blocked when not (invalid credentials, missing permissions, expired access tokens, etc.). That being said, we welcome any reviews of our authentication and permission flows, PRs to fix issues, and new tests to cover edge cases.
+Please report bugs in our authentication/permission system privately by submitting a vulnerability report.
+
+
+
+ Below is a breakdown of each section of the config.yml file and its purpose:
excludeThis section lets you tell RomM which platforms, ROMs, or files to ignore during scanning.
+platforms + Exclude entire platforms (folders) from being scanned. + Example:
+ +roms + Fine-tune which ROMs or files are excluded.
+single_file + Applies to ROMs that are single files (not in subfolders).
+multi_file + Applies to ROMs stored as folders (multi-disc, with DLC, etc.).
+systemCustomize how RomM interprets your folder and platform names.
+platforms + Map your custom folder names to RomM's recognized platform names. + Example:
+ +This treats a gc folder as GameCube (ngc) and psx as PlayStation (ps).
versions + Associate a platform with its main version. This also tells RomM to fetch medatata from the main version source. + Example: +
+filesystemSpecify the folder name where your ROMs are located if it differs from the default. For example, if your roms folder it's named my_roms (/home/user/library/my_roms), set this accordingly.
Example:
+ +Tip
+You can find examples of full binded batocera or es-de config files.
+ +Warning
+Only uncomment or add the lines you need. Any omitted or empty sections will use RomM's defaults. +For a full example, see the config.example.yml file.
+
+
+
+ This is a complete list of available environment variables; required variables are marked with a ✓.
Tip
+You can also set environment variables with a _FILE suffix, which will load the contents of the file specified in the variable into the variable without the suffix. For example, setting ROMM_AUTH_SECRET_KEY_FILE=/run/secrets/romm_auth_secret_key and creating a file with the secret key at the specified path will set ROMM_AUTH_SECRET_KEY to the contents of the file. Learn more.
| Variable | +Description | +Required | +Default | +
|---|---|---|---|
| ROMM_AUTH_SECRET_KEY | +Generate a key with openssl rand -hex 32 |
+✓ | ++ |
| DISABLE_CSRF_PROTECTION | +Disables CSRF protection (not recommended) | ++ | false |
+
| DISABLE_DOWNLOAD_ENDPOINT_AUTH | +Disable auth on download endpoint (WebRcade, Tinfoil) | ++ | false |
+
| DISABLE_USERPASS_LOGIN | +Disables login with username and password (when using OIDC) | ++ | false |
+
| SESSION_MAX_AGE_SECONDS | +Maximum age of a session in seconds | ++ | 1209600 |
+
| KIOSK_MODE | +Read-only mode for public displays or kiosks | ++ | false |
+
| UPLOAD_TIMEOUT | +Timeout for file uploads (in seconds) | ++ | 600 |
+
| SCAN_TIMEOUT | +Timeout for the background scan/rescan tasks (in seconds) | ++ | 14400 |
+
| DISABLE_EMULATOR_JS | +Disables playing in browser with EmulatorJS | ++ | false |
+
| DISABLE_RUFFLE_RS | +Disables playing flash games with RuffleRS | ++ | false |
+
| YOUTUBE_BASE_URL | +Base URL for alternate frontends (Piped, Invidious etc.) | ++ | https://www.youtube.com |
+
| TZ | +Sets the timezone | ++ | UTC |
+
| WEB_CONCURRENCY | +Number of processes running the app | ++ | 2 |
+
| ROMM_PORT | +Port on which the application listens | ++ | 8080 |
+
| ROMM_BASE_PATH | +Base folder path for library, resources and assets | ++ | /romm |
+
| ROMM_BASE_URL | +Base url for properly display container logs links (like register or recover password) | ++ | 0.0.0.0 |
+
| LOGLEVEL | +Logging level for the app | ++ | INFO |
+
| FORCE_COLOR | +Forces color output | ++ | false |
+
| NO_COLOR | +Disables color output | ++ | false |
+
| Variable | +Description | +Required | +Default | +
|---|---|---|---|
| DB_HOST | +Host name of database instance | +✓ | +127.0.0.1 |
+
| DB_PORT | +Port number of database instance | ++ | 3306 |
+
| DB_NAME | +Should match MYSQL_DATABASE in MariaDB | ++ | romm |
+
| DB_USER | +Database username (in MariaDB, should match MARIADB_USER) | +✓ | ++ |
| DB_PASSWD | +Database password (in MariaDB, should match MARIADB_PASSWORD) | +✓ | ++ |
| ROMM_DB_DRIVER | +Database driver to use (options: mariadb, mysql, postgresql) |
++ | mariadb |
+
| REDIS_HOST | +Host name of Redis/Valkey instance | ++ | 127.0.0.1 |
+
| REDIS_PORT | +Port number of Redis/Valkey instance | ++ | 6379 |
+
| REDIS_USERNAME | +Username for Redis/Valkey instance | ++ | + |
| REDIS_PASSWORD | +Password for Redis/Valkey instance | ++ | + |
| REDIS_DB | +Database number for Redis/Valkey instance | ++ | 0 |
+
| REDIS_SSL | +Enable SSL for Redis instance | ++ | false |
+
| SENTRY_DSN | +DSN for Sentry error tracking | ++ | + |
| Variable | +Description | +Required | +Default | +
|---|---|---|---|
| IGDB_CLIENT_ID | +Client ID for IGDB API | ++ | + |
| IGDB_CLIENT_SECRET | +Client secret for IGDB API | ++ | + |
| SCREENSCRAPER_USER | +Screenscraper username | ++ | + |
| SCREENSCRAPER_PASSWORD | +Screenscraper password | ++ | + |
| MOBYGAMES_API_KEY | +MobyGames secret API key | ++ | + |
| STEAMGRIDDB_API_KEY | +SteamGridDB secret API key | ++ | + |
| RETROACHIEVEMENTS_API_KEY | +Retroachievements secret API key | ++ | + |
| REFRESH_RETROACHIEVEMENTS_CACHE_DAYS | +Retroachievements metadata cache refresh on days | ++ | 30 | +
| LAUNCHBOX_API_ENABLED | +Enable LaunchBox API integration | ++ | false |
+
| PLAYMATCH_API_ENABLED | +Enable PlayMatch API integration | ++ | false |
+
| HASHEOUS_API_ENABLED | +Enable Hasheous API integration | ++ | false |
+
| Variable | +Description | +Required | +Default | +
|---|---|---|---|
| OIDC_ENABLED | +Enable OpenID Connect (OIDC) authentication | ++ | false |
+
| OIDC_PROVIDER | +Name of the OIDC provider in use | ++ | + |
| OIDC_CLIENT_ID | +Client ID for OIDC authentication | ++ | + |
| OIDC_CLIENT_SECRET | +Client secret for OIDC authentication | ++ | + |
| OIDC_REDIRECT_URI | +Absolute redirect URI for OIDC authentication | ++ | + |
| OIDC_SERVER_APPLICATION_URL | +Absolute URL of the OIDC server application | ++ | + |
| OIDC_TLS_CACERTFILE | +Path to a file containing trusted CA certificates | ++ | + |
| Variable | +Description | +Required | +Default | +
|---|---|---|---|
| ENABLE_RESCAN_ON_FILESYSTEM_CHANGE | +Enable re-scanning of library when filesystem changes | ++ | false |
+
| RESCAN_ON_FILESYSTEM_CHANGE_DELAY | +Delay in minutes before re-scanning library when filesystem changes | ++ | 5 |
+
| ENABLE_SCHEDULED_RESCAN | +Enable scheduled re-scanning of library | ++ | false |
+
| SCHEDULED_RESCAN_CRON | +Cron expression for scheduled re-scanning | ++ | "0 3 * * *" |
+
| ENABLE_SCHEDULED_UPDATE_SWITCH_TITLEDB | +Enable scheduled updating of Switch TitleDB index | ++ | false |
+
| SCHEDULED_UPDATE_SWITCH_TITLEDB_CRON | +Cron expression for scheduled updating of Switch TitleDB | ++ | "0 4 * * *" |
+
| ENABLE_SCHEDULED_UPDATE_LAUNCHBOX_METADATA | +Enable scheduled updating of LaunchBox metadata | ++ | false |
+
| SCHEDULED_UPDATE_LAUNCHBOX_METADATA_CRON | +Cron expression for scheduled updating of LaunchBox metadata | ++ | "0 5 * * *" |
+
| DEV_MODE | Enable development mode (debugging, hot-reloading) | | false |
+| DEV_HOST | Host for development server | | | DEV_PORT | Port for development server | |5000 |
+| DEV_SQL_ECHO | Enable SQL query logging in development mode | |false |
+
+
+
+ RomM requires one of these folder structures for proper operation. It will first attempt to detect Structure A (recommended), and if not found, will fall back to Structure B. This auto-detection ensures flexibility while encouraging organization best practices.
+RomM organizes content in two main categories: ROMs and BIOS files.
+Structure A (Recommended): Both ROMs and BIOS files have their own dedicated root folders, with platform folders inside each.
+/roms/{platform}/ - Contains all game files for that platform/bios/{platform}/ - Contains all BIOS files for that platformStructure B (Fallback): Each platform has its own root folder containing both a ROMs folder and a BIOS folder.
+/{platform}/roms/ - Contains all game files for that platform/{platform}/bios/ - Contains all BIOS files for that platformNote
+The BIOS folder is entirely optional and only needed for platforms that require BIOS files.
+When using Docker, the volume mount point differs based on your chosen structure:
+roms folderplatform foldersFor multifile games (games stored as folders with multiple files or folders inside), RomM will detect special folders inside the game and will display with special tags in the webUI:
+dlchackmanualmodpatchupdatedemotranslationprototypeTip
+For folder naming conventions, review the Platform Support section. To override default system names in the folder structure (if your directories are named differently), see the Configuration File section.
+| Structure A (recommended) + | Structure B (fallback) | +
|---|---|
+ library/roms/{platform}/{game}
+ |
+
+ library/{platform}/roms/{game}
+ |
+
+ + library/ + ├─ roms/ + │ ├─ gbc/ + │ │ ├─ game_1.gbc + │ │ └─ game_2.gbc + │ │ + │ ├─ gba/ + │ │ ├─ game_3.gba + │ │ └─ game_4/ + │ │ ├─ game_4.gba + │ │ ├─ dlc + │ │ │ ├─ game_4_dlc_1.7z + │ │ │ └─ game_4_dlc_2.7z + │ │ ├─ hack + │ │ │ └─ game_4_hardmode.rar + │ │ ├─ manual + │ │ │ └─ game_4_manual.pdf + │ │ ├─ mod + │ │ │ └─ game_4_crazy_mode.zip + │ │ ├─ patch + │ │ │ └─ game_4_patch_v1.1.zip + │ │ ├─ update + │ │ ├─ demo + │ │ ├─ translation + │ │ └─ prototype + │ │ + │ └─ ps/ + │ ├─ game_5/ + │ │ ├─ game_5_cd_1.iso + │ │ └─ game_5_cd_2.iso + │ │ + │ └─ game_6.iso + │ + └─ bios/ + ├─ gba/ + │ └─ gba_bios.bin + │ + └─ ps/ + ├─ scph1001.bin + ├─ scph5501.bin + └─ scph5502.bin ++ |
+
+ + library/ + ├─ gbc/ + │ └─ roms/ + │ ├─ game_1.gbc + │ └─ game_2.gbc + │ + ├─ gba/ + │ ├─ roms/ + │ │ ├─ game_3.gba + │ │ └─ game_4/ + │ │ ├─ game_4.gba + │ │ ├─ dlc + │ │ │ ├─ game_4_dlc_1.7z + │ │ │ └─ game_4_dlc_2.7z + │ │ ├─ hacks + │ │ │ └─ game_4_hardmode.rar + │ │ ├─ manuals + │ │ │ └─ game_4_manual.pdf + │ │ ├─ mods + │ │ │ └─ game_4_crazy_mode.zip + │ │ ├─ patch + │ │ │ └─ game_4_patch_v1.1.zip + │ │ ├─ update + │ │ ├─ demo + │ │ ├─ translation + │ │ └─ prototype + │ │ + │ └─ bios/ + │ └─ gba_bios.bin + │ + └─ ps/ + ├─ roms/ + │ ├─ game_5/ + │ │ ├─ game_5_cd1.iso + │ │ └─ game_5_cd2.iso + │ │ + │ └─ game_6.iso + │ + └─ bios/ + ├─ scph1001.bin + ├─ scph5501.bin + └─ scph5502.bin ++ |
+
Note
+RomM can be setup without a prior folder structure. If files are manually uploaded from the webUI, RomM will automatically create the folder Structure A
+RomM's behavior can be customized using a config.yml file or through the Library Management page in the Settings menu. You can grab the example config.example.yml file and adapt it to your library.
What is shown in the Library Management page is the content of the config.yml. For more details read the configuration file section.
Games can be tagged with region, revision, or other tags by using parentheses in the file name. Additionally, you can set the region and language by adding a prefix: (USA), [reg-J], (French), [De].
rev or rev- (e.g. rev v1 or rev-1)tetris [1.0001](HACK)[!].gbaTags can be used to search for games in the search bar. For example, searching for (USA) will return all games with the USA tag.
+
+
+
+ RomM supports multiple metadata providers to enrich your game library with titles, descriptions, cover art, and achievements. You don't need all providers, so this guide covers popular combos and setup instructions.
+Here are some combinations you can use based on your needs:
+IGDB (Internet Game Database) is a popular metadata provider that offers metadata, cover art, screenshots, related games and more.
+To access the IGDB API you'll need a Twitch account and a valid phone number for 2FA verification. Up-to-date instructions are available in the IGDB API documentation. When registering your application in the Twitch Developer Portal, fill out the form like so:
+romm-3fca6fd7f94dea4a05d029f654c0c44b or KVV8NDXMSRFJ2MRNPNRSL7GQTlocalhostApplication IntegrationConfidentialImportant
+The name you pick has to be unique! Picking an existing name will fail silently, with no error messages. We recommend using romm-<random hash>, like romm-3fca6fd7f94dea4a05d029f654c0c44b
Note the client ID and secret that appear on screen, and use them to set IGDB_CLIENT_ID and IGDB_CLIENT_SECRET in your environment variables.
ScreenScraper.fr is a French provider that offers metadata, cover art, screenshots and manuals. It supports a wide range of systems and is a great alternative to IGDB.
+To access the ScreenScraper API, create a ScreenScraper account and copy the user and password you just created to SCREENSCRAPER_USER and SCREENSCRAPER_PASSWORD respectively.
MobyGames is a metadata provider that offers medatada, cover art and screenshots.
+To access the MobyGames API, create a MobyGames account and then visit your profile page. Click the API link under your user name to sign up for an API key. Copy the key shown and use it to set MOBYGAMES_API_KEY.
Important
+Access to the MobyGames API is now a paid feature. While we will continue to support it, we recommend using ScreenScraper or Hasheous instead, as they are free to use.
+The LaunchBox Games Database is a community-driven database that provides metadata, cover art, and screenshots. Like the Launchbox desktop application, RomM downloads the entire database locally and matches games based on their exact filenames.
+To enable LaunchBox, set LAUNCHBOX_API_ENABLED=true in your environment variables. You can enable regular updates of the database by setting ENABLE_SCHEDULED_UPDATE_LAUNCHBOX_METADATA, and set the frequency on the cron job with SCHEDULED_UPDATE_LAUNCHBOX_METADATA_CRON (defaults to 5:00 AM every day).
Hasheous is a free, open-source metadata provider that uses file hashes to match games. It proxies IGDB data for titles, descriptions, and cover art, and can provide Retroachievements IDs for matched games.
+Simply set HASHEOUS_API_ENABLED=true in your environment variables, and future scans will start using the Hasheous API.
Playmatch is a project built and hosted by a member of our comminuty. It provides a hash-based matching service for, and is used in conjunction with, IGDB.
+To enable PlayMatch, set PLAYMATCH_API_ENABLED=true in your environment variables.
SteamGridDB provides custom cover art for games or collections. It's not accessed through the scanner but from the "search cover" button when manually editing a game.
+To access steamGridDB API, you need to login into their website with a steam account. Once logged in, go to your API tab under the preferences page. Copy the key shown and use it to set STEAMGRIDDB_API_KEY.
RomM is able to display your achievements from Retroachievements. To sync it with your RomM instance, you need to generate an API key from your Retroechievements account in your settings
+Copy the key shown and use it to set RETROACHIEVEMENTS_API_KEY and perform a partial scan targeting the platform you want to match with Retroachievements.
After that, each user need to set their own username in their profile and sync it with Retroachievements. A new Achievements tab will appear in the Personal tab in the game details.
To avoid unneccessary API calls, a cached file with the RA database is stored in RomM. Refresh time for that cache file can be changed with the env variable REFRESH_RETROACHIEVEMENTS_CACHE_DAYS
+
+
+
+ This quick start guide will help you get a RomM instance up and running. It is split into 3 parts:
+This guide will assume that you already have the following done, if not - stop here and come back when you do.
+Warning
+RomM works without a metadata API for basic use, but may cause issues with plugins like Playnite. Setting up IGDB API keys is recommended to prevent setup problems.
+Now that we have everything gathered, we can begin getting your instance set up!
+MARIADB_ROOT_PASSWORD: Sets the root password of the database. Use a unique and secure password (use a password generator for simplicity)MARIADB_DATABASE: Sets the database name for RomM. This can be modified - but it's not necessaryMARIADB_USER: User to connect to the database with. This can be modified - but it's not necessaryMARIADB_PASSWORD: Password for the user to connect to the database with. Use a unique and secure password (use a password generator for simplicity)DB_NAME: Name of the database set in the database sectionDB_USER: Name of the user to connect to the databaseDB_PASSWD: Password of the user to connect to the databaseROMM_AUTH_SECRET_KEY environment variable:
+
+ It should look something like this:
+ IGDB_CLIENT_ID and IGDB_CLIENT_SECRETSCREENSCRAPER_USER and SCREENSCRAPER_PASSWORDRETROACHIEVEMENTS_USERNAME and RETROACHIEVEMENTS_API_KEYMOBYGAMES_API_KEYSTEAMGRIDDB_API_KEYPLAYMATCH_API_ENABLED=trueHASHEOUS_API_ENABLED=trueLAUNCHBOX_API_ENABLED=true/path/to/library: Path to the directory where your rom files will be stored (usually the parent folder of the roms folder)/path/to/assets: Path to the directory where you will store your saves, etc/path/to/config: Path to the directory where you will store the config.ymlSave the file as docker-compose.yml instead of docker-compose.example.yml. It should look something like this:
+ +version: "3"
+
+volumes:
+ mysql_data:
+ romm_resources:
+ romm_redis_data:
+
+services:
+ romm:
+ image: rommapp/romm:latest
+ container_name: romm
+ restart: unless-stopped
+ environment:
+ - DB_HOST=romm-db
+ - DB_NAME=romm # Should match MARIADB_DATABASE in mariadb
+ - DB_USER=romm-user # Should match MARIADB_USER in mariadb
+ - DB_PASSWD= # Should match MARIADB_PASSWORD in mariadb
+ - ROMM_AUTH_SECRET_KEY= # Generate a key with `openssl rand -hex 32`
+ - SCREENSCRAPER_USER= # These are the recommended metadata providers
+ - SCREENSCRAPER_PASSWORD= # https://docs.romm.app/latest/Getting-Started/Metadata-Providers/#screenscraper
+ - RETROACHIEVEMENTS_API_KEY= # https://docs.romm.app/latest/Getting-Started/Metadata-Providers/#retroachievements
+ - STEAMGRIDDB_API_KEY= # https://docs.romm.app/latest/Getting-Started/Metadata-Providers/#steamgriddb
+ - HASHEOUS_API_ENABLED=true # https://docs.romm.app/latest/Getting-Started/Metadata-Providers/#hasheous
+ volumes:
+ - romm_resources:/romm/resources # Resources fetched from IGDB (covers, screenshots, etc.)
+ - romm_redis_data:/redis-data # Cached data for background tasks
+ - /path/to/library:/romm/library # Your game library. Check https://github.com/rommapp/romm?tab=readme-ov-file#folder-structure for more details.
+ - /path/to/assets:/romm/assets # Uploaded saves, states, etc.
+ - /path/to/config:/romm/config # Path where config.yml is stored
+ ports:
+ - 80:8080
+ depends_on:
+ romm-db:
+ condition: service_healthy
+ restart: true
+
+ romm-db:
+ image: mariadb:latest
+ container_name: romm-db
+ restart: unless-stopped
+ environment:
+ - MARIADB_ROOT_PASSWORD= # Use a unique, secure password
+ - MARIADB_DATABASE=romm
+ - MARIADB_USER=romm-user
+ - MARIADB_PASSWORD=
+ 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
+Open the terminal and navigate to the directory containing the docker-compose file
+docker compose up -d to kick off the docker pull. You will see it pull the container and set up the volumes and network:docker ps -f name=romm to verify that the containers are runninghttp://localhost:80, where you should be greeted with the RomM setup pageThis method is generally the fastest and recommended for first time setup. You need your library properly mounted as a container volume:
+Scan button in the sidebarThis method is certainly viable, but not recommended if you have a lot of ROMs and/or multiple platforms. It is good for adding after the fact as your collection grows, but wouldn't be recommended for the first set up, nor for multi-file ROMs:
+Upload button in the sidebar+ ADD and select the ROMs you want to upload in the file selector that appearsUpload to begin uploading the ROMsroms/platforms you have
+
+
+
+ Here are some basic configurations for popular reverse proxies. Some installations may require modifications to configuration options not listed below.
+https://romm.mysite.com {
+ tls mysite.com.crt mysite.com.key # Certificate and key files
+
+ encode zstd gzip
+
+ header * {
+ Strict-Transport-Security "max-age=31536000;"
+ X-XSS-Protection "1; mode=block"
+ X-Frame-Options "SAMEORIGIN"
+ X-Robots-Tag "noindex, nofollow"
+ -Server
+ -X-Powered-By
+ }
+
+ reverse_proxy romm:8080
+}
+server {
+ listen 80 default_server;
+ server_name romm.mysite.com;
+ client_max_body_size 0;
+
+ location / {
+ include /config/nginx/proxy.conf;
+ include /config/nginx/resolver.conf;
+ set $upstream_app romm;
+ set $upstream_port 8080;
+ set $upstream_proto http;
+ proxy_pass $upstream_proto://$upstream_app:$upstream_port;
+ }
+}
+server {
+ listen 80 default_server;
+ server_name _;
+ return 301 https://$host$request_uri;
+}
+
+server {
+ listen 443 ssl http2;
+ listen [::]:443 ssl http2;
+
+ server_name romm.mysite.com;
+ include /config/nginx/ssl.conf;
+ client_max_body_size 0;
+
+ location / {
+ include /config/nginx/proxy.conf;
+ include /config/nginx/resolver.conf;
+ set $upstream_app romm;
+ set $upstream_port 8080;
+ set $upstream_proto http;
+ proxy_pass $upstream_proto://$upstream_app:$upstream_port;
+
+ # Hide version
+ server_tokens off;
+
+ # Security headers
+ add_header X-Frame-Options "SAMEORIGIN" always;
+ add_header X-Content-Type-Options "nosniff" always;
+ add_header X-XSS-Protection "1; mode=block" always;
+ add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
+ add_header Referrer-Policy "no-referrer-when-downgrade" always;
+ }
+}
+Items marked with ❗ are important to set, as RomM may not correctly otherwise!
+romm.example.com (replace example with your own)* Scheme: http8080offonon ❗Strongly recommended, but only required if you plan to secure your site (use HTTPS)
+ononoffonCustom Nginx Configuration ❗
+ +| Details | +SSL | +Advanced | +
|---|---|---|
http:
+ romsdomainse:
+ entryPoints:
+ - "https"
+ rule: "Host(`roms.domain.se`)"
+ middlewares:
+ - default-headers
+ - https-redirectscheme
+ tls:
+ certResolver: http
+ service: romsdomainse
+
+services:
+ romsdomainse:
+ loadBalancer:
+ servers:
+ - url: "http://192.168.1.100:8080"
+ passHostHeader: true
+labels:
+ - "traefik.enable=true"
+ - "traefik.http.services.romm.loadbalancer.server.port=8080"
+ - "traefik.http.routers.romm.rule=Host(`romm.YOUR_DOMAIN.com`)"
+ - "traefik.http.routers.romm.entrypoints=websecure"
+ - "traefik.http.routers.romm.tls=true"
+ - "traefik.http.routers.romm.tls.certresolver=https"
+
+
+
+
+ Playnite is an open source video game library manager with one simple goal: To provide a unified interface for all of your games.
+This plugin allows you to import your RomM library into Playnite. It queries the RomM API to create Playnite library entires for each of your games. Installing a game in Playnite will download it from RomM and store it on your system, allowing you to launch it in your emulator of choice.
+playnite://playnite/installaddon/RomM_9700aa21-447d-41b4-a989-acd38f407d9fMenu -> Add-ons... -> Browse -> Libraries, search for RomM, and click Install.pext file onto PlayniteThe plugin requires that you have at least 1 emulator installed on your system and configured in Playnite. You can use a built-in emulator or a custom one. If no emulators are installed and configured, you won't be able to complete setup! To set up an emulator, go to Menu -> Library -> Configure Emulators... -> Add emulator....
The plugin needs to be configured before it can be used. To do this, go to Menu -> Library -> Configure Integrations... -> RomM.
You'll need to enter the host URL of your RomM instance, as well as a username and password. Passwords are stored in plaintext in Playnite, so it's recommended to use a separate account with the "VIEWER" role. The host URL has the include the protocol (http/https) and should not include a trailing slash, e.g. https://romm.example.com.
| Field | +Description | +Example | +Required | +
|---|---|---|---|
| Emulator | +A built-in (or custom) emulator | +Dolphin | +✓ | +
| Emulator Profile | +A built-in (or custom) emulator profile | +Nintendo GameCube | +✓ | +
| Platform | +The platform or console | +Nintendo GameCube | +✓ | +
| Destination Path | +The path where downloaded ROMs will be stored | +C:\roms\gc |
+✓ | +
| Auto-extract | +Whether compressed files should be extracted automatically | ++ | + |
| Enabled | +Whether the mapping is enabled | ++ | + |
Once you've set up the plugin, you can import your library by going to Menu -> Library -> Import RomM library. All games matching the emulator path mappings will be imported into Playnite.
Installing a game will download it from RomM and store it in the destination path. You can then launch the game from Playnite, and it will be launched using the configured emulator.
+By default, compressed files will be extracted automatically into a folder matching the game's name. You can modify this behavior in the settings page.
+
+
+
+ Tinfoil is a homebrew application for the Nintendo Switch, primarily used for installing and managing software, including games and updates, that are not obtained through official channels.
+This will help you configure Tinfoil for your Switch to work with your RomM library.
+Please note down the following in order to make this as smooth as possible, as well as some pre-reqs:
+DISABLE_DOWNLOAD_ENDPOINT_AUTH=true to your environment variables and restart the containerhttp or https/api/tinfoil/feedNow it's time to configure your switch - Please follow the steps, this will assume you have Tinfoil installed and know how to use the basic functions of it.
+http or https depending on your connectionmotd:
+ " RomM Switch Library"Now you will be able to see the files in "New Games" tab of Tinfoil OR you can access it within the "File Browser" section that you setup earlier.
+ +It didn't pull anything through to "New Games" and has not parsed any information about the titles?!
+That would be because the filename it has tried to pull had no TitleID (Improvement to RomM coming soon )
Make sure the filename has the TitleID within the title like this:
+
Once this is done, the next time Tinfoil is opened it is always parsed and re-scanned.
+
+
+
+ muOS is a Custom Firmware (CFW) primarily for handheld devices. Configurable, themeable, friendly, easy-to-use.
+The muOS app connects to your RomM instance and allows you to fetch games wirelessly from your Anbernic device.
+We leverage the muOS Archive Manager to install/update the app.
+romm_muOS_install_x.x.x.zip file./mnt/mmc/ARCHIVE on your device.Applications > Archive Manager and select romm_muOS_install_x.x.x.zip./mnt/mmc/MUOS/application/RomM/env.template, rename it to /mnt/mmc/MUOS/application/RomM/.env, edit it (any method is fine, we recommend SSH) and set HOST, USERNAME and PASSWORD.Applications > RomM and start browsing your collection.We use PortMaster to install the app on devices running EmulationStation.
+RomM App.sh file and RomM/ folder to the roms/ports on your device.RomM App.sh file executable by running chmod +x RomM App.sh.Ports section.Note
+Your device must connect to your RomM instance or home server over Wi-Fi. The easiest method is to keep them on the same network and set HOST to the server's IP and the port where RomM is running. Advanced users or those using reverse proxies can configure their network and DNS settings as needed, using a URL with a domain like https://romm.domain.com.
+
+
+
+ Scheduled tasks can be enabled and configured with the following environment variables:
+| Variable | +Description | +Value | +
|---|---|---|
| ENABLE_SCHEDULED_RESCAN | +Enable scheduled re-scanning of library | +true |
+
| SCHEDULED_RESCAN_CRON | +Cron expression for scheduled re-scanning | +"0 3 * * *" |
+
| ENABLE_SCHEDULED_UPDATE_SWITCH_TITLEDB | +Enable scheduled updating of Switch TitleDB index | +true |
+
| SCHEDULED_UPDATE_SWITCH_TITLEDB_CRON | +Cron expression for scheduled updating of Switch TitleDB | +"0 4 * * *" |
+
| ENABLE_SCHEDULED_UPDATE_LAUNCHBOX_METADATA | +Enable scheduled updating of LaunchBox metadata | +true |
+
| SCHEDULED_UPDATE_LAUNCHBOX_METADATA_CRON. | +Cron expression for scheduled updating of LaunchBox metadata | +"0 5 * * *" |
+
Users can opt to enable scheduled re-scans, and set the interval using Cron notation. Not that the scan will not completely re-scan every file, only catching those which have been added/updated.
+Support was added for Nintendo Switch ROMs with filenames using the titleid/programid format (e.g. 0100000000010000.xci). If a file under the switch folder matches the regex, the scanner will use the index to attempt to match it to a game. If a match is found, the IGDB handler will use the matched name as the search term.
The associated task updates the /fixtures/switch_titledb.json file at a regular interval to support new game releases.
RomM can also update the LaunchBox metadata database at a regular interval. This is onyl useful if you've enabled the LaunchBox metadata provider. The database is updated by downloading the latest version from the LaunchBox Games Database and replacing the existing one.
+RomM can also monitor the filesystem for events (files created/moved/deleted) and schedules a re-scan of the platform (or entire library is a new platform was added).
+The watcher can be enabled and configured with the following environment variables:
+| Variable | +Description | +Value | +
|---|---|---|
| ENABLE_RESCAN_ON_FILESYSTEM_CHANGE | +Enable re-scanning of library when filesystem changes | +true |
+
| RESCAN_ON_FILESYSTEM_CHANGE_DELAY | +Delay in minutes before re-scanning library when filesystem changes | +5 |
+
The watcher will monitor the /library/roms folder for changes to the filesystem, such as files being added, moved or deleted. It will ignore certain events (like modifying the file content or metadata), and will skip default OS files (like .DS_Store on mac).
When a change is detected, a scan will be scheduled for sometime in the future (default 5 minutes). If other events are triggered between now and the time at which the scan starts, more platforms will be added to the scan list (or the scan may switch to a full scan). This is done to reduce the number of tasks scheduled when many big changes happen to the library (mass upload, new mount, etc.)
+
+
+
+ Version 3.0 of RomM introduces a number of breaking changes aimed at improving performance and usability, which will require some users to make specific changes before upgrading to ensure compatibility and to take full advantage of the new features.
+All of the following changes are reflected in the example docker-compose.yml file, which has been simplified greatly. Please read this entire file carefully, as failing to do so may cause RomM to become inaccessible or unresponsive.
+We're removed support for SQLite as we've faced a number of engineering issues with it in the past, and MariaDB has proven more stable and robust. If you currently use SQLite, we'll automatically migrate your data from SQLite to MariaDB, but you'll first need to make the following changes before upgrading to the latest image.
+In your environment variables, change ROMM_DB_DRIVER to mariadb (or remove it completely as it's no longer needed). You'll then want to add the following environment variables:
- DB_HOST=mariadb
+- DB_PORT=3306
+- DB_NAME=romm # Should match MYSQL_DATABASE in mariadb
+- DB_USER=romm-user # Should match MYSQL_USER in mariadb
+- DB_PASSWD= # Should match MYSQL_PASSWORD in mariadb
+To setup a new MariaDB container, have a look at the example docker-compose.yml file.
+To support new features like EmulatorJS and saves/states management, we've decided to require authentication for all users. Anyone currently running RomM with authentication disabled will need to remove the ROMM_AUTH_ENABLED environment variable and add the following ones:
We understand that this requirement for authentication might conflict with the way some users currently share their collection with others (unrestricted access for all). However, given the exciting new features we've built, and the ones we're looking to build in the near future, we feel this is the right decision for the project.
+As Redis is required for authentication to work, we've integrated it directly into the docker image. If you're currently running the experimental Redis container, you can remove it, along with these environment variables:
+ +Mounting the config.yml file is now done by mounting a config folder.. Place your existing config.yml file inside a folder and bind it to /romm/config:
Updated config.example.yml
+This version introduces preliminary support for uploading/downloading saves, states and screenshots (read more about it in the 3.0 release notes). We've added a new volume mapping for these types of files called assets, which you'll want to bind to a local folder (or volume) so they'll persist. In your volumes section, add the following mapping, where /path/to/assets/ is some folder where you'll want to store these assets (and make sure that folder exists):
We recommend creating a folder next to your library/the one mapped to /romm/library in order to keep all your RomM files in the same place.
+
+
+
+ We’ve put together some guidelines for those anyone who wants to use our name and logo. In this context, "RomM", "The RomM Project", "the project", "we", "us", and "our" refer to the RomM project.
+| Color | +Hex Code | +
|---|---|
![]() |
+ #371f69 | +
![]() |
+ #553e98 | +
![]() |
+ #ede5f8 | +
![]() |
+ #bea4e1 | +
![]() |
+ #e6c7a7 | +
![]() |
+ #e1a38d | +
If you're working on a project that integrates with RomM and would like to use/remix the logo, please reach out to us first. We'd love to hear about what you're working on!
+
+
+
+
+ When it's ready.
+After the upcoming version is released.
+Sometime between now and the heat death of the universe.
+x.x.x of RomM (or any of the RomM clients/apps/plugins) be released?Same as above question.
+
+
+
+
+
+
+
+ Authelia is an open-source authentication and authorization server providing two-factor authentication and single sign-on (SSO) for your applications via a web portal. It acts as a companion for reverse proxies by allowing, denying, or redirecting requests. Authelia can be deployed alongside your other services to centralize identity management.
+OAuth2 (Open Authorization 2.0) is an industry-standard protocol for authorization. It allows applications (clients) to gain limited access to user accounts on an HTTP service without sharing the user’s credentials. Instead, it uses access tokens to facilitate secure interactions. OAuth2 is commonly used in scenarios where users need to authenticate via a third-party service.
+OIDC (OpenID Connect) is an identity layer built on top of OAuth2. While OAuth2 primarily handles authorization, OIDC adds authentication, enabling applications to verify a user’s identity and obtain profile information. This makes OIDC suitable for SSO solutions, where user identity is central to access management.
+Before setting up a provider and app, ensure that Authelia is installed and running by following the getting started and OIDC provider guides.
+First, in Authelia's configuration.yml, at identity_providers → oidc → claims_policies you'll need to add a Claims Policy if you do not already have one with the specified claims:
# identity_providers:
+# oidc:
+claims_policies:
+ with_email: # You can name this however you want
+ id_token:
+ [
+ "email",
+ "email_verified",
+ "alt_emails",
+ "preferred_username",
+ "name",
+ ]
+To read more about claims_policies and why you need it for RomM, see this section in the Authelia docs.
+Then, in the same configuration.yml, under identity_providers → oidc → clients, add a new entry:
client_id and client_secretpublic should be set to false.redirect_uris should include your RomM instance's URL + /api/oauth/openid (e.g., http://romm.host.local/api/oauth/openid).claims_policy is the name of the entry at claims_policies that you just added (or already had).scopes includes openid, email and profile.token_endpoint_auth_method should be set to client_secret_basic.userinfo_signed_response_alg should be set to none.Refer to the official docs for more details.
+This entry should look like this:
+#identity_providers:
+# oidc:
+# clients:
+- client_id: "<randomly_generated>" # read above for how generate
+ client_name: "RomM" # will be displayed in Authelia to users
+ client_secret: "$pbkdf2-sha512$randomly_generated" # read above for how generate
+ public: false
+ authorization_policy: "two_factor" # or one_factor, depending on your needs
+ grant_types:
+ - authorization_code
+ redirect_uris:
+ - "http://romm.host.local/api/oauth/openid"
+ claims_policy: "with_email"
+ scopes:
+ - "openid"
+ - "email"
+ - "profile"
+ userinfo_signed_response_alg: "none"
+ token_endpoint_auth_method: "client_secret_basic"
+To enable OIDC authentication in RomM, you need to set the following environment variables:
+OIDC_ENABLED: Set to true to enable OIDC authentication.OIDC_PROVIDER: The lowercase name of the provider (authelia).OIDC_CLIENT_ID: The client ID copied from the Authelia application.OIDC_CLIENT_SECRET: The generated output from Random Password.OIDC_REDIRECT_URI: The redirect URI configured in the Authelia provider, in the format http://romm.host.local/api/oauth/openid.OIDC_SERVER_APPLICATION_URL: The base URL for you Authelia instance, e.g. http://authelia.host.local.In RomM, open your user profile and set your email address. This email has to match your user email in Authelia.
+ +After configuring the environment variables, restart (or stop and remove) your RomM instance and navigate to the login page. You should see an option to log in using OIDC. Click on the OIDC button, and you'll be redirected to Authelia for authentication. Once authenticated, you'll be redirected back to RomM.
+
+
+
+
+ Authentik is an open-source identity provider (IdP) designed to manage authentication, authorization, and user management across applications. It supports modern authentication protocols and provides tools to simplify integration, including single sign-on (SSO), multi-factor authentication (MFA), and auditing capabilities. Authentik can be deployed alongside your other services to centralize identity management.
+OAuth2 (Open Authorization 2.0) is an industry-standard protocol for authorization. It allows applications (clients) to gain limited access to user accounts on an HTTP service without sharing the user’s credentials. Instead, it uses access tokens to facilitate secure interactions. OAuth2 is commonly used in scenarios where users need to authenticate via a third-party service.
+OIDC (OpenID Connect) is an identity layer built on top of OAuth2. While OAuth2 primarily handles authorization, OIDC adds authentication, enabling applications to verify a user’s identity and obtain profile information. This makes OIDC suitable for SSO solutions, where user identity is central to access management.
+Before setting up a provider and app, ensure that Authentik is installed and running by following the official installation guide..
+A provider in Authentik acts as the bridge between RomM and Authentik.
+
/api/oauth/openid (e.g., http://romm.host.local/api/oauth/openid).An app in Authentik represents the external service (in our case RomM) that will use the provider for authentication.
+To enable OIDC authentication in RomM, you need to set the following environment variables:
+OIDC_ENABLED: Set to true to enable OIDC authentication.OIDC_PROVIDER: The lowercase name of the provider (authentik).OIDC_CLIENT_ID: The client ID copied from the Authentik application.OIDC_CLIENT_SECRET: The client secret copied from the Authentik application.OIDC_REDIRECT_URI: The redirect URI configured in the Authentik provider, in the format http://romm.host.local/api/oauth/openid.OIDC_SERVER_APPLICATION_URL: The URL of the Authentik application, e.g., http://authentik.host.local/application/o/romm.In RomM, open your user profile and set your email address. This email has to match your user email in Authentik.
+ +After configuring the environment variables, restart (or stop and remove) your RomM instance and navigate to the login page. You should see an option to log in using OIDC. Click on the OIDC button, and you'll be redirected to Authentik for authentication. Once authenticated, you'll be redirected back to RomM.
+
+
+
+
+ Pocket ID is a simple OIDC provider that allows users to authenticate with their passkeys to your services.
+The goal of Pocket ID is to be a simple and easy-to-use. There are other self-hosted OIDC providers like Keycloak or ORY Hydra but they are often too complex for simple use cases.
+Additionally, what makes Pocket ID special is that it only supports passkey authentication, which means you don’t need a password.
+OAuth2 (Open Authorization 2.0) is an industry-standard protocol for authorization. It allows applications (clients) to gain limited access to user accounts on an HTTP service without sharing the user’s credentials. Instead, it uses access tokens to facilitate secure interactions. OAuth2 is commonly used in scenarios where users need to authenticate via a third-party service.
+OIDC (OpenID Connect) is an identity layer built on top of OAuth2. While OAuth2 primarily handles authorization, OIDC adds authentication, enabling applications to verify a user’s identity and obtain profile information. This makes OIDC suitable for SSO solutions, where user identity is central to access management.
+Before setting up the OIDC client, ensure that Pocket ID is installed and running by following the setup guide.
+Once you have logged in and configured a PassKey you now need to create an OIDC client, this will let Pocket ID know about the application that needs to be configured, and will give you the relevant keys to add to the RomM compose file.
+https://{host}/api/oauth/openidTo enable OIDC authentication in RomM, you need to set the following environment variables:
+OIDC_ENABLED: Set to true to enable OIDC authentication.OIDC_PROVIDER: The lowercase name of the provider (pocketid).OIDC_CLIENT_ID: The client ID copied from the Pocket ID applicationOIDC_CLIENT_SECRET: The client secret that is showing within your Pocket ID application.OIDC_REDIRECT_URI: The redirect URI configured in the Pocket ID provider, in the format https://{host}/api/oauth/openid.OIDC_SERVER_APPLICATION_URL: The authorization URL for you Pocket ID instance, e.g. https://id.host.local.In RomM, open your user profile and set your email address. This email has to match your user email in Pocket ID.
+ +After configuring the environment variables, restart (or stop and remove) your RomM instance and navigate to the login page. You should see an option to log in using OIDC. Click on the OIDC button, and you'll be redirected to Pocket ID for authentication. Once authenticated, you'll be redirected back to RomM.
+
+
+
+
+ Zitadel is an enterprise-grade, open-source identity and access management (IAM) platform that supports OAuth2, OpenID Connect, SAML, and passwordless authentication. It's used to manage users, roles, and secure login for web and cloud applications.
+OAuth2 (Open Authorization 2.0) is an industry-standard protocol for authorization. It allows applications (clients) to gain limited access to user accounts on an HTTP service without sharing the user’s credentials. Instead, it uses access tokens to facilitate secure interactions. OAuth2 is commonly used in scenarios where users need to authenticate via a third-party service.
+OIDC (OpenID Connect) is an identity layer built on top of OAuth2. While OAuth2 primarily handles authorization, OIDC adds authentication, enabling applications to verify a user’s identity and obtain profile information. This makes OIDC suitable for SSO solutions, where user identity is central to access management.
+Before setting up the OIDC client, ensure that Zitadel is installed and running by following the setup guide.
+Once you have logged in and changed the default password for your Zitadel organization, create a new Project (i.e Romm). This will be the basic settings for roles and authorization.
+In the "General" tab, there are options to allow the following:
+Unnecessary: Romm (at this time) does not allow granting permissions based on role, everyone gets viewer and will have to be changed manually using an admin account if desired.
+Recommended: If you allow registration to your platform, then anyone who registers can instantly access Romm (although only as a viewer, which may not be a problem for some)
+Optional: It could be used if you plan on separating users by organizations for other applications, but creating separate organizations is not typically useful for general self-hosting purposes
+Click on the Authorization tab and click New.
+Enter the user(s) and click Continue
+It should say "No role has been created yet.", but this is fine, you can just click Save and it should bring you back to the Authorization page with your user(s) listed with no roles
+On the General tab, click the New button under Applications.
+(Check "I'm a pro. Skip this wizard." to enter the information quicker)
+Name: RomM (or whatever you want)Application Type: WebGrant Types: Authorization CodeResponse Types: CodeAuthentication Method: BasicRedirect URIs: https://romm.domain.com/api/oauth/openidPost Logout URIs: https://romm.domain.com/Click Create.
+To enable OIDC authentication in RomM, you need to set the following environment variables:
+OIDC_ENABLED: Set to true to enable OIDC authentication.OIDC_PROVIDER: The name of the provider Zitadel.OIDC_CLIENT_ID: The client ID copied from the Zitadel applicationOIDC_CLIENT_SECRET: The client secret generated from the Zitadel applicationOIDC_REDIRECT_URI: The redirect URI configured in Zitadel https://rom.domain.com/api/oauth/openid.OIDC_SERVER_APPLICATION_URL: The domain for your Zitadel instance https://zitadel.domain.com. (The discovery URL for Zitadel is on the basedomain under /.well-known/openid-configuration)Click close to finish creating the application and then go to the Token Settings tab.
+Check "User Info inside ID Token" and click Save
+For your existing RomM admin account, open your user profile on Zitadel and set your email address. This email has to match your user email in Zitadel.
+After configuring the environment variables, restart (or stop and remove) your RomM instance and navigate to the login page. You should see the option "LOGIN WITH ZITADEL". Click on it and you'll be redirected to Zitadel for authentication. Once authenticated, you'll be redirected back to RomM.
+
+
+
+ While RomM supports every platform listed in the Supported Platforms page, the list is not exhaustive, and you may have ROMs in your library for other platforms. To load those files into RomM, place them in a folder for each platform, and give it a name that's all lowercase, with - to separate words, and with no white spaces. For example, pocket-challenge-v2 would map to Pocket Challenge V2, and display the default platform icon in the app.
Furthermore, only a portion of the supported platforms have custom icons built-in. If your library has platforms that aren't listed in the platforms icons list, RomM will display a default fallback icon.
+If you'd like to load your own custom icons for missing platforms, you can mount /var/www/html/assets/platforms to some local folder and place all of your custom .ico platform icons in there. You'll also want to download the ones provided in this project and place them in the same folder. If you'd like to use your own icons for platforms already supported by RomM, just replace the file with another using the exact same name.
The name of the .ico file should match the slug of the platform on IGDB. For example, the URL for the AmstradCPC is https://www.igdb.com/platforms/acpc, so the filename should be acpc.ico.
+
+
+
+ EmulatorJS is a web-based emulator for various system; that is, it allows you to run old games in your web browser. It's based on RetroArch compiled with Emscripten, which is a toolchain for compiling C and C++ code to WebAssembly.
Warning
+Due to a change by Apple in iOS 18.2, emulation is severely limited, and likely non-functional, on iOS 18.2-18.3 devices. This was fixed in iOS 18.4
+Warning
+PSP emulation with the PPSSPP core and MS-DOS with the dosbox-pure core requires one of the three options:
+Developer Settings. (Preferred)--disable-web-security and --enable-features=SharedArrayBuffer flags, which WE STRONGLY DISCOURAGE as it disables important security features.Warning
+Emulation is a complex and resource-intensive process. As such, it may not work well in all browser, especially older or less powerful ones. If you're having trouble running a game, try using a different browser or device.
+Our integration with EmulatorJS automates the process of loading and saving save files and save states. Before starting the game, select a save and/or state file to load (if one is available). Anytime you save the game (or create a save state), the save and state files stored with RomM will be updated, so there's no need to manually download or upload them.
+Note that only the following systems are currently supported:
+
+
+
+
+ DOS is now supported in versions of RomM 4.0 and above thanks to the EmulatorJS player - Simply create a DOS platform to enable the integration
+ +Warning
+This will need the same settings as the PSP emulation which you can find here to enable the play button
+Info
+I highly suggest you upload the games as .zip as the core can take advantage of unzipping and auto mounting options which are explained more below.
+Info
+Loading and saving states ARE supported so it's possible you only need to do the below steps once to load the game.
+Once you have the play button in the platform available for you there is some additional work you need to do in order to get the games playable and running. You first need to identify what DOS game you are trying to run, there would be three categories
+The official method to run the games from the EmulatorJS dev is the following (Only works for Homebrew and Demos):
+mount A / -t floppy - This will mount the location of the filesA: - This will take you to the location of the filesdir - to find the .EXE filefilename.exe - This will run the .exe and run the game, you might need some additional configuration but that is purely on the dosbox side and you might need to run the setup.exe file or a file name similiar.Warning
+This is not for the faint of heart and will require a lot of trial and error.
+As the system is using DOSBOX pure it has a neat trick where it will run .CONF files it finds and automatically mount locations and run .exe files automatically, at the minute this is highly experimental and might be more effort then it is worth, but if you want the files running perfectly then I would suggest you look into this method, but it is extremely trail and error.
+When you run a game in DOSBOX Pure, before it runs and mounts anything it will look for a .conf file and follow those instructions, this way we can actually auto mount locations, mount the required CDs and play the game without typing anything, you just click play, the auto mount does everything in the background and you are presented with the game.
+This is an example using the doom shareware file which has all the files in the folder.
+*.ins, *.cue or *.bin files, if these exist it usually means this is a CD required game and these instructions will not work# This is the configurationfile for DOSBox 0.74. (Please use the latest version of DOSBox)
+# Lines starting with a # are commentlines and are ignored by DOSBox.
+# They are used to (briefly) document the effect of each option.
+
+[sdl]
+# fullscreen: Start dosbox directly in fullscreen. (Press ALT-Enter to go back)
+# fulldouble: Use double buffering in fullscreen. It can reduce screen flickering, but it can also result in a slow DOSBox.
+# fullresolution: What resolution to use for fullscreen: original or fixed size (e.g. 1024x768).
+# Using your monitor's native resolution with aspect=true might give the best results.
+# If you end up with small window on a large screen, try an output different from surface.
+# windowresolution: Scale the window to this size IF the output device supports hardware scaling.
+# (output=surface does not!)
+# output: What video system to use for output.
+# Possible values: surface, overlay, opengl, openglnb, ddraw.
+# autolock: Mouse will automatically lock, if you click on the screen. (Press CTRL-F10 to unlock)
+# sensitivity: Mouse sensitivity.
+# waitonerror: Wait before closing the console if dosbox has an error.
+# priority: Priority levels for dosbox. Second entry behind the comma is for when dosbox is not focused/minimized.
+# pause is only valid for the second entry.
+# Possible values: lowest, lower, normal, higher, highest, pause.
+# mapperfile: File used to load/save the key/event mappings from. Resetmapper only works with the defaul value.
+# usescancodes: Avoid usage of symkeys, might not work on all operating systems.
+
+fullscreen=TRUE
+fulldouble=false
+fullresolution=Fixed
+windowresolution=1280x800
+output=direct3d
+autolock=true
+sensitivity=100
+waitonerror=true
+priority=higher,normal
+mapperfile=mapper-0.74.map
+usescancodes=true
+
+[dosbox]
+# language: Select another language file.
+# machine: The type of machine tries to emulate.
+# Possible values: hercules, cga, tandy, pcjr, ega, vgaonly, svga_s3, svga_et3000, svga_et4000, svga_paradise, vesa_nolfb, vesa_oldvbe.
+# captures: Directory where things like wave, midi, screenshot get captured.
+# memsize: Amount of memory DOSBox has in megabytes.
+# This value is best left at its default to avoid problems with some games,
+# though few games might require a higher value.
+# There is generally no speed advantage when raising this value.
+
+language=
+machine=svga_s3
+captures=.\Captures\
+memsize=16
+
+[render]
+# frameskip: How many frames DOSBox skips before drawing one.
+# aspect: Do aspect correction, if your output method doesn't support scaling this can slow things down!.
+# scaler: Scaler used to enlarge/enhance low resolution modes.
+# If 'forced' is appended, then the scaler will be used even if the result might not be desired.
+# Possible values: none, normal2x, normal3x, advmame2x, advmame3x, advinterp2x, advinterp3x, hq2x, hq3x, 2xsai, super2xsai, supereagle, tv2x, tv3x, rgb2x, rgb3x, scan2x, scan3x.
+
+frameskip=0
+aspect=false
+scaler=normal3x
+
+[cpu]
+# core: CPU Core used in emulation. auto will switch to dynamic if available and appropriate.
+# Possible values: auto, dynamic, normal, simple.
+# cputype: CPU Type used in emulation. auto is the fastest choice.
+# Possible values: auto, 386, 386_slow, 486_slow, pentium_slow, 386_prefetch.
+# cycles: Amount of instructions DOSBox tries to emulate each millisecond.
+# Setting this value too high results in sound dropouts and lags.
+# Cycles can be set in 3 ways:
+# 'auto' tries to guess what a game needs.
+# It usually works, but can fail for certain games.
+# 'fixed #number' will set a fixed amount of cycles. This is what you usually need if 'auto' fails.
+# (Example: fixed 4000).
+# 'max' will allocate as much cycles as your computer is able to handle.
+#
+# Possible values: auto, fixed, max.
+# cycleup: Amount of cycles to decrease/increase with keycombo.(CTRL-F11/CTRL-F12)
+# cycledown: Setting it lower than 100 will be a percentage.
+
+core=auto
+cputype=auto
+cycles=max
+cycleup=10
+cycledown=20
+
+[mixer]
+# nosound: Enable silent mode, sound is still emulated though.
+# rate: Mixer sample rate, setting any device's rate higher than this will probably lower their sound quality.
+# Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716.
+# blocksize: Mixer block size, larger blocks might help sound stuttering but sound will also be more lagged.
+# Possible values: 1024, 2048, 4096, 8192, 512, 256.
+# prebuffer: How many milliseconds of data to keep on top of the blocksize.
+
+nosound=false
+rate=22050
+blocksize=2048
+prebuffer=10
+
+[midi]
+# mpu401: Type of MPU-401 to emulate.
+# Possible values: intelligent, uart, none.
+# mididevice: Device that will receive the MIDI data from MPU-401.
+# Possible values: default, win32, alsa, oss, coreaudio, coremidi, none.
+# midiconfig: Special configuration options for the device driver. This is usually the id of the device you want to use.
+# See the README/Manual for more details.
+
+mpu401=intelligent
+mididevice=default
+midiconfig=
+
+[sblaster]
+# sbtype: Type of Soundblaster to emulate. gb is Gameblaster.
+# Possible values: sb1, sb2, sbpro1, sbpro2, sb16, gb, none.
+# sbbase: The IO address of the soundblaster.
+# Possible values: 220, 240, 260, 280, 2a0, 2c0, 2e0, 300.
+# irq: The IRQ number of the soundblaster.
+# Possible values: 7, 5, 3, 9, 10, 11, 12.
+# dma: The DMA number of the soundblaster.
+# Possible values: 1, 5, 0, 3, 6, 7.
+# hdma: The High DMA number of the soundblaster.
+# Possible values: 1, 5, 0, 3, 6, 7.
+# sbmixer: Allow the soundblaster mixer to modify the DOSBox mixer.
+# oplmode: Type of OPL emulation. On 'auto' the mode is determined by sblaster type. All OPL modes are Adlib-compatible, except for 'cms'.
+# Possible values: auto, cms, opl2, dualopl2, opl3, none.
+# oplemu: Provider for the OPL emulation. compat might provide better quality (see oplrate as well).
+# Possible values: default, compat, fast.
+# oplrate: Sample rate of OPL music emulation. Use 49716 for highest quality (set the mixer rate accordingly).
+# Possible values: 44100, 49716, 48000, 32000, 22050, 16000, 11025, 8000.
+
+sbtype=sb16
+sbbase=220
+irq=7
+dma=1
+hdma=5
+sbmixer=true
+oplmode=auto
+oplemu=default
+oplrate=44100
+
+[gus]
+# gus: Enable the Gravis Ultrasound emulation.
+# gusrate: Sample rate of Ultrasound emulation.
+# Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716.
+# gusbase: The IO base address of the Gravis Ultrasound.
+# Possible values: 240, 220, 260, 280, 2a0, 2c0, 2e0, 300.
+# gusirq: The IRQ number of the Gravis Ultrasound.
+# Possible values: 5, 3, 7, 9, 10, 11, 12.
+# gusdma: The DMA channel of the Gravis Ultrasound.
+# Possible values: 3, 0, 1, 5, 6, 7.
+# ultradir: Path to Ultrasound directory. In this directory
+# there should be a MIDI directory that contains
+# the patch files for GUS playback. Patch sets used
+# with Timidity should work fine.
+
+gus=false
+gusrate=44100
+gusbase=240
+gusirq=5
+gusdma=3
+ultradir=C:\ULTRASND
+
+[speaker]
+# pcspeaker: Enable PC-Speaker emulation.
+# pcrate: Sample rate of the PC-Speaker sound generation.
+# Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716.
+# tandy: Enable Tandy Sound System emulation. For 'auto', emulation is present only if machine is set to 'tandy'.
+# Possible values: auto, on, off.
+# tandyrate: Sample rate of the Tandy 3-Voice generation.
+# Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716.
+# disney: Enable Disney Sound Source emulation. (Covox Voice Master and Speech Thing compatible).
+
+pcspeaker=true
+pcrate=44100
+tandy=auto
+tandyrate=44100
+disney=true
+
+[joystick]
+# joysticktype: Type of joystick to emulate: auto (default), none,
+# 2axis (supports two joysticks),
+# 4axis (supports one joystick, first joystick used),
+# 4axis_2 (supports one joystick, second joystick used),
+# fcs (Thrustmaster), ch (CH Flightstick).
+# none disables joystick emulation.
+# auto chooses emulation depending on real joystick(s).
+# (Remember to reset dosbox's mapperfile if you saved it earlier)
+# Possible values: auto, 2axis, 4axis, 4axis_2, fcs, ch, none.
+# timed: enable timed intervals for axis. Experiment with this option, if your joystick drifts (away).
+# autofire: continuously fires as long as you keep the button pressed.
+# swap34: swap the 3rd and the 4th axis. can be useful for certain joysticks.
+# buttonwrap: enable button wrapping at the number of emulated buttons.
+
+joysticktype=fcs
+timed=true
+autofire=false
+swap34=false
+buttonwrap=false
+
+[serial]
+# serial1: set type of device connected to com port.
+# Can be disabled, dummy, modem, nullmodem, directserial.
+# Additional parameters must be in the same line in the form of
+# parameter:value. Parameter for all types is irq (optional).
+# for directserial: realport (required), rxdelay (optional).
+# (realport:COM1 realport:ttyS0).
+# for modem: listenport (optional).
+# for nullmodem: server, rxdelay, txdelay, telnet, usedtr,
+# transparent, port, inhsocket (all optional).
+# Example: serial1=modem listenport:5000
+# Possible values: dummy, disabled, modem, nullmodem, directserial.
+# serial2: see serial1
+# Possible values: dummy, disabled, modem, nullmodem, directserial.
+# serial3: see serial1
+# Possible values: dummy, disabled, modem, nullmodem, directserial.
+# serial4: see serial1
+# Possible values: dummy, disabled, modem, nullmodem, directserial.
+
+serial1=dummy
+serial2=dummy
+serial3=disabled
+serial4=disabled
+
+[dos]
+# xms: Enable XMS support.
+# ems: Enable EMS support.
+# umb: Enable UMB support.
+# keyboardlayout: Language code of the keyboard layout (or none).
+
+xms=true
+ems=true
+umb=true
+keyboardlayout=auto
+
+[ipx]
+# ipx: Enable ipx over UDP/IP emulation.
+
+ipx=false
+
+[autoexec]
+# Lines in this section will be run at startup.
+# You can put your MOUNT lines here.
+
+@echo off
+Mount C ".."
+C:
+cls
+DOOM.exe
+:exit
+exit
+Info
+At the minute DOS games redesigned by GOG are NOT supported, this is due to how they mount and use the locations. I am looking into how I can figure this out but I have had a 100% failure rate from the GOG DOS Games.
+Retail games usually require to run alongside a disk even if the game has been "installed" locally. I will use Dungeon Keeper Gold as an example for a retail game with a disc and the configuration needed.
+*.bin & *.cue) and move them to a folder named CD within the folder. Only within this folder you should all the .bin files and the "matching" .cue sheet (remember .cue is just a text document pulling all these files together, like a playlist)# This is the configurationfile for DOSBox 0.74. (Please use the latest version of DOSBox)
+# Lines starting with a # are commentlines and are ignored by DOSBox.
+# They are used to (briefly) document the effect of each option.
+
+[sdl]
+# fullscreen: Start dosbox directly in fullscreen. (Press ALT-Enter to go back)
+# fulldouble: Use double buffering in fullscreen. It can reduce screen flickering, but it can also result in a slow DOSBox.
+# fullresolution: What resolution to use for fullscreen: original or fixed size (e.g. 1024x768).
+# Using your monitor's native resolution with aspect=true might give the best results.
+# If you end up with small window on a large screen, try an output different from surface.
+# windowresolution: Scale the window to this size IF the output device supports hardware scaling.
+# (output=surface does not!)
+# output: What video system to use for output.
+# Possible values: surface, overlay, opengl, openglnb, ddraw.
+# autolock: Mouse will automatically lock, if you click on the screen. (Press CTRL-F10 to unlock)
+# sensitivity: Mouse sensitivity.
+# waitonerror: Wait before closing the console if dosbox has an error.
+# priority: Priority levels for dosbox. Second entry behind the comma is for when dosbox is not focused/minimized.
+# pause is only valid for the second entry.
+# Possible values: lowest, lower, normal, higher, highest, pause.
+# mapperfile: File used to load/save the key/event mappings from. Resetmapper only works with the defaul value.
+# usescancodes: Avoid usage of symkeys, might not work on all operating systems.
+
+fullscreen=TRUE
+fulldouble=false
+fullresolution=Fixed
+windowresolution=1280x800
+output=direct3d
+autolock=true
+sensitivity=100
+waitonerror=true
+priority=higher,normal
+mapperfile=mapper-0.74.map
+usescancodes=true
+
+[dosbox]
+# language: Select another language file.
+# machine: The type of machine tries to emulate.
+# Possible values: hercules, cga, tandy, pcjr, ega, vgaonly, svga_s3, svga_et3000, svga_et4000, svga_paradise, vesa_nolfb, vesa_oldvbe.
+# captures: Directory where things like wave, midi, screenshot get captured.
+# memsize: Amount of memory DOSBox has in megabytes.
+# This value is best left at its default to avoid problems with some games,
+# though few games might require a higher value.
+# There is generally no speed advantage when raising this value.
+
+language=
+machine=svga_s3
+captures=.\Captures\
+memsize=16
+
+[render]
+# frameskip: How many frames DOSBox skips before drawing one.
+# aspect: Do aspect correction, if your output method doesn't support scaling this can slow things down!.
+# scaler: Scaler used to enlarge/enhance low resolution modes.
+# If 'forced' is appended, then the scaler will be used even if the result might not be desired.
+# Possible values: none, normal2x, normal3x, advmame2x, advmame3x, advinterp2x, advinterp3x, hq2x, hq3x, 2xsai, super2xsai, supereagle, tv2x, tv3x, rgb2x, rgb3x, scan2x, scan3x.
+
+frameskip=0
+aspect=false
+scaler=normal3x
+
+[cpu]
+# core: CPU Core used in emulation. auto will switch to dynamic if available and appropriate.
+# Possible values: auto, dynamic, normal, simple.
+# cputype: CPU Type used in emulation. auto is the fastest choice.
+# Possible values: auto, 386, 386_slow, 486_slow, pentium_slow, 386_prefetch.
+# cycles: Amount of instructions DOSBox tries to emulate each millisecond.
+# Setting this value too high results in sound dropouts and lags.
+# Cycles can be set in 3 ways:
+# 'auto' tries to guess what a game needs.
+# It usually works, but can fail for certain games.
+# 'fixed #number' will set a fixed amount of cycles. This is what you usually need if 'auto' fails.
+# (Example: fixed 4000).
+# 'max' will allocate as much cycles as your computer is able to handle.
+#
+# Possible values: auto, fixed, max.
+# cycleup: Amount of cycles to decrease/increase with keycombo.(CTRL-F11/CTRL-F12)
+# cycledown: Setting it lower than 100 will be a percentage.
+
+core=auto
+cputype=auto
+cycles=max
+cycleup=10
+cycledown=20
+
+[mixer]
+# nosound: Enable silent mode, sound is still emulated though.
+# rate: Mixer sample rate, setting any device's rate higher than this will probably lower their sound quality.
+# Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716.
+# blocksize: Mixer block size, larger blocks might help sound stuttering but sound will also be more lagged.
+# Possible values: 1024, 2048, 4096, 8192, 512, 256.
+# prebuffer: How many milliseconds of data to keep on top of the blocksize.
+
+nosound=false
+rate=22050
+blocksize=2048
+prebuffer=10
+
+[midi]
+# mpu401: Type of MPU-401 to emulate.
+# Possible values: intelligent, uart, none.
+# mididevice: Device that will receive the MIDI data from MPU-401.
+# Possible values: default, win32, alsa, oss, coreaudio, coremidi, none.
+# midiconfig: Special configuration options for the device driver. This is usually the id of the device you want to use.
+# See the README/Manual for more details.
+
+mpu401=intelligent
+mididevice=default
+midiconfig=
+
+[sblaster]
+# sbtype: Type of Soundblaster to emulate. gb is Gameblaster.
+# Possible values: sb1, sb2, sbpro1, sbpro2, sb16, gb, none.
+# sbbase: The IO address of the soundblaster.
+# Possible values: 220, 240, 260, 280, 2a0, 2c0, 2e0, 300.
+# irq: The IRQ number of the soundblaster.
+# Possible values: 7, 5, 3, 9, 10, 11, 12.
+# dma: The DMA number of the soundblaster.
+# Possible values: 1, 5, 0, 3, 6, 7.
+# hdma: The High DMA number of the soundblaster.
+# Possible values: 1, 5, 0, 3, 6, 7.
+# sbmixer: Allow the soundblaster mixer to modify the DOSBox mixer.
+# oplmode: Type of OPL emulation. On 'auto' the mode is determined by sblaster type. All OPL modes are Adlib-compatible, except for 'cms'.
+# Possible values: auto, cms, opl2, dualopl2, opl3, none.
+# oplemu: Provider for the OPL emulation. compat might provide better quality (see oplrate as well).
+# Possible values: default, compat, fast.
+# oplrate: Sample rate of OPL music emulation. Use 49716 for highest quality (set the mixer rate accordingly).
+# Possible values: 44100, 49716, 48000, 32000, 22050, 16000, 11025, 8000.
+
+sbtype=sb16
+sbbase=220
+irq=7
+dma=1
+hdma=5
+sbmixer=true
+oplmode=auto
+oplemu=default
+oplrate=44100
+
+[gus]
+# gus: Enable the Gravis Ultrasound emulation.
+# gusrate: Sample rate of Ultrasound emulation.
+# Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716.
+# gusbase: The IO base address of the Gravis Ultrasound.
+# Possible values: 240, 220, 260, 280, 2a0, 2c0, 2e0, 300.
+# gusirq: The IRQ number of the Gravis Ultrasound.
+# Possible values: 5, 3, 7, 9, 10, 11, 12.
+# gusdma: The DMA channel of the Gravis Ultrasound.
+# Possible values: 3, 0, 1, 5, 6, 7.
+# ultradir: Path to Ultrasound directory. In this directory
+# there should be a MIDI directory that contains
+# the patch files for GUS playback. Patch sets used
+# with Timidity should work fine.
+
+gus=false
+gusrate=44100
+gusbase=240
+gusirq=5
+gusdma=3
+ultradir=C:\ULTRASND
+
+[speaker]
+# pcspeaker: Enable PC-Speaker emulation.
+# pcrate: Sample rate of the PC-Speaker sound generation.
+# Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716.
+# tandy: Enable Tandy Sound System emulation. For 'auto', emulation is present only if machine is set to 'tandy'.
+# Possible values: auto, on, off.
+# tandyrate: Sample rate of the Tandy 3-Voice generation.
+# Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716.
+# disney: Enable Disney Sound Source emulation. (Covox Voice Master and Speech Thing compatible).
+
+pcspeaker=true
+pcrate=44100
+tandy=auto
+tandyrate=44100
+disney=true
+
+[joystick]
+# joysticktype: Type of joystick to emulate: auto (default), none,
+# 2axis (supports two joysticks),
+# 4axis (supports one joystick, first joystick used),
+# 4axis_2 (supports one joystick, second joystick used),
+# fcs (Thrustmaster), ch (CH Flightstick).
+# none disables joystick emulation.
+# auto chooses emulation depending on real joystick(s).
+# (Remember to reset dosbox's mapperfile if you saved it earlier)
+# Possible values: auto, 2axis, 4axis, 4axis_2, fcs, ch, none.
+# timed: enable timed intervals for axis. Experiment with this option, if your joystick drifts (away).
+# autofire: continuously fires as long as you keep the button pressed.
+# swap34: swap the 3rd and the 4th axis. can be useful for certain joysticks.
+# buttonwrap: enable button wrapping at the number of emulated buttons.
+
+joysticktype=fcs
+timed=true
+autofire=false
+swap34=false
+buttonwrap=false
+
+[serial]
+# serial1: set type of device connected to com port.
+# Can be disabled, dummy, modem, nullmodem, directserial.
+# Additional parameters must be in the same line in the form of
+# parameter:value. Parameter for all types is irq (optional).
+# for directserial: realport (required), rxdelay (optional).
+# (realport:COM1 realport:ttyS0).
+# for modem: listenport (optional).
+# for nullmodem: server, rxdelay, txdelay, telnet, usedtr,
+# transparent, port, inhsocket (all optional).
+# Example: serial1=modem listenport:5000
+# Possible values: dummy, disabled, modem, nullmodem, directserial.
+# serial2: see serial1
+# Possible values: dummy, disabled, modem, nullmodem, directserial.
+# serial3: see serial1
+# Possible values: dummy, disabled, modem, nullmodem, directserial.
+# serial4: see serial1
+# Possible values: dummy, disabled, modem, nullmodem, directserial.
+
+serial1=dummy
+serial2=dummy
+serial3=disabled
+serial4=disabled
+
+[dos]
+# xms: Enable XMS support.
+# ems: Enable EMS support.
+# umb: Enable UMB support.
+# keyboardlayout: Language code of the keyboard layout (or none).
+
+xms=true
+ems=true
+umb=true
+keyboardlayout=auto
+
+[ipx]
+# ipx: Enable ipx over UDP/IP emulation.
+
+ipx=false
+
+[autoexec]
+# Lines in this section will be run at startup.
+# You can put your MOUNT lines here.
+
+@echo off
+Mount C ".."
+C:
+cd CD
+imgmount d DUNGEO~8.CUE -t iso -fs iso
+cd ..
+cls
+KEEPER.exe
+:exit
+exit
+If the games are not working and you go back to a blank dos looking screen, this will require some manual troubleshooting but I have found success with the following methods:
+type DEFAULT.cfg to see the installation location, this is where the game is looking for the files, this should be set to a D: location.Another way of troubleshooting is to use Retroarch and the core "dosbox-pure" because if it runs in here, it will run in RomM. Simply give it your ZIP and it will act the same as if you was doing it through RomM, once the .conf file is perfected add it back to the ZIP.
+
+
+
+ Ruffle is a web-based player for flash games. With flash now discontinued, this is the best way to play your flash collection in the browser.
+ +Important
+Ruffle will only play games stored in platform folders called flash or browser.
+
+
+
+ Below is a list of all supported platforms/systems/consoles and their respective folder names. Supported platforms means RomM can fetch metadata from sources for those platforms.
+Info
+For platforms that can be playable in the browser, please check emulatorjs supported platforms and ruffle player.
+Danger
+The folder name is case-sensitive and must be used exactly as it appears in the list below.
+Filter providers
+
+
+
+
+ This guide assumes you're familiar with Docker and have basic knowledge of server management. You'll need:
+Create the following directory structure for game assets and configuration:
+ +RomM requires a very specific folder structure for rom files:
+ +Note: For supported platforms and their specific folder names, refer to the official RomM wiki.
+Create these folders for project and container data:
+mkdir -p /volume1/docker/romm-project/
+mkdir -p /volume1/docker/romm/resources
+mkdir -p /volume1/docker/romm/redis-data
+mkdir -p /volume1/docker/mariadb-romm
+Create a new network bridge named rommbridge following standard Docker networking practices. You can use this guide for reference.
Generate your authentication key using:
+ +Save the output - you'll need it for the ROMM_AUTH_SECRET_KEY in your configuration.
Follow the dedicated wiki page for API key generation to set up your API keys.
+Important
+Create a docker-compose.yml file with the following content:
version: "3"
+
+volumes:
+ mysql_data:
+
+services:
+ romm:
+ image: rommapp/romm:latest
+ container_name: romm
+ restart: unless-stopped
+ environment:
+ - DB_HOST=romm-db
+ - DB_NAME=romm # Should match MARIADB_DATABASE in mariadb
+ - DB_USER=romm-user # Should match MARIADB_USER in mariadb
+ - DB_PASSWD= # Should match MARIADB_PASSWORD in mariadb
+ - ROMM_AUTH_SECRET_KEY= # Generate a key with `openssl rand -hex 32`
+ - SCREENSCRAPER_USER= # These are the recommended metadata providers
+ - SCREENSCRAPER_PASSWORD= # https://docs.romm.app/latest/Getting-Started/Metadata-Providers/#screenscraper
+ - RETROACHIEVEMENTS_API_KEY= # https://docs.romm.app/latest/Getting-Started/Metadata-Providers/#retroachievements
+ - STEAMGRIDDB_API_KEY= # https://docs.romm.app/latest/Getting-Started/Metadata-Providers/#steamgriddb
+ - HASHEOUS_API_ENABLED=true # https://docs.romm.app/latest/Getting-Started/Metadata-Providers/#hasheous
+ volumes:
+ - /volume1/docker/romm/resources:/romm/resources
+ - /volume1/docker/romm/redis-data:/redis-data
+ - /volume1/data/media/games/library:/romm/library
+ - /volume1/data/media/games/assets:/romm/assets
+ - /volume1/data/media/games/config:/romm/config
+ ports:
+ - 7676:8080
+ network_mode: rommbridge
+ depends_on:
+ romm-db:
+ condition: service_healthy
+ restart: true
+
+ romm-db:
+ image: mariadb:latest
+ container_name: romm-db
+ restart: unless-stopped
+ environment:
+ - MARIADB_ROOT_PASSWORD= # Use a unique, secure password
+ - MARIADB_DATABASE=romm
+ - MARIADB_USER=romm-user
+ - MARIADB_PASSWORD=
+ ports:
+ - 3309:3306
+ network_mode: rommbridge
+ volumes:
+ - /volume1/docker/mariadb-romm:/var/lib/mysql
+ healthcheck:
+ test: [CMD, healthcheck.sh, --connect, --innodb_initialized]
+ start_period: 30s
+ start_interval: 10s
+ interval: 10s
+ timeout: 5s
+ retries: 5
+http://your-server-ip:7676Important
+This guide is an abridged version of ChopFoo's original guide. If you have any suggestions or improvements, please submit a pull request to the RomM wiki.
+
+
+
+ This guide assumes you're familiar with Docker and have basic knowledge of TrueNAS. You'll need:
+Navigate to the App Catalog via Apps (Left navigation bar) -> Discover Apps -> RomM -> Install
+ +Step through the installation UI. You will need to supply various credentials per the Quick Start Guide. Most of the default values will work.
+Note: You will likely want to set certain Storage Configurations to a Dataset within TrueNAS, such as your RomM Library and Assets storage. If you do this, ensure you provide ACL access to the UserID specified above (default: 568, apps user).
+ +Save, and you're done! If the app will not boot, refer to Troubleshooting or head on over to the Discord.
+This installation path should only be used in the event that there is a bug with installing through the App Catalog, or you wish to have more flexibility than is provided by the installation UI.
+Navigate to the Install via YAML page via Apps (Left navigation bar) -> Discover Apps -> Install via YAML
Replace any empty values with credentials you've created per the Quick Start Guide.
+ +version: "3"
+
+volumes:
+ mysql_data:
+ romm_redis_data:
+
+services:
+ romm:
+ image: rommapp/romm:latest
+ container_name: romm
+ restart: unless-stopped
+ user: 568:568
+ environment:
+ - DB_HOST=romm-db
+ - DB_NAME=romm # Should match MARIADB_DATABASE in mariadb
+ - DB_USER=romm-user # Should match MARIADB_USER in mariadb
+ - DB_PASSWD= # Should match MARIADB_PASSWORD in mariadb
+ - ROMM_AUTH_SECRET_KEY= # Generate a key with `openssl rand -hex 32`
+ - SCREENSCRAPER_USER= # These are the recommended metadata providers
+ - SCREENSCRAPER_PASSWORD= # https://docs.romm.app/latest/Getting-Started/Metadata-Providers/#screenscraper
+ - RETROACHIEVEMENTS_API_KEY= # https://docs.romm.app/latest/Getting-Started/Metadata-Providers/#retroachievements
+ - STEAMGRIDDB_API_KEY= # https://docs.romm.app/latest/Getting-Started/Metadata-Providers/#steamgriddb
+ - HASHEOUS_API_ENABLED=true # https://docs.romm.app/latest/Getting-Started/Metadata-Providers/#hasheous
+ volumes: # Any /mnt paths may optionally be replaced with a docker volume
+ - /mnt/tank/truenas/resources:/romm/resources # Replace /mnt...: file path with your own data structure
+ - romm_redis_data:/romm/redis-data # Docker will manage this volume
+ - /mnt/tank/truenas/roms:/romm/library # Replace /mnt...: file path with your own data structure
+ - /mnt/tank/truenas/assets:/romm/assets # Replace /mnt...: file path with your own data structure
+ - /mnt/tank/truenas/config:/romm/config # Replace /mnt...: file path with your own data structure
+ ports:
+ - 31100:8080
+ depends_on:
+ romm-db:
+ condition: service_healthy
+ restart: true
+ deploy:
+ resources:
+ limits:
+ cpus: "2.0"
+ memory: 4g
+
+ romm-db:
+ image: mariadb:latest
+ container_name: romm-db
+ restart: unless-stopped
+ environment:
+ - MARIADB_ROOT_PASSWORD= # Use a unique, secure password
+ - MARIADB_DATABASE=romm
+ - MARIADB_USER=romm-user
+ - MARIADB_PASSWORD=
+ 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
+Save, and you're done! If the app will not boot, refer to Troubleshooting or head on over to the Discord.
+If you are encountering permissions issues with folders internal to the docker image (not your TrueNAS dataset), consider temporarily setting the user to root (user: 0). If you do this, it is recommended you fix local file permissions via shell and return access back to a non-root user.
+In my particular setup, I had to create a user/group in TrueNAS with uid:gid of 1000:1000 and auxiliary group apps due to hard-coded values in the RomM docker image. This resolved outstanding issues I had with my instance of RomM talking to its Redis instance.
If you have any suggestions or improvements, please submit a pull request to the RomM wiki.
+
+
+
+ Before getting started, install the Community Apps plugin for Unraid.
+Install Docker Compose Addon from the CA (Community Apps Store)
+ +You will now see Compose option under the Docker Containers in your Docker Tab in Unraid
+ +Click Add New Stack
+Name it RomM and click OK
+Click the Gear Icon, edit stack, then edit the compose file
+Add in the example Docker Compose from our example docker-compose.yml
+Add your environment variables, for example: API keys, MariaDB info, and metadata providers
+.env fileClick the Gear Icon, edit stack, then edit the environment file
+Make sure to click Save Changes after each edit to the compose and environment files
+Warning
+You need to make sure you are following either Folder Structure A or B (Recommend A Type) RomM Folder Structure
+Warning
+It's strongly recommended to backup the appdata folder (or mount it in a safe location) before updating, since tearing down the container will wipe the resources (covers, screenshots, etc.)
Grab IP:Port from romm, and open tab in browser in http://IP:Port and it should take you to setup screen
+
+
+
+ Before getting started, install the Community Apps plugin for Unraid.
+You'll want to create a custom bridge-type network for both containers to communicate with each other. This will prevent a number of common issues Unraid users tend to come across during setup. This can be done with the following command: docker network create romm, and you can verify it worked with docker network ls.
MariaDB is required to run RomM, so install it from the plugin registry. Only the official and linuxserver versions are supported, but the official version is preferred.
+ +Now fill in all the environment variables; descriptions of the options and sensible defaults are listed in the example docker-compose.yml file.
+ +Warning
+The network type must be set to Custom: romm
From the Unraid dashboard, click APPS in the navigation bar. In the search bar, search for romm, and install the app listed as "OFFICIAL". This one is maintained by our team and is the most up-to-date.
Configure the required environment variables, ports and paths as per the example docker-compose.yml file.
+ +Warning
+The network type must also be set to Custom: romm
Apply the changes, then head to the DOCKER tab. You should see both containers in a running state, and can access RomM using the IP:PORT of the container (highlighted below).
Warning
+It's strongly recommended to backup the appdata folder (or mount it in a safe location) before updating, since tearing down the container will wipe the resources (covers, screenshots, etc.)
DemonWarriorTech has published How to Install RomM on Unraid (Beginner Friendly) on installing and running RomM on Unraid for Beginners with an in depth instructions and explanation of the software install and how to use it.
+ +AlienTech42 has published a great video on installing and running RomM on Unraid. While a bit out of date vis-a-vis install instructions, it's still very useful for general setup and debugging. Check it out!
+ +You can find a support thread in the unraid forums.
+We want to give a special shout-out to @Smurre95 and @sfumat0 for their help documenting this process, and working towards getting RomM listed in CA. 🤝
+
+
+
+ Igir is a zero-setup ROM collection manager that sorts, filters, extracts or archives, patches, and reports on collections of any size on any OS. It can be used to rename your ROMs to match the RomM database, and to move them into a new directory structure.
+The directory structure is important for running the bulk ROM renaming script. Before running the bulk ROM renaming script, set up your directories as follows:
+.
+├── dats/ # DAT files from no-intro.org
+├── roms/ # Original ROM collection
+├── roms-unverified/ # Working copy of ROMs
+└── igir-romm-cleanup.sh
+Create a working copy of your ROMs:
+ +This provides a safe working environment and allows for easy script adjustment if needed.
+Download DAT Files:
+Extract the DAT files to your dats directory. You can optionally extract a subset of the .dat files into the directory instead.
Create the cleanup script igir-romm-cleanup.sh with the contents below:
#!/usr/bin/env bash
+set -ou pipefail
+cd "$(dirname "${0}")"
+
+INPUT_DIR=roms-unverified
+OUTPUT_DIR=roms-verified
+
+# Documentation: https://igir.io/
+# Uses dat files: https://datomatic.no-intro.org/index.php?page=download&op=daily
+time npx -y igir@latest \
+ move \
+ extract \
+ report \
+ test \
+ -d dats/ \
+ -i "${INPUT_DIR}/" \
+ -o "${OUTPUT_DIR}/{romm}/" \
+ --input-checksum-quick false \
+ --input-checksum-min CRC32 \
+ --input-checksum-max SHA256 \
+ --only-retail
+Make the script executable:
+ +Run the script. It will generate a new output directory named roms-verified, moving the files from roms-unverified if its checksum matches any of the known checksums in the DAT files provided. Any ROMs not identified will remain in the roms-unverified directory.
The script may not identify all of the ROMs in your input directory. You can choose to migrate them over manually:
+ +This will move your ROMs from the input to the output directory, preserving the subdirectory structure. It also cleans up file extensions in the process.
+The Igir script will move games that have multiple discs to separate folders. This can confuse RomM's game detection, and those games need to be reorganized into single folders with many discs.
+To do this enter your platform directory, such as ps or psx and run the following:
ls -d *Disc* | while read dir; do
+ game=$(echo "${dir}" | sed -r 's/ \(Disc [0-9]+\)//')
+ mkdir -p "${game}"
+ mv "${dir}"/* "${game}/"
+ rm -rf "${dir}"
+done
+This will find any directory with (Disc in the name and move the files into a new directory without the (Disc #) string. For example:
Before:
+ +Gets combined to:
+
+
+
+
+ 403 ForbiddenWhen authentication is enabled, most endpoints will return a 403 Forbidden response if you're not authenticated, or if your sessions is in a broken state. The session key can be reset by clearing your cookies.
CSRF protection is also enabled, which helps to mitigates CSRF attacks (useful if your instance is public). If you encounter a Forbidden (403) CSRF verification failed error, simply reloading your browser should force it to fetch a fresh CSRF cookie.
Unable to login: CSRF token verification failedThis error is known to happen on Chrome, but could happen in other browsers; manually clear your cookies (specifically one called csrftoken) and hard reload your browser window (CMD+SHIFT+R on macOS, CTRL+F5 on Windows).
400 Bad Request on the Websocket endpointIf you're running RomM behind a reverse-proxy (Caddy, Nginx, etc.), ensure that Websockets are supported and enabled. This may vary depending on the reverse proxy solution being used. In the case of Nginx Proxy Manager, enable the "Websockets Support" toggle when editing the proxy host.
+
+
+
+ invalid host in "tcp://<internal ip>:8080" of the "listen" directive in /etc/nginx/conf.d/default.conf:7By default, Kubernetes will grab information about the service object linked to a pod and inject it as an environment variable into the pod. In RomM, this leads to the pod attempting to bind to the service IP address, leading to the above fatal error.
+To resolve thes error, this default Kubernetes behaviour needs to be disabled by setting the enableServiceLinks value in the pod spec to false.
+
+
+
+ Verify that the database is mapped to a persistent storage volume in your docker compose or Unraid template.
+ +Could not get twitch auth token: check client_id and client_secretThis is likely due to mis-configured environment variables; verify that CLIENT_ID and CLIENT_SECRET are set correctly, and that both match the values in IGDB.
Each platform may have different logs, but check the stdout logs for docker. For example when using the recommended docker compose setup docker logs -f romm will display a continuous stream of the log. Most lines start with INFO, WARNING, or ERROR
+
+
+
+ There are a few common reasons why a scan may end instantly/without scanning platforms
+/romm/libraryls -lhromm folder structureThis is the same issue as the one above, and can be quickly solved by verifying your folder structure. RomM expects a library with a folder named roms in it, for example:
/server/media/library:/romm/library/server/media/games/roms:/romm/library/romsWhen scanning the folders mounted in /library/roms, the scanner tries to match the folder name with the platform's slug in IGDB. If you notice that the scanner isn't detecting a platform, verify that the folder name matches the slug in the URL of the platform in IGDB. For example, the Nintendo 64DD has the URL https://www.igdb.com/platforms/64dd, so the folder should be named 64dd.
The background scan task times out after 4 hours, which can happen if you have a very large library. The easiest work around is to keep running scans every 4 hours, without checking the "Complete re-scan" option. You can also change the timeout via environment variable SCAN_TIMEOUT.
Check the logs for RomM, you should find a line that looks like ERROR: [RomM][scan_handler][2025-04-12 11:48:55] that explains why the scanner stopped. This can often happen due to a corrupted file or a file the python zipfile library cannot handle, such as old DOS zip files with backslashes instead of forward slashes.
The easiest method is to check the logs via this command, which will list all the scanned platforms since the RomM container was started docker logs romm 2>/dev/null|egrep 'scan_handler.*Identified as.*🎮'
Here is an example output:
+
+
+
+
+ We have noticed recently a spate of access denied on Synology systems via Portainer or even docker manager. The ErrNo13 is directly related to Synology and it is a simple permission issue. To fix it please do the following:
+sudo chown -R user:group /path/to/library
sudo chmod -R a=,a+rX,u+w,g+w /path/to/library
sudo chown -R user:group /path/to/assets
sudo chmod -R a=,a+rX,u+w,g+w /path/to/assets
sudo chown -R user:group /path/to/config
sudo chmod -R a=,a+rX,u+w,g+w /path/to/config
You will find the relevant directories in your compose, this is basically the folders where you store your RomM information and we are just resetting permissions. Restart the containers and you should now have no issues scanning information in!
+Any issues please ask in the Discord.
+Thanks to Docker IDs - DrFrankenstein for the guidance from his blog.