Skip to content

Commit 194bc56

Browse files
authored
Merge pull request #139 from rommapp/5.3-release-docs
docs: 5.3 release documentation
2 parents 1b8504d + e90f863 commit 194bc56

41 files changed

Lines changed: 895 additions & 304 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎docs/Navigation.md‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,17 +50,22 @@ search:
5050
- [Collections](using/collections.md)
5151
- [Smart Collections](using/smart-collections.md)
5252
- [Virtual Collections](using/virtual-collections.md)
53+
- [Physical Games](using/physical-games.md)
54+
- [Recommendations](using/recommendations.md)
5355
- [Downloads](using/downloads.md)
5456
- [Uploads](using/uploads.md)
5557
- In-Browser Play
5658
- [EmulatorJS](using/in-browser-play/emulatorjs.md)
5759
- [`js-dos`](using/in-browser-play/js-dos.md)
5860
- [MS-DOS](using/in-browser-play/ms-dos.md)
61+
- [PICO-8](using/in-browser-play/pico-8.md)
5962
- [Ruffle](using/in-browser-play/ruffle.md)
6063
- [Emulator Streaming](using/emulator-streaming.md)
6164
- [Migrating to webstation](using/emulator-streaming-migration.md)
65+
- [Jukebox](using/jukebox.md)
6266
- [Saves & States](using/saves-and-states.md)
6367
- [RetroAchievements](using/retroachievements.md)
68+
- [Walkthroughs](using/walkthroughs.md)
6469
- [ROM Patcher](using/rom-patcher.md)
6570
- [Netplay](using/netplay.md)
6671
- [Account & Profile](using/account-and-profile.md)

‎docs/administration/firmware-management.md‎

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,14 @@ RomM does not ship games or firmware, and the team cannot help you obtain BIOS f
1919
## Ingesting firmware
2020

