RomM logo

RomM

Beautiful, powerful, self-hosted rom manager and player

Alternative to: antstream arcade


About Versions (100)

5.0.0-beta.1

2026-07-04
romm-5 0-banner

[!WARNING] This is the first beta of v5.0.0. It ships a brand-new frontend that lives alongside the current one. Expect rough edges, and please report anything you find. The new UI is still on beta: enable it from your user settings (UI version). The classic UI remains the default and is untouched.

[!NOTE] Environment Variables

OIDC_ALLOW_REGISTRATION: Gate automatic user registration on OIDC login (default false) DISABLE_LOGS_VIEWER: Disable the logs viewer for every user, including admins (default false)

Highlights

A brand-new frontend

v5 kicks off the biggest visual overhaul in RomM’s history: a ground-up frontend with a new design system, a fresh visual language, and a universal input model that feels at home with mouse, touch, keyboard and gamepad alike. This first beta is your early look, opt in and let us know what you think. #3436

[!NOTE] Controller support

This new frontend has been designed to make it controller friendly from the beginning. Some controls and navigation has been already implemented but it’s half baked, not every piece of the UI is wired to the controller yet.

home details image

Live playing sessions

See what’s being played, as it happens. Active game sessions are now tracked in real time, so you always know what’s running across your library. #3272

active_sesisons

Live logs

Tail your server logs straight from the UI, streamed live, now with semantic module names and a module filter to cut through the noise. Debugging a scan or a player issue no longer means digging through the container. #3557 #3578

logs

Shared savestates

Pick up where someone else left off. Saves and savestates can now be shared with other users, so progress travels with the game instead of being locked to a single device. #3569

shared_save

Shared screenshots

Captured a great moment? Screenshots are now first-class shared assets, complete with the uploader’s avatar, making it easy to show off (or get help with) what’s happening on screen. #3549

shared

Interactive 3D boxart

Covers get a new dimension. Boxart can now be rendered as an interactive 3D box on the game detail hero, bringing a bit of shelf-appeal back to your digital collection. Can be enabled selecting 3D box boxart in the UI settings. #3580

3d

Overlay debug mode

A new debug overlay draws live diagnostics right on top of the UI, perfect for tracking down layout and rendering issues without leaving the app. It can be enabled from the UI settings #3554

debug_ui

Controller debug view

Wondering if your gamepad is mapped correctly? The new controller debug view shows inputs as you press them, making setup and troubleshooting a breeze. #3436

controller_debug

Changelog preview

What’s new is now front and center. A built-in changelog dialog, reachable from the user menu, surfaces release highlights directly in the app so you never miss what changed. #3436

changelog

QR auth for TV-like devices

Signing in on a TV or other input-limited device just got painless. RomM now implements the OAuth device authorization flow (RFC 8628): scan a QR code with your phone to pair and authenticate, no on-screen keyboard wrestling required. #3308

[!NOTE]

API Changes

5.0.0 is a major release with several breaking changes (⚠️) and large new subsystems: a fine-grained permissions engine, an OAuth device-authorization flow, a music library, an activity feed, a logs viewer, and first-class ROM soundtracks / screenshots / manuals / patching.

New endpoints

Device authorization (OAuth device flow) - new device_auth.py

  • POST /api/auth/device/init (public): start a device-auth request; returns device_code, user_code, polling interval.
  • POST /api/auth/device/token (public): poll/exchange a device_code for an access token.
  • GET /api/auth/device/pending/{user_code}: details of a pending request for approval.
  • POST /api/auth/device/approve: approve with approved_scopes.
  • POST /api/auth/device/deny: deny a pending request.

Permissions engine - new permissions.py

  • GET /api/permissions/catalog: available entities + actions.
  • GET /api/permissions/me: current user’s effective grants + hidden entities.
  • GET /api/permissions/groups: list permission groups.
  • POST /api/permissions/groups: create a permission group.
  • PUT /api/permissions/groups/{id}: update a permission group.
  • DELETE /api/permissions/groups/{id}: delete a permission group.
  • GET /api/permissions/users/{user_id}: get a user’s group + overrides + hidden entities.
  • PUT /api/permissions/users/{user_id}: update a user’s permission group and overrides.
  • POST /api/permissions/hidden: hide an entity for a user or group.
  • DELETE /api/permissions/hidden: un-hide an entity.

Music library - new music.py

  • GET /api/music/tracks: paginated music-track listing (with facet filters).
  • GET /api/music/albums
  • GET /api/music/artists
  • GET /api/music/genres
  • GET /api/music/years

