Skip to content

Releases: rommapp/romm

4.8.1

03 Apr 18:54
723d066

Choose a tag to compare

What's Changed

  • make loading per-platform stats opt-in so homepage doesn't fetch them by @cciollaro in #3158
  • fix: correct ZX Spectrum +3 ROM hashes in known_bios_files.json by @Abdess in #3191
  • Return link for romm-mobile app to README.md by @milktoastrat in #3207
  • Add outbound HTTP proxy support for backend requests by @dafal in #3189
  • chore(deps): bump lodash from 4.17.23 to 4.18.1 in /frontend by @dependabot[bot] in #3212
  • 4.8 hotfixes by @gantoine in #3213
  • Fix 500 on /api/tasks/status after cleanup_missing_roms task completes by @gantoine in #3214
  • Fix registration invite links losing token on external redirect by @gantoine in #3215
  • fix: correctly delete nested (subdirectory) ROMs from filesystem by @gantoine in #3216
  • Fix GET /api/tasks/status 500 on expired job TTL (NoSuchJobError) by @gantoine in #3217

New Contributors

Full Changelog: 4.8.0...4.8.1

4.8.0

01 Apr 12:35
9a6beba

Choose a tag to compare

Highlights

Client API tokens

API tokens are a safer way for apps and devices to connect without sharing user credentials. A new QR-based pairing flow makes setup quick, with support for regeneration and revocation when needed. #3114

Screenshot 2026-03-13 at 9 15 48 PM Screenshot 2026-03-13 at 9 25 26 PM

Chunked uploads

Goodbye failed uploads and incessant timeouts! ROMs will now upload in smaller chunks, allowing for more reliable transfers even on spotty connections. #3076

Screenshot 2026-03-13 at 9 17 24 PM

Local LaunchBox metadata import

Have a local LaunchBox installation packed with games? You can now import metadata directly from it, including cover art, screenshots and video previews. #2922

Screenshot 2026-03-13 at 9 26 29 PM

Minor changes

  • Add config option to use local video paths in gamelist.xml export by @JamieeBond in #3082
  • Add additional cover styles for boxart to prevent cropping by @Drarox in #3060
  • Fetch games on search view mount and reset search state on input clear by @zurdi15 in #3080
  • Add video_normalized media type option for ScreenScraper scans by @gantoine in #3088
  • Scrape and store age rating data from ScreenScraper.fr by @gantoine in #3089
  • Make invite token expiration configurable by @gantoine in #3094
  • Click to zoom game cover image by @gantoine in #3093
  • Add more platforms to cover styles by @Drarox in #3098
  • Show filtered ROM count in the gallery AppBar and filter drawer by @gantoine in #3097
  • Show firmware count in scan results to improve BIOS detection discoverability by @gantoine in #3111
  • Per-platform metadata coverage and region breakdown to server stats by @cciollaro in #3110
  • Use PICO-8 built-in cover art from .p8.png cartridge files by @gantoine in #3119
  • Auto-update game status from RetroAchievements award kind during progress sync by @gantoine in #3118
  • Add Bulgarian (bg_BG) translation by @DenislavDenev in #3159

Fixes

  • Fix platform aspect ratio not applying in gallery view by @gantoine in #3083
  • Fix metadata IDs not persisting when handler is disabled or game not found by @gantoine in #3085
  • Hack for natural sorting of ROMs by @gantoine in #3086
  • Always sub dash with colon for launchbox matching by @gantoine in #3090
  • Fix 500 error when loading platforms with ROMs whose filenames start with region tags by @gantoine in #3091
  • Fix M3U generation to exclude raw .bin tracks when .cue files are present by @gantoine in #3100
  • Filesystem watcher and scheduled scan skip when no metadata sources configured by @gantoine in #3106
  • Replace deep watch with computed to reduce reactivity overhead by @cciollaro in #3104
  • Add missing platforms to playable game filter by @Bergbok in #3121
  • Default to querying all roms by @camhorn in #3122
  • Remove cover image card bevel by @gantoine in #3131
  • Auto-select firmware when only one option is available by @gantoine in #3150
  • Fix IntegrityError when updating favourites after ROM rescan by @Copilot in #3166
  • Fix mod_zip UTF-8 filename handling for non-ASCII downloads by @tmgast in #3171