2121
1. Put the file in the right `bios/` folder (see [Folder Structure](../getting-started/folder-structure.md))
22-
2. Run a scan → Firmware is picked up alongside ROMs
23-
3. Navigate to the platform's gallery and click the `CPU` icon in the top left
24-
4. Firmware files will display at the bottom of the page
22+
2. Run a scan, and firmware is picked up alongside ROMs
23+
3. The platform's firmware is then listed on that platform's page, and offered to the in-browser player
24+
25+
Where `bios/` lives is up to you. The default is `bios/{platform}` at the library root, and you can move it with the [`filesystem.structure.firmware`](../reference/configuration-file.md#filesystemstructure) template.
26+
27+
## Missing firmware
28+
29+
Delete a file from `bios/` and the next scan **flags it missing** instead of dropping it from the database. Put the file back and the next scan clears the flag. If you're never replacing it, the **Cleanup missing firmware** task deletes every flagged row in one go (see [Scheduled Tasks](scheduled-tasks.md#triggering-a-task-manually)).
2530

2631
## Platform-specific firmware
2732

‎docs/administration/index.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ description: Running RomM for yourself and others.
55

66
# Administration
77

8-
Administration is everything you do **as the operator** of a RomM instance: managing accounts, controlling access, configuring metadata sources, scheduling scans, watching the library for changes, monitoring the server, and keeping data safe.
8+
Administration is everything you do **as the server owner** of a RomM instance: managing accounts, controlling access, configuring metadata sources, scheduling scans, watching the library for changes, monitoring the server, and keeping data safe.
99

1010
The end-user equivalent (how to actually play the games, build collections, upload saves) lives in [Using RomM](../using/index.md).
1111

‎docs/administration/oidc/index.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,8 @@ environment:
134134
- OIDC_USERNAME_ATTRIBUTE=preferred_username
135135
```
136136

137+
Whatever that attribute holds gets sanitised before it becomes a username to prevent invalid characters from being used. RomM also sends a PKCE challenge on every authorization request, so it's safe to mark PKCE required for the client if your IdP offers that.
138+
137139
## Important notes
138140

139141
- **Email must match** between OIDC and any existing local account, otherwise OIDC creates a new account alongside the old one.

‎docs/administration/scanning-and-watcher.md‎

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ Every scan picks one mode. Modes differ in what they touch, so use the most-targ
2020
| Mode | What it does | When to use |
2121
| ----------------- | -------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
2222
| **New Platforms** | Only scans platform folders not already in the DB. | After mounting a new ROM set (very fast). |
23-
| **Quick** | Skips files that already exist in the DB, with no metadata refresh. | Default for scheduled runs and the watcher. |
23+
| **Quick** | Adds new games and catches file updates, with no metadata refresh. | Default for scheduled runs and the watcher. |
2424
| **Unmatched** | Re-runs metadata matching against ROMs currently missing external IDs. | After adding a new metadata provider, or when some titles didn't match on the first scan. |
2525
| **Update** | Re-fetches metadata for all already-matched ROMs. | When metadata providers have meaningfully changed (e.g. IGDB restructured). |
2626
| **Hashes** | Recalculates CRC/MD5/SHA1 hashes. | After upgrading from a version that didn't hash or when you suspect file corruption. |
@@ -36,12 +36,14 @@ A manual scan can be scoped to specific platforms and a chosen subset of metadat
3636

3737
Configured via env vars (full table in [Scheduled Tasks](scheduled-tasks.md)):
3838

39-
| Variable | Default | Purpose |
40-
| ----------------------- | ----------- | ------------------------------------------------------------------------------------------------------------ |
41-
| `SCHEDULED_RESCAN_CRON` | `0 0 * * *` | Cron expression for the scheduled library scan. Runs a **Quick** scan by default. |
42-
| `SCAN_TIMEOUT` | `14400` | Hard cap in seconds: scans that exceed this are killed and logged. |
43-
| `SCAN_WORKERS` | `1` | Concurrent worker processes for scanning; leave as auto unless you're tuning. |
44-
| `SEVEN_ZIP_TIMEOUT` | `60` | Per-archive timeout in seconds for `.7z` extraction during scan; raise if scanning huge compressed ROM sets. |
39+
| Variable | Default | Purpose |
40+
| ----------------------- | ----------- | ---------------------------------------------------------------------------------------------------------- |
41+
| `SCHEDULED_RESCAN_CRON` | `0 3 * * *` | Cron expression for the scheduled library scan, which runs a **Quick** scan |
42+
| `SCAN_TIMEOUT` | `14400` | Hard cap in seconds, after which the scan is killed and the clients watching it are told why |
43+
| `SCAN_WORKERS` | `4` | How many ROMs a scan processes at once |
44+
| `SEVEN_ZIP_TIMEOUT` | `60` | Per-archive timeout in seconds for `.7z` extraction during scan, raise it if scanning huge compressed sets |
45+
46+
Scans get their own queue and worker now, so a long library scan won't hold up the shorter background tasks behind it.
4547

4648
To disable scheduled scans entirely, either unset the cron or set it to something unreachable (`SCHEDULED_RESCAN_CRON=0 0 31 2 *`).
4749

@@ -100,7 +102,19 @@ exclude:
100102
extensions: [nfo]
101103
```
102104

103-
Full schema in [Configuration File](../reference/configuration-file.md).
105+
Whatever you list here is **added** to the defaults, not swapped in for them. The system folders and the frontend media folders stay excluded either way. Full schema in [Configuration File](../reference/configuration-file.md).
106+
107+
## Platform folder names
108+
109+
Every platform folder has to resolve to a [known slug](../platforms/supported-platforms.md). The [folder name aliases](../platforms/supported-platforms.md#folder-name-aliases) already cover what Batocera, RetroBat and ES-DE call things, so a library from one of those works mostly untouched. Anything else needs a [`system.platforms`](../reference/configuration-file.md#systemplatforms) mapping.
110+
111+
## Title IDs read from the binary
112+
113+
The following platforms stamp a **native Title ID** into the game binary, which scans can read: PSX, PS2, PS3, PSP, PS Vita, Switch, 3DS, Wii, Wii U, GameCube, Dreamcast, Xbox and Xbox 360.
114+
115+
That ID identifies games on the platforms RomM doesn't hash, which is how a renamed or moved file holds on to its saves and collections, and marks the location where the game writes its saves, which is needed for device sync.
116+
117+
To skip the whole thing, use [`filesystem.skip_title_id_extraction`](../reference/configuration-file.md#filesystemskip_title_id_extraction).
104118

105119
## Region and language preference
106120

‎docs/administration/scheduled-tasks.md‎

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,21 @@ Every scheduled task takes a standard 5-field cron expression:
2525
- `*/30 * * * *`: every 30 minutes
2626
- `0 2 * * 0`: 2 AM every Sunday
2727

28-
Set the env var and restart the container; the scheduler picks up the new schedule the moment RomM comes back up.
28+
Set the env var and restart the container. The scheduler picks up the new schedule as soon as RomM is back.
2929

3030
## Enabling a scheduled task
3131

32-
Most tasks have an `ENABLE_*` environment variable, like `ENABLE_SCHEDULED_UPDATE_LAUNCHBOX_METADATA=true` which enables the LaunchBox sync, and every one of them is off by default. Set both the enable var and its cron var, since a task with an empty cron string has nothing to schedule and stays unscheduled even when enabled.
32+
Most tasks have an `ENABLE_*` environment variable, like `ENABLE_SCHEDULED_UPDATE_LAUNCHBOX_METADATA=true` which enables the LaunchBox sync. Set both the enable var and its cron var, since a task with an empty cron string has nothing to schedule and stays unscheduled even when enabled.
33+
34+
Unlike other tasks, **build recommendations index** ships enabled, because the [recommendation](../using/recommendations.md) sections read that index and similar games sits empty without it. Setting `ENABLE_SCHEDULED_BUILD_RECOMMENDATIONS=false` stops the nightly rebuild, but doesn't hide either section; users turn those off in their own settings.
3335

3436
The housekeeping tasks (netplay cleanup, upload tmp cleanup, ZIP cache cleanup) are always on and have no env vars. Check the [env var reference](../reference/environment-variables.md) for the full list.
3537

3638
## Triggering a task manually
3739

3840
### From the Administration page
3941

40-
**Administration → Tasks** shows every task with a "Run" button. Admins (anyone with `tasks.run` scope) can trigger:
42+
**Administration → Tasks** lists every task with its status and a way to run it. Anyone with the `tasks.run` scope can fire one off, scheduled tasks included, which saves waiting for the next cron tick after a config change.
4143

4244
### From the API
4345

@@ -59,6 +61,7 @@ A task that's been "running" for hours is usually a scan that hit `SCAN_TIMEOUT`
5961
On a Raspberry Pi or NAS with 2 GB of RAM and/or a single CPU core:
6062

6163
- Raise the cron intervals (daily → weekly) for the nightlies
62-
- Set `SCAN_WORKERS=1` to avoid concurrent scan processes
64+
- Set `SCAN_WORKERS=1` and `WEB_SERVER_CONCURRENCY=1`, both of which default to `4`
6365
- Enable the watcher but raise `RESCAN_ON_FILESYSTEM_CHANGE_DELAY` to 30+ minutes
64-
- Disable image conversion if you don't care about WebP (`ENABLE_SCHEDULED_CONVERT_IMAGES_TO_WEBP=false`).
66+
- Disable image conversion if you don't care about WebP (`ENABLE_SCHEDULED_CONVERT_IMAGES_TO_WEBP=false`)
67+
- On a big library, set `ENABLE_SCHEDULED_BUILD_RECOMMENDATIONS=false` to skip the nightly build

‎docs/administration/server-stats.md‎

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ description: "The numbers Mason! What do they mean?"
1111

1212
### Top-line counts
1313

14-
| Metric | What it counts |
15-
| ---------------- | --------------------------------------------------------------------------------- |
16-
| **Platforms** | Every platform RomM has seen at least one ROM for. Deleted platforms don't count. |
17-
| **Games** | Total ROM entries. A multi-file game (folder with multiple files) counts as 1. |
18-
| **Saves** | User save files across all users. |
19-
| **States** | Emulator save states across all users. |
20-
| **Screenshots** | User-uploaded screenshots. Provider-fetched screenshots aren't counted here. |
21-
| **Size on disk** | Total disk usage of all ROMs, saves, states, and screenshots. |
14+
| Metric | What it counts |
15+
| ---------------- | ----------------------------------------------------------------------------------------- |
16+
| **Platforms** | Every platform RomM has seen at least one ROM for. Deleted platforms don't count. |
17+
| **Games** | Total ROM entries. Multi-file (folder with multiple files) and physical games count as 1. |
18+
| **Saves** | User save files across all users. |
19+
| **States** | Emulator save states across all users. |
20+
| **Screenshots** | User-uploaded screenshots. Provider-fetched screenshots aren't counted here. |
21+
| **Size on disk** | Total disk usage of all ROMs, saves, states, and screenshots. |
2222

2323
### Per-platform breakdown
2424

@@ -29,8 +29,6 @@ Under the summary, it's a table sorted by name, size or game count. For each pla
2929
- Region distribution (how many games tagged USA, Japan, Europe, World, etc.)
3030
- Metadata coverage (how many games have metadata from each provider)
3131

32-
When you want to know "which platform is eating my disk?" or "which platform has the worst match rate?"
33-
3432
## API
3533

3634
The same data is available programmatically:

‎docs/developers/architecture.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ Environment variables (100+ of them, all listed in `env.template`) cover infrast
8383

8484
### Background jobs
8585

86-
RQ workers run scheduled jobs (rescans, Switch TitleDB refresh, LaunchBox refresh, image-to-WebP conversion, RA progress sync, netplay cleanup) and manual tasks (`cleanup_missing_roms`, `cleanup_orphaned_resources`, `sync_folder_scan`). Each scheduled task is gated by an `ENABLE_SCHEDULED_*` env var and tunable via the matching `*_CRON`. Operator-side detail in [Scheduled Tasks](../administration/scheduled-tasks.md).
86+
RQ workers run scheduled jobs (rescans, Switch TitleDB refresh, LaunchBox refresh, image-to-WebP conversion, RA progress sync, netplay cleanup) and manual tasks (`cleanup_missing_roms`, `cleanup_orphaned_resources`, `sync_folder_scan`). Each scheduled task is gated by an `ENABLE_SCHEDULED_*` env var and tunable via the matching `*_CRON`. Server owner detail in [Scheduled Tasks](../administration/scheduled-tasks.md).
8787

8888
## Frontend
8989

‎docs/developers/development-setup.md‎

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@ description: Run RomM locally for development
77

88
# Setting up RomM for development
99

10+
## Prerequisites
11+
12+
| Tool | Needed for |
13+
| ------- | ------------------------------------------------------------ |
14+
| Python | 3.14 or newer, pinned in `.python-version` |
15+
| Node.js | 24, with npm 11.10 or newer, per `frontend/package.json` |
16+
| uv | Dependencies, and it fetches the Python in `.python-version` |
17+
| Docker | For the database, Valkey, and the optional streaming stack |
18+
1019
## Option 1: Using Docker
1120

1221
If you prefer to use Docker for development, you can set up RomM using the provided Docker Compose configuration. This method simplifies the setup process by encapsulating all dependencies within Docker containers.
@@ -111,6 +120,15 @@ uv sync --all-extras --dev
111120
docker compose up -d
112121
```
113122

123+
Two optional stacks have their own compose files:
124+
125+
```sh
126+
docker compose -f docker-compose.oidc.yml up -d # Authentik, for testing OIDC
127+
docker compose -f docker-compose.streaming.yml up -d # webstation, for emulator streaming
128+
```
129+
130+
The streaming image is amd64 only and runs to several GB, hence opt-in.
131+
114132
#### Run the backend
115133

116134
_Migrations will be run automatically when running the backend._
@@ -126,7 +144,6 @@ uv run python3 main.py
126144

127145
```sh
128146
cd frontend
129-
# npm version >= 9 needed
130147
npm install
131148
```
132149

‎docs/developers/index.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ description: Build on top of RomM or contribute to it
55

66
# API & Development
77

8-
Everything you need to **build on top of RomM** (third-party apps, scripts, integrations) or **contribute to it** (code, translations, docs). End-user content lives in [Using RomM](../using/index.md). Operator content lives in [Administration](../administration/index.md).
8+
Everything you need to **build on top of RomM** (third-party apps, scripts, integrations) or **contribute to it** (code, translations, docs). End-user content lives in [Using RomM](../using/index.md). Server owner content lives in [Administration](../administration/index.md).
99

1010
## Calling the API
1111

0 commit comments

Comments
 (0)