RomM
Beautiful, powerful, self-hosted rom manager and player
Alternative to: antstream arcade
5.3.0-beta.1
2026-09-18[!CAUTION]
Breaking changes
Filesystem structure must be explicitly declared
We no longer detect the filesystem layout by default, and an instance will refuses to start until explicitly declared in your
config.yml. This is the equivalent of structure A:filesystem: structure: default: "roms/{platform}/{game}" firmware: "bios/{platform}"And the equivalent of structure B:
filesystem: structure: default: "{platform}/roms/{game}" firmware: "{platform}/bios"
filesystem.roms_folderandfilesystem.firmware_folderhave also been removed. An instance that still sets either will refuse to start and print the equivalent template.See Custom library structure and the
filesystem.structureschema.
[!WARNING] Emulator streaming config is now one entry per container, not one per emulator. A container’s host, protocol and label become the defaults for every platform it serves, and a platform block only overrides what differs. Existing streaming setups need their
config.ymlrewritten before the feature will come back up.See Emulator Streaming for the new schema.
[!NOTE]
Environment variables
Emulation
variable default description MAX_SAVES_PER_SLOT 50Versions kept per save slot, newest first ( 0disables)STREAMING_LAUNCH_TIMEOUT 600Seconds to wait for a streamed emulator to launch STREAMING_STATE_HISTORY_LIMIT 50Save states kept per ROM, emulator and user Physical games
variable default description UPC_LOOKUP_ENABLED trueBarcode lookups when adding a physical game UPC_LOOKUP_API_KEY -Key for the UPC lookup service UPC_LOOKUP_URL https://api.upcitemdb.com/prod/trial/lookupUPC lookup endpoint Recommendations
variable default description ENABLE_SCHEDULED_BUILD_RECOMMENDATIONS trueNightly rebuild of the recommendation index SCHEDULED_BUILD_RECOMMENDATIONS_CRON 30 5 * * *When that rebuild runs Browser players
variable default description DISABLE_JSDOS falseDisable the js-dos player for everyone DISABLE_PICO8 falseDisable the PICO-8 player for everyone Metadata providers
variable default description DEMOZOO_API_ENABLED falseEnable the Demozoo metadata provider POUET_API_ENABLED falseEnable the Pouët metadata provider CSDB_API_ENABLED falseEnable the CSDb metadata provider STEAM_API_ENABLED falseEnable the Steam storefront metadata provider HASHEOUS_API_URL https://hasheous.org/api/v1Use a self-hosted Hasheous instance General
variable default description SCAN_WORKERS 4Parallel scan workers, was 1WEB_SERVER_CONCURRENCY 4API server workers, was 1DB_POOL_RECYCLE_SECONDS 300Recycle pooled DB connections after this many seconds
Highlights
Custom library structure
Instead of guessing between two folder structures, describe your exact library layout in config.yml. {platform} is the platform folder, the final {game} is where a game starts, and anything else in {braces} is just a folder you use to organize things. You can override the layout per platform, and give a platform a list of layouts when its games sit at more than one depth. #3571
ROM identity is now content-hashed, so you can move files around and keep their saves, favorites, play history and collections. And if you came from Batocera, RetroBat or ES-DE, their platform folder names are recognized out of the box, so most libraries need no mapping at all. #4345
filesystem:
structure:
default: "roms/{platform}/{game}"
firmware: "bios/{platform}"
ps3: "roms/{platform}/{category}/{game}"
snes: "roms/{platform}/{region}/{game}"
nes:
- "roms/{platform}/{game}"
- "roms/{platform}/{category}/{game}"
Docs: Custom library structure, Folder name aliases
Emulator streaming
A massive update to emulator streaming. You configure one entry per container instead of one per emulator, a platform can pool several containers and grab whichever one is free, and platforms that do both browser and streamed play now get separate Play and Stream buttons. #4314
Saves and save states made while streaming are pulled back into your library with history and thumbnails. Multi-disc games get a disc-swap control, and whichever disc was mounted when you saved is the one remounted when you load. PS2 and GameCube can sync a whole memory card instead of individual save files, with a memory card library to create, rename, version, share and download them. Admins get a desktop session for setting up an emulator with no game running, plus a fleet view to force-release sessions across every container.
Docs: Emulator Streaming
Physical games
Own a game on a cartridge or disc, but have no ROM for it? You can now add it anyway, by name or by scanning its barcode with your camera, and it gets matched to metadata like any other game. #3848
Docs: Physical Games
Walkthroughs
Walkthroughs are now documents on a game, sitting next to its manuals. Upload your own, or paste a GameFAQs URL and have it fetched directly (as plain text). It’ll even remember where you left off and show a progress bar for each user. #3816
Docs: Walkthroughs
Title IDs read from the binary
Scans now pull a game’s native Title ID straight out of its binary on PSX, PS2, PS3, PSP, PS Vita, Switch, 3DS, Wii, Wii U, GameCube, Dreamcast, Xbox and Xbox 360. It identifies games on the platforms we don’t hash, so a renamed or moved file keeps its saves and collections, and it tells the system where a game writes its saves, so device sync knows what to look for. #3925
Docs: Title ids read from the binary
Jukebox
A soundtrack player for your whole library that follows you as a mini player anywhere in the app. Browse by album, platform, artist or genre, or just put a playlist on: Free Radio picks a randomized, album-balanced hour, and there’s a Decade Mix, recently added, and your personal favorites. #4197
Docs: Jukebox
JS-DOS and PICO-8 in the browser
Windows 3.x and 9x games now run on js-dos and its DOSBox-X backend. Note that js-dos saves stay in your browser and are not synced back to the server. #4061
PICO-8 cartridges (.p8 and .p8.png) are also now playable, on FAKE-08, with keyboard + mouse, gamepad, or touch input. #4400
Four new metadata sources
Steam is now a metadata source for the win, linux and mac platforms, no API key required! It’s in the scan, in the Match ROM dialog when a PC game was missed or matched to the wrong app, and in the cover picker alongside SteamGridDB. #4241 #4498 #4500
Demozoo, Pouët and CSDb cover demoscene productions on platforms we already support. Tag a file (demozoo-108), or paste an id or a production URL into the ROM editor. #4221
scan:
priority:
metadata:
- steam # PC platforms only
Docs: Metadata Providers
EmulatorJS cores and multi-disc games
A multi-disc game is handed to EmulatorJS all at once now, so you can swap discs from the emulator’s own menu instead of going back and reloading. Set emulatorjs.disable_batch_bootup to boot only the disc you launched, if a core mishandles the batch. #3988
You can also preselect a core per platform with emulatorjs.default_cores. That sets the starting point, and anyone who has already picked a core on their device keeps their choice. #4452
Docs: Cores, Multi-disc games
Library-aware recommendations
Recommendations are now built from your own library, blending metadata overlap, the list pulled from IGDB, and what you actually play. You’ll find them under Similar games on a game’s page, and in a new Recommended for you row on the home screen. Enable it by setting ENABLE_SCHEDULED_BUILD_RECOMMENDATIONS=true in your env vars. #4174
Docs: Recommendations
Saves
A save syncs automatically with the server seconds after its stored in the browser. The player watches the emulator’s SRAM while you play and uploads a new version as soon as one appears, so your progress is saved even if the tab is closed or the browser crashes. #4378 #4558
Saves are also organized into slots, the same model used by the sync clients. Ordinary play goes to the autosave slot, which keeps a capped history; a named slot on launch keeps every version. Each version carries a screenshot from the moment it was written, and the server prunes a slot to MAX_SAVES_PER_SLOT (50 by default). #4517 #4540
In-game, the Export and Import save buttons are replaced by a single Load save or state picker that restarts the game from the save you pick. #4600 #4615
emulatorjs:
auto_save_sync: false # opt ou & Quit
Docs: Saves & States
Sort and filter by game length
You can now sort and filter the gallery by how long a game takes, straight from the gallery rather than having to build a collection for it. It’s based on the HowLongToBeat main story time, so it needs HLTB_API_ENABLED and a scan that matched the game. #4392
Docs: Game length
Minor changes
- feat(v2): link Server Stats platform rows to their platform by @sdornan in https://github.com/rommapp/romm/pull/4252
- feat(gallery): pick a game’s default version by region priority by @sdornan in https://github.com/rommapp/romm/pull/4260
- feat: split company metadata into publishers and developers by @gantoine in https://github.com/rommapp/romm/pull/3898
- feat(saves): scope save discovery to a set of ROM IDs by @gantoine in https://github.com/rommapp/romm/pull/4304
- feat(hasheous): make the Hasheous API URL configurable by @closer in https://github.com/rommapp/romm/pull/4300
- feat(scan): refresh files scan and uploads into rom folders by @zurdi15 in https://github.com/rommapp/romm/pull/4277
- feat(player): confirm before leaving a running game by @gantoine in https://github.com/rommapp/romm/pull/4308
- feat(v2): make game header tags clickable by @gantoine in https://github.com/rommapp/romm/pull/4372
- feat(v2): zoom the game cover, and dismiss the lightbox from anywhere on the backdrop by @gantoine in https://github.com/rommapp/romm/pull/4373
- feat(home): add a game anniversary widget by @Spinnich in https://github.com/rommapp/romm/pull/4396
- feat(firmware): let missing firmware be found, cleaned up, and kept out of the player by @Spinnich in https://github.com/rommapp/romm/pull/4077
- feat(v2): show a reading-progress bar in the manual and walkthrough viewers by @gantoine in https://github.com/rommapp/romm/pull/4470
- feat(streaming): let the launch screen pick which save to restore by @LoneAngelFayt in https://github.com/rommapp/romm/pull/4507
- feat(v2): polish upload actions and pickers across details, player and scan settings by @zurdi15 in https://github.com/rommapp/romm/pull/4576
- feat(v2): open the EmulatorJS and js-dos launch views without a page load by @zurdi15 in https://github.com/rommapp/romm/pull/4567
- feat(v2): phone-friendly tabs, subtabs and patch picker in game details by @zurdi15 in https://github.com/rommapp/romm/pull/4578
- feat(v2): phone-friendly list rows, soundtrack header and mini player by @zurdi15 in https://github.com/rommapp/romm/pull/4580
- feat(v2): unify platform/collection settings and fill the viewport by @zurdi15 in https://github.com/rommapp/romm/pull/4618
Fixes
- fix(v2): Fix missing v2 auth notifications by @Florian-Cullmann in https://github.com/rommapp/romm/pull/4246
- fix(v2): remember the core a game was launched with by @gantoine in https://github.com/rommapp/romm/pull/4251
- fix(frontend): keep collection ROM counts in step with the gallery by @sdornan in https://github.com/rommapp/romm/pull/4261
- fix(hltb): keep a pinned HowLongToBeat match through a rescan by @sdornan in https://github.com/rommapp/romm/pull/4262
- fix(roms): Fix N+1 and entity sort in GET /api/roms by @tmgast in https://github.com/rommapp/romm/pull/4264
- fix(auth): send PKCE on the OIDC authorization request by @jgarcesres in https://github.com/rommapp/romm/pull/4267
- fix: Preserve nested arcade ROM filenames by @mvanhorn in https://github.com/rommapp/romm/pull/4271
- fix: map Neo Geo MVS/AES to the RetroAchievements Arcade console by @gantoine in https://github.com/rommapp/romm/pull/4282
- fix: restore HowLongToBeat lookups and repair endpoint discovery by @sdornan in https://github.com/rommapp/romm/pull/4286
- fix(scan): let update metadata scans refresh artwork, and record uploads explicitly by @sdornan in https://github.com/rommapp/romm/pull/4160
- fix(screenscraper): map mega-duck-slash-cougar-boy to ss id 90 by @gantoine in https://github.com/rommapp/romm/pull/4307
- fix(platforms): add doom as a platform with its standalone provider mappings by @gantoine in https://github.com/rommapp/romm/pull/4309
- fix(roms): stop a racing upload from undoing a folder conversion by @tmgast in https://github.com/rommapp/romm/pull/4316
- fix(manual): only ask where a manual goes when the answer is open by @tmgast in https://github.com/rommapp/romm/pull/4315
- fix(logs): stop a multi-line record painting over the rows after it by @sdornan in https://github.com/rommapp/romm/pull/4303
- fix: allow INI files in library scans by @mvanhorn in https://github.com/rommapp/romm/pull/4328
- fix(frontend): Add crossorigin attribute to manifest link so CloudFlare Tunnels does not break site.webmanifest by @Macleykun in https://github.com/rommapp/romm/pull/4332
- fix(player): Show a clear message instead of the generic error for threaded cores over non-secure origins by @TRusselo in https://github.com/rommapp/romm/pull/4313
- fix(v2): read the date picker’s value in UTC, not local time by @sdornan in https://github.com/rommapp/romm/pull/4322
- fix(backend): Rate limit the unauthenticated metadata heartbeat endpoint by @gantoine in https://github.com/rommapp/romm/pull/4327
- fix(download): make cached zips readable by nginx and serialize their builds by @tmgast in https://github.com/rommapp/romm/pull/4329
- fix(scan): Follow-ups to the sigil title ID branch by @gantoine in https://github.com/rommapp/romm/pull/4333
- fix(export): write gamelist media where ES-DE and Batocera frontends find it by @sdornan in https://github.com/rommapp/romm/pull/4344
- fix(retroachievements): don’t match ROMs against games with no achievement set by @Spinnich in https://github.com/rommapp/romm/pull/4352
- fix(scan): let a complete rescan clear the ids it rematched by @Spinnich in https://github.com/rommapp/romm/pull/4353
- fix(collections): honor “Show autogenerated collections” on the v2 collections page by @Spinnich in https://github.com/rommapp/romm/pull/4355
- fix(hashing): read zips zipfile can’t decode through 7zz by @sdornan in https://github.com/rommapp/romm/pull/4357
- fix(db): make virtual_collections and generated columns collation-agnostic by @gantoine in https://github.com/rommapp/romm/pull/4374
- fix(v2): don’t reload the page on reconnect while a game is running by @gantoine in https://github.com/rommapp/romm/pull/4369
- fix(db): make migrations collation-agnostic on MariaDB by @gantoine in https://github.com/rommapp/romm/pull/4371
- fix(export): share the ES-DE media folders with the Pegasus export by @sdornan in https://github.com/rommapp/romm/pull/4370
- fix(auth): require platforms.write and enforce platform visibility on the export endpoints by @gantoine in https://github.com/rommapp/romm/pull/4376
- fix(export): merge gamelist.xml and metadata.pegasus.txt instead of overwriting by @sdornan in https://github.com/rommapp/romm/pull/4368
- fix(screenscraper): let the daily-quota breaker recover by @Spinnich in https://github.com/rommapp/romm/pull/4360
- fix(server): default to 4 API workers and fix the WEB_SERVER_CONCURRENCY guidance by @Spinnich in https://github.com/rommapp/romm/pull/4385
- fix(gallery): join roms_metadata before the grouped dedup window by @gantoine in https://github.com/rommapp/romm/pull/4390
- fix(docker): bump sigil past the zstd asm link failure by @sdornan in https://github.com/rommapp/romm/pull/4404
- fix(firmware): 404 the content endpoints when the file is gone by @gantoine in https://github.com/rommapp/romm/pull/4405
- fix(v2): read the webp flag the heartbeat actually sends by @gantoine in https://github.com/rommapp/romm/pull/4406
- fix(auth): sanitize the username an OIDC provider hands us by @gantoine in https://github.com/rommapp/romm/pull/4407
- fix(ra): return achievements in RetroAchievements’ display order by @gantoine in https://github.com/rommapp/romm/pull/4408
- fix(v2): keep a click in selection mode from navigating away by @gantoine in https://github.com/rommapp/romm/pull/4409
- fix(db): recycle pooled connections before the server drops them by @gantoine in https://github.com/rommapp/romm/pull/4411
- fix(v2): keep the player from booting a rom’s media instead of the game by @gantoine in https://github.com/rommapp/romm/pull/4412
- fix(ss): let region_mode decide the title, not just the artwork by @gantoine in https://github.com/rommapp/romm/pull/4413
- fix(scan): tell the clients when SCAN_TIMEOUT killed the scan by @gantoine in https://github.com/rommapp/romm/pull/4414
- fix(roms): keep unplayed games when sorting by a rom_user column by @zurdi15 in https://github.com/rommapp/romm/pull/4424
- fix(player): keep RomM chrome off the emulator on mobile by @zurdi15 in https://github.com/rommapp/romm/pull/4425
- fix(tasks): match a running task by its registry key by @sdornan in https://github.com/rommapp/romm/pull/4430
- fix(tasks): refill the Switch TitleDB store a schema bump drops by @sdornan in https://github.com/rommapp/romm/pull/4432
- fix(frontend): 404 unmatched URLs in v2 instead of “not migrated yet” by @sdornan in https://github.com/rommapp/romm/pull/4455
- fix(frontend): stop ESLint and Prettier fighting over formatting by @sdornan in https://github.com/rommapp/romm/pull/4456
- fix(v2): announce the hash chip’s disclosure state and action by @zurdi15 in https://github.com/rommapp/romm/pull/4451
- fix(v2): give the gallery a real Select all in both layouts by @zurdi15 in https://github.com/rommapp/romm/pull/4453
- fix(roms): sort unset per-user and metadata keys last on every engine by @zurdi15 in https://github.com/rommapp/romm/pull/4454
- fix(migrations): let every 5.3.0 revision be replayed by @gantoine in https://github.com/rommapp/romm/pull/4484
- fix(roms): invalidate a user’s gallery sidecars on rom_user writes by @zurdi15 in https://github.com/rommapp/romm/pull/4463
- fix(roms): sort grouped galleries by the best sibling’s key by @zurdi15 in https://github.com/rommapp/romm/pull/4465
- fix(v2): dismiss tooltips when an overlay opens over them by @sdornan in https://github.com/rommapp/romm/pull/4482
- fix(patcher): apply patches to ROMs inside ZIP archives by @kylebenzo in https://github.com/rommapp/romm/pull/4472
- fix(streaming): prefer the emulator’s own screenshot for save-state thumbnails by @LoneAngelFayt in https://github.com/rommapp/romm/pull/4478
- fix(tasks): fill the scan counters a job’s stored stats predate by @sdornan in https://github.com/rommapp/romm/pull/4480
- fix(migrations): name the fix when the server denies trigger DDL by @gantoine in https://github.com/rommapp/romm/pull/4490
- fix(v2): address review findings on the shared metadata provider card by @zurdi15 in https://github.com/rommapp/romm/pull/4516
- fix(frontend-v2): center the recommendation caption under the card by @sdornan in https://github.com/rommapp/romm/pull/4510
- fix(scan): send Playmatch as a metadata source so the UI switch works by @gantoine in https://github.com/rommapp/romm/pull/4519
- fix(player): stop hiding EmulatorJS’s own messages by @gantoine in https://github.com/rommapp/romm/pull/4520
- fix(collections): pick the current user’s favorites collection by @gantoine in https://github.com/rommapp/romm/pull/4521
- fix(player): never boot a multi-disc playlist on its own by @gantoine in https://github.com/rommapp/romm/pull/4524
- fix(player): give a gamepad a way onto the Play button by @gantoine in https://github.com/rommapp/romm/pull/4525
- fix(v2): compare typed confirmations on the rendered phrase by @gantoine in https://github.com/rommapp/romm/pull/4523
- fix(v2): remove double border on selected game cards by @zurdi15 in https://github.com/rommapp/romm/pull/4547
- fix(v2): make the Missing games selection actionable by @gantoine in https://github.com/rommapp/romm/pull/4527
- fix(v2): stop offering a missing rom’s files for download by @gantoine in https://github.com/rommapp/romm/pull/4528
- fix(player): attach a real screenshot to a manual save state by @gantoine in https://github.com/rommapp/romm/pull/4526
- fix(tasks): refuse a manual task run when no worker is listening by @zurdi15 in https://github.com/rommapp/romm/pull/4548
- fix(tasks): read older cleanup stats, and check the worker where it enqueues by @zurdi15 in https://github.com/rommapp/romm/pull/4551
- fix: treat every disc descriptor as a disc, not just .cue by @sdornan in https://github.com/rommapp/romm/pull/4532
- fix(v2): jukebox in the settings sidebar, launch-view titles, match overlay by @zurdi15 in https://github.com/rommapp/romm/pull/4555
- fix(v2): make the player back links and the details Play button real links by @zurdi15 in https://github.com/rommapp/romm/pull/4560
- fix(streaming): pool same-origin webstation containers and keep a claim on its own container by @LoneAngelFayt in https://github.com/rommapp/romm/pull/4533
- fix(scan): don’t report an unanswered lookup as a confirmed miss by @gantoine in https://github.com/rommapp/romm/pull/4534
- fix(streaming): make broker save-clearing configurable and date the picker by its sort key by @LoneAngelFayt in https://github.com/rommapp/romm/pull/4542
- fix(tools): repair the test-data seeder’s imports and rom digests by @sdornan in https://github.com/rommapp/romm/pull/4554
- fix(v2): stop the layout’s min-height leaking into the gallery shell by @sdornan in https://github.com/rommapp/romm/pull/4563
- fix(v2): line the placeholder rows up with the rows they stand in for by @sdornan in https://github.com/rommapp/romm/pull/4561
- fix(v2): invoke the view transition callback once by @sdornan in https://github.com/rommapp/romm/pull/4574
- fix(v2): stop probing platform icon variants that cannot exist by @sdornan in https://github.com/rommapp/romm/pull/4573
- fix(v2): stop the unhandled rejection when a view transition is preempted by @sdornan in https://github.com/rommapp/romm/pull/4570
- fix(scan): read PSX and PS2 serials sigil missed and identify multi-disc roms by their first disc by @tmgast in https://github.com/rommapp/romm/pull/4566
- fix(deps): bump engine.io-client past the ws memory-exhaustion advisory by @sdornan in https://github.com/rommapp/romm/pull/4571
- fix(v2): close the launch-path gaps found by the pr-ready gauntlet by @gantoine in https://github.com/rommapp/romm/pull/4579
- fix(frontend): restate the player isolation URLs instead of reading nginx by @gantoine in https://github.com/rommapp/romm/pull/4583
- fix(about): show current git branch instead of “development” by @zurdi15 in https://github.com/rommapp/romm/pull/4617
- fix(roms): answer the id endpoints without building every Rom by @sdornan in https://github.com/rommapp/romm/pull/4584
- fix(backend): return identifiers without building an ORM row per id by @sdornan in https://github.com/rommapp/romm/pull/4586
- fix(roms): read note authors off the joined user by @sdornan in https://github.com/rommapp/romm/pull/4588
- fix(collections): project identifier columns instead of loading whole collections by @sdornan in https://github.com/rommapp/romm/pull/4589
- fix(roms): load the parent rom with a rom file so the file schema validates by @sdornan in https://github.com/rommapp/romm/pull/4593
- fix(v2): UI/UX polish: unified empty states, smoother loading, tab query cleanup by @zurdi15 in https://github.com/rommapp/romm/pull/4594
- fix(gallery): hold the v2 list-view columns still while rows load by @sdornan in https://github.com/rommapp/romm/pull/4598
- fix(v2): drop the box behind platform icons in the list row by @sdornan in https://github.com/rommapp/romm/pull/4601
- fix(v2): right-align the list-view quantity columns by @sdornan in https://github.com/rommapp/romm/pull/4603
- fix(v2): align HLTB column values across the strip by @sdornan in https://github.com/rommapp/romm/pull/4604
- fix(v2): restore blurred glass off Safari and guard the unguarded subgrid by @sdornan in https://github.com/rommapp/romm/pull/4607
- fix(upload): accept empty ROM files by @zurdi15 in https://github.com/rommapp/romm/pull/4610
- fix(upload): refuse an empty file that declares chunks by @zurdi15 in https://github.com/rommapp/romm/pull/4611
- fix(upload): style the pending-files Add button as a primary add action by @zurdi15 in https://github.com/rommapp/romm/pull/4612
- fix(covers): keep animated covers animated after they are applied by @zurdi15 in https://github.com/rommapp/romm/pull/4613
- fix(states): fold core groups from the whole header, center card actions by @zurdi15 in https://github.com/rommapp/romm/pull/4614
- fix(covers): rework the search cover dialog layout by @zurdi15 in https://github.com/rommapp/romm/pull/4616
- fix(i18n): route hard-coded UI strings through the locale files by @sdornan in https://github.com/rommapp/romm/pull/4619
- fix(a11y): translate the v2 primitives’ own control labels by @sdornan in https://github.com/rommapp/romm/pull/4620
Other changes
- chore(agents): add a review-polish skill from recurring PR corrections by @gantoine in https://github.com/rommapp/romm/pull/4250
- chore(deps): bump starlette from 1.0.1 to 1.6.0 by @sdornan in https://github.com/rommapp/romm/pull/4254
- refactor(v2): give the metadata provider taxonomy one home by @sdornan in https://github.com/rommapp/romm/pull/4263
- chore(deps-dev): Bump brace-expansion from 2.0.3 to 2.1.4 in /frontend by @dependabot[bot] in https://github.com/rommapp/romm/pull/4266
- chore(deps): Bump asyncssh from 2.23.0 to 2.23.1 by @dependabot[bot] in https://github.com/rommapp/romm/pull/4292
- refactor(v2): extract a shared player shell by @gantoine in https://github.com/rommapp/romm/pull/4301
- refactor(assets): make rom_ids the only ROM scope on saves and states by @gantoine in https://github.com/rommapp/romm/pull/4305
- docs(skills): merge pre-pr-verification into review-polish by @gantoine in https://github.com/rommapp/romm/pull/4311
- chore(deps): Bump tornado from 6.5.7 to 6.5.8 by @dependabot[bot] in https://github.com/rommapp/romm/pull/4324
- chore(deps-dev): Bump postcss-selector-parser from 7.1.1 to 7.1.5 in /frontend by @dependabot[bot] in https://github.com/rommapp/romm/pull/4325
- chore(deps-dev): Bump browserslist from 4.28.1 to 4.28.8 in /frontend by @dependabot[bot] in https://github.com/rommapp/romm/pull/4326
- chore(deps-dev): Bump fast-uri from 3.1.5 to 3.1.7 in /frontend by @dependabot[bot] in https://github.com/rommapp/romm/pull/4330
- chore(deps-dev): Bump @humanfs/node from 0.16.7 to 0.16.8 in /frontend by @dependabot[bot] in https://github.com/rommapp/romm/pull/4331
- chore: drop the vcrpy exclude-newer override by @sdornan in https://github.com/rommapp/romm/pull/4334
- refactor(tasks): schedule with RQ instead of rq-scheduler by @sdornan in https://github.com/rommapp/romm/pull/4274
- docs(agents): never run the full backend test suite locally by @gantoine in https://github.com/rommapp/romm/pull/4336
- perf(scan): give scans their own queue and worker by @sdornan in https://github.com/rommapp/romm/pull/4275
- ci: Bump GitHub Actions to Node 24 runtimes by @sdornan in https://github.com/rommapp/romm/pull/4341
- chore(deps): Bump cryptography from 49.0.0 to 50.0.0 by @dependabot[bot] in https://github.com/rommapp/romm/pull/4342
- perf(scan): coalesce scan progress reports, and give the rom refetch one home by @gantoine in https://github.com/rommapp/romm/pull/4340
- chore(dev): move the Authentik stack into docker-compose.oidc.yml by @gantoine in https://github.com/rommapp/romm/pull/4367
- chore(python): move the backend to Python 3.14 by @sdornan in https://github.com/rommapp/romm/pull/4359
- perf(tests): stop the suite waiting on connections it never wanted by @gantoine in https://github.com/rommapp/romm/pull/4375
- perf(backend): add missing gallery indexes and reconcile model/schema index drift by @sdornan in https://github.com/rommapp/romm/pull/4384
- perf(scan): read files in 256 KiB chunks instead of 8 KiB by @Spinnich in https://github.com/rommapp/romm/pull/4387
- perf(scan): default to 4 scan workers instead of 1 by @Spinnich in https://github.com/rommapp/romm/pull/4386
- chore(tasks): Quiet RQ per-tick scheduler heartbeat log line by @gantoine in https://github.com/rommapp/romm/pull/4393
- chore(deps-dev): bump vitest from 4.1.8 to 4.1.11 in /frontend by @dependabot[bot] in https://github.com/rommapp/romm/pull/4399
- chore(deps-dev): bump js-yaml from 4.3.1 to 4.3.2 in /frontend by @dependabot[bot] in https://github.com/rommapp/romm/pull/4401
- security: strip control characters from names reaching the mod_zip manifest by @gantoine in https://github.com/rommapp/romm/pull/4402
- perf(gallery): materialize the ids sibling_roms matches on by @Spinnich in https://github.com/rommapp/romm/pull/4394
- chore(agents): Add a pr-ready skill chaining the four PR review passes by @sdornan in https://github.com/rommapp/romm/pull/4415
- perf(metadata): stop storing the metadata dumps twice over in the cache by @gantoine in https://github.com/rommapp/romm/pull/4416
- perf(metadata): compress the cache-only metadata dump records by @sdornan in https://github.com/rommapp/romm/pull/4426
- docs: add a one-click deploys section to the README by @gantoine in https://github.com/rommapp/romm/pull/4427
- chore(deps): upgrade rq to 2.12 by @sdornan in https://github.com/rommapp/romm/pull/4428
- ci: align and manage the Docker service image pins by @sdornan in https://github.com/rommapp/romm/pull/4433
- docs: tighten the README copy by @gantoine in https://github.com/rommapp/romm/pull/4438
- ci: build each arch on a native runner and cache layers by @sdornan in https://github.com/rommapp/romm/pull/4437
- chore(deps): update astral-sh/setup-uv action to v10.1.0 by @renovate[bot] in https://github.com/rommapp/romm/pull/4440
- chore(deps): update postgres docker tag to v18 by @renovate[bot] in https://github.com/rommapp/romm/pull/4444
- chore(deps): update github actions (major) by @renovate[bot] in https://github.com/rommapp/romm/pull/4445
- ci: pin the amd64 image build to ubuntu-24.04 by @sdornan in https://github.com/rommapp/romm/pull/4458
- ci: run trunk check on master pushes by @sdornan in https://github.com/rommapp/romm/pull/4457
- chore(deps): update ghcr.io/goauthentik/server docker tag to v2024.12.5 by @renovate[bot] in https://github.com/rommapp/romm/pull/4441
- docs(examples): drop the gc override from the config example by @sdornan in https://github.com/rommapp/romm/pull/4461
- chore(ci): drop the docs and website release triggers by @gantoine in https://github.com/rommapp/romm/pull/4491
- perf(migrations): add the 5.3.0 roms columns in one table copy by @gantoine in https://github.com/rommapp/romm/pull/4501
- perf(docker): upgrade nginx to 1.29.8 and tune the serving layer by @sdornan in https://github.com/rommapp/romm/pull/4468
- docs: correct stale Vuetify claims in v2 skills and architecture doc by @sdornan in https://github.com/rommapp/romm/pull/4474
- chore(translation): translate the remaining untranslated zh_CN strings by @wolfg1969 in https://github.com/rommapp/romm/pull/4489
- refactor(roms): give the ROM filters a single home, and match them against the facets mirror by @sdornan in https://github.com/rommapp/romm/pull/4487
- ci: gate the preview-build report job on the build-preview label by @sdornan in https://github.com/rommapp/romm/pull/4475
- perf(frontend): precompress built assets and serve them with gzip_static by @sdornan in https://github.com/rommapp/romm/pull/4471
- chore(deps): update github actions by @renovate[bot] in https://github.com/rommapp/romm/pull/4513
- chore(uv): bump to 0.12.13 and make pyproject the single source for the version by @sdornan in https://github.com/rommapp/romm/pull/4469
- refactor(v2): unify metadata provider cards behind a shared component by @zurdi15 in https://github.com/rommapp/romm/pull/4515
- refactor(frontend): native fullscreen where it exists, one path for all players by @sdornan in https://github.com/rommapp/romm/pull/4514
- refactor(player): route the mount-time Play focus through the shared check by @gantoine in https://github.com/rommapp/romm/pull/4538
- chore(deps): update docker/setup-buildx-action action to v4.4.1 by @renovate[bot] in https://github.com/rommapp/romm/pull/4544
- style(player): one presentation for save and state facts by @zurdi15 in https://github.com/rommapp/romm/pull/4545
- docs: require screenshots and mermaid diagrams in PR descriptions by @gantoine in https://github.com/rommapp/romm/pull/4549
- chore(uploads): manual file uploads into a ROM across the Files and Media tabs by @zurdi15 in https://github.com/rommapp/romm/pull/4550
- chore(deps): bump nanoid from 3.3.16 to 3.3.19 in /frontend by @dependabot[bot] in https://github.com/rommapp/romm/pull/4530
- chore(deps-dev): bump @babel/core from 7.29.0 to 7.29.7 in /frontend by @dependabot[bot] in https://github.com/rommapp/romm/pull/4531
- docs: upload PR screenshots with gh —attach by @gantoine in https://github.com/rommapp/romm/pull/4625
- chore(frontend): upgrade vue-tsc to 3.x and raise the TypeScript floor by @sdornan in https://github.com/rommapp/romm/pull/4622
- chore(deps): bump md-editor-v3 from 5.8.5 to 6.5.4 in /frontend by @dependabot[bot] in https://github.com/rommapp/romm/pull/4627
- chore(storybook): light and dark theme switch work in storybook by @andest01 in https://github.com/rommapp/romm/pull/4626
- docs(claude): add a knowledge-base skill for Greptile’s repo docs by @zurdi15 in https://github.com/rommapp/romm/pull/4595
- perf(backend): resolve roms without the related load in the file and props routes by @sdornan in https://github.com/rommapp/romm/pull/4590
- perf(backend): check rom-note visibility without the related load by @sdornan in https://github.com/rommapp/romm/pull/4587
- test(backend): stop the suite emitting warnings by @sdornan in https://github.com/rommapp/romm/pull/4597
New Contributors
- @jgarcesres made their first contribution in https://github.com/rommapp/romm/pull/4267
- @bphenriques made their first contribution in https://github.com/rommapp/romm/pull/4061
- @axelquack made their first contribution in https://github.com/rommapp/romm/pull/4221
- @closer made their first contribution in https://github.com/rommapp/romm/pull/4300
- @Macleykun made their first contribution in https://github.com/rommapp/romm/pull/4332
- @TRusselo made their first contribution in https://github.com/rommapp/romm/pull/4313
- @kylebenzo made their first contribution in https://github.com/rommapp/romm/pull/4472
- @andest01 made their first contribution in https://github.com/rommapp/romm/pull/4626
Full Changelog: https://github.com/rommapp/romm/compare/5.2.0…5.3.0-beta.1