Other changes

  • Typed API form fields by @gantoine in #3036
  • Fix OAuth token expiry and implement refresh token rotation by @HydroSulphide in #3102
  • Add property for path_video and refactor places which use similar logic by @JamieeBond in #3116
  • Move "Clean up All" missing ROMs deletion to background task by @gantoine in #3109
  • Allow partial updates to ROM user props via typed payload schema by @gantoine in #3124
  • Switch ACCESS_TOKEN_EXPIRE_MINUTES to SECONDS by @gantoine in #3096
  • Update RAHasher to version 1.8.3 and add Wii platform support by @zurdi15 in #3145
  • Add OIDC_SERVER_METADATA_URL to support providers with non-standard discovery URLs (e.g. Google) by @gantoine in #3099
  • Fix OIDC login role downgrading for users without claims by @pacnpal in #3103
  • Implement OIDC RP-Initiated Logout (end-session endpoint) by @gantoine in #3107
  • Make OAuth token expiry configurable via env vars by @HydroSulphide in #3126
  • Remove Non-Argosy Android app references from README by @milktoastrat in #3130
  • Lockdown package installs by @gantoine in #3203
  • Bump authlib from 1.6.6 to 1.6.7 by @dependabot[bot] in #3070
  • Bump tar from 7.5.9 to 7.5.10 in /frontend by @dependabot[bot] in #3075
  • Bump joserfc from 1.3.5 to 1.6.3 by @dependabot[bot] in #3064
  • Bump tornado from 6.5.1 to 6.5.5 by @dependabot[bot] in #3123
  • chore(deps): bump authlib from 1.6.7 to 1.6.9 by @dependabot[bot] in #3138
  • chore(deps): bump memray from 1.17.2 to 1.19.2 by @dependabot[bot] in #3141
  • chore(deps): bump socket.io-parser from 4.2.5 to 4.2.6 in /frontend by @dependabot[bot] in #3144
  • chore(deps-dev): bump flatted from 3.3.4 to 3.4.2 in /frontend by @dependabot[bot] in #3146
  • chore(deps-dev): bump picomatch from 2.3.1 to 2.3.2 in /frontend by @dependabot[bot] in #3177
  • chore(deps): bump requests from 2.32.4 to 2.33.0 by @dependabot[bot] in #3186
  • chore(deps-dev): bump handlebars from 4.7.8 to 4.7.9 in /frontend by @dependabot[bot] in #3188
  • chore(deps): bump cryptography from 46.0.5 to 46.0.6 by @dependabot[bot] in #3196
  • chore(deps): bump pygments from 2.19.2 to 2.20.0 by @dependabot[bot] in #3199

Note

Environment Variables

UPLOAD_TIMEOUT has been removed in favour of chunked uploads
OAUTH_ACCESS_TOKEN_EXPIRE_SECONDS: Access token lifetime (in seconds, default 30 minutes)
OAUTH_REFRESH_TOKEN_EXPIRE_SECONDS: Refresh token lifetime (in seconds, default 7 days)
INVITE_TOKEN_EXPIRY_SECONDS: Invite token lifetime (in seconds, default 10 minutes)
OIDC_SERVER_METADATA_URL: URL to the OIDC provider metadata endpoint
OIDC_RP_INITIATED_LOGOUT: Enable RP-initiated logout flow (default false)
OIDC_END_SESSION_ENDPOINT: OIDC end-session endpoint override URL

New Contributors

Full Changelog: 4.7.0...4.8.0

4.8.0-beta.1

22 Mar 01:22
c52bdf9

Choose a tag to compare

4.8.0-beta.1 Pre-release
Pre-release

Highlights

Client API tokens

API tokens are a safer way for apps and devices to connect without sharing user credentials. A new QR-based pairing flow makes setup quick, with support for regeneration and revocation when needed. #3114

Screenshot 2026-03-13 at 9 15 48 PM Screenshot 2026-03-13 at 9 25 26 PM

Chunked uploads

Goodbye failed uploads and incessant timeouts! ROMs will now upload in smaller chunks, allowing for more reliable transfers even on spotty connections. #3076

Screenshot 2026-03-13 at 9 17 24 PM

Local LaunchBox metadata import

Have a local LaunchBox installation packed with games? You can now import metadata directly from it, including cover art, screenshots and video previews. #2922

Screenshot 2026-03-13 at 9 26 29 PM

Minor changes

  • Add config option to use local video paths in gamelist.xml export by @JamieeBond in #3082
  • Add additional cover styles for boxart to prevent cropping by @Drarox in #3060
  • Fetch games on search view mount and reset search state on input clear by @zurdi15 in #3080
  • Add video_normalized media type option for ScreenScraper scans by @gantoine in #3088
  • Scrape and store age rating data from ScreenScraper.fr by @gantoine in #3089
  • Make invite token expiration configurable by @gantoine in #3094
  • Click to zoom game cover image by @gantoine in #3093
  • Add more platforms to cover styles by @Drarox in #3098
  • Show filtered ROM count in the gallery AppBar and filter drawer by @gantoine in #3097
  • Show firmware count in scan results to improve BIOS detection discoverability by @gantoine in #3111
  • Per-platform metadata coverage and region breakdown to server stats by @cciollaro in #3110
  • Use PICO-8 built-in cover art from .p8.png cartridge files by @gantoine in #3119
  • Auto-update game status from RetroAchievements award kind during progress sync by @gantoine in #3118