Activity feed - new activity.py

  • GET /api/activity: global activity feed.
  • GET /api/activity/rom/{rom_id}: activity for a single ROM.
  • POST /api/activity/heartbeat: report an active play-session heartbeat.
  • DELETE /api/activity/heartbeat: end a play session / clear heartbeat.

Logs viewer - new logs.py

  • GET /api/logs: fetch application log entries (gated by the new DISABLE_LOGS_VIEWER config flag).

ROM soundtracks - new roms/soundtrack.py

  • GET /api/roms/{id}/soundtracks/metadata: track metadata for a ROM’s soundtrack files.
  • POST /api/roms/{id}/soundtracks: upload soundtrack file(s).
  • DELETE /api/roms/{id}/soundtracks/{file_id}: delete a soundtrack file.

ROM screenshots - new roms/screenshot.py

  • POST /api/roms/{id}/screenshots: upload screenshot(s).
  • DELETE /api/roms/{id}/screenshots/{file_id}: delete a screenshot file.

ROM manuals - new roms/manual.py

  • POST /api/roms/{id}/manuals/files: upload manual file(s).
  • DELETE /api/roms/{id}/manuals/files/{file_id}: delete a manual file.
  • POST /api/roms/{id}/manuals/redownload: re-fetch the manual from the metadata source.

ROM patching - new roms/patch.py

  • POST /api/roms/{id}/patch: apply a patch file (PatchRequest) to produce a patched ROM.

Other ROM endpoints

  • GET /api/roms/{id}/simple: lightweight SimpleRomSchema fetch for a single ROM.
  • POST /api/roms/{id}/convert-to-folder: convert a single-file ROM into a multi-file (folder) ROM.

Asset visibility & content serving

  • PUT /api/saves/{id}/visibility: set a save public/private ({ is_public }).
  • PUT /api/states/{id}/visibility: set a state public/private ({ is_public }).
  • GET /api/states/{id}/content: download a state’s binary content.
  • PUT /api/screenshots/{id}: update a screenshot (visibility).
  • DELETE /api/screenshots/{id}: delete a screenshot.
  • GET /api/screenshots/{id}/content: download a screenshot’s binary content.
  • GET /api/users/{id}/avatar: serve a user’s avatar image.

Changed endpoints

ROM schemas (affect GET /api/roms, GET /api/roms/{id}, and related listings)

  • SimpleRomSchema and DetailedRomSchema: added name_sort_key, has_manual_files, has_soundtrack.
    • SimpleRomSchema also added screenshot_path.
    • DetailedRomSchema also added all_user_saves, all_user_states, all_user_screenshots.
  • SiblingRomSchema: added is_main_sibling.
  • RomFileSchema: added is_top_level and track_meta (music metadata).
  • RomFiltersDict: added tags.
  • ⚠️ RomFileCategory enum: added soundtrack and screenshot.
  • PUT /api/roms/{id} (Body_update_rom): added name_sort_key.
  • RomGamelistMetadata: added sort_name.

Platforms

  • ⚠️ PlatformSchema: removed aspect_ratio.
  • ⚠️ PUT /api/platforms/{id} (Body_update_platform): removed aspect_ratio.

Saves / States / Screenshots

  • SaveSchema and StateSchema: added is_public.
  • ScreenshotSchema: added is_gallery and is_public.

Users / auth / devices

  • ⚠️ Role enum: viewer | editor | adminuser | admin (roles collapsed; permissions now handled by the new permissions engine).
  • UserSchema: added permission_group_id.
  • UserNoteSchema: added user_avatar_path, user_updated_at.
  • DeviceSchema: added client_device_identifier.
  • ClientTokenSchema / ClientTokenCreateSchema / ClientTokenAdminSchema: added device_id; ClientTokenAdminSchema also added user_avatar_path, user_updated_at.
  • SyncNegotiatePayload: device_id is now optional (was required).

Config / metadata

  • FrontendDict: added DISABLE_LOGS_VIEWER.
  • MetadataMediaType enum: added box2d_side.

Removed endpoints

  • ⚠️ GET /api/raw/assets/{path:path} - removed (the whole raw.py router is gone).
  • ⚠️ HEAD /api/raw/assets/{path:path} - removed.
    • Generic raw-asset serving is replaced by dedicated content endpoints: GET /api/screenshots/{id}/content, GET /api/states/{id}/content, and GET /api/users/{id}/avatar.

What’s Changed

New Contributors

Full Changelog: https://github.com/rommapp/romm/compare/4.9.2…5.0.0-beta.1