chore(deps): update ghcr.io/rommapp/romm docker tag to v5 #91
Open
renovate-bot
wants to merge 1 commit from
renovate/ghcr.io-rommapp-romm-5.x into main
pull from: renovate/ghcr.io-rommapp-romm-5.x
merge into: ops:main
ops:main
ops:renovate/gitlab-19.x
ops:renovate/node-feature-discovery-0.x
ops:renovate/ghcr.io-mogenius-helm-charts-renovate-operator-5.x
ops:renovate/docker.io-binwiederhier-ntfy-2.x
ops:renovate/ghcr.io-scanopy-scanopy-server-0.x
ops:renovate/ghcr.io-diced-zipline-4.x
ops:renovate/ghcr.io-prometheus-community-charts-prometheus-operator-crds-32.x
ops:renovate/ghcr.io-paperless-ngx-paperless-ngx-3.x
ops:renovate/admonstrator-paperless-ai-next-2026.x
ops:renovate/ghcr.io-perfectra1n-kubesearch-mcp-1.x
ops:renovate/registry.erwanleboucher.dev-eleboucher-charts-memini-0.x
ops:renovate/ghcr.io-prymitive-karma-0.x
ops:renovate/sentry-34.x
ops:renovate/loki-7.x
ops:renovate/ghcr.io-stacklok-toolhive-toolhive-operator-crds-0.x
ops:renovate/ghcr.io-stacklok-toolhive-toolhive-operator-0.x
ops:renovate/ghcr.io-mogenius-helm-charts-renovate-operator-6.x
ops:renovate/docker.io-healthchecks-healthchecks-5.x
ops:renovate/ghcr.io-atuinsh-atuin-18.x
ops:renovate/uv_build-0.x
ops:renovate/ghcr.io-home-operations-kromgo-0.x
ops:renovate/ghcr.io-home-operations-charts-echo-0.x
ops:renovate/ghcr.io-siderolabs-installer-1.13.x
ops:renovate/gitlab-9.x
ops:renovate/ghcr.io-ellite-wallos-5.x
ops:renovate/gitlab-10.x
ops:renovate/tailscale-operator-1.x
ops:renovate/ghcr.io-goauthentik-server-2026.x
ops:renovate/kube-prometheus-stack-92.x
ops:renovate/containers.podman-1.x
ops:renovate/ghcr.io-helmforgedev-helm-kubernetes-mcp-server-1.x
ops:renovate/ghcr.io-gethomepage-homepage-2.x
ops:renovate/ghcr.io-sysadminsmedia-homebox-0.x
ops:renovate/codefloe.com-crowci-crow-2.x
ops:renovate/ghcr.io-spegel-org-helm-charts-spegel-0.x
ops:renovate/external-secrets-2.x
ops:renovate/kube-prometheus-stack-87.x
ops:renovate/code.forgejo.org-forgejo-helm-forgejo-17.x
ops:renovate/forgejo-1.x
ops:renovate/cilium-1.x
ops:renovate/gitlab-agent-2.x
ops:renovate/python-3.x
ops:renovate/registry.gitlab.com-fmd-foss-fmd-server-0.x
ops:renovate/ghcr.io-gotson-komga-1.x
ops:renovate/open-webui-17.x
ops:renovate/ghcr.io-archivebox-archivebox-0.x
ops:renovate/ghcr.io-muety-wakapi-2.x
ops:renovate/ghcr.io-controlplaneio-fluxcd-charts-flux-operator-0.x
ops:renovate/quay.io-oauth2-proxy-oauth2-proxy-7.x
ops:renovate/external-dns-1.x
ops:renovate/plugin-barman-cloud-0.x
ops:renovate/reloader-2.x
ops:renovate/longhorn-1.x
ops:renovate/cloudnative-pg-0.x
ops:renovate/nvidia-device-plugin-0.x
ops:renovate/goldilocks-11.x
ops:renovate/quay.io-jetstack-charts-trust-manager-0.x
ops:renovate/lscr.io-linuxserver-faster-whisper-3.x
ops:renovate/goldilocks-10.x
ops:renovate/ghcr.io-sissbruecker-linkding-1.x
ops:renovate/ghcr.io-navidrome-navidrome-0.x
ops:renovate/authentik-2026.x
ops:renovate/random-3.x
ops:renovate/mirror.gcr.io-envoyproxy-gateway-helm-1.x
ops:renovate/johly-airtrail-3.x
ops:renovate/nvidia-gpu-exporter-2.x
ops:renovate/metrics-server-3.x
ops:renovate/altinity-clickhouse-operator-0.x
ops:renovate/ghcr.io-usememos-memos-0.x
ops:renovate/ghcr.io-siderolabs-kubelet-1.x
ops:renovate/ghcr.io-remsky-kokoro-fastapi-gpu-0.x
ops:renovate/kubernetes.core-6.x
ops:renovate/quay.io-jetstack-charts-cert-manager-1.x
ops:renovate/ghcr.io-siderolabs-kubelet-1.34.x
ops:renovate/ghcr.io-siderolabs-charts-talos-cloud-controller-manager-0.x
ops:renovate/crowci-0.x-lockfile
ops:renovate/quay.io-thanos-thanos-0.x
ops:renovate/open-webui-15.x
ops:renovate/mail-5.x
ops:renovate/cert-manager-webhook-pdns-3.x
ops:renovate/bluesky-pds-0.x
ops:renovate/promtail-6.x
ops:renovate/loki-6.x
ops:renovate/github.com-imusmanmalik-cert-manager-mixin-1.x
ops:renovate/lock-file-maintenance
ops:renovate/bitwarden-secrets-1.x
ops:renovate/ruby-4.x
ops:renovate/plausible-analytics-3.x
ops:renovate/sops-1.x
ops:renovate/plausible-analytics-2.x
ops:renovate/ghcr.io-gethomepage-homepage-1.x
ops:renovate/ingress-nginx-4.x
ops:renovate/ghcr.io-rommapp-romm-4.x
ops:renovate/gabehf-koito-0.x
ops:renovate/willshersystems.sshd-0.x
ops:renovate/ghcr.io-prometheus-community-charts-prometheus-operator-crds-30.x
No reviewers
Labels
Clear labels
No items
No labels
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set.
Reference
ops/homelab!91
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "renovate/ghcr.io-rommapp-romm-5.x"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
This PR contains the following updates:
4.4.1→5.4.1Release Notes
rommapp/romm (ghcr.io/rommapp/romm)
v5.4.1Compare Source
What's Changed
New Contributors
Full Changelog: https://github.com/rommapp/romm/compare/5.4.0...5.4.1
v5.4.0Compare Source
Technical changes
🌎 ENVIRONMENT VARIABLES
Notifications and email
-SMTP_FROMare set587---romm@example.comstarttlsstarttls,tls(implicit TLS, usually port 465) ornoneAudit log
900keeps them foreverLibrary conversion
false?format=download conversions6002Devices and sync
true20waits foreverwin,win3x,win9x,windows-apps{}Scheduled cleanups
true*/30 * * * *true0 * * * *true0 4 * * *true23 * * * *General
-*allows any origin but never credentials*false18060📡 API CHANGES
| Change | Description | | --- | --- | | ⚠️ CORS denied by default | `ROMM_CORS_ALLOWED_ORIGINS` now defaults to empty instead of `*`; browser clients on another origin must be allowlisted (#4699) | | CORS wildcard drops credentials | With `*` in `ROMM_CORS_ALLOWED_ORIGINS`, responses no longer send `Access-Control-Allow-Credentials` (#4699) | | Invalid credentials are unauthenticated | A malformed Basic header or an invalid/expired JWT bearer no longer 500s; the request proceeds unauthenticated and gets the route's 401/403 (#4799) | | ⚠️ `PermissionGroupSchema.is_system` removed | Replaced by `system_key` (`SystemGroupKey` or null) (#4767) | | Age limits on permissions | `PermissionGroupSchema/Create/Update` and `UserPermissionsSchema/Update` gain `age_limit`, `hide_unrated_roms`; updates apply them only with `set_age_settings: true` (#5081) | | Collection `rom_count` is computed | `rom_count` on collection, smart and virtual collection schemas is now read-only, derived from the visible `rom_ids` (#4930) | | ⚠️ Collection name errors | Duplicate name on create or rename returns 409 (was 500); names over 400 chars return 422 (#4997) | | ⚠️ `GET /api/netplay/list` | Scope `assets.read` - `roms.read`; `game_id` is now an integer ROM id, 404 for a missing or hidden ROM (#4700) | | ⚠️ Netplay socket rooms | `open-room` and password-less `join-room` require a signed-in user with `roms.read` who can see the ROM; the room password moved from `extra.room_password` to top-level `password` (#4700) | | ⚠️ `GET /api/play-sessions` | Without `devices.read`, only allowed when `device_id` equals the calling token's device; no longer defaults `device_id` from the token (#4956) | | ⚠️ `PlaySessionSchema.sync_session_id` removed | Field dropped from play session responses (#4670) | | Page params on play and sync sessions | `GET /api/play-sessions` and `GET /api/sync/sessions` use shared page params (`limit` 1 to 10000, `offset`); sync sessions gains `offset` (#4715) | | ⚠️ Sync `delete` operation | `SyncOperationSchema.action` adds `delete` (slot emptied on the server); `SyncNegotiateResponse` adds `total_delete` (#4674) | | `POST /api/sync/negotiate` payload | New `restore_unlisted` and `emulators` fields to re-offer unlisted saves and filter by emulator (#5091) | | Save sync baselines | `POST /api/saves` and `PUT /api/saves/{id}` take a `content_hash` query param; `POST /api/saves/{id}/downloaded` takes `content_hash` in the body (#4768) | | Save/state uploads validated | `emulator` must be a single folder name (max length enforced); file names over 255 bytes return 400; uploads to a hidden ROM return 404 (#4851, #4997) | | `SaveSchema` / `StateSchema` annotations | New `is_favorite` and `labels`; masked to defaults on another user's shared save or state (#4714) | | `StateSchema.core` | New field naming the RetroArch core that wrote the state (#4862) | | ⚠️ `PUT /api/roms/{id}` rename errors | Renaming onto an existing file returns 409 (was 500); an invalid or overlong `fs_name` returns 400 before any metadata fetch (#4997) | | `PUT /api/roms/{id}` manual metadata | `raw_manual_metadata` is validated, 422 when malformed; `ManualMetadata` gains `alternative_names` (#5111) | | `POST /api/roms/{id}/convert-to-folder` | Also returns 409 when an `.m3u` beside the file lists it; upload and walkthrough routes reject the same case (#5076) | | `GET /api/roms` relevance ordering | Empty `order_by` with a search term ranks by relevance on every database; `char_index` is empty under relevance order (#4996) | | `GET/HEAD /api/roms/{id}/content/{file_name}` | New `?format=` for converted single-file downloads (202 + `Retry-After` while converting, 406 when unavailable) (#4999) | | `GET /api/roms/{id}/content/{file_name}` | New `purpose=download\|play` query param, recorded in the audit log (#4748) | | `DetailedRomSchema.download_formats` | Formats the caller can request with `?format=` (#5000) | | `is_easyrpg_game` on ROM schemas | New boolean on `SimpleRomSchema` and `DetailedRomSchema` (#5077) | | Pinned media | `RomUserSchema.pinned_media` and `RomUserData.pinned_media` (ordered media keys, null for default) (#4764) | | ROM metadata fields | LaunchBox box art `box2d_*`/`box3d_*` (url and path), `video_path` now nullable (#5129); SS `physical_disc`/`physical_extra_discs` (#4885); SS and Hasheous `dump_regions/languages/tags` (#4740); RA `hash_match` (#4816) | | `PlatformSchema` | New computed `abbreviation` and `alternative_names` (#5107) | | `MusicTrackSchema.file_name` | New field (#5079) | | `DeviceSchema.capabilities` | New `capabilities` map on device schema and on `POST`/`PUT /api/devices` payloads (#4835) | | `GET /api/heartbeat` | Adds `EMULATION.DISABLE_EASYRPG` (#5077), `NOTIFICATIONS` (#4735), `DEVICE_INSTALL` (#4835), `CONVERTO` (#4999) | | `GET /api/config` | Adds `CONVERTO` and `CONVERTO_LIBRARY_TARGETS` (#4999) | | `POST /api/tasks/run/{task_name}` | Returns 409 when a single-instance task is already queued or running; `TaskInfo` adds `destructive` (#5000) | | `POST /api/reset-password` | Enforces the password policy with 400, leaving the reset link usable (#5106) | | OIDC callback | A provider error redirects to `/login?bypass_autologin=true` instead of 500 (#4746); an account linked to a different provider identity gets 403 (#4892) | | `POST /api/activity/heartbeat` | Returns 404 for a ROM hidden from the caller (#5117) | | ⚠️ `activity:update` socket event | Sent only to users who can see the ROM, instead of broadcast to every client (#5121) | | ⚠️ `scan` socket event payload | Validated strictly (`ScanPayload`, unknown keys rejected); invalid options, no scan worker, or a scan in flight emit `scan:done_ko` (#5014) | | `scan:scanning_rom` | Payload adds `is_new` (#4867) | | `sync:conflict` | Payload adds `rom_name` (#4552) | | Socket session revocation | Logging out or revoking a session disconnects the sockets it opened (#4732) | | Streaming session routes | Control routes take `container` and `claimed_at` query params; launch socket payloads add `claimed_at`, `core`, `core_tier`, import `refusals`; `StreamingContainerSchema` adds `supports_live_states`, `import_kinds`, `state_core`; 409 bodies use `ContainerBusyDetail` (#4631, #4691, #4796, #4859, #4862) |Notifications
/api/notifications/api/notificationsusers.write(#4732)/api/notifications/read/api/notifications/{notification_id}/api/notificationsNotification channels
/api/notification-channels/api/notification-channels/api/notification-channels/{channel_id}/api/notification-channels/{channel_id}/api/notification-channels/{channel_id}/test/api/notification-channels/{channel_id}/confirm/api/notification-channels/{channel_id}/resend-code/api/notification-channels/apprise-services/api/notification-channels/apprise-services/parseAudit events
/api/audit-eventsusers.readsee everyone (#4748)Device installs
/api/devices/online/devicessocket (#4835)/api/devices/{device_id}/installs/api/devices/{device_id}/installs/api/devices/{device_id}/installs/claim/api/devices/{device_id}/installs/{request_id}done,already_installedorfailed(#4835)/api/devices/{device_id}/installs/{request_id}/api/roms/{id}/installsRetroArch Cloud Sync (WebDAV)
/api/sync/retroarch/{path}/api/sync/retroarch/{path}roms/,saves/andstates/(#3904)/api/sync/retroarch/{path}/api/sync/retroarch/{path}/api/sync/retroarch/{path}/api/sync/retroarch/{path}Saves and states
/api/saves/{id}/favoriteis_favoriteon a save (#4714)/api/saves/{id}/labels/api/saves/{id}/file-name/api/states/{id}/favoriteis_favoriteon a state (#4714)/api/states/{id}/labels/api/states/{id}/file-nameCollections
/api/collections/{id}/visibility/api/collections/smart/{id}/visibilityROMs, tasks and config
/api/tasks/scanScanPayloadbody; 202, 409 if one is in flight, 503 with no worker (#5014)/api/roms/{id}/easyrpg/{path}index.jsonand game/RTP files for RPG Maker 2000/2003 games (#5077)/api/config/converto_settingsSocket.IO events
notifications:new/notifications:read/notifications:dismissedinstall:updatedinstall:queued/install:cancelled/devicesnamespace (device-bound client token required) (#4835)activity:refreshHighlights
Notifications
RomM now keeps a notification inbox for each user. Scans and tasks that finish or fail, a role change, or someone ending your stream all leave a notification that is pushed to every open tab and still waits for you the next time you open RomM. Admins can send their own from the Send tab on the Notifications page, and any API client can post one through
POST /api/notifications. #4732Each user can also forward their notifications to channels, filtered by level and topic. A RomM webhook sends a JSON payload (signed with HMAC-SHA256 when you give it a secret), and email works once the
SMTP_*variables are set, which also sends password reset links by email. Admins can additionally pick any of the services Apprise supports, such as Discord, Telegram, Slack, ntfy, Gotify or Matrix, and fill in that service's fields or paste its URL. #4735 #4769RetroArch Cloud Sync
RomM is now a Cloud Sync target for RetroArch. Point RetroArch's Cloud Sync at
https://<your-romm>/api/sync/retroarch/(the trailing slash matters) and sign in with your RomM username and password (setup guide). Saves and states sync straight into your library, web player states show up in RetroArch's numbered load slots, and RetroArch registers itself as one of your devices on its first sync. #3904The config, thumbnails and system file categories sync too, stored per user. PSP save folders are bundled into one save per folder; if a folder's title matches no ROM, map its serial with
SYNC_RETROARCH_PSP_SERIAL_MAP. Generic WebDAV clients can browse the same path read-only. #3931Browser saves sync, and installs on your devices
All five in-browser players (EmulatorJS, EasyRPG, js-dos, PICO-8 and Ruffle) now sync saves through device sync. Each browser profile registers as a device, named like "Firefox on macOS", and negotiates its saves with the server when a game launches, so a save made in one browser is waiting in another and a conflicting copy is archived instead of overwritten. A new Devices page at
/deviceslets you rename your devices, turn sync off for one, or remove it. #5091You can also send a game to a device from the web UI. "Install on device" in a game's menu adds it to the download queue of the devices you pick, and the device downloads it the next time it's online. Only devices whose app reports it accepts installs are listed. Turn the feature off with
DEVICE_INSTALL_ENABLED=false, and keep platforms out of it withDEVICE_INSTALL_EXCLUDED_PLATFORM_SLUGS. #4835Parental controls
Give a permission group an age limit, and its members only see games rated for that age or younger. Each user can replace their group's limit, and a "Hide unrated games" switch hides games no rating covers. Admins are never limited. Set them in the group and user dialogs under Administration. #5081 #5083
A game's age comes from the strictest of its IGDB, ScreenScraper, LaunchBox (ESRB) and Steam ratings, and a manual rating list replaces the providers' ratings. The limit applies everywhere a game can show up: the gallery, search, collections, stats, the Jukebox and feeds. See Parental controls for the details.
Audit log
RomM now records who did what: downloads and player launches, play sessions, uploads and edits, collection changes, scans and tasks, and security events like sign-ins, failed sign-ins and permission changes. Admins read it in the new Events tab under Settings › Logs, filtered by user, category and date, with a search over names and IP addresses. Events are kept for 90 days, set by
AUDIT_LOG_RETENTION_DAYS(0keeps them forever). See Audit log for everything that's recorded. #4748Library conversion with rom-converto
Pick a storage format per platform, and the new "Convert library" task converts every matched game on it in place, so a game keeps its saves and collections. Only lossless conversions are offered, and because the task deletes the originals it asks you to type a confirmation first. Set
ROM_CONVERTO_ENABLED=trueand choose formats under the new Conversion settings page, or inconfig.yml(setup guide). #4999With
download_conversion_enabledon, the game page's More menu offers "Download as" in any format the file can be converted to, and clients can ask for one with?format=on the download URL. #5000RPG Maker 2000/2003 in the browser
RPG Maker 2000 and 2003 games on the
rpg-makerplatform now play in the browser on the EasyRPG web player. The free EasyRPG RTP ships with it, so games that rely on the RTP start, though some assets (mostly in battles) are missing from it. Games need to be extracted folders, since the web player can't read archives. Disable it withDISABLE_EASYRPG. #5077Alternative titles and relevance in search
Search now matches the alternative titles your metadata providers know about, including localized names, so a Japanese title finds the game listed under its English name and the other way around. You can add your own in the new "Alternative titles" field of the Edit dialog, such as "ACNH" or a fan translation's name. Already matched IGDB and Hasheous games pick up their regional titles on their next metadata refresh. #5111
The Search page also orders results by relevance until you pick a sort, with exact title matches first. #4995 #4996
Minor changes
activetoggle state to RBtn by @sdornan in #5090Fixes
Other changes
New Contributors
Full Changelog: https://github.com/rommapp/romm/compare/5.3.1...5.4.0
v5.3.1Compare Source
Minor changes
Fixes
Other changes
frontend/scripts/**/*.tsby @andest01 in #4575Full Changelog: https://github.com/rommapp/romm/compare/5.3.0...5.3.1
v5.3.0Compare Source
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. #3571ROM 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
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-dosand its DOSBox-X backend. Note thatjs-dossaves stay in your browser and are not synced back to the server. #4061PICO-8 cartridges (
.p8and.p8.png) are also now playable, on FAKE-08, with keyboard + mouse, gamepad, or touch input. #4400Docs: js-dos, PICO-8
Four new metadata sources
Steam is now a metadata source for the
win,linuxandmacplatforms, 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 #4500Demozoo, 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. #4221Docs: 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_bootupto boot only the disc you launched, if a core mishandles the batch. #3988You 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. #4452Docs: 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=truein your env vars. #4174Docs: 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
autosaveslot, 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 toMAX_SAVES_PER_SLOT(50 by default). #4517 #4540In-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
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_ENABLEDand a scan that matched the game. #4392Docs: Game length
Minor changes
Fixes
Other changes
New Contributors
Full Changelog: https://github.com/rommapp/romm/compare/5.2.0...5.3.0
v5.2.0Compare Source
Minor changes
Fixes
.xdeltasupport to server-side ROM patcher and v2 patcher UI by @gantoine with @Copilot in #4215Other changes
New Contributors
Full Changelog: https://github.com/rommapp/romm/compare/5.1.0...5.2.0
v5.1.0Compare Source
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
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. #3838Scan settings UI
Brand new UI to edit the whole
scan.*section ofconfig.yml. #3854Manual 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
scan.priority.region_modeto let config regions drive media selection by @gantoine in https://github.com/rommapp/romm/pull/3917Fixes
Other changes
New Contributors
Full Changelog: https://github.com/rommapp/romm/compare/5.0.0...5.1.0
v5.0.0Compare Source
Highlights
UI overhaul
A ground-up redesign of the UI, with a new design system, fresh visual language, and a universal input model that feels at home with mouse, touch, keyboard and gamepad alike. With a stronger emphasis on performance, responsiveness, ease-of-use and accessibility, the new UI should be a joy on any device. #3436
Shared savestates
Share your game saves and savestates with other users; useful for speedrunning, special unlocks, new game +, or just showing off your progress. #3569
Interactive 3D boxart
Boxart go weeeeeeeeeeeeeeeeeeeeeeeeeeeee! #3580
CRT mode
Take me back to the 90s with a CRT shader that simulates the look of those old displays we love dearly. #3552
Server-side ROM patching
We've unlocked the full power of ROM patching by moving it to the server. Simply apply patches to your ROMs, now with the option to use stored or uploaded patch files. #3225
QR code pairing
Quickly pair your PC, TV or handheld device with your server by scanning a QR code (currently available on Argosy Launcher and Playnite). #3308
Real-time logs
Tired of SSHing into your server to tail the logs when something breaks? Now you can view the backend logs in real-time directly from the web UI. #3557
Controller debug view
Test your controller inputs and mappings in real-time with a new debug view. #3581
Changelog preview
A quick peak at the changes in the current version, with links to the full changelog. #3560
Granular permission system
Tweak access to your library with per-user and per-group permissions, with one configurable default group for new users. Tri-state grant/revoke on top of the group, and per-entity overrides, allow for fine-grained control over who can see what. #3605
Music player
Music files stored within a ROMs'
soundtrackfolder can now be played directly from details page (#3610), and queried directly from the API (#3640). This opens the door to future features like background music playback and soundtrack playlists.Minor changes
<sortname>import and edit support for ROM ordering by @gantoine in https://github.com/rommapp/romm/pull/3460Fixes
v*tags by @gantoine in https://github.com/rommapp/romm/pull/3658fix(scan): strip leading dot from dot-separated version tags by @TowyTowy in https://github.com/rommapp/romm/pull/3751
Other changes
New Contributors
Full Changelog: https://github.com/rommapp/romm/compare/4.9.2...5.0.0
v4.9.2Compare Source
What's Changed
Full Changelog: https://github.com/rommapp/romm/compare/4.9.1...4.9.2
v4.9.1Compare Source
What's Changed
Full Changelog: https://github.com/rommapp/romm/compare/4.9.0...4.9.1
v4.9.0Compare Source
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.ymlvia thescan.priority.artworklist. #3252Pegasus metadata export
You can now auto-export a Pegasus compatible
metadata.pegasus.txtfile, just like the existinggamelist.xmlexport. Enable it in yourconfig.ymlfile by settingscan.export.pegasusto true, and it should appear in each platform folder (alongside your ROMs). #3153Notable changes
Fixes
cusregion in default ScreenScraper fallback regions by @gantoine in #3273DISABLE_EMULATOR_JSto Console mode (disable Play + block direct player route) by @gantoine in #3373gamelist.xmlexport to use relative media paths for local exports by @gtronset in #3369<alternativeEmulator>tags during gamelist.xml import by @gantoine in #3421<folder>entries in gamelist.xml metadata import by @gantoine in #3422miximage_v2media type to explicitly select SS.fr mixrbv2 by @gantoine in #3446Other changes
rom_files(rom_id)to fix slow game listing on large ROM sets by @gantoine in #3259job.get_id()withjob.idfor rq >= 2.7.0 compatibility by @gantoine in #3320New Contributors
Full Changelog: https://github.com/rommapp/romm/compare/4.8.1...4.9.0-beta.1
v4.8.1Compare Source
What's Changed
/api/tasks/statusaftercleanup_missing_romstask completes by @gantoine in #3214New Contributors
Full Changelog: https://github.com/rommapp/romm/compare/4.8.0...4.8.1
v4.8.0Compare Source
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
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
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
Minor changes
video_normalizedmedia type option for ScreenScraper scans by @gantoine in https://github.com/rommapp/romm/pull/3088Fixes
Other changes
New Contributors
Full Changelog: https://github.com/rommapp/romm/compare/4.7.0...4.8.0
v4.7.0Compare Source
Highlights
Auto-export
gamelist.xmlAutomatically generate an ES-DE compatible
gamelist.xmlfile during scans by enabling the option in yourconfig.yml. This will place the newgamelist.xmlfile within the platform folder for selected/discovered platforms.@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
OIDC_AUTOLOGIN=trueenv var to automatically login using OIDC by @pR0Ps in #2969|by @gantoine in #2996zelda|mario|sonicwould show all games withzelda,marioORsonicin the namePKGJfeed endpoints in.tsvformat by @gantoine in #2986GET /api/feeds/pkgj/psp/gamesGET /api/feeds/pkgj/psp/dlcGET /api/feeds/pkgj/psvita/gamesGET /api/feeds/pkgj/psvita/dlcGET /api/feeds/pkgj/psx/gamesFixes
Other changes
New Contributors
Full Changelog: https://github.com/rommapp/romm/compare/4.6.1...4.7.0
v4.6.1Compare Source
What's Changed
Full Changelog: https://github.com/rommapp/romm/compare/4.6.0...4.6.1
v4.6.0Compare Source
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
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
Patcher.js
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:#2873
Minor changes
Fixes
filesfrom model_dump in scan by @gantoine in #2914Other changes
WEB_SERVER_GUNICORN_WAITenv var for slow systems by @gantoine in #2887New Contributors
Full Changelog: https://github.com/rommapp/romm/compare/4.5.0...4.6.0
v4.5.0Compare Source
Highlights
Netplay
The incredibly smart and beautiful people over at the EmulatorJS project have added Netplay to their client, allowing you to play with your friends on the same instance over the internet! Enable netplay and configure the STUN/TURN servers in your
config.yml:To host a game, start it, then hit the 🌐 icon in botton bar. Set your name, create a room (password optional), and other players should be able to see and join your room. All players need access to your RomM server to join a room and play together. #2728
Multiple notes
You've begged for it, and boy did we ever delivered! Write and store multiple notes for each game, with full mark down support; sharable, swapable, and easily identified with the 📝 icon. #2665
Metadata locale selection for IGDB and ScreenScraper
You can now set the order of your preferred locales/regional variants when fetching metadata from IGDB and ScreenScraper. The options below are available and can be set in your
config.yml. #2700Minor changes
filesystem.skip_hash_calculationinconfig.ymlby @zurdi15 in https://github.com/rommapp/romm/pull/2703Fixes
OIDC_USERNAME_ATTRIBUTEby @gantoine in https://github.com/rommapp/romm/pull/2755Behind-the-scenes
New Contributors
Full Changelog: https://github.com/rommapp/romm/compare/4.4.1...4.5.0
Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR has been generated by Mend Renovate.
Update ghcr.io/rommapp/romm Docker tag to v5to chore(deps): update ghcr.io/rommapp/romm docker tag to v5chore(deps): update ghcr.io/rommapp/romm docker tag to v5to Update ghcr.io/rommapp/romm Docker tag to v5Update ghcr.io/rommapp/romm Docker tag to v5to chore(deps): update ghcr.io/rommapp/romm docker tag to v50c45155d59tobc2c3b510dbc2c3b510dto9b45a743a6flate diff
No differences detected.
Pipeline
9b45a743a6a1cd32f9abflate diff
Pipeline
a1cd32f9aba0b32e275dflate diff
No differences detected.
Pipeline
View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.Merge
Merge the changes and update on Forgejo.