Fixes

  • Fix platform aspect ratio not applying in gallery view by @gantoine in #3083
  • Fix metadata IDs not persisting when handler is disabled or game not found by @gantoine in #3085
  • Hack for natural sorting of ROMs by @gantoine in #3086
  • Always sub dash with colon for launchbox matching by @gantoine in #3090
  • Fix 500 error when loading platforms with ROMs whose filenames start with region tags by @gantoine in #3091
  • Fix M3U generation to exclude raw .bin tracks when .cue files are present by @gantoine in #3100
  • Filesystem watcher and scheduled scan skip when no metadata sources configured by @gantoine in #3106
  • Replace deep watch with computed to reduce reactivity overhead by @cciollaro in #3104
  • Add missing platforms to playable game filter by @Bergbok in #3121
  • Default to querying all roms by @camhorn in #3122
  • Remove cover image card bevel by @gantoine in #3131
  • Auto-select firmware when only one option is available by @gantoine in #3150

Other changes

  • Typed API form fields by @gantoine in #3036
  • Fix OAuth token expiry and implement refresh token rotation by @HydroSulphide in #3102
  • Add property for path_video and refactor places which use similar logic by @JamieeBond in #3116
  • Move "Clean up All" missing ROMs deletion to background task by @gantoine in #3109
  • Allow partial updates to ROM user props via typed payload schema by @gantoine in #3124
  • Switch ACCESS_TOKEN_EXPIRE_MINUTES to SECONDS by @gantoine in #3096
  • Update RAHasher to version 1.8.3 and add Wii platform support by @zurdi15 in #3145
  • Add OIDC_SERVER_METADATA_URL to support providers with non-standard discovery URLs (e.g. Google) by @gantoine in #3099
  • Fix OIDC login role downgrading for users without claims by @pacnpal in #3103
  • Implement OIDC RP-Initiated Logout (end-session endpoint) by @gantoine in #3107
  • Make OAuth token expiry configurable via env vars by @HydroSulphide in #3126
  • Remove Non-Argosy Android app references from README by @milktoastrat in #3130
  • Bump authlib from 1.6.6 to 1.6.7 by @dependabot[bot] in #3070
  • Bump tar from 7.5.9 to 7.5.10 in /frontend by @dependabot[bot] in #3075
  • Bump joserfc from 1.3.5 to 1.6.3 by @dependabot[bot] in #3064
  • Bump tornado from 6.5.1 to 6.5.5 by @dependabot[bot] in #3123
  • chore(deps): bump authlib from 1.6.7 to 1.6.9 by @dependabot[bot] in #3138
  • chore(deps): bump memray from 1.17.2 to 1.19.2 by @dependabot[bot] in #3141
  • chore(deps): bump socket.io-parser from 4.2.5 to 4.2.6 in /frontend by @dependabot[bot] in #3144
  • chore(deps-dev): bump flatted from 3.3.4 to 3.4.2 in /frontend by @dependabot[bot] in #3146

Note

API Changes

⚠️ Most API endpoints that accept form input(s) are now fully typed and allow for partial updates. Field names were (mostly) unchanged, so existing API calls should continue to work as expected. Affect endpoints:

  • PUT /api/roms: Update Rom
  • POST /api/collections: Create Collection
  • PUT /api/collections: Update Collection
  • POST /api/collections/smart: Create SmartCollection
  • PUT /api/collections/smart: Update SmartCollection
  • POST /api/saves: Upload Save
  • PUT /api/saves: Update Save
  • POST /api/states: Upload State
  • PUT /api/states: Update State
  • POST /api/screenshots: Upload Screenshot

Client tokens expose a new batch of endpoints:

  • POST /api/client-tokens: Create client token
  • GET /api/client-tokens: List client tokens
  • DELETE /api/client-tokens/{token_id}: Revoke client token
  • POST /api/client-tokens/regenerate: Regenerate client token secret
  • POST /api/client-tokens/pair: Pair client token via QR code
  • GET /api/client-tokens/pair/{code}/status: Check QR pairing status
  • POST /api/client-tokens/exchange: Exchange pairing code for client token
  • GET /api/client-tokens/all: Get all client tokens (admin only)
  • DELETE /api/client-tokens/{token_id}/admin: Revoke any client token (admin only)

⚠️ RomFile endponts have been moved:

  • GET /api/roms/files/{rom_id} -> POST /api/roms/{rom_id}/files
  • GET /api/roms/files/{rom_id}/content -> /{id}/files/content/{file_name}

