github rommapp/romm 5.0.0

5 hours ago
romm-5 0-banner

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

Jul-11-2026 14-55-17

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' soundtrack folder 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

Fixes

  • fix: Refresh platforms on scan by @zurdi15 in #3555
  • Handle missing ROM files during delete-from-filesystem requests by @zurdi15 in #3562
  • fix: guard SiblingBadge against missing sibling_roms (scan crash with Group ROMs) by @androosio in #3568
  • Permission fix for exported game lists and Pegasus platform slugs mapping by @ametis70 in #3587
  • fix(platform): accept embedded custom_name body on platform update by @gantoine in #3597
  • fix(webp): backfill cover conversion on startup when enabled by @gantoine in #3602
  • fix(scan): prevent duplicate ROM entries from racing scans by @gantoine in #3606
  • fix(scan): make scan tracker totals reflect platforms actually scanned by @gantoine in #3607
  • Fix state/save injection timing and corruption in EmulatorJS by @gantoine in #3624
  • fix(scan): Normalize Sony serial codes to uppercase before cache lookup by @gantoine in #3622
  • Fix ROM name handling in UNMATCHED scans to replace placeholders by @gantoine in #3623
  • fix(backend): load platform_id on siblings to avoid DetachedInstanceError by @gantoine in #3635
  • Fix ROM upload temp directory to use RESOURCES_BASE_PATH by @gantoine in #3632
  • fix(roms): namespace filter-values cache by schema version by @Spinnich in #3638
  • fix(retroachievements): match MSX2 against RetroAchievements (#3644) by @Spinnich in #3645
  • fix(retroachievements): match Famicom Disk System (FDS) against RetroAchievements by @Spinnich in #3647
  • fix(retroachievements): match SuperGrafx against RetroAchievements by @Spinnich in #3652
  • Fix typo in core mapping from 'zsx' to 'zxs' by @sildur in #3656
  • Refine filename version-tag parsing to avoid swallowing generic v* tags by @gantoine in #3658
  • fix: make 1.8 migration re-entrant so fresh installs stop crash-looping on MariaDB by @mvanhorn in #3669
  • fix(retroachievements): hash GameCube and Wii RVZ/WIA images natively by @Spinnich in #3657
  • fix(collections): download whole collections as a single zip by @Spinnich in #3661
  • fix: display selected firmware in player by @chiyi-creator in #3673
  • fix: stop mapping Public Domain ROMs to Poland by @chiyi-creator in #3671
  • fix: allow NAT64-wrapped public IPs through SSRF filter by @gantoine in #3675
  • Use parsed filename for unmatched ROM titles instead of raw filename by @gantoine in #3681
  • fix(scan): fall back to other providers when ScreenScraper quota is exhausted by @gantoine in #3686
  • fix(launchbox): import local media when matching via update_rom by @gantoine in #3687
  • feat: default UI language to browser language when available by @gantoine in #3690
  • fix(platforms): stop platform variants from renaming the parent platform by @gantoine in #3693
  • fix: generate virtual collections from all metadata sources by @gantoine in #3694
  • fix(sockets): require TASKS_RUN scope for scan and scan:stop by @gantoine in #3698
  • fix(roms): enforce parent ROM visibility on direct file endpoints by @gantoine in #3703
  • fix(backend): correct M4A embedded cover extraction and validation by @VoidHandler in #3705
  • fix(launchbox): match remote cover art region to ROM region by @gantoine in #3709
  • fix(backend): serve PDF/Markdown manuals inline so the viewer can render them by @gantoine in #3714
  • fix: surface config.yml parse errors instead of silently using defaults by @gantoine in #3713
  • fix(frontend): restore manual display and extract ManualSubtab by @gantoine in #3717
  • Fixed the translation of "player-count" by @wolfg1969 in #3719
  • fix(scan): make Hasheous and SteamGridDB scan lookups fault-tolerant in the metadata handlers by @TowyTowy in #3716
  • fix(backend): discard ScreenScraper chroma-key green placeholder art by @gantoine in #3724
  • fix(frontend): restore manual display and extract ManualSubtab by @gantoine in #3717
  • Fixed the translation of "player-count" by @wolfg1969 in #3719
  • fix(scan): make Hasheous and SteamGridDB scan lookups fault-tolerant in the metadata handlers by @TowyTowy in #3716
  • fix(backend): discard ScreenScraper chroma-key green placeholder art by @gantoine in #3724
  • fix(ui): remove cover-art attribution link on details pages by @gantoine in #3737
    fix(scan): strip leading dot from dot-separated version tags by @TowyTowy in #3751

Other changes

  • fix(search): full-text indexes+caching by @bonofiglio in #3540
  • Integrate Hypothesis property-based testing for the backend by @gantoine in #3403
  • feat: backend connection status notice + offline-aware boot by @zurdi15 in #3550
  • Run backend tests in parallel with pytest-xdist by @gantoine in #3559
  • feat(auth): add OIDC_ALLOW_REGISTRATION toggle to gate OIDC auto-registration by @Spinnich in #3577
  • docs: split frontend constitution into focused agent skills, make CLAUDE.md holistic by @gantoine in #3581
  • Exclude served resources from Vite dev watcher by @gantoine in #3586
  • Add test data generator script by @gantoine in #3585
  • Test Build GitHub Action improvements by @ametis70 in #3588
  • fix(deps): bump dependencies to patch reported vulnerabilities by @gantoine in #3592
  • Turkish language support tr_TR by @y1lm-z in #3593
  • perf(roms): speed up the gallery/search list endpoint on large libraries by @gantoine in #3595
  • Stop spamming PRs with coverage reports by @gantoine in #3625
  • Squash legacy migrations by @gantoine in #3670
  • docs(claude): add PR linking and template conventions by @gantoine in #3682
  • i18n: rename "Duplicates" filter to "Versions" in the UI by @gantoine in #3688
  • test: add axe accessibility gate + keyboard nav tests to Storybook by @gantoine in #3691
  • docs(sync): clarify slot pairing behavior in negotiate OpenAPI spec by @gantoine in #3699
  • feat(playmatch): move integration to API v2 by @DevYukine in #3689
  • ci: fail PRs that modify the frozen frontend v1 UI by @gantoine in #3723
  • Hotfix upload buttons in media tabs by @gantoine in #3732
  • ci: fail PRs that modify the frozen frontend v1 UI by @gantoine in #3723
  • Add Freegosy to community tab in README by @abduznik in #3729
  • Update README featured projects by @QuaiGoner in #3738
  • feat: inject ScreenScraper dev credentials at build time by @gantoine in #3740
  • build(deps): bump python-engineio from 4.12.2 to 4.13.2 by @dependabot[bot] in #3626
  • build(deps): bump joserfc from 1.6.3 to 1.6.7 by @dependabot[bot] in #3627
  • build(deps): bump python-socketio from 5.14.0 to 5.16.2 by @dependabot[bot] in #3628
  • chore(deps): bump joserfc from 1.6.7 to 1.6.8 by @dependabot[bot] in #3672

New Contributors

Full Changelog: 4.9.2...5.0.0

Don't miss a new romm release

NewReleases is sending notifications on new releases.