RomM integrates with RetroAchievements.org to display achievement lists alongside your ROMs and to track unlock progress per user. When you open a game’s detail page, RomM fetches the achievement set for that ROM — identified by matching its hash against the RetroAchievements database — and shows each achievement’s title, description, point value, and badge image.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/rommapp/romm/llms.txt
Use this file to discover all available pages before exploring further.
Prerequisites
- A free account at retroachievements.org
- A RetroAchievements Web API key (found under Settings → Keys on the website)
Setup
Generate your API key
Log in to RetroAchievements.org, navigate to Settings → Keys, and copy your Web API Key.
Add the API key to RomM
Set the Restart the container for the change to take effect.
RETROACHIEVEMENTS_API_KEY environment variable in your Docker Compose file:Scan your library
Run a full library scan (or wait for the scheduled rescan) so RomM can calculate ROM hashes and look up matching achievement sets.
Configuration
| Variable | Default | Description |
|---|---|---|
RETROACHIEVEMENTS_API_KEY | (empty) | Your RetroAchievements Web API key. The integration is disabled when this is not set. |
REFRESH_RETROACHIEVEMENTS_CACHE_DAYS | 30 | Number of days before the local hash-to-game-ID cache is refreshed from the RetroAchievements API. |
ENABLE_SCHEDULED_RETROACHIEVEMENTS_PROGRESS_SYNC | false | Enable the scheduled progress sync task. |
SCHEDULED_RETROACHIEVEMENTS_PROGRESS_SYNC_CRON | 0 4 * * * | Cron expression controlling when the progress sync runs (default: 4 AM daily). |
How ROM identification works
RetroAchievements identifies games by hashing ROM files using its own hashing algorithm. RomM calculates a hash for each ROM during a scan, then looks it up in a platform-specific hash index downloaded from the RetroAchievements API. The hash index is stored locally asra_hashes_v2.json inside the platform’s resource directory. RomM refreshes this file automatically once the age exceeds REFRESH_RETROACHIEVEMENTS_CACHE_DAYS.
You can force RomM to use a specific RetroAchievements game entry for a ROM by adding an
(ra-XXXXX) tag to the filename, where XXXXX is the RetroAchievements game ID. For example: Sonic the Hedgehog (USA) (ra-1).md. This bypasses hash-based lookup and pins the achievement set directly.Supported platforms
RomM maps the following platform slugs to RetroAchievements system IDs:| Platform | RA System ID |
|---|---|
| NES / Famicom | 7 |
| SNES / Super Famicom | 3 |
| Nintendo 64 | 2 |
| Game Boy | 4 |
| Game Boy Color | 6 |
| Game Boy Advance | 5 |
| Nintendo DS | 18 |
| GameCube | 16 |
| Wii | 19 |
| Sega Genesis / Mega Drive | 1 |
| Sega Master System | 11 |
| Sega CD | 9 |
| SEGA 32X | 10 |
| Sega Saturn | 39 |
| Dreamcast | 40 |
| Game Gear | 15 |
| PlayStation | 12 |
| PlayStation 2 | 21 |
| PSP | 41 |
| TurboGrafx-16 | 8 |
| Atari 2600 | 25 |
| Atari 7800 | 51 |
| Lynx | 13 |
| Jaguar | 17 |
| Neo Geo Pocket / Color | 14 |
| MSX / MSX2 | 29 |
| Arcade | 27 |
| PC-FX | 49 |
| Virtual Boy | 28 |
| WonderSwan / Color | 53 |
| Pokémon Mini | 24 |
| Famicom Disk System | 81 |
| Windows | 102 |
What data RomM fetches
For each matched ROM, RomM retrieves the following from the RetroAchievements API:- Game details: title, cover image, in-game screenshot, release date, genre, publisher, and developer
- Achievement list: for every achievement in the set — RA ID, title, description, point value, badge image URLs (locked and unlocked variants), total unlock counts, display order, and type (progression, win condition, missable, etc.)
- Total achievements possible
- Number unlocked (normal and hardcore)
- Most recent unlock date
- Highest award kind (e.g. beaten, mastered)
- Per-achievement unlock date (normal and hardcore)
Scheduled progress sync
WhenENABLE_SCHEDULED_RETROACHIEVEMENTS_PROGRESS_SYNC=true, RomM periodically fetches updated progress for all users who have linked their RetroAchievements username. The sync is incremental: if the unlock count and most recent unlock date for a game haven’t changed since the last run, RomM skips the per-game API call and reuses cached data, minimising API usage.