Other changes:

  • GET /api/stats endpoint now includes additional metadata coverage and region breakdowns
    • Added METADATA_COVERAGE and REGION_BREAKDOWN fields to StatsReturn
  • Added path_video field and ra_hash fields to DetailedRomSchema and SimpleRomSchema
  • Added ra_hash field to RomFileSchema
  • Added firmware_count field to PlatformSchema
  • Added highest_award_kind field to RAUserGameProgression
  • Added refresh_token and refresh_expires to TokenResponse
  • UPLOAD_TIMEOUT has been removed from the /api/heartbeat response

Note

Environment Variables

UPLOAD_TIMEOUT has been removed in favour of chunked uploads
OAUTH_ACCESS_TOKEN_EXPIRE_SECONDS: Access token lifetime (in seconds, default 30 minutes)
OAUTH_REFRESH_TOKEN_EXPIRE_SECONDS: Refresh token lifetime (in seconds, default 7 days)
INVITE_TOKEN_EXPIRY_SECONDS: Invite token lifetime (in seconds, default 10 minutes)
OIDC_SERVER_METADATA_URL: URL to the OIDC provider metadata endpoint
OIDC_RP_INITIATED_LOGOUT: Enable RP-initiated logout flow (default false)
OIDC_END_SESSION_ENDPOINT: OIDC end-session endpoint override URL

New Contributors

Read more

4.8.0-alpha.1

14 Mar 01:27
3e65534

Choose a tag to compare

4.8.0-alpha.1 Pre-release
Pre-release

Note

API Changes

⚠️ Most API endpoints that accept form input(s) are now fully typed and allow for partial updates. Field names were (mostly) unchanged, so existing API calls should continue to work as expected. Affect endpoints:

  • PUT /api/roms: Update Rom
  • POST /api/collections: Create Collection
  • PUT /api/collections: Update Collection
  • POST /api/collections/smart: Create SmartCollection
  • PUT /api/collections/smart: Update SmartCollection
  • POST /api/saves: Upload Save
  • PUT /api/saves: Update Save
  • POST /api/states: Upload State
  • PUT /api/states: Update State
  • POST /api/screenshots: Upload Screenshot

Client tokens expose a new batch of endpoints:

  • POST /api/client-tokens: Create client token
  • GET /api/client-tokens: List client tokens
  • DELETE /api/client-tokens/{token_id}: Revoke client token
  • POST /api/client-tokens/regenerate: Regenerate client token secret
  • POST /api/client-tokens/pair: Pair client token via QR code
  • GET /api/client-tokens/pair/{code}/status: Check QR pairing status
  • POST /api/client-tokens/exchange: Exchange pairing code for client token
  • GET /api/client-tokens/all: Get all client tokens (admin only)
  • DELETE /api/client-tokens/{token_id}/admin: Revoke any client token (admin only)

⚠️ RomFile endponts have been moved:

  • GET /api/roms/files/{rom_id} -> POST /api/roms/{rom_id}/files
  • GET /api/roms/files/{rom_id}/content -> /{id}/files/content/{file_name}

Other changes:

  • GET /api/stats endpoint now includes additional metadata coverage and region breakdowns
    • Added METADATA_COVERAGE and REGION_BREAKDOWN fields to StatsReturn
  • Added path_video field and ra_hash fields to DetailedRomSchema and SimpleRomSchema
  • Added ra_hash field to RomFileSchema
  • Added firmware_count field to PlatformSchema
  • Added highest_award_kind field to RAUserGameProgression
  • Added refresh_token and refresh_expires to TokenResponse
  • UPLOAD_TIMEOUT has been removed from the /api/heartbeat response

Note

Environment Variables

UPLOAD_TIMEOUT has been removed in favour of chunked uploads
OAUTH_ACCESS_TOKEN_EXPIRE_SECONDS: Access token lifetime (in seconds, default 30 minutes)
OAUTH_REFRESH_TOKEN_EXPIRE_SECONDS: Refresh token lifetime (in seconds, default 7 days)
INVITE_TOKEN_EXPIRY_SECONDS: Invite token lifetime (in seconds, default 10 minutes)
OIDC_SERVER_METADATA_URL: URL to the OIDC provider metadata endpoint
OIDC_RP_INITIATED_LOGOUT: Enable RP-initiated logout flow (default false)
OIDC_END_SESSION_ENDPOINT: OIDC end-session endpoint override URL

Highlights

Client API tokens

API tokens are a safer way for apps and devices to connect without sharing user credentials. A new QR-based pairing flow makes setup quick, with support for regeneration and revocation when needed. #3114

Screenshot 2026-03-13 at 9 15 48 PM Screenshot 2026-03-13 at 9 25 26 PM

Chunked uploads

Goodbye failed uploads and incessant timeouts! ROMs will now upload in smaller chunks, allowing for more reliable transfers even on spotty connections. #3076

