Is your feature request related to a problem? Please describe.
When RomM is running on a home server connected to a TV or large display, there is no way to showcase the library passively. The library just sits idle. Many game storefronts and media centers have an "attract mode" or screensaver that cycles through media — RomM has no equivalent. I find myself wanting to leave RomM visible on a screen, but there is nothing to show without manually navigating.
Describe the solution you'd like
A Screensaver Mode — a dedicated page or sidebar-accessible mode that randomly cycles through ROM media (screenshots, box art, and/or videos) for selected platforms.
Proposed controls and behavior:
- Platform selection — choose one or more platforms, or All; platforms with more ROMs are selected proportionally (weighted random) so the distribution reflects library size
- Media type selection — Screenshots, Box art, Video — independently toggleable; separate display intervals for images and videos
- Overlay — game title, platform name, and media type displayed over the media during playback
- Keyboard controls — Space to pause/resume, → to skip to next, Esc to stop
- Volume control — slider for video audio
- Images use
object-fit: contain (letterboxed, no cropping); Videos use object-fit: contain as well
- Smooth crossfade transition between items
- Background pre-fetch: the next ROM is fetched during the current item's display interval, so transitions are immediate
The mode should be accessible from the sidebar (similar to the existing Random button) and ideally support a URL parameter ?platforms={id1},{id2} so that clicking the screensaver button from a platform page (/platform/{id}) pre-selects that platform automatically.
No new backend endpoints are required. All necessary data is already available:
| Need |
Existing endpoint / field |
| Platform list |
GET /api/platforms |
| Random ROM from platform |
GET /api/roms?platform_ids={id}&limit=1&offset={n} |
| Screenshot URLs |
rom.merged_screenshots (array) |
| Box art URLs |
rom.path_cover_large / rom.path_cover_small |
| Video URL |
rom.path_video → /assets/romm/resources/ + value |
| Platform name |
rom.platform_display_name |
Note: During implementation I found that GET /api/roms?platform_id={id} (singular) does not filter by platform — it returns all ROMs with total equal to the full library count (22,280 in my case). The correct working parameter is platform_ids (plural). This may be worth documenting or fixing as a separate issue.
Describe alternatives you've considered
- External slideshow tools (e.g. Chromecast, digital signage software): require exporting media out of RomM and lose the game title / platform metadata overlay.
- Browser extensions / custom CSS: cannot provide the shuffle logic or API integration.
- Standalone HTML prototype served from
custom/: this is what I currently use as a workaround. I built a fully working prototype that connects to the RomM API using the existing session cookie (same-origin, no separate authentication required). It implements all of the features described above. While functional, it lives outside the RomM UI and requires manual setup — a proper integrated implementation would be far more accessible to other users.
Additional context
I built and tested a working prototype against a live RomM instance (30 platforms, ~22,000 ROMs). The prototype demonstrates:
- Platform-weighted random selection
- Per-media-type intervals (images and videos on separate timers)
- Background pre-fetch for seamless transitions
- Video audio playback with muted fallback for browsers that block autoplay
- Sidebar button injection via
MutationObserver with platform auto-selection from URL parameter
- Full keyboard control
- Screensaver session logging would also be valuable: a single
POST /api/screensaver/session entry per launch (not per ROM displayed) would allow users to track their own screensaver usage history, separate from actual gameplay records.
The prototype is implemented as ~500 lines of vanilla HTML/JS with no dependencies. The same logic could be implemented as a Vue component reusing existing Vuetify UI patterns already present in the codebase.
Screenshots and a screen recording of the prototype are available if helpful. I am also happy to collaborate on a proper Vue component implementation.

Is your feature request related to a problem? Please describe.
When RomM is running on a home server connected to a TV or large display, there is no way to showcase the library passively. The library just sits idle. Many game storefronts and media centers have an "attract mode" or screensaver that cycles through media — RomM has no equivalent. I find myself wanting to leave RomM visible on a screen, but there is nothing to show without manually navigating.
Describe the solution you'd like
A Screensaver Mode — a dedicated page or sidebar-accessible mode that randomly cycles through ROM media (screenshots, box art, and/or videos) for selected platforms.
Proposed controls and behavior:
object-fit: contain(letterboxed, no cropping); Videos useobject-fit: containas wellThe mode should be accessible from the sidebar (similar to the existing Random button) and ideally support a URL parameter
?platforms={id1},{id2}so that clicking the screensaver button from a platform page (/platform/{id}) pre-selects that platform automatically.No new backend endpoints are required. All necessary data is already available:
GET /api/platformsGET /api/roms?platform_ids={id}&limit=1&offset={n}rom.merged_screenshots(array)rom.path_cover_large/rom.path_cover_smallrom.path_video→/assets/romm/resources/+ valuerom.platform_display_nameDescribe alternatives you've considered
custom/: this is what I currently use as a workaround. I built a fully working prototype that connects to the RomM API using the existing session cookie (same-origin, no separate authentication required). It implements all of the features described above. While functional, it lives outside the RomM UI and requires manual setup — a proper integrated implementation would be far more accessible to other users.Additional context
I built and tested a working prototype against a live RomM instance (30 platforms, ~22,000 ROMs). The prototype demonstrates:
MutationObserverwith platform auto-selection from URL parameterPOST /api/screensaver/sessionentry per launch (not per ROM displayed) would allow users to track their own screensaver usage history, separate from actual gameplay records.The prototype is implemented as ~500 lines of vanilla HTML/JS with no dependencies. The same logic could be implemented as a Vue component reusing existing Vuetify UI patterns already present in the codebase.
Screenshots and a screen recording of the prototype are available if helpful. I am also happy to collaborate on a proper Vue component implementation.