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) |
API changes
| Change | Description |
|---|---|
PUT /config/scan
| Replace the scan.* section of the configuration.
|
GET /platform/filesystem
| Retrieve platform folders on disk that have no database row yet. |
GET /roms
| Now accepts a with_rom_id_index parameter.
|
DELETE /{rom_id}/files/{file_id}
| Delete a single file belonging to a ROM. |
BulkOperationResponse
| Swaps failed_items: int for failed_ids: list[int].
|
ConfigResponse
| Adds SCAN_ARTWORK_PRIORITY_OVERRIDES, GAMELIST_AUTO_EXPORT_ON_SCAN, and PEGASUS_AUTO_EXPORT_ON_SCAN.
|
Streaming endpoints
| Method | Path | Description |
|---|---|---|
GET
| /streaming/config
| Returns streaming config flag plus a sanitized container list |
POST
| /streaming/sessions
| Claims a session for a game to launch it |
POST
| /streaming/sessions/{platform}/save-and-exit
| Releases the session |
POST
| /streaming/sessions/{platform}/volume
| Set from 0-100 |
POST
| /streaming/sessions/{platform}/mute
| Toggles or explicitly sets mute state |
POST
| /streaming/sessions/{platform}/save-state
| Saves to a manual slot without stopping the emulator |
POST
| /streaming/sessions/{platform}/load-state
| Loads from a manual slot or the platform's autosave slot |
DELETE
| /streaming/sessions/{platform}
| Releases the session and best-effort tells the broker to stop the emulator |
GET
| /streaming/sessions
| Debug view of all active sessions |
DELETE
| /streaming/sessions
| Force-releases every active session. |
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.
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
- launchboxScan settings UI
Brand new UI to edit the whole scan.* section of config.yml. #3854
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
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
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
Other changes
- docs: add agent repository instructions by @gantoine in #3755
- Reduce RQ worker registry sweep verbosity and frequency by @gantoine in #3731
- chore(i18n): add linter enforcing alphabetically sorted locale files by @gantoine in #3757
- perf(backend): index roms (platform_id, fs_size_bytes) by @gantoine in #3780
- perf(roms): make full rom id index opt-out on GET /api/roms by @gantoine in #3781
- revert(v2): hydrate gallery cards per-card via /roms/{id}/simple by @gantoine in #3789
- perf(backend): make roms_metadata fast via generated columns by @gantoine in #3826
- build(deps): bump pillow from 12.2.0 to 12.3.0 by @dependabot[bot] in #3863
- build(deps): bump pydantic-settings from 2.14.1 to 2.14.2 by @dependabot[bot] in #3868
New Contributors
- @kthistlewood made their first contribution in #3759
- @AlmostEasyGoing made their first contribution in #3834
Full Changelog: 5.0.0...5.1.0-alpha.1