Screenshot 2026-03-13 at 9 17 24 PM

Local LaunchBox metadata import

Have a local LaunchBox installation packed with games? You can now import metadata directly from it, including cover art, screenshots and video previews. #2922

Screenshot 2026-03-13 at 9 26 29 PM

Minor changes

  • Add config option to use local video paths in gamelist.xml export by @JamieeBond in #3082
  • Add additional cover styles for boxart to prevent cropping by @Drarox in #3060
  • Fetch games on search view mount and reset search state on input clear by @zurdi15 in #3080
  • Add video_normalized media type option for ScreenScraper scans by @gantoine in #3088
  • Scrape and store age rating data from ScreenScraper.fr by @gantoine in #3089
  • Make invite token expiration configurable by @gantoine in #3094
  • Click to zoom game cover image by @gantoine in #3093
  • Add more platforms to cover styles by @Drarox in #3098
  • Show filtered ROM count in the gallery AppBar and filter drawer by @gantoine in #3097
  • Show firmware count in scan results to improve BIOS detection discoverability by @gantoine in #3111
  • Per-platform metadata coverage and region breakdown to server stats by @cciollaro in #3110
  • Use PICO-8 built-in cover art from .p8.png cartridge files by @gantoine in #3119
  • Auto-update game status from RetroAchievements award kind during progress sync by @gantoine in #3118

Fixes

  • Fix platform aspect ratio not applying in gallery view by @gantoine in #3083
  • Fix metadata IDs not persisting when handler is disabled or game not found by @gantoine in #3085
  • Hack for natural sorting of ROMs by @gantoine in #3086
  • Always sub dash with colon for launchbox matching by @gantoine in #3090
  • Fix 500 error when loading platforms with ROMs whose filenames start with region tags by @gantoine in #3091
  • Fix M3U generation to exclude raw .bin tracks when .cue files are present by @gantoine in #3100
  • Filesystem watcher and scheduled scan skip when no metadata sources configured by @gantoine in #3106
  • Replace deep watch with computed to reduce reactivity overhead by @cciollaro in #3104
  • Add missing platforms to playable game filter by @Bergbok in #3121
  • Default to querying all roms by @camhorn in #3122
  • Remove cover image card bevel by @gantoine in #3131

Other changes

New Contributors

Full Changelog: 4.7.0...4.8.0-alpha.1

4.7.0

03 Mar 21:53
b2cfb95

Choose a tag to compare

Highlights

Auto-export gamelist.xml

Automatically generate an ES-DE compatible gamelist.xml file during scans by enabling the option in your config.yml. This will place the new gamelist.xml file within the platform folder for selected/discovered platforms.

scan:
    export_gamelist: true

@ItzCobaltboy in #2987

Device-based save synchronization

Thanks to @tmgast, we've laid the ground work for device-based save synchronization to enable multi-device save management, as defined in RFC-0001. Devices (handhelds, PCs, etc.) can register with the server and track which saves they've synced, enabling conflict detection when a device tries to upload stale data.

Note that this is purely foundational work to set up an initial structure and API implementation and in intended for third-party developers. #2917

Minor changes

  • Add support for ScummVM shortnames by @gantoine in #2957
  • Add OIDC_AUTOLOGIN=true env var to automatically login using OIDC by @pR0Ps in #2969
  • Enable keyboard lock in emulatorjs by @matthewturk in #3043
  • Group games with same name (but different tags) as versions/siblings by @zeroSteiner in #2984
  • Search by mutliple keywords with | by @gantoine in #2996
    • zelda|mario|sonic would show all games with zelda, mario OR sonic in the name
  • New PKGJ feed endpoints in .tsv format by @gantoine in #2986
    • PSP games: GET /api/feeds/pkgj/psp/games
    • PSP DLC files: GET /api/feeds/pkgj/psp/dlc
    • PS Vita games: GET /api/feeds/pkgj/psvita/games
    • PS Vita DLC files: GET /api/feeds/pkgj/psvita/dlc
    • PSX games: GET /api/feeds/pkgj/psx/games

Fixes

  • [HOTFIX] Fix all roms displayed in all platforms by @gantoine in #2948
  • [ROMM-2956] Fix refresh on card edit by @gantoine in #2962
  • Invalid category values fix by @LoneAngelFayt in #2979
  • Filter keys now plural by @camhorn in #2982
  • [ROMM-2991] Allow set completion to 0 by @gantoine in #2995
  • [ROMM-2997] Fix HLTB search term fetching by @gantoine in #2998
  • [ROMM-2983] Fix negative filter by verified by @gantoine in #3000
  • [ROMM-2976] Fix no games displayed for status filter by @gantoine in #3001
  • [ROMM-2974] Stop displaying public collections in "add to collection" dialog the user doesn't own by @gantoine in #3002
  • [ROMM-2972] Fix /props returning stale data by @gantoine in #3003
  • [ROMM-2965] Check file count for file select menu emulatorjs by @gantoine in #3005
  • [ROMM-2943] Match scanned platform based on fs_slug by @gantoine in #3008
  • [ROMM-3020] Fix split collection custom artowrk by @gantoine in #3028
  • [ROMM-3025] Fix collections with custom art failing by @gantoine in #3027
  • [ROMM-3026] Region/language shortcodes should be case sensitive by @gantoine in #3035
  • [ROMM-3031] Fix screenshot property on save/state by @gantoine in #3037
  • Remove ICE server list from config response when unauthenticated by @gantoine in #3054

