Skip to content

[Feature Request] Screensaver Mode — shuffle playback of ROM media (screenshots, box art, videos) #3499

Description

@yamanobe96

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.

Image Image Image

Metadata

Metadata

Assignees

No one assigned

    Labels

    ui/uxUI/UX improvements or suggestions

    Fields

    No fields configured for Feature.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions