RomM
Beautiful, powerful, self-hosted rom manager and player
Alternative to: antstream arcade
4.9.0-beta.1
2026-06-05[!WARNING] The structure of scan exports in
config.ymlhas changed! If you’re currently exportinggamelist.xmlfiles withscan.export_gamelist, migrate toscan.export.gamelist_xml: true
Highlights
Save sync engine
“Coming soon” no more! Third-party app developers will now be able to rely on RomM to keep save files in sync across devices and platforms. #3137
Devices (apps, handhelds, browsers) can choose to register themselves with the server, which uniquely identifies them with a token. The system tracks which device has the latest version of a save file, flags conflicts when two devices change the same save, and syncs in whichever way fits the device: on demand, via a watched folder, or through a scheduled background sync.
Play session tracking
Another one for the app developers: client devices submit batches of play sessions per device, recording when and how long games were played. Sessions track both the time window (start_time/end_time) and screen-on time (duration_ms), which may differ due to device suspension or back-grounding. #3155
Libretro thumbnails
The libretro thumbnail repository is now available as a first-class artwork source for region-correct box art (PAL/Europe, Japan, etc.). Matching is exact case-insensitive against the directory listing, so a ROM named “(Europe)” lands on the (Europe) artwork. The source is enabled by default, and you can set it’s priority in your config.yml via the scan.priority.artwork list. #3252
Pegasus metadata export
You can now auto-export a Pegasus compatible metadata.pegasus.txt file, just like the existing gamelist.xml export. Enable it in your config.yml file by setting scan.export.pegasus to true, and it should appear in each platform folder (alongside your ROMs). #3153
Notable changes
- Gamelist export improvements by @vargash in https://github.com/rommapp/romm/pull/3202
- Send a suggestion to playmatch on manual match when enabled by @DevYukine in https://github.com/rommapp/romm/pull/3296
- Add SteamGridDB, ScreenScraper, MobyGames & Launchbox hash support to Playmatch by @DevYukine in https://github.com/rommapp/romm/pull/3381
- Compute raw CHD hashes and route disc-data SHA1 to Hasheous by @Spinnich in https://github.com/rommapp/romm/pull/3385
- Add Playmatch as explicit metadata source by @gantoine in https://github.com/rommapp/romm/pull/3407
- Add genesis_plus_gx_wide, bsnes, freeintv, azahar EJS cores to nightly by @gantoine in https://github.com/rommapp/romm/pull/3454
Fixes
- 4.8.1 hotfixes by @gantoine in https://github.com/rommapp/romm/pull/3221
- UI settings not woking after switching pages back and forth by @Namaneo in https://github.com/rommapp/romm/pull/3317
- MSDOS games fail to launch in console mode (“Error for site owner / Check console”) by @gantoine in https://github.com/rommapp/romm/pull/3294
- Include
cusregion in default ScreenScraper fallback regions by @gantoine in https://github.com/rommapp/romm/pull/3273 - Scan stalls on platforms with 10k+ already-scanned ROMs by @gantoine in https://github.com/rommapp/romm/pull/3249
- Respect LOGLEVEL env var across all log output sources by @gantoine in https://github.com/rommapp/romm/pull/3243
- Registration links redirect to login for unauthenticated users by @gantoine in https://github.com/rommapp/romm/pull/3231
- Address bugs and add test coverage for save-sync by @tmgast in https://github.com/rommapp/romm/pull/3135
- Fix age_ratings Pydantic validation error on MySQL/MariaDB for single-element arrays by @gantoine in https://github.com/rommapp/romm/pull/3223
- Parse Content-Type essence before validating resource downloads by @TechnicallyComputers in https://github.com/rommapp/romm/pull/3233
- Fix content_hash not updated by @gantoine in https://github.com/rommapp/romm/pull/3234
- Fix extension exclusion not matching multi-dot filenames by @gantoine in https://github.com/rommapp/romm/pull/3326
- Fix chunked uploads writing to RAM/tmpfs and upload speed showing 0 B/s by @gantoine in https://github.com/rommapp/romm/pull/3316
- Fix RuffleRS scaling and overflow issues on large and small screens by @jondycz in https://github.com/rommapp/romm/pull/3245
- Fix RAHasher prod build by @dangmai in https://github.com/rommapp/romm/pull/3282
- Fix download failing when hash has not been computed by @Namaneo in https://github.com/rommapp/romm/pull/3264
- Fix race condition in collection and favorite rom membership updates by @Spinnich in https://github.com/rommapp/romm/pull/3263
- Fix settings drawer logout button overflowing on mobile by @gantoine in https://github.com/rommapp/romm/pull/3248
- Improve light mode text by @gantoine in https://github.com/rommapp/romm/pull/3236
- Resolve MariaDB errors in migration downgrades (0068, 0072) by @gantoine in https://github.com/rommapp/romm/pull/3246
- Show TheGamesDB link on platform drawer when tgdb_id is set by @gantoine in https://github.com/rommapp/romm/pull/3254
- A bunch of minor bug fixes by @Namaneo in https://github.com/rommapp/romm/pull/3270
- Re-parse tags from filename when renaming a rom by @zurdi15 in https://github.com/rommapp/romm/pull/3295
- Open refresh metadata dialog with scan type and metadata source selection by @gantoine in https://github.com/rommapp/romm/pull/3293
- Setup wizard: make platform row click toggle selection checkbox by @gantoine in https://github.com/rommapp/romm/pull/3341
- Use static auth background on Firefox by @gantoine in https://github.com/rommapp/romm/pull/3352
- Validate uploaded images with libmagic by @gantoine in https://github.com/rommapp/romm/pull/3353
- Tolerate forward-compat values and malformed YAML in config loader by @gantoine in https://github.com/rommapp/romm/pull/3364
- Apply
DISABLE_EMULATOR_JSto Console mode (disable Play + block direct player route) by @gantoine in https://github.com/rommapp/romm/pull/3373 - Fix stale disc file ID in localStorage causing 404 on ROM play after rescan by @gantoine in https://github.com/rommapp/romm/pull/3374
- Fix
gamelist.xmlexport to use relative media paths for local exports by @gtronset in https://github.com/rommapp/romm/pull/3369 - Include games without achievements in RA hash cache by @gantoine in https://github.com/rommapp/romm/pull/3368
- Generate gunicorn logging config to writable /tmp path by @gantoine in https://github.com/rommapp/romm/pull/3383
- Avoid Safari/WebKit stalls during chunked ROM uploads by @gantoine in https://github.com/rommapp/romm/pull/3382
- Default SYNC_BASE_PATH to /var/lib/romm/sync by @gantoine in https://github.com/rommapp/romm/pull/3386
- Exclude the videos directory from scanning for batocera config by @enlewof in https://github.com/rommapp/romm/pull/3387
- Treat Libretro-only ROM matches as identified during scan by @gantoine in https://github.com/rommapp/romm/pull/3394
- Fix Complete Rescan not clearing unselected metadata sources by @gantoine in https://github.com/rommapp/romm/pull/3395
- Respect region priority for multi-region ROMs by @gantoine in https://github.com/rommapp/romm/pull/3396
- Tolerate launchbox basepath by @gantoine in https://github.com/rommapp/romm/pull/3397
- Harden multi-ROM folder exclusion matching for ES-DE media directories by @gantoine in https://github.com/rommapp/romm/pull/3399
- Fix: UNMATCHED scan ignores manually-set metadata IDs when metadata is absent by @gantoine in https://github.com/rommapp/romm/pull/3401
- Fix IGDB/SGDB matching wrong game for standalone expansions (e.g. Ecco: The Tides of Time) by @gantoine in https://github.com/rommapp/romm/pull/3400
- fix: wipe downloaded resources on COMPLETE rescan by @gantoine in https://github.com/rommapp/romm/pull/3406
- fix(screenscraper): re-add user credentials to media file downloads by @Spinnich in https://github.com/rommapp/romm/pull/3414
- fix(screenscraper): skip name search after notgame hash lookup by @Spinnich in https://github.com/rommapp/romm/pull/3417
- Handle malformed ES-DE
<alternativeEmulator>tags during gamelist.xml import by @gantoine in https://github.com/rommapp/romm/pull/3421 - Support
<folder>entries in gamelist.xml metadata import by @gantoine in https://github.com/rommapp/romm/pull/3422 - fix(nginx): use Buffer for binary-safe base64 decode in m3u endpoint by @Spinnich in https://github.com/rommapp/romm/pull/3428
- Add iOS pseudo-fullscreen shim for EmulatorJS player by @gantoine in https://github.com/rommapp/romm/pull/3431
- perf(roms): avoid hydrating full Rom rows for siblings on list endpoint by @gantoine in https://github.com/rommapp/romm/pull/3432
- fix(screenscraper): inject user credentials for all standard media downloads by @Spinnich in https://github.com/rommapp/romm/pull/3438
- Use region-prioritized release dates from ScreenScraper by @gantoine in https://github.com/rommapp/romm/pull/3434
- chore: remove obsolete ‘version’ attribute by @VewDev in https://github.com/rommapp/romm/pull/3443
- feat: add
miximage_v2media type to explicitly select SS.fr mixrbv2 by @gantoine in https://github.com/rommapp/romm/pull/3446 - Fix HTTP 500 on ROM list when platform has ROMs with NULL names by @gantoine in https://github.com/rommapp/romm/pull/3450
- Fix save-sync hash drift, archival save leak, and dedupe scoping by @tmgast in https://github.com/rommapp/romm/pull/3448
- Composite hashing for compressed archives by @Spinnich in https://github.com/rommapp/romm/pull/3412
- fix(screenscraper): use internal filename as romnom for single-file archive games by @Spinnich in https://github.com/rommapp/romm/pull/3451
- Fix save-sync negotiate thrash and unblock content_hash recompute by @tmgast in https://github.com/rommapp/romm/pull/3453
- fix(hashing): compute RA hash for archive ROMs on cartridge platforms by @Spinnich in https://github.com/rommapp/romm/pull/3455
- fix(igdb): match ROMs by localized/alternative titles in scan by @Spinnich in https://github.com/rommapp/romm/pull/3461
- Match IGDB regional-twin platforms in scans (#3462) by @Spinnich in https://github.com/rommapp/romm/pull/3463
- fix(roms): repair multi-file ROM downloads broken by deferred file stats by @gantoine in https://github.com/rommapp/romm/pull/3466
- fix(ss): map New Nintendo 3DS to ScreenScraper system 17 by @Spinnich in https://github.com/rommapp/romm/pull/3465
- Fix double URL-encoding of ScreenScraper name-search term by @Spinnich in https://github.com/rommapp/romm/pull/3468
- test(roms): cover region-tag re-parse on rename (#3471) by @Spinnich in https://github.com/rommapp/romm/pull/3472
- Invalidate EmulatorJS ROM cache when a ROM filename changes by @Copilot in https://github.com/rommapp/romm/pull/3476
- fix(roms): return 404 when content file_ids match no files by @Spinnich in https://github.com/rommapp/romm/pull/3473
- fix(screenscraper): utilize ss.fr jeuinfos.php endpoint for non-hashable platforms by @Spinnich in https://github.com/rommapp/romm/pull/3475
Other changes
- Safer migrations by @gantoine in https://github.com/rommapp/romm/pull/3238
- Skip RAHasher subprocess for archived disc-platform ROMs by @gantoine in https://github.com/rommapp/romm/pull/3253
- Add missing index on
rom_files(rom_id)to fix slow game listing on large ROM sets by @gantoine in https://github.com/rommapp/romm/pull/3259 - Enforce LF line endings for shell scripts via .gitattributes by @Spinnich in https://github.com/rommapp/romm/pull/3266
- Describe architecture by @zurdi15 in https://github.com/rommapp/romm/pull/3299
- Replace HIGH_PRIO_STRUCTURE_PATH by @gantoine in https://github.com/rommapp/romm/pull/3322
- Replace deprecated
job.get_id()withjob.idfor rq >= 2.7.0 compatibility by @gantoine in https://github.com/rommapp/romm/pull/3320 - Update config.batocera-retrobat.yml by @enlewof in https://github.com/rommapp/romm/pull/3349
- Prefer ROM’s own region tag for ScreenScraper and IGDB artwork by @gantoine in https://github.com/rommapp/romm/pull/3367
- Add comma-separated metadata attribute support to gamelist by @EntropyEngineer in https://github.com/rommapp/romm/pull/3380
- Improve API handling, KO scrape data, and metadata sanitization by @Spinnich in https://github.com/rommapp/romm/pull/3384
- Hardlink import/export assets, harden sync init by @gantoine in https://github.com/rommapp/romm/pull/3388
- Guard init startup against OpenTelemetry boot-loop conditions by @gantoine in https://github.com/rommapp/romm/pull/3423
- Refresh CSRF cookie on OIDC session authentication changes by @gantoine in https://github.com/rommapp/romm/pull/3424
- Defer optional handler initialization with lazy factories by @gantoine in https://github.com/rommapp/romm/pull/3426
- Denormalize ROM file stats for efficient gallery rendering by @gantoine in https://github.com/rommapp/romm/pull/3425
- Add DNS resolution check to URL validation by @gantoine in https://github.com/rommapp/romm/pull/3441
- Add tgcd and supergrafx to emulatorjs platform list by @gantoine in https://github.com/rommapp/romm/pull/3459
- Bump RAHasher to 1.8.3 in docker/Dockerfile by @gantoine in https://github.com/rommapp/romm/pull/3277
- Bump pytest-asyncio for pytest 9 compatibility by @gantoine in https://github.com/rommapp/romm/pull/3269
- Bump vite from 6.4.1 to 6.4.2 in /frontend by @dependabot[bot] in https://github.com/rommapp/romm/pull/3227
- Bump postcss from 8.5.8 to 8.5.12 in /frontend by @dependabot[bot] in https://github.com/rommapp/romm/pull/3321
- Bump axios from 1.13.6 to 1.15.0 in /frontend by @dependabot[bot] in https://github.com/rommapp/romm/pull/3240
- Bump python-dotenv from 1.0.1 to 1.2.2 by @dependabot[bot] in https://github.com/rommapp/romm/pull/3301
- Bump follow-redirects from 1.15.11 to 1.16.0 in /frontend by @dependabot[bot] in https://github.com/rommapp/romm/pull/3267
- Bump pillow from 12.1.1 to 12.2.0 by @dependabot[bot] in https://github.com/rommapp/romm/pull/3257
- Bump mako from 1.3.10 to 1.3.11 by @dependabot[bot] in https://github.com/rommapp/romm/pull/3304
- Bump pytest from 8.4.1 to 9.0.3 by @dependabot[bot] in https://github.com/rommapp/romm/pull/3268
- Bump fast-uri from 3.1.0 to 3.1.2 in /frontend by @dependabot[bot] in https://github.com/rommapp/romm/pull/3345
- Bump serialize-javascript and workbox-build in /frontend by @dependabot[bot] in https://github.com/rommapp/romm/pull/3346
- Bump cryptography from 46.0.5 to 46.0.7 by @dependabot[bot] in https://github.com/rommapp/romm/pull/3351
- Bump @babel/plugin-transform-modules-systemjs from 7.29.0 to 7.29.4 in /frontend by @dependabot[bot] in https://github.com/rommapp/romm/pull/3350
- Bump authlib from 1.6.9 to 1.6.12 by @dependabot[bot] in https://github.com/rommapp/romm/pull/3370
- Bump idna from 3.10 to 3.15 by @dependabot[bot] in https://github.com/rommapp/romm/pull/3391
- Bump js-cookie from 3.0.5 to 3.0.7 in /frontend by @dependabot[bot] in https://github.com/rommapp/romm/pull/3404
- Bump asyncssh from 2.22.0 to 2.23.0 by @dependabot[bot] in https://github.com/rommapp/romm/pull/3442
- Upgrade FastAPI to 0.134.0 and Starlette to 1.0.1 by @gantoine in https://github.com/rommapp/romm/pull/3437
New Contributors
- @TechnicallyComputers made their first contribution in https://github.com/rommapp/romm/pull/3233
- @jondycz made their first contribution in https://github.com/rommapp/romm/pull/3245
- @Spinnich made their first contribution in https://github.com/rommapp/romm/pull/3263
- @Namaneo made their first contribution in https://github.com/rommapp/romm/pull/3264
- @dangmai made their first contribution in https://github.com/rommapp/romm/pull/3282
- @enlewof made their first contribution in https://github.com/rommapp/romm/pull/3349
- @EntropyEngineer made their first contribution in https://github.com/rommapp/romm/pull/3380
- @gtronset made their first contribution in https://github.com/rommapp/romm/pull/3369
- @VewDev made their first contribution in https://github.com/rommapp/romm/pull/3443
Full Changelog: https://github.com/rommapp/romm/compare/4.8.1…4.9.0-beta.1