Other changes

New Contributors

Full Changelog: 4.6.1...4.7.0

4.7.0-beta.2

21 Feb 18:15
cccee5a

Choose a tag to compare

4.7.0-beta.2 Pre-release
Pre-release

Highlights

Auto-export gamelist.xml

Automatically generate an ES-DE compatible gamelist.xml file during scans by enabling the option in your config.yml. This will place the new gamelist.xml file within the platform folder for selected/discovered platforms.

scan:
    export_gamelist: true

@ItzCobaltboy in #2987

Device-based save synchronization

Thanks to @tmgast, we've laid the ground work for device-based save synchronization to enable multi-device save management, as defined in RFC-0001. Devices (handhelds, PCs, etc.) can register with the server and track which saves they've synced, enabling conflict detection when a device tries to upload stale data.

Note that this is purely foundational work to set up an initial structure and API implementation and in intended for third-party developers. #2917

Minor changes

  • Add support for ScummVM shortnames by @gantoine in #2957
  • Add OIDC_AUTOLOGIN=true env var to automatically login using OIDC by @pR0Ps in #2969
  • Group games with same name (but different tags) as versions/siblings by @zeroSteiner in #2984
  • Search by mutliple keywords with | by @gantoine in #2996
    • zelda|mario|sonic would show all games with zelda, mario OR sonic in the name
  • New PKGJ feed endpoints in .tsv format by @gantoine in #2986
    • PSP games: GET /api/feeds/pkgj/psp/games
    • PSP DLC files: GET /api/feeds/pkgj/psp/dlc
    • PS Vita games: GET /api/feeds/pkgj/psvita/games
    • PS Vita DLC files: GET /api/feeds/pkgj/psvita/dlc
    • PSX games: GET /api/feeds/pkgj/psx/games

Fixes

  • [HOTFIX] Fix all roms displayed in all platforms by @gantoine in #2948
  • [ROMM-2956] Fix refresh on card edit by @gantoine in #2962
  • Invalid category values fix by @LoneAngelFayt in #2979
  • Filter keys now plural by @camhorn in #2982
  • [ROMM-2991] Allow set completion to 0 by @gantoine in #2995
  • [ROMM-2997] Fix HLTB search term fetching by @gantoine in #2998
  • [ROMM-2983] Fix negative filter by verified by @gantoine in #3000
  • [ROMM-2976] Fix no games displayed for status filter by @gantoine in #3001
  • [ROMM-2974] Stop displaying public collections in "add to collection" dialog the user doesn't own by @gantoine in #3002
  • [ROMM-2972] Fix /props returning stale data by @gantoine in #3003
  • [ROMM-2965] Check file count for file select menu emulatorjs by @gantoine in #3005
  • [ROMM-2943] Match scanned platform based on fs_slug by @gantoine in #3008
  • [ROMM-3020] Fix split collection custom artowrk by @gantoine in #3028
  • [ROMM-3025] Fix collections with custom art failing by @gantoine in #3027
  • [ROMM-3026] Region/language shortcodes should be case sensitive by @gantoine in #3035
  • [ROMM-3031] Fix screenshot property on save/state by @gantoine in #3037

Other changes

New Contributors

Full Changelog: 4.6.1...4.7.0-beta.2

4.7.0-beta.1

21 Feb 15:20
1dfce1c

Choose a tag to compare

4.7.0-beta.1 Pre-release
Pre-release

Highlights

Auto-export gamelist.xml

Automatically generate an ES-DE compatible gamelist.xml file during scans by enabling the option in your config.yml. This will place the new gamelist.xml file within the platform folder for selected/discovered platforms.

scan:
    export_gamelist: true

@ItzCobaltboy in #2987

Device-based save synchronization

Thanks to @tmgast, we've laid the ground work for device-based save synchronization to enable multi-device save management, as defined in RFC-0001. Devices (handhelds, PCs, etc.) can register with the server and track which saves they've synced, enabling conflict detection when a device tries to upload stale data.

Note that this is purely foundational work to set up an initial structure and API implementation and in intended for third-party developers. #2917

