Claude b5f457b53a feat: replace subfolder flag with per-platform custom library structure
Generalizes the opt-in subfolder scanning into a per-platform custom
library structure template, modeled on Retrom's. Replaces the
`scan.subfolders` (bool | list) flag with `filesystem.structure`
(fs_slug -> template); platforms without a template keep RomM's default
discovery (top-level files and folders), so existing setups are unaffected.

A template is relative to the platform's ROM folder (RomM already resolves
the library root, roms_folder and platform directory) and is a sequence of
`/`-separated path sections:

  - a braced section is a macro, a bare section is a literal folder matched
    exactly;
  - the last section must be the terminal {gameFile} (each file is a game) or
    {gameDir} (each folder is a single multi-file game);
  - any other braced section ({region}, {category}, ...) is a wildcard
    directory level that matches any folder (organizational only).

Examples:
  filesystem:
    structure:
      nes: "{category}/{gameFile}"   # roms/nes/Hacks/foo.nes
      ps3: "{category}/{gameDir}"    # roms/ps3/PSN/Game/
      snes: "{region}/{gameFile}"    # roms/snes/USA/foo.sfc

Declaring {gameFile} vs {gameDir} removes the previous disc-descriptor
guessing entirely — the user states file-vs-folder. Hidden (dot-prefixed)
folders are never descended into. Hash-based non-destructive identity
(relocate a moved/renamed game in place, preserving saves/history/favorites/
collections) is retained and now triggers for any platform with a custom
structure.

- config: parse + validate templates at load (parse_library_structure,
  LibraryStructure); reject {platform}/{library} (RomM resolves those) and
  malformed templates.
- fs handler: _discover_structured_roms walks literal/wildcard levels to the
  terminal; _discover_default_roms preserves the default behavior.
- Tests: template parser (valid/invalid), per-platform config loading, and
  structured discovery (wildcard/literal levels, file/dir terminals, depth>1,
  hidden-folder skip, cross-folder name collisions). Subfolder-flag tests
  replaced.
- Docs: config.example.yml documents filesystem.structure; scan.subfolders
  removed.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Sk2dzM3K9qxWBdPAeGb7us
2026-06-21 22:01:05 +00:00
2026-04-15 19:20:17 -04:00
2025-07-03 23:37:00 -03:00
2024-05-21 19:22:14 -04:00
2026-06-07 09:16:50 -04:00
2026-06-07 13:03:23 -04:00
2024-02-11 16:41:36 +01:00
2026-04-01 20:49:08 -04:00
2024-07-09 13:43:14 +02:00
2026-06-20 16:21:20 +00:00

romm logo

A beautiful, powerful, self-hosted ROM manager and player.

discord-badge-img docs-badge-img license-badge-img release-badge-img docker-pulls-badge-img

Overview

RomM (ROM Manager) allows you to scan, enrich, browse and play your game collection with a clean and responsive interface. With support for multiple platforms, various naming schemes, and custom tags, RomM is a must-have for anyone who plays on emulators.

Features

  • Scan and enhance your game library with metadata from IGDB, Screenscraper and MobyGames
  • Fetch custom artwork from SteamGridDB
  • Display your achievements from Retroachievements
  • Metadata available for 400+ platforms
  • Play games directly from the browser using EmulatorJS and RuffleRS
  • Share your library with friends with limited access and permissions
  • Official apps for Playnite, Android and CFWs
  • Supports multi-disk games, DLCs, mods, hacks, patches, and manuals
  • Parse and filter by tags in filenames
  • View, upload, update, and delete games from any modern web browser

Preview

🖥 Desktop 📱 Mobile
desktop preview mobile preview

Installation

To start using RomM, check out the Quick Start Guide in the docs. If you are having issues with RomM, please review the page for troubleshooting steps.

Contributing

To contribute to RomM, please check Contribution Guide.

Community

Here are a few projects maintained by members of our community. Please note that the RomM team does not regularly review their source code.

Mobile

Desktop

Handhelds

Other

[🔷] Official first-party app

Join us on Discord, where you can ask questions, submit ideas, get help, showcase your collection, and discuss RomM with other users.

discord-invite-img

Technical Support

If you have any issues with RomM, please open an issue in this repository.

Financial Support

Consider supporting the development of this project on Open Collective. All funds will be used to cover the costs of hosting, development, and maintenance of RomM.

oc-donate-img

Our Friends

Here are a few projects that we think you might like:

  • EmulatorJS: An embeddable, browser-based emulator
  • RetroDECK: Retro gaming on SteamOS and Linux
  • ES-DE Frontend: Emulator frontend for Linux, macOS and Windows
  • Gaseous: Another ROM manager with web-based emulator
  • Retrom: A centralized game library/collection management service
  • Drop: Steam-like experience for DRM-free games
  • LanCommander: Digital game platform for PC games
  • Steam ROM Manager: An app for managing ROMs in Steam

hackernews badge   selfh.st badge   Aikido Security Audit Report
S
Description
A beautiful, powerful, self-hosted ROM manager and player.
Readme AGPL-3.0
466 MiB
Languages
Python 55.8%
Vue 24.5%
TypeScript 18.8%
CSS 0.4%
JavaScript 0.2%
Other 0.3%