Caution
As of this version, a valid config.yml
file is required to run the app, and must be mounted before upgrading to 4.1.0. Please refer to the instructions at the top of this example config.yml file. The file can be used as-is without making any changes.
Warning
This version contains a bug that will cause scans to fail and stop after the first game is matched. We recommend thoroughly reading these release notes, then upgrading directly to the latest patch release.
Important
Some platform slugs have been updated to fix common setup issues and remove duplicates. If you use any of the following platforms, the system will migrate to the new slugs will happen automatically, and update your config.yml
file accordingly. No manual intervention is required.
cpc
, apple-i
, apple2
, apple2gs
, apple3
, mattel-aquarius
, atari-2600
, atari-5200
, atari-7800
, atari-8-bit
, bally-astrocade
, bbc-micro
, cd-i
, cdtv
, channel-f
, commodore-16-plus4
, dragon-3264
, dreamcast
, edsac--1
, electron
, elektor-tv-games-computer
, fmtowns
, game-com
, gameboy
, gameboy-color
, gameboy-advance
, game-gear
, gamecube
, genesis-slash-megadrive
, macintosh
, microcomputer--1
, microvision--1
, neo-geo
, odyssey--1
, nintendo-ds
, palmos
, pc88
, pc98
, pet
, pdp-7--1
, pdp-8--1
, playstation
, ps
, ps4--1
, playstation-4
, playstation-5
, ps-vita
, sega-32x
, sega-cd
, sega-cd-32x
, sega-master-system
, sega-saturn
, sharp-x1
, sinclair-zx81
, sg-1000
, switch2
, thomson-mo
, trs-80-coco
, turbografx-16-slash-pc-engine-cd
, turbo-grafx
, turbografx16--1
, watara-slash-quickshot-supervision
, windows
, zx-spectrum
New Features
Missing games admin page
To simplify removal of missing games, we're added a new tab under the Library Management section of the admin panel that displays all ROMs present in the database but missing from the file system. You can choose to delete single games, groups of games using multi-select, or simply purge (cleanup) all missing games from the database with a single click.
Note: removing games will also remove any associated metadata, notes, status info, and will disassociate the game from any uploaded saves and states.
Smart collections
Create smart, self-updating collections for a predetermined set of search terms and filters! On the search page, change the search term and/or filters, and a new button will appear in the top bar. The dialog will display which filters will be set and allow you to give this smart collection a name and description.
Note: the list of games will only update when you view the contents of the collection

Experimental iOS app
The third-party Android app now has experimental support for iOS devices. You'll need to build and sign the .ipa
file locally with XCode (instructions to come). A full release to the play store and support for loading into alternative app store like AltStore is planned once a certain level of stability and polish has been reached.
Minor Changes
- Unify platform slugs by @gantoine in #2143
- Display an icon on the card if game has notes by @gantoine in #2226
- [ROMM-2142] Custom SGDB title match by @gantoine in #2220
- Use best-match algo for more providers by @gantoine in #2231
- Add zh_TW translation. by @wctang in #2188 and #2194
- Adding Polish translation files by @gutmanovaty in #2173
- Scroll to window bottom on scan by @gantoine in #2255
- Normalize result names for better merging of manual search results by @gantoine in #2267
- Add OpenTelemetry integration for API service and file watcher by @adamantike in #2251 and #2252
Note
The API responses for the following endpoints have changed. Please refer to the swagger docs under /api/docs
for the updated response types.
/api/firmware/delete
, /api/rom/delete
, /api/tasks/{task_id}
, /api/tasks/run
and /api/tests/run/{task_name}
Bug Fixes
- [ROMM-2202] Fix rom ID selected refresh metadata by @gantoine in #2204
- Docker build and init fixes by @adamantike in #2238
- Make RetroAchievements hash matching case-insensitive by @adamantike in #2240
- Correctly set up dockerignore file by @adamantike in #2237
- Run scheduler when only LaunchBox update is enabled by @adamantike in #2222
- Correctly evaluate enabled metadata sources in scheduled library scan by @adamantike in #2213
- [ROMM-2186] Allow editing user without password field by @gantoine in #2193
- [ROMM-2184] Fix selecting dialog buttons on mobile by @gantoine in #2198
- [ROMM-1868] Fix grouping by metadata rows by @gantoine in #2203
- [ROMM-1949] Fix multi rom download by @gantoine in #2206
- [ROMM-2155] Fix char bar jumping to wrong game by @gantoine in #2208
- [ROMM-2075] Use platform version icon on card by @gantoine in #2207
- [ROMM-2211] Only show missing platforms on lib manage page by @gantoine in #2212
- Fire off search if URL state prepopulated by @gantoine in #2205
- Improve performance on asset screenshot retrieval by @adamantike in #2248
- Correctly upload manual to resources path by @adamantike in #2254
- Disable OpenTelemetry integration if not configured by @adamantike in #2262
- [ROMM-2163] Fix excluding single roms without extensions by @gantoine in #2256
- [ROMM-2247] Return early if cover write fails by @gantoine in #2249
- Always hash the largest file in compressed multi file roms by @gantoine in #2261
Other
- Add support for database query string using
DB_QUERY_JSON
variable by @adamantike in #2244 - Refactor task execution workers by @zurdi15 in #2178
- Add IPv6 support by @danielkoster in #2201
- Separate tests folder from backend code by @adamantike in #2234
- Move pytest.ini to backend directory by @adamantike in #2214
- Remove indirect dependency freezegun by @adamantike in #2233
- Move pytest-cov dependency to test extra by @adamantike in #2229
- Replace emoji dependency with constants by @adamantike in #2228
- Add type hints to task classes by @adamantike in #2221
- Remove uses of Props and Functions comments by @gantoine in #2187
- Replace MessageResponse with specific responses by @gantoine in #2185
- Migrate scheduler to native RQ process by @adamantike in #2224
- Migrate worker to native rq process by @gantoine in #2227
- Migrate watcher to use watchfiles library by @adamantike in #2230
- Use native 7z to extract files and calculate hashes by @gantoine in #2232
- Do not warn when REDIS_HOST is set by @adamantike in #2243
- Create startup script to run initial tasks before main application by @adamantike in #2258
- Move cache initialization to startup script by @adamantike in #2260
- Use column properties to calculate
fs_size_bytes
by @gantoine in #2264 - misc: Upgrade Ruffle to v2025-08-14 by @adamantike in #2265
- Make default ROMM_AUTH_SECRET_KEY consistent between workers by @gantoine in #2266
New Contributors
- @gutmanovaty made their first contribution in #2173
- @wctang made their first contribution in #2188
- @danielkoster made their first contribution in #2201
Full Changelog: 4.0.1...4.1.0