Minor changes

  • Add support for ScummVM shortnames by @gantoine in #2957
  • Add OIDC_AUTOLOGIN=true env var to automatically login using OIDC by @pR0Ps in #2969
  • Group games with same name (but different tags) as versions/siblings by @zeroSteiner in #2984
  • Search by mutliple keywords with | by @gantoine in #2996
    • zelda|mario|sonic would show all games with zelda, mario OR sonic in the name
  • New PKGJ feed endpoints in .tsv format by @gantoine in #2986
    • PSP games: GET /api/feeds/pkgj/psp/games
    • PSP DLC files: GET /api/feeds/pkgj/psp/dlc
    • PS Vita games: GET /api/feeds/pkgj/psvita/games
    • PS Vita DLC files: GET /api/feeds/pkgj/psvita/dlc
    • PSX games: GET /api/feeds/pkgj/psx/games

Fixes

  • [HOTFIX] Fix all roms displayed in all platforms by @gantoine in #2948
  • [ROMM-2956] Fix refresh on card edit by @gantoine in #2962
  • Invalid category values fix by @LoneAngelFayt in #2979
  • Filter keys now plural by @camhorn in #2982
  • [ROMM-2991] Allow set completion to 0 by @gantoine in #2995
  • [ROMM-2997] Fix HLTB search term fetching by @gantoine in #2998
  • [ROMM-2983] Fix negative filter by verified by @gantoine in #3000
  • [ROMM-2976] Fix no games displayed for status filter by @gantoine in #3001
  • [ROMM-2974] Stop displaying public collections in "add to collection" dialog the user doesn't own by @gantoine in #3002
  • [ROMM-2972] Fix /props returning stale data by @gantoine in #3003
  • [ROMM-2965] Check file count for file select menu emulatorjs by @gantoine in #3005
  • [ROMM-2943] Match scanned platform based on fs_slug by @gantoine in #3008
  • [ROMM-3020] Fix split collection custom artowrk by @gantoine in #3028
  • [ROMM-3025] Fix collections with custom art failing by @gantoine in #3027
  • [ROMM-3026] Region/language shortcodes should be case sensitive by @gantoine in #3035
  • [ROMM-3031] Fix screenshot property on save/state by @gantoine in #3037

Other changes

New Contributors

Full Changelog: 4.6.1...4.7.0-beta.1

4.7.0-alpha.1

12 Feb 16:14
ee998eb

Choose a tag to compare

4.7.0-alpha.1 Pre-release
Pre-release

Note

