Skip to content

Releases: rommapp/romm

5.2.0

Choose a tag to compare

@gantoine gantoine released this 20 Aug 11:34
42e8043

Minor changes

  • feat(screenscraper): pace and report scans against the account's reported limits by @Spinnich in #3989
  • feat: reorderable region and language priority lists in scan settings by @gantoine in #4015
  • feat(frontend): autofocus the search field on the Search view by @gantoine in #4022
  • feat(home): make the random pick widget clickable and denser by @gantoine in #4056
  • feat(rating): show provider ratings by @wadiebs in #4096
  • feat(soundtrack player): improve artwork by @wadiebs in #4168
  • feat(v2): previous / next game buttons on the details page by @gantoine in #4012
  • feat(v2): search platforms by slug, folder, category and family by @Spinnich in #4136
  • feat(hasheous): map famicom to the NES platform by @sdornan in #4162
  • feat(v2): show IGDB ports on the game overview by @sdornan in #4184

Fixes

  • fix(steamgriddb): skip DMCA-locked grids when scraping SteamGridDB by @gantoine in #4004
  • fix(security): close three permission gaps found auditing 5.1.0 by @gantoine in #3993
  • fix(backend): re-run the Hasheous hash lookup on a hashes scan by @gantoine in #4013
  • fix(v2): keep RSelect menus inside the viewport and tidy the selection text by @gantoine in #4014
  • fix(roms): give each FPKGi package a unique name within its rom by @gantoine in #4021
  • fix(backend): scope ScreenScraper French fallback to taxonomy fields by @gantoine in #4026
  • fix(v2): pivot to a filtered search from the overview info grid by @gantoine in #4023
  • fix(backend): tolerate calendar-invalid gamelist dates on PostgreSQL by @gantoine in #4024
  • fix(player): skip the save load a state immediately discards by @gantoine in #4025
  • fix(roms): search the gallery by CRC32, MD5, SHA-1 and RA hash by @Spinnich in #4032
  • fix(docker): always start the RQ scheduler by @XenuIsWatching in #4033
  • fix(backend): scope the kiosk read-only cap to the anonymous visitor by @Spinnich in #4047
  • fix: batch of open bug fixes (#4027, #4034, #4035, #4038, #4040, #4043, #4045) by @gantoine in #4051
  • fix(scan): report only newly discovered firmware by @gantoine in #4055
  • fix(rom-details): render the manual viewer on mobile by @gantoine in #4058
  • fix(hasheous): read the CHD and DOS signature sources by @gantoine in #4060
  • fix(stats): pluralize the platform game count and lift meta legibility by @gantoine in #4065
  • fix(config): map tic80 to the tic-80 platform slug by @XenuIsWatching in #4090
  • fix(docker): keep the Redis password out of the RQ worker command line by @gantoine in #4093
  • fix(v2): make hashes recoverable without HTTPS and show all firmware hashes by @Spinnich in #4083
  • fix(home): stop scanning the library filesystem on every home page load by @Spinnich in #4069
  • fix(auth): accept a stale user-bound CSRF token on anonymous requests by @bikeborb in #4086
  • fix(v2): drop a random pick after leaving the platform by @Spinnich in #4113
  • fix(states): repoint the row when a re-upload changes emulator by @TowyTowy in #4112
  • fix(v2): keep Playmatch selectable when providers are set to All by @sdornan in #4120
  • fix(hashing): extract CHD SHA-1 for folder-based ROMs by @sdornan in #4129
  • fix(v2): compute game-card cover width instead of deriving it by @sdornan in #4135
  • fix(media): stop recording paths for media that never landed by @sdornan in #4131
  • fix(screenscraper): report rejected credentials instead of a bare 403 by @Spinnich in #4130
  • fix(launchbox): match ROMs during a scan the way Match ROM does by @sdornan in #4121
  • fix(hltb): renew rejected HLTB sessions instead of failing the scan by @sdornan in #4125
  • fix(v2): drop a random pick that lands after leaving the gallery by @Spinnich in #4138
  • fix(ss): store the ScreenScraper box-2D front locally by @sdornan in #4139
  • fix(v2): show a running scan on pages loaded mid-scan by @sdornan in #4142
  • fix(resources): fetch each cover once instead of once per size by @Spinnich in #4143
  • fix(metadata): identify archives and folder ROMs by the right file by @Spinnich in #4146
  • fix(match-rom): show the saving overlay above the grid match panel by @sdornan in #4147
  • refactor(i18n): name gallery filters by property instead of "Show X" by @sdornan in #4149
  • fix(v2): bulk favorite no-ops on a fresh instance and reports the wrong direction by @Spinnich in #4151
  • fix: refresh the v2 gallery when a ROM is edited or matched by @sdornan in #4153
  • fix(v2): pin mobile bottom nav with sticky instead of fixed by @nickybmon in #4155
  • fix(export): stop miximage_v2 colliding with miximage, persist gamelist back covers by @sdornan in #4156
  • fix(hashing): surface unreadable zip and tar archives by @sdornan in #4163
  • fix: remove double URL-encoding of MobyGames search terms by @justinjd00 in #4181
  • fix(i18n): correct Breton pt_BR player-count and align ja_JP/tr_TR by @sdornan in #4183
  • fix(i18n): translate pt_BR strings left in English by @sdornan in #4185
  • fix(v2): close open overlays when the route changes by @sdornan in #4193
  • Changed default compose, will explain more in pull by @danblu3 in #4202
  • fix(v2): drop the roms from the gallery when they leave the collection on screen by @sdornan in #4204
  • fix(scan): normalize region and language tags to one canonical spelling by @sdornan in #4206
  • fix: demote uvicorn HTTP access logs to WARNING/DEBUG only by @gantoine with @Copilot in #4214
  • fix: Add .xdelta support to server-side ROM patcher and v2 patcher UI by @gantoine with @Copilot in #4215
  • fix(states): enforce ROM visibility when uploading a state by @gantoine in #4216
  • fix(auth): build invite links from ROMM_BASE_URL by @sdornan in #4217
  • fix(scan): re-read filename tags on a complete rescan by @sdornan in #4218
  • fix(libretro): cache missing thumbnail listings by @sdornan in #4219
  • fix(launchbox): match titles differing only by punctuation by @sdornan in #4224
  • fix(hltb): match titles whose series prefix the catalogue omits by @sdornan in #4225
  • fix(ss): don't use the Switch icon URL as the manual URL by @TowyTowy in #4228
  • fix(resources): publish downloaded resources atomically by @sdornan in #4230
  • fix(i18n): translate route titles once locale messages are loaded by @sdornan in #4231
  • fix(i18n): add the missing playlists permission entity label by @sdornan in #4234
  • fix(hltb): fetch metadata when a HowLongToBeat ID is set by hand by @sdornan in #4235
  • fix(launchbox): match LaunchBox dumps that separate words with underscores by @sdornan in #4239
  • fix(backend): make filters match against all grouped versions instead of only the main version of each game entry by @darkpaul91 in #4240
  • feat(metadata): warn when ScreenScraper dev credentials are missing by @gantoine in #4243
  • fix(scan): ignore Windows Zone.Identifier files by @Florian-Cullmann in #4245

Other changes

  • perf(roms): stop the Missing tab scanning the whole library by @Spinnich in #4005
  • perf(scan): stop hashing single-file ROMs twice by @XenuIsWatching in #4017
  • perf(collections): serve smart and standard collections from a composed query by @Spinnich in #4039
  • perf(roms): extend ...
Read more

5.1.1-beta.2

5.1.1-beta.2 Pre-release
Pre-release

Choose a tag to compare

@gantoine gantoine released this 16 Aug 22:10
3c8e553

What's Changed

  • fix(stats): pluralize the platform game count and lift meta legibility by @gantoine in #4065
  • fix(config): map tic80 to the tic-80 platform slug by @XenuIsWatching in #4090
  • fix(docker): keep the Redis password out of the RQ worker command line by @gantoine in #4093
  • fix(v2): make hashes recoverable without HTTPS and show all firmware hashes by @Spinnich in #4083
  • fix(home): stop scanning the library filesystem on every home page load by @Spinnich in #4069
  • perf(roms): pick a random rom without paging to a random offset by @Spinnich in #4071
  • perf(roms): sort metadata fields on the indexed roms column by @Spinnich in #4078
  • fix(auth): accept a stale user-bound CSRF token on anonymous requests by @bikeborb in #4086
  • perf(gallery): resolve the random rom button in one request by @Spinnich in #4097
  • perf(home): stop counting the whole library for the two home rows by @Spinnich in #4110
  • chore(deps): bump aiohttp from 3.14.1 to 3.14.3 by @dependabot[bot] in #4115
  • fix(v2): drop a random pick after leaving the platform by @Spinnich in #4113
  • chore(deps-dev): bump fast-uri from 3.1.4 to 3.1.5 in /frontend by @dependabot[bot] in #4118
  • chore(deps): bump socket.io-parser from 4.2.6 to 4.2.7 in /frontend by @dependabot[bot] in #4119
  • feat(Rating): show provider ratings by @wadiebs in #4096
  • fix(states): repoint the row when a re-upload changes emulator by @TowyTowy in #4112
  • fix(v2): keep Playmatch selectable when providers are set to All by @sdornan in #4120
  • fix(hashing): extract CHD SHA-1 for folder-based ROMs by @sdornan in #4129
  • fix(v2): compute game-card cover width instead of deriving it by @sdornan in #4135
  • fix(media): stop recording paths for media that never landed by @sdornan in #4131
  • fix(screenscraper): report rejected credentials instead of a bare 403 by @Spinnich in #4130
  • fix(launchbox): match ROMs during a scan the way Match ROM does by @sdornan in #4121
  • fix(hltb): renew rejected HLTB sessions instead of failing the scan by @sdornan in #4125
  • feat(v2): search platforms by slug, folder, category and family by @Spinnich in #4136
  • fix(v2): drop a random pick that lands after leaving the gallery by @Spinnich in #4138
  • fix(ss): store the ScreenScraper box-2D front locally by @sdornan in #4139
  • fix(v2): show a running scan on pages loaded mid-scan by @sdornan in #4142
  • fix(resources): fetch each cover once instead of once per size by @Spinnich in #4143
  • fix(metadata): identify archives and folder ROMs by the right file by @Spinnich in #4146
  • fix(match-rom): show the saving overlay above the grid match panel by @sdornan in #4147
  • refactor(i18n): name gallery filters by property instead of "Show X" by @sdornan in #4149
  • fix(v2): bulk favorite no-ops on a fresh instance and reports the wrong direction by @Spinnich in #4151
  • fix: refresh the v2 gallery when a ROM is edited or matched by @sdornan in #4153
  • fix(v2): pin mobile bottom nav with sticky instead of fixed by @nickybmon in #4155
  • fix(export): stop miximage_v2 colliding with miximage, persist gamelist back covers by @sdornan in #4156
  • feat(hasheous): map famicom to the NES platform by @sdornan in #4162
  • fix(hashing): surface unreadable zip and tar archives by @sdornan in #4163
  • feat(soundtrack player): improve artwork by @wadiebs in #4168
  • fix: remove double URL-encoding of MobyGames search terms by @justinjd00 in #4181
  • fix(i18n): correct Breton pt_BR player-count and align ja_JP/tr_TR by @sdornan in #4183
  • feat(v2): show IGDB ports on the game overview by @sdornan in #4184
  • fix(i18n): translate pt_BR strings left in English by @sdornan in #4185
  • perf(scan): scope a rom-id scan to the selected roms by @sdornan in #4188
  • chore(deps-dev): bump js-yaml from 4.2.0 to 4.3.1 in /frontend by @dependabot[bot] in #4189
  • fix(v2): close open overlays when the route changes by @sdornan in #4193
  • perf(scan): cut scan memory and drop a quadratic file listing check by @XenuIsWatching in #4198
  • Changed default compose, will explain more in pull by @danblu3 in #4202
  • fix(v2): drop the roms from the gallery when they leave the collection on screen by @sdornan in #4204
  • fix(scan): normalize region and language tags to one canonical spelling by @sdornan in #4206
  • perf(scan): stop re-hashing unchanged firmware on every scan by @sdornan in #4211

New Contributors

Full Changelog: 5.1.1-beta.1...5.1.1-beta.2

5.1.1-beta.1

5.1.1-beta.1 Pre-release
Pre-release

Choose a tag to compare

@gantoine gantoine released this 02 Aug 15:28
4fac604

Minor changes

  • feat(frontend): autofocus the search field on the Search view by @gantoine in #4022
  • feat(home): make the random pick widget clickable and denser by @gantoine in #4056
  • feat(screenscraper): pace and report scans against the account's reported limits by @Spinnich in #3989
  • feat(v2): previous / next game buttons on the details page by @gantoine in #4012

Fixes

  • fix: Skip DMCA-locked grids when scraping SteamGridDB by @gantoine in #4004
  • fix(security): close three permission gaps found auditing 5.1.0 by @gantoine in #3993
  • fix(backend): re-run the Hasheous hash lookup on a hashes scan by @gantoine in #4013
  • fix(v2): keep RSelect menus inside the viewport and tidy the selection text by @gantoine in #4014
  • fix: reorderable region and language priority lists in scan settings by @gantoine in #4015
  • fix: give each FPKGi package a unique name within its rom by @gantoine in #4021
  • fix(backend): scope ScreenScraper French fallback to taxonomy fields by @gantoine in #4026
  • fix(v2): pivot to a filtered search from the overview info grid by @gantoine in #4023
  • fix(backend): tolerate calendar-invalid gamelist dates on PostgreSQL by @gantoine in #4024
  • fix(player): skip the save load a state immediately discards by @gantoine in #4025
  • fix(roms): search the gallery by CRC32, MD5, SHA-1 and RA hash by @Spinnich in #4032
  • fix(docker): always start the RQ scheduler by @XenuIsWatching in #4033
  • fix(backend): scope the kiosk read-only cap to the anonymous visitor by @Spinnich in #4047
  • fix: batch of open bug fixes (#4027, #4034, #4035, #4038, #4040, #4043, #4045) by @gantoine in #4051
  • fix(scan): report only newly discovered firmware by @gantoine in #4055
  • fix(rom-details): render the manual viewer on mobile by @gantoine in #4058
  • fix(hasheous): read the CHD and DOS signature sources by @gantoine in #4060

Other changes

  • perf(scan): stop hashing single-file ROMs twice by @XenuIsWatching in #4017
  • perf(roms): stop the Missing tab scanning the whole library by @Spinnich in #4005
  • perf(collections): serve smart and standard collections from a composed query by @Spinnich in #4039
  • perf(roms): extend the sibling covering index to cover the ROM grouping query by @Spinnich in #4054
  • perf(roms): let a gallery window fetch skip the library count by @Spinnich in #4062

Full Changelog: 5.1.0...5.1.1-beta.1

5.1.0

Choose a tag to compare

@gantoine gantoine released this 29 Jul 21:43
06cafd4

Warning

When binary logging is on and the connecting user lacks SUPER, trigger DDL is refused unless the global log_bin_trust_function_creators flag is 1. Run this on your MariaDB as an admin/root user (not the romm app user):

SET GLOBAL log_bin_trust_function_creators = 1;

SET GLOBAL is lost on DB restart. Either add to your MariaDB my.cnf under [mysqld]:

log_bin_trust_function_creators = 1

Or grant the app user the privilege (MariaDB 10.5+):

`GRANT BINLOG ADMIN ON *.* TO 'romm'@'%';`   -- or: GRANT SUPER ON *.* TO 'romm'@'%';

Warning

If your reverse proxy caches responses itself, or overrides/strips Cache-Control, it will defeat our built-in cache and serve a stale index.html that points at bundles the new image no longer ships, which usually shows up as a blank page or a broken UI after upgrading. After upgrading, purge your proxy's or CDN's existing cache once so clients stop being served entries stored under the old (header-less) behaviour.

Highlights

Emulator streaming

Launches a game into a native emulator running in a separate container and streams the picture, sound, and input back to your browser. Unlike EmulatorJS, the emulation runs server-side on real emulator binaries (PCSX2, Dolphin, Xemu), so the heavy lifting happens on the host rather than in the client. #3211

Important

Emulator streaming is in early development, and documentation is coming soon! If you really want to try it today, refer to this pull request in the rommapp/docs repo.

image2

Per-field artwork priority overrides

Optional per-field artwork priority to prioritize metadata sources differently for covers, screenshots, and manuals, which fall back to the shared scan.priority.artwork. #3838

scan:
  priority:
    cover: # Cover art only
      - igdb
      - ss
    screenshot: # Screenshots only
      - ss
      - igdb
    manual: # Game manuals only
      - launchbox
    region_mode: prefer_rom_tags  Region tags win over priority list

Scan settings UI

Brand new UI to edit the whole scan.* section of config.yml. #3854

Screenshot 2026-07-21 at 8 20 20 PM

Manual cover search filters

Client-side filters to the manual cover-search dialog to quickly narrow SteamGridDB results instead of scrolling through dozens of community covers. #3857

Screenshot 2026-07-21 at 8 20 44 PM

Minor changes

  • feat: add file deletion to the Files tab on the game details page by @zurdi15 with @Copilot in #3753
  • feat(v2): add reduced-effects mode for low-power devices by @gantoine in #3766
  • feat(v2): link Hasheous provider to game detail page by @gantoine in #3783
  • feat: add soundtrack gallery filter by @gantoine in #3790
  • feat(playmatch): support self-hosted Playmatch instances by @gantoine in #3827
  • feat: Support Range requests for multi-file ROM downloads by @tmgast in #3167
  • feat: add "Open in Flashpoint" game action by @gantoine in #3845
  • feat: Surface never-scanned platform folders in the scan picker by @gantoine in #3847
  • feat(platforms): add editable platform descriptions by @Spinnich in #3855
  • feat(v2): add random-ROM button to collections by @gantoine in #3860
  • feat(v2): show smart and virtual collections on the home screen by @gantoine in #3859
  • feat(scan): reassociate renamed/moved ROMs with missing entries by file hash by @gantoine in #3861
  • feat(v2): auto-mark now-playing on launch + confirm launching shelved games by @gantoine in #3867
  • feat: add music favorites and playlists API by @tmgast in #3896
  • feat: add scan.priority.region_mode to let config regions drive media selection by @gantoine in #3917
  • feat: add Scan Settings to the user dropdown menu by @gantoine in #3923
  • feat(tasks): allow orphaned resource cleanup to run on a schedule by @XenuIsWatching in #3970

Note

Environment variables

variable default description
PLAYMATCH_API_URL https://playmatch.retrorealm.dev/api/v2 Use self-hosted instance of Playmatch
STREAMING_BROKER_SECRET - Required for emulator streaming
STREAMING_SAVE_TIMEOUT 45 Save request timeout (in seconds)
ROMM_CORS_ALLOWED_ORIGINS Comma-separated list of allowed CORS origins (empty allows all)
ROMM_SESSION_SECURE_COOKIE 'false Mark session and CSRF cookies Secure (enable when served over HTTPS)
MAX_ASSET_UPLOAD_SIZE_BYTES 536870912 Max size of a save/state/screenshot upload request in bytes (0 disables the limit)
MAX_AUTOCLEANUP_LIMIT 100 Max number of saves a client can keep per slot when autocleanup is on (minimum 1)

Fixes

  • fix(scan): resolve "Reg-" prefixed region shortcodes to full names by @TowyTowy in #3754
  • fix(playmatch): handle empty heartbeat query by @DevYukine in #3756
  • fix(db): pin explicit collation in virtual_collections view for MariaDB 11.6+ by @kthistlewood in #3759
  • fix(v2): render match-rom covers at full width in Safari by @gantoine in #3763
  • fix(migrations): make DDL idempotent on partial-failure reruns by @gantoine in #3767
  • fix(v2): link IGDB provider to game page by slug by @gantoine in #3782
  • fix(v2): batch gallery cover fetches into windows by @gantoine in #3765
  • fix(ss): tolerate ScreenScraper's invalid JSON escapes by @gantoine in #3778
  • fix(backend): lightweight eager-load for /roms/{id}/simple by @gantoine in #3779
  • fix(platforms): include TGDB handler in tgdb_id fallback for supported platforms by @TowyTowy in #3785
  • fix: respect configured IGDB region priority by @gantoine in #3791
  • fix(retroachievements): resolve m3u playlists to natively hashed discs by @Spinnich in #3804
  • fix(retroachievements): extract non-zip archives before RAHasher hashing by @Spinnich in #3813
  • fix(metadata): search the whole filename for Sony serial codes by @TowyTowy in #3802
  • fix(docker): proxy nginx to gunicorn over TCP instead of unix socket by @gantoine in #3810
  • fix(frontend): base v2 verified badge on real DB hash matches by @gantoine in #3815
  • fix(v2): render visible labels on device-auth and token expiry selects by @gantoine in #3818
  • fix(igdb): don't match series games to their base title by @gantoine in #3817
  • fix(scan): make v2 per-ROM "Update metadata" run the update scan type by @gantoine in #3819
  • fix(v2): batch gallery hydration into windows and cap concurrency by @gantoine in #3824
  • fix(v2): clear gallery selection after deleting ROMs by @gantoine in #3828
  • fix(player): keep origin save bound and surface save slots in v2 EmulatorJS by @gantoine in #3831
  • fix: Missing last platform-stats progressbar by @AlmostEasyGoing in #3834
  • fix(netplay): correct room-list and socket URLs behind a reverse proxy by @gantoine in #3839
  • fix: don't re-stamp updated_at for unchanged ROMs during scans by @gantoine in #3843
  • fix: load selected file with correct extension for multi-file roms by @gantoine in #3844
  • Fix v2 gallery not refetching when filter logic operator changes by @gantoine in #3840
  • Fix wrong error wording for flag-only providers in setup wizard by @gantoine in #3841
  • Fix slot-less save upload DB/file desync by @gantoine in #3846
  • fix: enforce hidden-ROM/platform visibility on asset download and streaming endpoints by @gantoine in #3853
  • fix(v2): ignore phantom/non-standard gamepads in nav polling by @gantoine in #3852
  • fix(v2): overlay body-scroll-lock leaks + Library Stats label clipping by @gantoine in #3858
  • fix(collections): lazy-load collection mosaic artwork by @gantoine in #3870
  • fix(v2): keep collection visibility toggle in sync after save by @gantoine in https://github....
Read more

5.1.0-beta.3

5.1.0-beta.3 Pre-release
Pre-release

Choose a tag to compare

@gantoine gantoine released this 27 Jul 22:17
4b83bf0

What's Changed

  • Enforce hidden-rom visibility on rom child routes by @gantoine in #3960
  • Always allow changing the virtual collection type in v2 settings by @gantoine in #3961
  • Fix ROMM_AUTH_SECRET_KEY auto-generation under nounset by @gantoine in #3967
  • feat(tasks): allow orphaned resource cleanup to run on a schedule by @XenuIsWatching in #3970
  • Serve each PKG file as its own FPKGi entry by @gantoine in #3966
  • fix(resources): handle write failures when the disk is full by @XenuIsWatching in #3969
  • fix(tasks): skip orphaned resource cleanup when the database looks empty by @gantoine in #3971

New Contributors

Full Changelog: 5.1.0-beta.2...5.1.0-beta.3

5.1.0-beta.2

5.1.0-beta.2 Pre-release
Pre-release

Choose a tag to compare

@gantoine gantoine released this 26 Jul 20:10
1647ed3

What's Changed

  • Set page titles across v2 views by @gantoine in #3955
  • Hide v2 actions the backend won't allow, with Playwright cover in CI by @gantoine in #3957
  • security: harden CORS, session cookies, filename sanitization, and upload limits by @Sunil56224972 in #3952
  • build(deps): bump postcss from 8.5.15 to 8.5.23 in /frontend by @dependabot[bot] in #3959

New Contributors

Full Changelog: 5.1.0-beta.1...5.1.0-beta.2

5.1.0-beta.1

5.1.0-beta.1 Pre-release
Pre-release

Choose a tag to compare

@gantoine gantoine released this 25 Jul 18:34
58efd33

Warning

When binary logging is on and the connecting user lacks SUPER, trigger DDL is refused unless the global log_bin_trust_function_creators flag is 1. Run this on your MariaDB as an admin/root user (not the romm app user):

SET GLOBAL log_bin_trust_function_creators = 1;

SET GLOBAL is lost on DB restart. Either add to your MariaDB my.cnf under [mysqld]:

log_bin_trust_function_creators = 1

Or grant the app user the privilege (MariaDB 10.5+):

`GRANT BINLOG ADMIN ON *.* TO 'romm'@'%';`   -- or: GRANT SUPER ON *.* TO 'romm'@'%';

Warning

If your reverse proxy caches responses itself, or overrides/strips Cache-Control, it will defeat our built-in cache and serve a stale index.html that points at bundles the new image no longer ships, which usually shows up as a blank page or a broken UI after upgrading. After upgrading, purge your proxy's or CDN's existing cache once so clients stop being served entries stored under the old (header-less) behaviour.

Highlights

Emulator streaming

Launches a game into a native emulator running in a separate container and streams the picture, sound, and input back to your browser. Unlike EmulatorJS, the emulation runs server-side on real emulator binaries (PCSX2, Dolphin, Xemu), so the heavy lifting happens on the host rather than in the client. #3211

Important

Emulator streaming is in early development, and documentation is coming soon! If you really want to try it today, refer to this pull request in the rommapp/docs repo.

image2

Per-field artwork priority overrides

Optional per-field artwork priority to prioritize metadata sources differently for covers, screenshots, and manuals, which fall back to the shared scan.priority.artwork. #3838

scan:
  priority:
    cover: # Cover art only
      - igdb
      - ss
    screenshot: # Screenshots only
      - ss
      - igdb
    manual: # Game manuals only
      - launchbox
    region_mode: prefer_rom_tags  Region tags win over priority list

Scan settings UI

Brand new UI to edit the whole scan.* section of config.yml. #3854

Screenshot 2026-07-21 at 8 20 20 PM

Manual cover search filters

Client-side filters to the manual cover-search dialog to quickly narrow SteamGridDB results instead of scrolling through dozens of community covers. #3857

Screenshot 2026-07-21 at 8 20 44 PM

Minor changes

  • feat: add file deletion to the Files tab on the game details page by @zurdi15 with @Copilot in #3753
  • feat(v2): add reduced-effects mode for low-power devices by @gantoine in #3766
  • feat(v2): link Hasheous provider to game detail page by @gantoine in #3783
  • feat: add soundtrack gallery filter by @gantoine in #3790
  • feat(playmatch): support self-hosted Playmatch instances by @gantoine in #3827
  • feat: Support Range requests for multi-file ROM downloads by @tmgast in #3167
  • feat: add "Open in Flashpoint" game action by @gantoine in #3845
  • feat: Surface never-scanned platform folders in the scan picker by @gantoine in #3847
  • feat(platforms): add editable platform descriptions by @Spinnich in #3855
  • feat(v2): add random-ROM button to collections by @gantoine in #3860
  • feat(v2): show smart and virtual collections on the home screen by @gantoine in #3859
  • feat(scan): reassociate renamed/moved ROMs with missing entries by file hash by @gantoine in #3861
  • feat(v2): auto-mark now-playing on launch + confirm launching shelved games by @gantoine in #3867
  • feat: add music favorites and playlists API by @tmgast in #3896
  • feat: add scan.priority.region_mode to let config regions drive media selection by @gantoine in #3917
  • feat: add Scan Settings to the user dropdown menu by @gantoine in #3923

Note

Environment variables

cariable default description
PLAYMATCH_API_URL https://playmatch.retrorealm.dev/api/v2 Use self-hosted instance of Playmatch
STREAMING_BROKER_SECRET - Required for emulator streaming
STREAMING_SAVE_TIMEOUT 45 Save request timeout (in seconds)

Fixes

  • fix(scan): resolve "Reg-" prefixed region shortcodes to full names by @TowyTowy in #3754
  • fix(playmatch): handle empty heartbeat query by @DevYukine in #3756
  • fix(db): pin explicit collation in virtual_collections view for MariaDB 11.6+ by @kthistlewood in #3759
  • fix(v2): render match-rom covers at full width in Safari by @gantoine in #3763
  • fix(migrations): make DDL idempotent on partial-failure reruns by @gantoine in #3767
  • fix(v2): link IGDB provider to game page by slug by @gantoine in #3782
  • fix(v2): batch gallery cover fetches into windows by @gantoine in #3765
  • fix(ss): tolerate ScreenScraper's invalid JSON escapes by @gantoine in #3778
  • fix(backend): lightweight eager-load for /roms/{id}/simple by @gantoine in #3779
  • fix(platforms): include TGDB handler in tgdb_id fallback for supported platforms by @TowyTowy in #3785
  • fix: respect configured IGDB region priority by @gantoine in #3791
  • fix(retroachievements): resolve m3u playlists to natively hashed discs by @Spinnich in #3804
  • fix(retroachievements): extract non-zip archives before RAHasher hashing by @Spinnich in #3813
  • fix(metadata): search the whole filename for Sony serial codes by @TowyTowy in #3802
  • fix(docker): proxy nginx to gunicorn over TCP instead of unix socket by @gantoine in #3810
  • fix(frontend): base v2 verified badge on real DB hash matches by @gantoine in #3815
  • fix(v2): render visible labels on device-auth and token expiry selects by @gantoine in #3818
  • fix(igdb): don't match series games to their base title by @gantoine in #3817
  • fix(scan): make v2 per-ROM "Update metadata" run the update scan type by @gantoine in #3819
  • fix(v2): batch gallery hydration into windows and cap concurrency by @gantoine in #3824
  • fix(v2): clear gallery selection after deleting ROMs by @gantoine in #3828
  • fix(player): keep origin save bound and surface save slots in v2 EmulatorJS by @gantoine in #3831
  • fix: Missing last platform-stats progressbar by @AlmostEasyGoing in #3834
  • fix(netplay): correct room-list and socket URLs behind a reverse proxy by @gantoine in #3839
  • fix: don't re-stamp updated_at for unchanged ROMs during scans by @gantoine in #3843
  • fix: load selected file with correct extension for multi-file roms by @gantoine in #3844
  • Fix v2 gallery not refetching when filter logic operator changes by @gantoine in #3840
  • Fix wrong error wording for flag-only providers in setup wizard by @gantoine in #3841
  • Fix slot-less save upload DB/file desync by @gantoine in #3846
  • fix: enforce hidden-ROM/platform visibility on asset download and streaming endpoints by @gantoine in #3853
  • fix(v2): ignore phantom/non-standard gamepads in nav polling by @gantoine in #3852
  • fix(v2): overlay body-scroll-lock leaks + Library Stats label clipping by @gantoine in #3858
  • fix(collections): lazy-load collection mosaic artwork by @gantoine in #3870
  • fix(v2): keep collection visibility toggle in sync after save by @gantoine in #3871
  • fix(db): don't use STR_TO_DATE in a generated column (MariaDB 12.3) by @gantoine in #3879
  • fix(v2): take the hotkey-mute playing flag from EmulatorJS' start hook by @gantoine in #3878
  • fix(archives): read RAR archives through bsdtar so they can be hashed by @gantoine in #3887
  • fix(nginx): cache only fingerprinted assets, revalidate the rest by @Spinnich in #3892
  • fix(v2): hide empty platforms in S...
Read more

5.1.0-alpha.5

5.1.0-alpha.5 Pre-release
Pre-release

Choose a tag to compare

@gantoine gantoine released this 25 Jul 02:19
a127286

What's Changed

  • fix(roms): list the smart collections a ROM belongs to on its detail view by @Spinnich in #3936
  • fix(player): guard v2 EmulatorJS against stale saved disc id by @Spinnich in #3940
  • fix(player): render ScreenScraper bezel in v2 EmulatorJS player by @Spinnich in #3944

Full Changelog: 5.1.0-alpha.4...5.1.0-alpha.5

5.1.0-alpha.4

5.1.0-alpha.4 Pre-release
Pre-release

Choose a tag to compare

@gantoine gantoine released this 24 Jul 02:00
dcc04aa

Warning

When binary logging is on and the connecting user lacks SUPER, trigger DDL is refused unless the global log_bin_trust_function_creators flag is 1. Run this on your MariaDB as an admin/root user (not the romm app user):

SET GLOBAL log_bin_trust_function_creators = 1;

SET GLOBAL is lost on DB restart. Either add to your MariaDB my.cnf under [mysqld]:

log_bin_trust_function_creators = 1

Or grant the app user the privilege (MariaDB 10.5+):

`GRANT BINLOG ADMIN ON *.* TO 'romm'@'%';`   -- or: GRANT SUPER ON *.* TO 'romm'@'%';

What's Changed

  • fix(backend): make roms_facets/collection migrations idempotent by @gantoine in #3930

Full Changelog: 5.1.0-alpha.3...5.1.0-alpha.4

5.1.0-alpha.3

5.1.0-alpha.3 Pre-release
Pre-release

Choose a tag to compare

@gantoine gantoine released this 24 Jul 00:47
48d283a

What's Changed

  • perf(backend): mirror ROM filter values into a narrow trigger-maintained table by @gantoine in #3885
  • perf(backend): materialize virtual collection membership by @gantoine in #3886
  • fix(archives): read RAR archives through bsdtar so they can be hashed by @gantoine in #3887
  • fix(nginx): cache only fingerprinted assets, revalidate the rest by @Spinnich in #3892
  • fix(v2): hide empty platforms in Server Stats breakdown by @Spinnich in #3899
  • fix(scan): reconcile rom_files in place instead of purging them by @gantoine in #3900
  • fix(scan): emit a client update for ROMs that are no longer missing by @gantoine in #3903
  • Fix/server stats duplicate slug key by @Spinnich in #3906
  • Add music favorites and playlists API by @tmgast in #3896
  • perf(stats): aggregate Server Stats breakdowns from roms_facets by @Spinnich in #3910
  • Fix Playmatch health check failing on plain-text response by @gantoine in #3916
  • Stop storing fanart and title_screen twice when screenshots are enabled by @gantoine in #3918
  • Add scan.priority.region_mode to let config regions drive media selection by @gantoine in #3917
  • Default EmulatorJS netplay username to the RomM account by @gantoine in #3919
  • fix(v2): restore backdrop-filter blur in production builds by @zurdi15 in #3922
  • Keep config.yaml EmulatorJS core settings active after user changes settings by @gantoine in #3920
  • Add Scan Settings to the user dropdown menu by @gantoine in #3923
  • build(deps-dev): bump fast-uri from 3.1.2 to 3.1.4 in /frontend by @dependabot[bot] in #3927
  • build(deps): bump linkify-it from 5.0.1 to 5.0.2 in /frontend by @dependabot[bot] in #3926
  • fix(migrations): pin device FK column collations to match devices.id by @gantoine in #3929

Full Changelog: 5.1.0-alpha.2...5.1.0-alpha.3