Adds opt-in, per-platform subfolder scanning (closes #2050). When enabled for a platform, RomM recurses that platform's subfolders and treats each nested file as its own ROM, instead of collapsing a subfolder into one multi-file ROM — so libraries organized into Hacks/, Translations/, Homebrew/, etc. are scanned correctly. Enable per platform in config.yml (default off, existing setups unaffected): scan: subfolders: nes: true # recurse every subfolder snes: ["Hacks", "Translations"] # recurse only these; keep others whole Key difference from a naive path-identity approach: identity is reconciled by content hash on scan. Moving or renaming a ROM between subfolders is detected by its hash against a now-missing ROM and relocated in place, so saves, play history, favorites and collection membership follow it. Falls back to path identity when hashing is unavailable (skip_hash_calculation or a non-hashable platform). A cheap size pre-filter avoids hashing every newly-seen file (e.g. on first enable). Details: - Per-platform opt-in via scan.subfolders (fs_slug -> bool | list[str]); no DB schema change. - Recursion skips hidden (dot-prefixed) folders, and keeps a folder whole as a single multi-file ROM when it holds a disc/playlist descriptor (.m3u/.cue/.gdi/.ccd/.toc) — covers cue+bin / multi-disc games. - Path-based keying for the steady-state lookup (get_roms_by_fs_name and mark_missing_roms key on full path) so identically-named files in different subfolders stay distinct; the (platform_id, fs_name) index is non-unique. - File resolution (download/delete/hash) uses the ROM's stored fs_path. - Scan log flags entries that became "missing" because a folder is now recursed, so stale entries are easy to clean up. - Frontend: the Files tab shows a ROM's on-disk Location (click-to-copy), built as a shared LocationChip mirroring HashChip's RTag-based pattern. New i18n keys added to all locales. Tests: backend unit tests for recursion (collisions, hidden folders, descriptor dirs kept whole, named-list form), full-path keying in get_roms_by_fs_name / mark_missing_roms, and hash-based relocation. Co-Authored-By: Claude Opus 4.8 <[email protected]> Claude-Session: https://claude.ai/code/session_01Sk2dzM3K9qxWBdPAeGb7us
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 |
|---|---|
![]() |
![]() |
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
- 🔷 Argosy: Native client for installing and launching games by @tmgast
- romm-ios-app: Native iOS app by @ilyas-hallak
- romm-mobile: Android (and soon iOS) app by @mattsays
Desktop
- 🔷 Playnite plugin: Library plugin for Playnite by @gantoine
- RommBrowser: Electron client by @smurflabs
- RetroArch Sync: Sync RetroArch library with RomM by @Covin90
- RomMate: Desktop app for browsing your collection by @brenoprata10
- romm-client: Desktop client by @chaun14
Handhelds
- 🔷 Grout: Download client for muOS and NextUI by @BrandonKowalski
- DeckRommSync: SteamOS downloader and syncer by @PeriBluGaming
- SwitchRomM: Homebrew NRO for Switch by @Shalasere
Other
- romm-comm: Discord bot by @idio-sync
- GGRequestz: Game discovery and request tool by @XTREEMMAK
- Syncthing sync: Small tool to push a Syncthing library to RomM by @amn-96
[🔷] 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.
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.
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