API Changes

  • New endpoints that only return identifiers (IDs)
    • GET /api/collections/identifiers
    • GET /api/collections/virtual/identifiers
    • GET /api/collections/smart/identifiers
    • GET /api/firmware/identifiers
    • GET /api/platforms/identifiers
    • GET /api/roms/identifiers
    • GET /api/roms/{id}/notes/identifiers
    • GET /api/saves/identifiers
    • GET /api/states/identifiers
    • GET /api/users/identifiers
  • New endpoint for device registration
    • POST /api/devices/register_device
    • GET /api/devices
    • GET/PUT/DELETE /api/devices/{device_id}
  • New endpoints for save management
    • GET /api/saves/summary: Saves summary grouped by slot
    • GET /api/saves/{id}/content: Download save content
    • GET /api/saves/{id}/downloaded: Confirm download
    • POST /api/saves/{id}/untrack: Disable sync tracking for a save on a device
    • POST /api/saves/{id}/track: Re-enable sync tracking for a save on a device
    • GET /api/saves can be filtered by rom_id, platform_id, device_id or slot
  • New PKGJ feed endpoints in .tsv format
    • PSP games: GET /api/feeds/pkgj/psp/games
    • PSP DLC files: GET /api/feeds/pkgj/psp/dlc
    • PS Vita games: GET /api/feeds/pkgj/psvita/games
    • PS Vita DLC files: GET /api/feeds/pkgj/psvita/dlc
    • PSX games: GET /api/feeds/pkgj/psx/games
  • Collection.user__username -> Collection.owner_username ⚠️
  • SmartCollectionSchema.user__username -> SmartCollectionSchema.owner_username` ⚠️
  • RomUserSchema.user__username removed ⚠️
  • New field on /heartbeat response OIDC.AUTOLOGIN
  • RomFileCategory enum includes cheat value
  • New fields on SaveSchema and StateSchema objects
    • slot: string | null
    • content_hash: string | null
    • device_syncs: list[DeviceSyncSchema]

Highlights

Auto-export gamelist.xml

Automatically generate an ES-DE compatible gamelist.xml file during scans by enabling the option in your config.yml. This will place the new gamelist.xml file within the platform folder for selected/discovered platforms.

scan:
    export_gamelist: true

@ItzCobaltboy in #2987

Device-based save synchronization

Thanks to @tmgast, we've laid the ground work for device-based save synchronization to enable multi-device save management, as defined in RFC-0001. Devices (handhelds, PCs, etc.) can register with the server and track which saves they've synced, enabling conflict detection when a device tries to upload stale data.

Note that this is purely foundational work to set up an initial structure and API implementation and in intended for third-party developers. #2917

Minor changes

  • Add support for ScummVM shortnames by @gantoine in #2957
  • Add OIDC_AUTOLOGIN=true env var to automatically login using OIDC by @pR0Ps in #2969
  • Group games with same name (but different tags) as versions/siblings by @zeroSteiner in #2984
  • Search by mutliple keywords with | by @gantoine in #2996
    • zelda|mario|sonic would show all games with zelda, mario OR sonic in the name
  • New PKGJ feed endpoints in .tsv format by @gantoine in #2986
    • PSP games: GET /api/feeds/pkgj/psp/games
    • PSP DLC files: GET /api/feeds/pkgj/psp/dlc
    • PS Vita games: GET /api/feeds/pkgj/psvita/games
    • PS Vita DLC files: GET /api/feeds/pkgj/psvita/dlc
    • PSX games: GET /api/feeds/pkgj/psx/games

Fixes

Other changes

New Contributors

Full Changelog: 4.6.1...4.7.0-alpha.1

4.6.1

27 Jan 14:57
cd56d3a

Choose a tag to compare

What's Changed

Full Changelog: 4.6.0...4.6.1

4.6.0

26 Jan 22:34
443110f

Choose a tag to compare

Highlights

Additional metadata

The edit dialog now allows you to manually set metadata properties that would otherwise only be aggregated from metadata sources, if those metadata sources don't support/populate certain fields. #2848

Screenshot 2026-01-12 at 1 16 34 PM

Enhance folder structure config

We've improved the web interface that lets you configure platform bindings and versions, and excluded files and folders. This change should simplify the process of configuring how library folders are interpreted and what content is ignored during scanning. #2809

Screenshot 2026-01-12 at 12 25 11 PM Screenshot 2026-01-12 at 12 25 23 PM

Patcher.js

  • We're introducing a new ROM patching feature to the app that enables your admins and editors to apply various types of patches to ROM files. At this time both ROM and patch files must be downloaded locally and re-uploaded via the patcher, with future work planned to patch ROMs directly from your library. #2787
Screenshot 2026-01-12 at 12 25 37 PM

UI settings sync

UI settings are now synced between devices for every user! These settings do not affect third-party apps, and any setting must be changed at least once for this sync to take effect. #2777

BIOS file defaults

A default BIOS file can now be specified per emulator core directly in your config.yml:

emulatorjs:
  settings:
    mgba:
      bios_file: gba_bios.bin

#2873

Minor changes

Fixes

  • Fix YAML indentation in netplay section of config example file by @Zuko in #2812
  • [HOTFIX] Fix scrolling load more in gallery views by @gantoine in #2813
  • [HOTFIX] Multi roms should only consider top-level files by @gantoine in #2821
  • Notes flag by @zurdi15 in #2817
  • [ROMM-2824] Also replace - with : for edge cases in HLTB and LB handlers by @gantoine in #2827
  • [ROMM-2844] Use webp images for game covers in list view by @gantoine in #2845
  • [ROMM-2835] Fix appearance of chevron screenshot buttons by @gantoine in #2846
  • [ROMM-2833] Fix using default locales in igdb handler by @gantoine in #2847
  • [ROMM-2796] Add check to overwrite media assets by @gantoine in #2851
  • Allow deleting single chip in additional metadata by @SaraVieira in #2861
  • [ROMM-2853] Update rom_file.category column enum by @gantoine in #2860
  • [HOTFIX] Dont schedule tasks if already queued by @gantoine in #2885
  • [ROMM-2808] Stop filtering nsfw games from search results by @gantoine in #2852
  • [ROMM-2856] Use platform slug to fetch feed games by @gantoine in #2862
  • [HOTFIX] Check if gamelist metadata source selected before populating cache by @gantoine in #2865
  • [ROMM-2889] Add media to update_config_file by @gantoine in #2897
  • [HOTFIX] Rename selected_statuses to statuses by @gantoine in #2902
  • [HOTFIX] Only add ? to qs on download path by @gantoine in #2907
  • [ROMM-2874] Feature/updated-after-query-param by @BrandonKowalski in #2898
  • [ROMM-2906] Fix icon color light mode by @gantoine in #2913
  • [HOTFIX] Remove files from model_dump in scan by @gantoine in #2914
  • [ROMM-2891] Empty String Flashpoint ID by @BrandonKowalski in #2918

Other changes

New Contributors

Full Changelog: 4.5.0...4.6.0