You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/administration/firmware-management.md
+8-3Lines changed: 8 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -19,9 +19,14 @@ RomM does not ship games or firmware, and the team cannot help you obtain BIOS f
19
19
## Ingesting firmware
20
20
21
21
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)).
Copy file name to clipboardExpand all lines: docs/administration/index.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -5,7 +5,7 @@ description: Running RomM for yourself and others.
5
5
6
6
# Administration
7
7
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.
9
9
10
10
The end-user equivalent (how to actually play the games, build collections, upload saves) lives in [Using RomM](../using/index.md).
Copy file name to clipboardExpand all lines: docs/administration/oidc/index.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -134,6 +134,8 @@ environment:
134
134
- OIDC_USERNAME_ATTRIBUTE=preferred_username
135
135
```
136
136
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
+
137
139
## Important notes
138
140
139
141
- **Email must match** between OIDC and any existing local account, otherwise OIDC creates a new account alongside the old one.
|**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. |
24
24
|**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. |
25
25
|**Update**| Re-fetches metadata for all already-matched ROMs. | When metadata providers have meaningfully changed (e.g. IGDB restructured). |
26
26
|**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
36
36
37
37
Configured via env vars (full table in [Scheduled Tasks](scheduled-tasks.md)):
|`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.
45
47
46
48
To disable scheduled scans entirely, either unset the cron or set it to something unreachable (`SCHEDULED_RESCAN_CRON=0 0 31 2 *`).
47
49
@@ -100,7 +102,19 @@ exclude:
100
102
extensions: [nfo]
101
103
```
102
104
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).
Copy file name to clipboardExpand all lines: docs/administration/scheduled-tasks.md
+8-5Lines changed: 8 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -25,19 +25,21 @@ Every scheduled task takes a standard 5-field cron expression:
25
25
-`*/30 * * * *`: every 30 minutes
26
26
-`0 2 * * 0`: 2 AM every Sunday
27
27
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.
29
29
30
30
## Enabling a scheduled task
31
31
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.
33
35
34
36
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.
35
37
36
38
## Triggering a task manually
37
39
38
40
### From the Administration page
39
41
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.
41
43
42
44
### From the API
43
45
@@ -59,6 +61,7 @@ A task that's been "running" for hours is usually a scan that hit `SCAN_TIMEOUT`
59
61
On a Raspberry Pi or NAS with 2 GB of RAM and/or a single CPU core:
60
62
61
63
- 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`
63
65
- 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
Copy file name to clipboardExpand all lines: docs/developers/architecture.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -83,7 +83,7 @@ Environment variables (100+ of them, all listed in `env.template`) cover infrast
83
83
84
84
### Background jobs
85
85
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).
| 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
+
10
19
## Option 1: Using Docker
11
20
12
21
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
111
120
docker compose up -d
112
121
```
113
122
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
+
114
132
#### Run the backend
115
133
116
134
_Migrations will be run automatically when running the backend._
Copy file name to clipboardExpand all lines: docs/developers/index.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -5,7 +5,7 @@ description: Build on top of RomM or contribute to it
5
5
6
6
# API & Development
7
7
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).
0 commit comments