diff --git a/.github/resources/isotipo.png b/.github/resources/isotipo.png new file mode 100644 index 00000000..7489459b Binary files /dev/null and b/.github/resources/isotipo.png differ diff --git a/.github/resources/isotipo.svg b/.github/resources/isotipo.svg new file mode 100644 index 00000000..822a7c31 --- /dev/null +++ b/.github/resources/isotipo.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 3f96f64d..38e07129 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,61 +1,61 @@ name: Build and Deploy MkDocs Site on: - push: - branches: [main] + push: + branches: [main] concurrency: - group: "pages" - cancel-in-progress: true + group: "pages" + cancel-in-progress: true permissions: - contents: write - pages: write - id-token: write + contents: write + pages: write + id-token: write jobs: - build: - runs-on: ubuntu-latest - timeout-minutes: 10 - steps: - - name: Checkout repo - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Install uv - uses: astral-sh/setup-uv@v5 - with: - enable-cache: true - cache-dependency-glob: "uv.lock" - - - name: "Set up Python" - uses: actions/setup-python@v5 - with: - python-version-file: ".python-version" - - - name: Install dependencies - run: uv sync --all-extras --dev - - - name: Build Site - run: uv run mkdocs build - - - name: Upload artifact - uses: actions/upload-pages-artifact@v3 - with: - path: ./site - - deploy: - needs: build - runs-on: ubuntu-latest - timeout-minutes: 5 - - # Deploy to the github-pages environment - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 + build: + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Checkout repo + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install uv + uses: astral-sh/setup-uv@v5 + with: + enable-cache: true + cache-dependency-glob: "uv.lock" + + - name: "Set up Python" + uses: actions/setup-python@v5 + with: + python-version-file: ".python-version" + + - name: Install dependencies + run: uv sync --all-extras --dev + + - name: Build Site + run: uv run mkdocs build + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: ./site + + deploy: + needs: build + runs-on: ubuntu-latest + timeout-minutes: 5 + + # Deploy to the github-pages environment + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/trunk-check.yml b/.github/workflows/trunk-check.yml new file mode 100644 index 00000000..38ed263d --- /dev/null +++ b/.github/workflows/trunk-check.yml @@ -0,0 +1,22 @@ +name: Run Trunk Check + +on: + pull_request: + +concurrency: + group: ${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +permissions: read-all + +jobs: + trunk_check: + runs-on: ubuntu-latest + permissions: + checks: write # For trunk to post annotations + contents: read # For repo checkout + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Trunk Check + uses: trunk-io/trunk-action@v1 diff --git a/.trunk/.gitignore b/.trunk/.gitignore new file mode 100644 index 00000000..15966d08 --- /dev/null +++ b/.trunk/.gitignore @@ -0,0 +1,9 @@ +*out +*logs +*actions +*notifications +*tools +plugins +user_trunk.yaml +user.yaml +tmp diff --git a/.trunk/configs/.markdownlint.yaml b/.trunk/configs/.markdownlint.yaml new file mode 100644 index 00000000..6d4875b7 --- /dev/null +++ b/.trunk/configs/.markdownlint.yaml @@ -0,0 +1,6 @@ +# Prettier friendly markdownlint config (all formatting rules disabled) +extends: markdownlint/style/prettier +MD007: + indent: 4 +MD033: false +MD041: false diff --git a/.trunk/configs/.prettierrc.yaml b/.trunk/configs/.prettierrc.yaml new file mode 100644 index 00000000..f1d7f908 --- /dev/null +++ b/.trunk/configs/.prettierrc.yaml @@ -0,0 +1 @@ +tabWidth: 4 diff --git a/.trunk/configs/.vale.ini b/.trunk/configs/.vale.ini new file mode 100644 index 00000000..77f526d4 --- /dev/null +++ b/.trunk/configs/.vale.ini @@ -0,0 +1,10 @@ +StylesPath = .vale + +Vocab = romm + +[formats] +markdoc = md + +[*.md] +BasedOnStyles = Vale + diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml new file mode 100644 index 00000000..008810fa --- /dev/null +++ b/.trunk/trunk.yaml @@ -0,0 +1,31 @@ +# This file controls the behavior of Trunk: https://docs.trunk.io/cli +# To learn more about the format of this file, see https://docs.trunk.io/reference/trunk-yaml +version: 0.1 +cli: + version: 1.22.10 +# Trunk provides extensibility via plugins. (https://docs.trunk.io/plugins) +plugins: + sources: + - id: trunk + ref: v1.6.7 + uri: https://github.com/trunk-io/plugins +# Many linters and tools depend on runtimes - configure them here. (https://docs.trunk.io/runtimes) +runtimes: + enabled: + - node@18.20.5 + - python@3.10.8 +# This is the section where you manage your linters. (https://docs.trunk.io/check/configuration) +lint: + enabled: + # - vale@3.9.5 + - git-diff-check + - markdownlint@0.44.0 + - prettier@3.5.1 + - trufflehog@3.88.12 +actions: + disabled: + enabled: + - trunk-announce + - trunk-fmt-pre-commit + - trunk-upgrade-available + - trunk-check-pre-push diff --git a/.vale/config/vocabularies/romm/accept.txt b/.vale/config/vocabularies/romm/accept.txt new file mode 100644 index 00000000..a663d3b2 --- /dev/null +++ b/.vale/config/vocabularies/romm/accept.txt @@ -0,0 +1,27 @@ +Alexa +Authentik +Authelia +Caddy +Cron +Famicom +GIDs +Igir +Keycloak +linuxserver +MariaDB +MobyGames +Nginx +OAuth +Playnite +Portainer +RomM +ROMs +shortcode +Synology +toolchain +Traefik +Unraid +UIDs +URIs +Websocket +Websockets diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..2174177d --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,134 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +- Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +- The use of sexualized language or imagery, and sexual attention or + advances of any kind +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email + address, without their explicit permission +- Sharing copyrighted ROM files, discussing how to pirate ROMs, posting links + to file downloads, or any other discussions about copyrighted ROMs +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + + + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +. +All complaints will be reviewed and investigated promptly and fairly. + + + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +. Translations are available at +. diff --git a/README.md b/README.md index cf424776..f3c62705 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,78 @@ -# An editable wiki for our projects +
+ RomM docs logo +

+ Beautiful, powerful, documentation for RomM +

+ +
+ +[![license-badge-img]][license-badge] +[![discord-badge-img]][discord-badge] + +
+ + +# Overview + +This is the official documentation for [RomM](https://romm.app/), the beautiful, powerful self-hosted ROM manager and player. Here you'll find everything you need to know about setting up, configuring, and using RomM. + +## Building the documentation + +We use `uv` to build the documentation. To install it, run: + +```sh +curl -LsSf https://astral.sh/uv/install.sh | sh +``` + +Then install python and the required dependencies: + +```sh +uv install python +uv sync --all-extras --dev +``` + +Finally run the following command to serve the documentation from a local server: + +```sh +uv run mkdocs serve +``` + +## Contributing + +We welcome all types of contributions, from simple typo fixes to new content. If you'd like to contribute, please read our [code of conduct](CODE_OF_CONDUCT.md). + +### Setting up the linter + +We use [Trunk](https://trunk.io) for linting, which combines multiple linters with sensible defaults and a single configuration file. You'll need to install the Trunk CLI to use it. + +#### - Install the Trunk CLI + +```sh +curl https://get.trunk.io -fsSL | bash +``` + +Alternative installation methods can be found [here](https://docs.trunk.io/check/usage#install-the-cli). On commit, the linter will run automatically. To run it manually, use the following commands: + +```sh +trunk fmt +trunk check +``` + +## Social + +Join us on Discord, where you can ask questions, submit ideas, get help, showcase your collection, and discuss RomM with other users. + +[![discord-invite]][discord-invite-url] + + + +[license-badge-img]: https://img.shields.io/github/license/rommapp/wiki?style=for-the-badge&color=a32d2a +[license-badge]: LICENSE +[discord-badge-img]: https://img.shields.io/badge/discord-7289da?style=for-the-badge +[discord-badge]: https://discord.gg/P5HtHnhUDH + + + +[discord-invite]: https://invidget.switchblade.xyz/P5HtHnhUDH +[discord-invite-url]: https://discord.gg/P5HtHnhUDH diff --git a/docs/Getting-Started/Authentication.md b/docs/Getting-Started/Authentication.md index ba58de6b..5a184ba9 100644 --- a/docs/Getting-Started/Authentication.md +++ b/docs/Getting-Started/Authentication.md @@ -2,7 +2,7 @@ RomM provides support for various forms of authentication, granting flexibility ### Setup -You'll want to set the following env variable before starting RomM: +You'll want to set the following environment variable before starting RomM: - `ROMM_AUTH_SECRET_KEY` is required and can be generated with `openssl rand -hex 32` @@ -34,13 +34,13 @@ curl https://romm.local/api/platforms -H 'Authorization: Basic YWRtaW46aHVudGVyM Along with the above forms of authentication, we've added an endpoint to generate expiring, scope-limited authentication tokens (`/api/token`). Successfully authenticating with that endpoint with return an `access_token` valid for 15 minutes, and a [`refresh_token`](https://oauth.net/2/grant-types/refresh-token/) valid for 2 weeks. The `refresh_token` can be used to generate a new `access_token` when needed. -The `/api/token` endpoint requires a username, password, and a list of [scopes](https://oauth.net/2/scope/) in the format `read:roms write:roms read:platforms ...`. The list of scopes and endpoints are available to browse via Swagger UI or Redoc (see next section). +The `/api/token` endpoint requires a username, password, and a list of [scopes](https://oauth.net/2/scope/) in the format `read:roms write:roms read:platforms ...`. The list of scopes and endpoints are available to browse via Swagger UI or ReDoc (see next section). **Note: As of now, only the legacy [password grant type](https://oauth.net/2/grant-types/password/) is supported.** We plan to eventually add support for [Client Credentials](https://oauth.net/2/grant-types/client-credentials/). ### OpenAPI -The API endpoints are fully documented and compliant with the OpenAPI specification. Explore the API endpoints using the Swagger UI interface at `/api/docs` and the Redoc interface at `/api/redoc`, or view the raw JSON at `/openapi.json`. +The API endpoints are fully documented and compliant with the OpenAPI specification. Explore the API endpoints using the Swagger UI interface at `/api/docs` and the ReDoc interface at `/api/redoc`, or view the raw JSON at `/openapi.json`. For more information on OpenAPI, visit the [OpenAPI Specification](https://www.openapis.org/) website. diff --git a/docs/Getting-Started/Environment-Variables.md b/docs/Getting-Started/Environment-Variables.md index e7fb2920..9250ca6f 100644 --- a/docs/Getting-Started/Environment-Variables.md +++ b/docs/Getting-Started/Environment-Variables.md @@ -1,5 +1,6 @@ This is a complete list of available environment variables; required variables are marked with a `✓`. + !!! tip You can also set environment variables with a `_FILE` suffix, which will load the contents of the file specified in the variable into the variable without the suffix. For example, setting `ROMM_AUTH_SECRET_KEY_FILE=/run/secrets/romm_auth_secret_key` and creating a file with the secret key at the specified path will set `ROMM_AUTH_SECRET_KEY` to the contents of the file. [Learn more.](https://docs.docker.com/compose/how-tos/use-secrets/) @@ -13,8 +14,8 @@ This is a complete list of available environment variables; required variables a | DISABLE_USERPASS_LOGIN | Disables login with username and password (when using OIDC) | | `false` | | UPLOAD_TIMEOUT | Timeout for file uploads (in seconds) | | `600` | | SCAN_TIMEOUT | Timeout for the background scan/rescan tasks (in seconds) | | `14400` | -| DISABLE_EMULATOR_JS | Disables playing in browser with [EmulatorJS](../Platforms-and-Players/EmulatorJS-Player.md) | | `false` | -| DISABLE_RUFFLE_RS | Disables playing flash games with [RuffleRS](../Platforms-and-Players/RuffleRS-Player.md) | | `false` | +| DISABLE_EMULATOR_JS | Disables playing in browser with [EmulatorJS](../Platforms-and-Players/EmulatorJS-Player.md) | | `false` | +| DISABLE_RUFFLE_RS | Disables playing flash games with [RuffleRS](../Platforms-and-Players/RuffleRS-Player.md) | | `false` | | TZ | Sets the timezone | | `UTC` | | GUNICORN_WORKERS | Number of processes running the app | | `2` | | ROMM_BASE_PATH | Base folder path for library, resources and assets | | `/romm` | @@ -28,7 +29,7 @@ This is a complete list of available environment variables; required variables a | -------------- | ------------------------------------------------------------------ | :------: | ----------- | | DB_HOST | Host name of database instance | ✓ | `127.0.0.1` | | DB_PORT | Port number of database instance | | `3306` | -| DB_NAME | Should match MYSQL_DATABASE in mariadb | | `romm` | +| DB_NAME | Should match MYSQL_DATABASE in MariaDB | | `romm` | | DB_USER | Database username (in MariaDB, should match MARIADB_USER) | ✓ | | | DB_PASSWD | Database password (in MariaDB, should match MARIADB_PASSWORD) | ✓ | | | ROMM_DB_DRIVER | Database driver to use (options: `mariadb`, `mysql`, `postgresql`) | | `mariadb` | @@ -46,7 +47,7 @@ This is a complete list of available environment variables; required variables a | ------------------- | -------------------------- | :------: | ------- | | IGDB_CLIENT_ID | Client ID for IGDB API | | | | IGDB_CLIENT_SECRET | Client secret for IGDB API | | | -| MOBYGAMES_API_KEY | Mobygames secret API key | | | +| MOBYGAMES_API_KEY | MobyGames secret API key | | | | STEAMGRIDDB_API_KEY | SteamGridDB secret API key | | | ## Authentication @@ -63,11 +64,11 @@ This is a complete list of available environment variables; required variables a ## Background tasks -| Variable | Description | Required | Default | -| -------------------------------------- | ------------------------------------------------------------------ | :------: | ------------- | -| ENABLE_RESCAN_ON_FILESYSTEM_CHANGE | Enable rescanning of library when filesystem changes | | `false` | -| RESCAN_ON_FILESYSTEM_CHANGE_DELAY | Delay in minutes before rescanning library when filesystem changes | | `5` | -| ENABLE_SCHEDULED_RESCAN | Enable scheduled rescanning of library | | `false` | -| SCHEDULED_RESCAN_CRON | Cron expression for scheduled rescanning | | `"0 3 * * *"` | -| ENABLE_SCHEDULED_UPDATE_SWITCH_TITLEDB | Enable scheduled updating of Switch TitleDB index | | `false` | -| SCHEDULED_UPDATE_SWITCH_TITLEDB_CRON | Cron expression for scheduled updating of Switch TitleDB | | `"0 4 * * *"` | +| Variable | Description | Required | Default | +| -------------------------------------- | ------------------------------------------------------------------- | :------: | ------------- | +| ENABLE_RESCAN_ON_FILESYSTEM_CHANGE | Enable re-scanning of library when filesystem changes | | `false` | +| RESCAN_ON_FILESYSTEM_CHANGE_DELAY | Delay in minutes before re-scanning library when filesystem changes | | `5` | +| ENABLE_SCHEDULED_RESCAN | Enable scheduled re-scanning of library | | `false` | +| SCHEDULED_RESCAN_CRON | Cron expression for scheduled re-scanning | | `"0 3 * * *"` | +| ENABLE_SCHEDULED_UPDATE_SWITCH_TITLEDB | Enable scheduled updating of Switch TitleDB index | | `false` | +| SCHEDULED_UPDATE_SWITCH_TITLEDB_CRON | Cron expression for scheduled updating of Switch TitleDB | | `"0 4 * * *"` | diff --git a/docs/Getting-Started/Generate-API-Keys.md b/docs/Getting-Started/Generate-API-Keys.md index 05f5df4f..9ff2a339 100644 --- a/docs/Getting-Started/Generate-API-Keys.md +++ b/docs/Getting-Started/Generate-API-Keys.md @@ -7,21 +7,22 @@ To access the IGDB API you'll need a Twitch account and a valid phone number for - Category: `Application Integration` - Client Type: `Confidential` + !!! important - **The name you pick has to be unique! Picking an existing name will fail silently, with no error messages. We recommend using `romm-`, like `romm-3fca6fd7f94dea4a05d029f654c0c44b`** + The name you pick has to be unique! Picking an existing name will fail silently, with no error messages. We recommend using `romm-`, like `romm-3fca6fd7f94dea4a05d029f654c0c44b` Note the client ID and secret that appear on screen, and use them to set `IGDB_CLIENT_ID` and `IGDB_CLIENT_SECRET` in your environment variables. -| ![IGDB_Creation](https://github.com/rommapp/romm/assets/3247106/7a93bf68-f6d9-46a5-ab72-719f2d5ec9d3) | ![IGDB_Secret](https://github.com/rommapp/romm/assets/3247106/7a9dc056-52be-41c4-aec5-e2758aa520b5) | +| ![IGDB Creation](https://github.com/rommapp/romm/assets/3247106/7a93bf68-f6d9-46a5-ab72-719f2d5ec9d3) | ![IGDB Secret](https://github.com/rommapp/romm/assets/3247106/7a9dc056-52be-41c4-aec5-e2758aa520b5) | | ----------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | ## MobyGames To access the MobyGames API, [create a MobyGames account](https://www.mobygames.com/user/register/) and then visit your profile page. Click the **API** link under your user name to sign up for an API key. Copy the key shown and use it to set `MOBYGAMES_API_KEY`. + !!! important - -> **MobyGames API became a [paid feature](https://www.mobygames.com/info/api/#non-commercial). Any existing key can be used as usual, but any new API key created will be under a paywall** + MobyGames API became a [paid feature](https://www.mobygames.com/info/api/#non-commercial). Any existing key can be used as usual, but any new API key created will be under a paywall ## ScreenScraper diff --git a/docs/Getting-Started/Quick-Start-Guide.md b/docs/Getting-Started/Quick-Start-Guide.md index cbfbd3c5..38ddc5a3 100644 --- a/docs/Getting-Started/Quick-Start-Guide.md +++ b/docs/Getting-Started/Quick-Start-Guide.md @@ -12,18 +12,19 @@ This guide will assume that you already have the following done, if not - stop h - OpenSSL installed (optional) - A Twitch account (optional) - 2-factor authentication set up on your Twitch account - - _This is required to get a dev account and an IGDB key_ + - _This is required to get a developer account and an IGDB key_ - A MobyGames account (optional) -- Your Roms organized in the correct format +- Your ROMs organized in the correct format + !!! warning Not setting up RomM with a metadata API will work for basic operation but can cause issues with, for instance, the Playnite plugin. It is recommended to setup IGDB API keys to avoid issues during setup. -#### Twitch and MobyGames API Keys +### Twitch and MobyGames API Keys Head over to [API key docs](../Getting-Started/Generate-API-Keys.md) to get your Twitch and/or MobyGames keys, then come back here -#### Generating Authentication Keys +### Generating Authentication Keys This step will generate a key that is used in the authorization of RomM. Without this, you will be unable to log in and use the platform @@ -58,8 +59,9 @@ Now that we have everything gathered, we can begin getting your instance set up! - `/path/to/library`: Path to the directory where your rom files will be stored - `/path/to/assets`: Path to the directory where you will store your saves, etc - `/path/to/config`: Path to the directory where you will store the config.yml -5. Save the file as _docker-compose.yml_ instead of _docker-compose.example.yml_. It should look soomething like this: +5. Save the file as _docker-compose.yml_ instead of _docker-compose.example.yml_. It should look something like this: + ???+ example "Example Docker Compose" ``` yaml --8<-- "quick-start.docker-compose.yml" @@ -68,7 +70,7 @@ Now that we have everything gathered, we can begin getting your instance set up! 6. Open the terminal and navigate to the directory containing the docker-compose file 7. Run `docker compose up -d` to kick off the docker pull. You will see it pull the container and set up the volumes and network: - +docker compose status 8. Run `docker ps -f name=romm` to verify that the containers are running 9. Open a web browser and navigate to `http://localhost:8080`, where you should be greeted with the RomM setup page @@ -77,26 +79,26 @@ Now that we have everything gathered, we can begin getting your instance set up! ## Configure -Now that the container is running, we will configure it by importing your roms +Now that the container is running, we will configure it by importing your ROMs -#### Uploading Your Roms via Web Interface +### Uploading Your ROMs via Web Interface -This method is certainly viable, but not recommended if you have a lot of roms and/or multiple platforms. It is good for adding after the fact as your collection grows, but wouldn't be recommended for the first set up, nor for multi-file roms +This method is certainly viable, but not recommended if you have a lot of ROMs and/or multiple platforms. It is good for adding after the fact as your collection grows, but wouldn't be recommended for the first set up, nor for multi-file ROMs 1. Log into RomM with your user credentials -2. Navigate to _Library_ -> _Upload roms_ -3. Select the platform, then click _ADD ROMS_ and select the roms you want to upload in the file selector that appears -4. Click _UPLOAD_ to begin uploading the roms -5. Repeat for all the roms/platforms you have +2. Navigate to _Library_ -> _Upload ROMs_ +3. Select the platform, then click _ADD ROMs_ and select the ROMs you want to upload in the file selector that appears +4. Click _UPLOAD_ to begin uploading the ROMs +5. Repeat for all the `roms/platforms` you have - +upload dialog -#### Importing Your Roms via Scanner +#### Importing Your ROMs via Scanner This method is generally the fastest and recommended for first time setup 1. Stop your RomM instance. `docker compose down` if you are in the terminal and directory containing the docker-compose file, otherwise `docker stop romm` -2. Go to the library folder created by RomM, set in the docker-compose file under _:/romm/library_ and create a folder named `roms` +2. Go to the library folder created by RomM, set in the docker-compose file under `:/romm/library` and create a folder named `roms` 3. Copy your platform folders/rom files into the `roms` folder you created 4. Start the RomM instance back up. `docker compose up -d` if you are in the terminal and directory containing the docker-compose file, otherwise `docker start romm` 5. Log into RomM with your user credentials diff --git a/docs/Getting-Started/Reverse-Proxy.md b/docs/Getting-Started/Reverse-Proxy.md index c77bf99e..09adbc25 100644 --- a/docs/Getting-Started/Reverse-Proxy.md +++ b/docs/Getting-Started/Reverse-Proxy.md @@ -1,4 +1,4 @@ -Here are some basic configurations for popular reverse proxies. Some installations may require modifications to config options not listed below. +Here are some basic configurations for popular reverse proxies. Some installations may require modifications to configuration options not listed below. ## Caddy @@ -90,17 +90,17 @@ server { Items marked with ❗ are important to set, as RomM may not correctly otherwise! -#### ⚡ Details +### ⚡ Details -- Domain Names: `romm.mydomain.com` (replace mydomain with your own)\* Scheme: `http` -- Forward Hostname/IP: (like 192.168.X.X) +- Domain Names: `romm.example.com` (replace example with your own)\* Scheme: `http` +- Forward Hostname/IP: device IP (like 192.168.X.X) - Forward Port: `8080` - Cache Assets: `off` - Block Common Exploits: `on` - Websockets Support: `on` ❗ - Access List: - -#### 🛡️ SSL +### 🛡️ SSL Strongly recommended, but only required if you plan to secure your site (use HTTPS) @@ -108,14 +108,14 @@ Strongly recommended, but only required if you plan to secure your site (use HTT - Force SSL: `on` - HTTP/2 Support: `on` - HSTS Enabled: `off` -- Email Address for Let's Encrypt: +- Email Address for Let's Encrypt: your email address - I Agree to the TOS: `on` -#### ⚙️ Advanced +### ⚙️ Advanced -Custom Nginx Confguration ❗ +Custom Nginx Configuration ❗ -``` +```yaml proxy_max_temp_file_size 0; ``` @@ -127,7 +127,7 @@ proxy_max_temp_file_size 0; ### Using a configuration document -```yml +```yaml http: romsdomainse: entryPoints: @@ -150,7 +150,7 @@ services: ### Using labels in docker compose -```yml +```yaml labels: - "traefik.enable=true" - "traefik.http.services.romm.loadbalancer.server.port=8080" diff --git a/docs/Maintenance/Scheduled-Tasks.md b/docs/Maintenance/Scheduled-Tasks.md index 377b81e1..af5c568f 100644 --- a/docs/Maintenance/Scheduled-Tasks.md +++ b/docs/Maintenance/Scheduled-Tasks.md @@ -4,39 +4,39 @@ Scheduled tasks can be enabled and configured with the following environment var | Variable | Description | Value | | -------------------------------------- | -------------------------------------------------------- | :-----------: | -| ENABLE_SCHEDULED_RESCAN | Enable scheduled rescanning of library | `true` | -| SCHEDULED_RESCAN_CRON | Cron expression for scheduled rescanning | `"0 3 * * *"` | +| ENABLE_SCHEDULED_RESCAN | Enable scheduled re-scanning of library | `true` | +| SCHEDULED_RESCAN_CRON | Cron expression for scheduled re-scanning | `"0 3 * * *"` | | ENABLE_SCHEDULED_UPDATE_SWITCH_TITLEDB | Enable scheduled updating of Switch TitleDB index | `true` | | SCHEDULED_UPDATE_SWITCH_TITLEDB_CRON | Cron expression for scheduled updating of Switch TitleDB | `"0 4 * * *"` | | ENABLE_SCHEDULED_UPDATE_MAME_XML | Enable scheduled updating of MAME XML index | `true` | | SCHEDULED_UPDATE_MAME_XML_CRON | Cron expression for scheduled updating of MAME XML | `"0 5 * * *"` | -### Scheduled rescan +### Scheduled re-scan -Users can opt to enable scheduled rescans, and set the interval using cron notation. Not that the scan will **not completely rescan** every file, only catching those which have been added/updated. +Users can opt to enable scheduled re-scans, and set the interval using Cron notation. Not that the scan will **not completely re-scan** every file, only catching those which have been added/updated. ### Switch titleDB update -Support was added for Nintendo Switch ROMs with filenames using the [titleid/programid format][titleid-program-id-url] (e.g. 0100000000010000.xci). If a file under the `switch` folder matches the regex, the scanner will use the index to attempt to match it to a game. If a match is found, the IGDB handler will use the matched name as the search term. +Support was added for Nintendo Switch ROMs with filenames using the [titleid/programid format](https://wiki.gbatemp.net/wiki/List_of_Switch_homebrew_titleID) (e.g. 0100000000010000.xci). If a file under the `switch` folder matches the regex, the scanner will use the index to attempt to match it to a game. If a match is found, the IGDB handler will use the matched name as the search term. The associated task updates the `/fixtures/switch_titledb.json` file at a regular interval to support new game releases. ### MAME XML update -Support was also added for MAME arcade games with shortcode names (e.g. `actionhw.zip` -> ACTION HOLLYWOOD), and works in the same way as the titleid matcher (without the regex). +Support was also added for MAME arcade games with shortcode names (e.g. `actionhw.zip` -> `ACTION HOLLYWOOD`), and works in the same way as the TitleID matcher (without the regex). The associated task updates the `/fixtures/mame.xml` file at a regular interval to support updates to the library. ## File system watcher -RomM can also monitor the filesystem for events (files created/moved/deleted) and schedules a rescan of the platform (or entire library is a new platform was added). +RomM can also monitor the filesystem for events (files created/moved/deleted) and schedules a re-scan of the platform (or entire library is a new platform was added). The watcher can be enabled and configured with the following environment variables: -| Variable | Description | Value | -| ---------------------------------- | ------------------------------------------------------------------ | :----: | -| ENABLE_RESCAN_ON_FILESYSTEM_CHANGE | Enable rescanning of library when filesystem changes | `true` | -| RESCAN_ON_FILESYSTEM_CHANGE_DELAY | Delay in minutes before rescanning library when filesystem changes | `5` | +| Variable | Description | Value | +| ---------------------------------- | ------------------------------------------------------------------- | :----: | +| ENABLE_RESCAN_ON_FILESYSTEM_CHANGE | Enable re-scanning of library when filesystem changes | `true` | +| RESCAN_ON_FILESYSTEM_CHANGE_DELAY | Delay in minutes before re-scanning library when filesystem changes | `5` | The watcher will monitor the `/library/roms` folder for changes to the filesystem, such as files being added, moved or deleted. It will ignore certain events (like modifying the file content or metadata), and will skip default OS files (like `.DS_Store` on mac). diff --git a/docs/Maintenance/Upgrading-to-3.0.md b/docs/Maintenance/Upgrading-to-3.0.md index 95866004..98539da2 100644 --- a/docs/Maintenance/Upgrading-to-3.0.md +++ b/docs/Maintenance/Upgrading-to-3.0.md @@ -6,9 +6,9 @@ All of the following changes are reflected in the [example docker-compose.yml fi We're removed support for SQLite as we've faced a number of engineering issues with it in the past, and MariaDB has proven more stable and robust. If you currently use SQLite, we'll automatically migrate your data from SQLite to MariaDB, but you'll **first need to make the following changes before upgrading to the latest image.** -In your env variables, change `ROMM_DB_DRIVER` to `mariadb` (or remove it completely as it's no longer needed). You'll then want to add the following env variables: +In your environment variables, change `ROMM_DB_DRIVER` to `mariadb` (or remove it completely as it's no longer needed). You'll then want to add the following environment variables: -``` +```yaml - DB_HOST=mariadb - DB_PORT=3306 - DB_NAME=romm # Should match MYSQL_DATABASE in mariadb @@ -20,9 +20,9 @@ To setup a new MariaDB container, have a look at the [example docker-compose.yml ## Authentication as standard -To support new features like EmulatorJS and saves/states management, we've decided to require authentication for all users. Anyone currently running RomM with authentication disabled will need to remove the `ROMM_AUTH_ENABLED` env variable and add the following ones: +To support new features like EmulatorJS and saves/states management, we've decided to require authentication for all users. Anyone currently running RomM with authentication disabled will need to remove the `ROMM_AUTH_ENABLED` environment variable and add the following ones: -``` +```yaml - ROMM_AUTH_SECRET_KEY= # Generate a key with `openssl rand -hex 32` ``` @@ -32,7 +32,7 @@ We understand that this requirement for authentication might conflict with the w As Redis is [required for authentication](../Getting-Started/Authentication.md) to work, we've integrated it directly into the docker image. If you're currently running the experimental Redis container, you can remove it, along with these environment variables: -``` +```yaml - ENABLE_EXPERIMENTAL_REDIS - REDIS_HOST - REDIS_PORT @@ -42,7 +42,7 @@ As Redis is [required for authentication](../Getting-Started/Authentication.md) Mounting the `config.yml` file is now done by mounting a `config` folder.. Place your existing `config.yml` file inside a folder and bind it to `/romm/config`: -``` +```yaml - /path/to/config:/romm/config ``` @@ -52,7 +52,7 @@ Updated [config.example.yml](https://github.com/rommapp/romm/blob/master/example This version introduces preliminary support for uploading/downloading saves, states and screenshots (read more about it in the 3.0 release notes). We've added a new volume mapping for these types of files called `assets`, which you'll want to bind to a local folder (or volume) so they'll persist. In your volumes section, add the following mapping, where `/path/to/assets/` is some folder where you'll want to store these assets (and make sure that folder exists): -``` +```yaml - /path/to/assets:/romm/assets ``` diff --git a/docs/Miscellaneous/Brand-Guidelines.md b/docs/Miscellaneous/Brand-Guidelines.md index f3d780b3..2ecc0803 100644 --- a/docs/Miscellaneous/Brand-Guidelines.md +++ b/docs/Miscellaneous/Brand-Guidelines.md @@ -3,12 +3,12 @@ We’ve put together some guidelines for those anyone who wants to use our name ## The Logo
- romm logo + RomM logo

-The logo should always be used in its standard colors: #ede5f8, #bea4e1, #371f69, #553e98, #e6c7a7, and #e1a38d. +The logo should always be used in its standard colors: #ede5f8 #ede5f8, #bea4e1 #bea4e1, #371f69 #371f69, #553e98 #553e98, #e6c7a7 #e6c7a7, and e1a38d #e1a38d. ## Do these things diff --git a/docs/Miscellaneous/FAQs.md b/docs/Miscellaneous/FAQs.md index b0bf700c..e3bf7603 100644 --- a/docs/Miscellaneous/FAQs.md +++ b/docs/Miscellaneous/FAQs.md @@ -1,8 +1,8 @@ -### Why is not PSP emulation enabled if emulatorjs supports it? +### Why is not PSP emulation enabled if EmulatorJS supports it? PSP emulation with the PPSSPP core requires special setup with a reverse proxy, or launching Chrome browser with the `--disable-web-security` and `--enable-features=SharedArrayBuffer` flags, which **WE STRONGLY DISCOURAGE** as it disables important security features. -### When will the next version of RomM come out? +### When will the next version of RomM be available? When it's ready. @@ -14,6 +14,6 @@ After the upcoming version is released. Sometime between now and the heat death of the universe. -### When will version x.x.x of RomM (or any of the RomM clients/apps/plugins) come out? +### When will version `x.x.x` of RomM (or any of the RomM clients/apps/plugins) be released? Same as above question. diff --git a/docs/Navigation.md b/docs/Navigation.md index 744fea38..39a309d7 100644 --- a/docs/Navigation.md +++ b/docs/Navigation.md @@ -17,7 +17,7 @@ search: - [Custom Platforms](Platforms-and-Players/Custom-Platforms.md) - [EmulatorJS Player](Platforms-and-Players/EmulatorJS-Player.md) - [RuffleRS Player](Platforms-and-Players/RuffleRS-Player.md) -- System Setup Gudies +- System Setup Guides - [Unraid Setup](System-Setup/Unraid-Setup-Guide.md) - [Synology Setup](System-Setup/Synology-Setup-Guide.md) - [TrueNAS Setup](System-Setup/TrueNAS-Setup-Guide.md) @@ -35,7 +35,7 @@ search: - [Scanning Issues](Troubleshooting/Scanning-Issues.md) - [Authentication Issues](Troubleshooting/Authentication-Issues.md) - [Synology Issues](Troubleshooting/Synology-Issues.md) - - [Miscellanous Issues](Troubleshooting/Miscellaneous-Troubleshooting.md) + - [Miscellaneous Issues](Troubleshooting/Miscellaneous-Troubleshooting.md) - Miscellaneous - [FAQs](Miscellaneous/FAQs.md) - [Branding Guidelines](Miscellaneous/Brand-Guidelines.md) diff --git a/docs/OIDC-Guides/OIDC-Setup-With-Authentik.md b/docs/OIDC-Guides/OIDC-Setup-With-Authentik.md index 1e5abae6..a1fc9d43 100644 --- a/docs/OIDC-Guides/OIDC-Setup-With-Authentik.md +++ b/docs/OIDC-Guides/OIDC-Setup-With-Authentik.md @@ -54,7 +54,7 @@ An app in Authentik represents the external service (in our case RomM) that will - Go to the "Applications" section in the admin interface. ![Applications](../resources/authentik/5-applications.png) 2. **Create a New Application**: - - Click on “Create” and configure the app settings: - **Name**: Provide a recognizable name (e.g., "RomM"). - **Slug**: Create a unique identifier for the app (e.g., "romm"). - **Provider**: Link the app to the previously created provider, "RomM OIDC Provider". + - Click on “Create” and configure the app settings: - **Name**: Provide a recognizable name (e.g., "RomM"). - **Slug**: Create a unique identifier for the app (e.g., `romm`). - **Provider**: Link the app to the previously created provider, "RomM OIDC Provider". ![New application](../resources/authentik/6-new-application.png) 3. **Click Create**. diff --git a/docs/OIDC-Guides/OIDC-Setup-With-PocketID.md b/docs/OIDC-Guides/OIDC-Setup-With-PocketID.md index 47440d66..d202d4f6 100644 --- a/docs/OIDC-Guides/OIDC-Setup-With-PocketID.md +++ b/docs/OIDC-Guides/OIDC-Setup-With-PocketID.md @@ -22,7 +22,7 @@ OIDC (OpenID Connect) is an identity layer built on top of OAuth2. While OAuth2 ### Step 1: Install and Configure Pocket ID -Before setting up the OIDC client, ensure that Pocket ID is installed and running by following the [github.](https://github.com/stonith404/pocket-id#setup) +Before setting up the OIDC client, ensure that Pocket ID is installed and running by following the [setup guide](https://github.com/stonith404/pocket-id#setup). ### Step 2: Add a client @@ -32,7 +32,7 @@ Once you have logged in and configured a PassKey you now need to create an OIDC - Go to OIDC Client - Click Add OIDC Client - Name: RomM - - Callback URLs: https://{yoururl}/api/oauth/openid + - Callback URLs: `https://{host}/api/oauth/openid` - Click Save - Stay on this page, you will be shown your client secret only THIS time. @@ -44,7 +44,7 @@ To enable OIDC authentication in RomM, you need to set the following environment - `OIDC_PROVIDER`: The lowercase name of the provider (`pocketid`). - `OIDC_CLIENT_ID`: The client ID copied from the Pocket ID application - `OIDC_CLIENT_SECRET`: The client secret that is showing within your Pocket ID application. -- `OIDC_REDIRECT_URI`: The redirect URI configured in the Pocket ID provider, in the format `https://{yoururl}/api/oauth/openid`. +- `OIDC_REDIRECT_URI`: The redirect URI configured in the Pocket ID provider, in the format `https://{host}/api/oauth/openid`. - `OIDC_SERVER_APPLICATION_URL`: The authorization URL for you Pocket ID instance, e.g. `https://id.host.local/authorize`. ### Step 4: Set your Email in RomM diff --git a/docs/Platforms-and-Players/Custom-Platforms.md b/docs/Platforms-and-Players/Custom-Platforms.md index 14d2978e..6b07589e 100644 --- a/docs/Platforms-and-Players/Custom-Platforms.md +++ b/docs/Platforms-and-Players/Custom-Platforms.md @@ -4,6 +4,6 @@ Furthermore, only a portion of the supported platforms have custom icons built-i If you'd like to load your own custom icons for missing platforms, you can mount `/var/www/html/assets/platforms` to some local folder and place all of your custom **`.ico`** platform icons in there. You'll also want to download the ones [provided in this project](https://github.com/rommapp/romm/tree/release/frontend/assets/platforms) and place them in the same folder. If you'd like to use your own icons for platforms already supported by RomM, just replace the file with another using the exact same name. -**The name of the `.ico` file should match the slug of the platform on IGDB.** For example, the URL for the AmstradCPC is https://www.igdb.com/platforms/acpc, so the filename should be `acpc.ico`. +**The name of the `.ico` file should match the slug of the platform on IGDB.** For example, the URL for the AmstradCPC is , so the filename should be `acpc.ico`. Screenshot 2023-09-15 at 10 45 04 AM diff --git a/docs/Platforms-and-Players/EmulatorJS-Player.md b/docs/Platforms-and-Players/EmulatorJS-Player.md index 621ced8b..34b10380 100644 --- a/docs/Platforms-and-Players/EmulatorJS-Player.md +++ b/docs/Platforms-and-Players/EmulatorJS-Player.md @@ -1,11 +1,14 @@ -[EmulatorJS](https://emulatorjs.org/) is a web-based emulator for various system; that is, it allows you to run old games in your web browser. It's based on [Emscripten](https://emscripten.org/), which is a toolchain for compiling C and C++ code to WebAssembly. +[EmulatorJS](https://emulatorjs.org/) is a web-based emulator for various system; that is, it allows you to run old games in your web browser. It's based on [`Emscripten`](https://emscripten.org/), which is a toolchain for compiling C and C++ code to WebAssembly. + !!! warning Due to a [change by Apple in iOS 18.2](https://bugs.webkit.org/show_bug.cgi?id=284752), emulation is severely limited, and likely non-functional, on iOS devices. + !!! warning PSP emulation with the PPSSPP core requires [special setup with a reverse proxy](https://emulatorjs.org/docs/options#ejs_threads), or launching Chrome browser with the `--disable-web-security` and `--enable-features=SharedArrayBuffer` flags, which WE STRONGLY DISCOURAGE as it disables important security features. + !!! warning Emulation is a complex and resource-intensive process. As such, it may not work well in all browser, especially older or less powerful ones. If you're having trouble running a game, try using a different browser or device. diff --git a/docs/Platforms-and-Players/RuffleRS-Player.md b/docs/Platforms-and-Players/RuffleRS-Player.md index ac87810d..c4fd725d 100644 --- a/docs/Platforms-and-Players/RuffleRS-Player.md +++ b/docs/Platforms-and-Players/RuffleRS-Player.md @@ -1,4 +1,5 @@ -[Ruffle](https://ruffle.rs/) is a web-based player for flash games. With flash now dscontinued, this is the best way to play your flash collection in the browser. +[Ruffle](https://ruffle.rs/) is a web-based player for flash games. With flash now discontinued, this is the best way to play your flash collection in the browser. + !!! important - **Ruffle will only play games stored in platform folders called `flash` or `browser`.** + Ruffle will only play games stored in platform folders called `flash` or `browser`. diff --git a/docs/Platforms-and-Players/Supported-Platforms.md b/docs/Platforms-and-Players/Supported-Platforms.md index ba31ef44..c5f54c43 100644 --- a/docs/Platforms-and-Players/Supported-Platforms.md +++ b/docs/Platforms-and-Players/Supported-Platforms.md @@ -1,11 +1,13 @@ + + Below is a list of all supported platforms/systems/consoles and their respective folder names. **The folder name is case-sensitive and must be used exactly as it appears in the list below.** -| Platform Name | Folder Name | IGDB | Mobygames | +| Platform Name | Folder Name | IGDB | MobyGames | | ----------------------------------------------------- | ----------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | -| 1292 Advanced Programmable Video System | `1292-advanced-programmable-video-system` | IGDB | Mobygames | -| 3DO Interactive Multiplayer | `3do` | IGDB | Mobygames | -| ABC 80 | `abc-80` | | Mobygames | -| APF MP1000/Imagination Machine | `apf` | | Mobygames | +| 1292 Advanced Programmable Video System | `1292-advanced-programmable-video-system` | IGDB | MobyGames | +| 3DO Interactive Multiplayer | `3do` | IGDB | MobyGames | +| ABC 80 | `abc-80` | | MobyGames | +| APF MP1000/Imagination Machine | `apf` | | MobyGames | | AY-3-8500 | `ay-3-8500` | IGDB | | | AY-3-8603 | `ay-3-8603` | IGDB | | | AY-3-8605 | `ay-3-8605` | IGDB | | @@ -14,396 +16,398 @@ Below is a list of all supported platforms/systems/consoles and their respective | AY-3-8610 | `ay-3-8610` | IGDB | | | AY-3-8710 | `ay-3-8710` | IGDB | | | AY-3-8760 | `ay-3-8760` | IGDB | | -| Acorn Archimedes | `acorn-archimedes` | IGDB | Mobygames | -| Acorn Electron | `acorn-electron` | IGDB | Mobygames | -| Adventure Vision | `adventure-vision` | | Mobygames | -| AirConsole | `airconsole` | IGDB | Mobygames | -| Alice 32/90 | `alice-3290` | | Mobygames | -| Altair 680 | `altair-680` | | Mobygames | -| Altair 8800 | `altair-8800` | | Mobygames | -| Amazon Alexa | `amazon-alexa` | | Mobygames | -| Amazon Fire TV | `amazon-fire-tv` | IGDB | Mobygames | -| Amiga | `amiga` | IGDB | Mobygames | -| Amiga CD32 | `amiga-cd32` | IGDB | Mobygames | -| Amstrad CPC | `acpc` | IGDB | Mobygames | -| Amstrad PCW | `amstrad-pcw` | IGDB | Mobygames | -| Android | `android` | IGDB | Mobygames | -| Antstream | `antstream` | | Mobygames | -| Apple I | `apple-i` | | Mobygames | -| Apple II | `appleii` | IGDB | Mobygames | -| Apple IIGD | `apple2gs` | | Mobygames | -| Apple IIGS | `apple-iigs` | IGDB | Mobygames | +| Acorn Archimedes | `acorn-archimedes` | IGDB | MobyGames | +| Acorn Electron | `acorn-electron` | IGDB | MobyGames | +| Adventure Vision | `adventure-vision` | | MobyGames | +| AirConsole | `airconsole` | IGDB | MobyGames | +| Alice 32/90 | `alice-3290` | | MobyGames | +| Altair 680 | `altair-680` | | MobyGames | +| Altair 8800 | `altair-8800` | | MobyGames | +| Amazon Alexa | `amazon-alexa` | | MobyGames | +| Amazon Fire TV | `amazon-fire-tv` | IGDB | MobyGames | +| Amiga | `amiga` | IGDB | MobyGames | +| Amiga CD32 | `amiga-cd32` | IGDB | MobyGames | +| Amstrad CPC | `acpc` | IGDB | MobyGames | +| Amstrad PCW | `amstrad-pcw` | IGDB | MobyGames | +| Android | `android` | IGDB | MobyGames | +| Antstream | `antstream` | | MobyGames | +| Apple I | `apple-i` | | MobyGames | +| Apple II | `appleii` | IGDB | MobyGames | +| Apple IIGD | `apple2gs` | | MobyGames | +| Apple IIGS | `apple-iigs` | IGDB | MobyGames | | Apple Pippin | `apple-pippin` | IGDB | | -| Arcade | `arcade` | IGDB | Mobygames | -| Arcadia 2001 | `arcadia-2001` | IGDB | Mobygames | -| Arduboy | `arduboy` | IGDB | Mobygames | -| Astral 2000 | `astral-2000` | | Mobygames | -| Atari 2600 | `atari2600` | IGDB | Mobygames | -| Atari 5200 | `atari5200` | IGDB | Mobygames | -| Atari 7800 | `atari7800` | IGDB | Mobygames | -| Atari 8-bit | `atari8bit` | IGDB | Mobygames | -| Atari Jaguar | `jaguar` | IGDB | Mobygames | +| Arcade | `arcade` | IGDB | MobyGames | +| Arcadia 2001 | `arcadia-2001` | IGDB | MobyGames | +| Arduboy | `arduboy` | IGDB | MobyGames | +| Astral 2000 | `astral-2000` | | MobyGames | +| Atari 2600 | `atari2600` | IGDB | MobyGames | +| Atari 5200 | `atari5200` | IGDB | MobyGames | +| Atari 7800 | `atari7800` | IGDB | MobyGames | +| Atari 8-bit | `atari8bit` | IGDB | MobyGames | +| Atari Jaguar | `jaguar` | IGDB | MobyGames | | Atari Jaguar CD | `atari-jaguar-cd` | IGDB | | -| Atari Lynx | `lynx` | IGDB | Mobygames | -| Atari ST/STE | `atari-st` | IGDB | Mobygames | -| Atari VCS | `atari-vcs` | | Mobygames | -| Atom | `atom` | | Mobygames | -| BBC Micro | `bbcmicro` | | Mobygames | -| BBC Microcomputer System | `bbcmicro` | IGDB | Mobygames | -| BREW | `brew` | | Mobygames | -| Bally Astrocade | `astrocade` | IGDB | Mobygames | -| BeOS | `beos` | | Mobygames | -| BlackBerry OS | `blackberry` | IGDB | Mobygames | -| Blacknut | `blacknut` | | Mobygames | -| Blu-ray Player | `blu-ray-player` | IGDB | Mobygames | -| Bubble | `bubble` | | Mobygames | -| CD-i | `philips-cd-i` | | Mobygames | +| Atari Lynx | `lynx` | IGDB | MobyGames | +| Atari ST/STE | `atari-st` | IGDB | MobyGames | +| Atari VCS | `atari-vcs` | | MobyGames | +| Atom | `atom` | | MobyGames | +| BBC Micro | `bbcmicro` | | MobyGames | +| BBC Microcomputer System | `bbcmicro` | IGDB | MobyGames | +| BREW | `brew` | | MobyGames | +| Bally Astrocade | `astrocade` | IGDB | MobyGames | +| BeOS | `beos` | | MobyGames | +| BlackBerry OS | `blackberry` | IGDB | MobyGames | +| Blacknut | `blacknut` | | MobyGames | +| Blu-ray Player | `blu-ray-player` | IGDB | MobyGames | +| Bubble | `bubble` | | MobyGames | +| CD-i | `philips-cd-i` | | MobyGames | | CDC Cyber 70 | `cdccyber70` | IGDB | | -| CDTV | `commodore-cdtv` | | Mobygames | -| COSMAC | `fred-cosmac` | | Mobygames | -| CP/M | `cpm` | | Mobygames | +| CDTV | `commodore-cdtv` | | MobyGames | +| COSMAC | `fred-cosmac` | | MobyGames | +| CP/M | `cpm` | | MobyGames | | Call-A-Computer time-shared mainframe computer system | `call-a-computer` | IGDB | | -| Camputers Lynx | `camputers-lynx` | | Mobygames | -| Casio Loopy | `casio-loopy` | IGDB | Mobygames | -| Casio PV-1000 | `casio-pv-1000` | | Mobygames | -| Casio Programmable Calculator | `casio-programmable-calculator` | | Mobygames | -| Champion 2711 | `champion-2711` | | Mobygames | -| Channel F | `fairchild-channel-f` | | Mobygames | -| ClickStart | `clickstart` | | Mobygames | -| Coleco Adam | `colecoadam` | | Mobygames | -| ColecoVision | `colecovision` | IGDB | Mobygames | -| Colour Genie | `colour-genie` | | Mobygames | -| Commodore 128 | `c128` | | Mobygames | -| Commodore 16 | `c16` | IGDB | Mobygames | -| Commodore C64/128/MAX | `c64` | IGDB | Mobygames | -| Commodore CDTV | `commodore-cdtv` | IGDB | Mobygames | -| Commodore PET | `cpet` | IGDB | Mobygames | -| Commodore PET/CBM | `cpet` | | Mobygames | -| Commodore Plus/4 | `c-plus-4` | IGDB | Mobygames | -| Commodore VIC-20 | `vic-20` | IGDB | Mobygames | -| Compal 80 | `compal-80` | | Mobygames | -| Compucolor I | `compucolor-i` | | Mobygames | -| Compucolor II | `compucolor-ii` | | Mobygames | -| Compucorp Programmable Calculator | `compucorp-programmable-calculator` | | Mobygames | -| CreatiVision | `creativision` | | Mobygames | -| Cybervision | `cybervision` | | Mobygames | -| DOS | `dos` | IGDB | Mobygames | -| DVD Player | `dvd-player` | IGDB | Mobygames | -| Danger OS | `danger-os` | | Mobygames | -| Dedicated console | `dedicated-console` | | Mobygames | -| Dedicated handheld | `dedicated-handheld` | | Mobygames | -| Didj | `didj` | | Mobygames | -| DoJa | `doja` | | Mobygames | +| Camputers Lynx | `camputers-lynx` | | MobyGames | +| Casio Loopy | `casio-loopy` | IGDB | MobyGames | +| Casio PV-1000 | `casio-pv-1000` | | MobyGames | +| Casio Programmable Calculator | `casio-programmable-calculator` | | MobyGames | +| Champion 2711 | `champion-2711` | | MobyGames | +| Channel F | `fairchild-channel-f` | | MobyGames | +| ClickStart | `clickstart` | | MobyGames | +| Coleco Adam | `colecoadam` | | MobyGames | +| ColecoVision | `colecovision` | IGDB | MobyGames | +| Colour Genie | `colour-genie` | | MobyGames | +| Commodore 128 | `c128` | | MobyGames | +| Commodore 16 | `c16` | IGDB | MobyGames | +| Commodore C64/128/MAX | `c64` | IGDB | MobyGames | +| Commodore CDTV | `commodore-cdtv` | IGDB | MobyGames | +| Commodore PET | `cpet` | IGDB | MobyGames | +| Commodore PET/CBM | `cpet` | | MobyGames | +| Commodore Plus/4 | `c-plus-4` | IGDB | MobyGames | +| Commodore VIC-20 | `vic-20` | IGDB | MobyGames | +| Compal 80 | `compal-80` | | MobyGames | +| Compucolor I | `compucolor-i` | | MobyGames | +| Compucolor II | `compucolor-ii` | | MobyGames | +| Compucorp Programmable Calculator | `compucorp-programmable-calculator` | | MobyGames | +| CreatiVision | `creativision` | | MobyGames | +| Cybervision | `cybervision` | | MobyGames | +| DOS | `dos` | IGDB | MobyGames | +| DVD Player | `dvd-player` | IGDB | MobyGames | +| Danger OS | `danger-os` | | MobyGames | +| Dedicated console | `dedicated-console` | | MobyGames | +| Dedicated handheld | `dedicated-handheld` | | MobyGames | +| Didj | `didj` | | MobyGames | +| DoJa | `doja` | | MobyGames | | Donner Model 30 | `donner30` | IGDB | | -| Dragon 32/64 | `dragon-32-slash-64` | IGDB | Mobygames | -| Dreamcast | `dc` | IGDB | Mobygames | -| ECD Micromind | `ecd-micromind` | | Mobygames | +| Dragon 32/64 | `dragon-32-slash-64` | IGDB | MobyGames | +| Dreamcast | `dc` | IGDB | MobyGames | +| ECD Micromind | `ecd-micromind` | | MobyGames | | EDSAC | `edsac--1` | IGDB | | -| Electron | `acorn-electron` | | Mobygames | -| Enterprise | `enterprise` | | Mobygames | -| Epoch Cassette Vision | `epoch-cassette-vision` | IGDB | Mobygames | -| Epoch Game Pocket Computer | `epoch-game-pocket-computer` | | Mobygames | -| Epoch Super Cassette Vision | `epoch-super-cassette-vision` | IGDB | Mobygames | -| Evercade | `evercade` | IGDB | Mobygames | -| ExEn | `exen` | | Mobygames | -| Exelvision | `exelvision` | | Mobygames | -| Exidy Sorcerer | `exidy-sorcerer` | IGDB | Mobygames | -| FM Towns | `fm-towns` | IGDB | Mobygames | -| FM-7 | `fm-7` | IGDB | Mobygames | -| Fairchild Channel F | `fairchild-channel-f` | IGDB | Mobygames | +| Electron | `acorn-electron` | | MobyGames | +| Enterprise | `enterprise` | | MobyGames | +| Epoch Cassette Vision | `epoch-cassette-vision` | IGDB | MobyGames | +| Epoch Game Pocket Computer | `epoch-game-pocket-computer` | | MobyGames | +| Epoch Super Cassette Vision | `epoch-super-cassette-vision` | IGDB | MobyGames | +| Evercade | `evercade` | IGDB | MobyGames | +| ExEn | `exen` | | MobyGames | +| Exelvision | `exelvision` | | MobyGames | +| Exidy Sorcerer | `exidy-sorcerer` | IGDB | MobyGames | +| FM Towns | `fm-towns` | IGDB | MobyGames | +| FM-7 | `fm-7` | IGDB | MobyGames | +| Fairchild Channel F | `fairchild-channel-f` | IGDB | MobyGames | | Family Computer | `famicom` | IGDB | | | Family Computer Disk System | `fds` | IGDB | | -| Feature phone | `mobile-custom` | | Mobygames | +| Feature phone | `mobile-custom` | | MobyGames | | Ferranti Nimrod Computer | `nimrod` | IGDB | | -| Fire TV | `amazon-fire-tv` | | Mobygames | -| Freebox | `freebox` | | Mobygames | -| G-cluster | `g-cluster` | | Mobygames | -| GIMINI | `gimini` | | Mobygames | -| GNEX | `gnex` | | Mobygames | -| GP2X | `gp2x` | | Mobygames | -| GP2X Wiz | `gp2x-wiz` | | Mobygames | -| GP32 | `gp32` | | Mobygames | -| GVM | `gvm` | | Mobygames | -| Galaksija | `galaksija` | | Mobygames | +| Fire TV | `amazon-fire-tv` | | MobyGames | +| Freebox | `freebox` | | MobyGames | +| G-cluster | `g-cluster` | | MobyGames | +| GIMINI | `gimini` | | MobyGames | +| GNEX | `gnex` | | MobyGames | +| GP2X | `gp2x` | | MobyGames | +| GP2X Wiz | `gp2x-wiz` | | MobyGames | +| GP32 | `gp32` | | MobyGames | +| GVM | `gvm` | | MobyGames | +| Galaksija | `galaksija` | | MobyGames | | Gamate | `gamate` | IGDB | | | Game & Watch | `g-and-w` | IGDB | | -| Game Boy | `gb` | IGDB | Mobygames | -| Game Boy Advance | `gba` | IGDB | Mobygames | -| Game Boy Color | `gbc` | IGDB | Mobygames | -| Game Gear | `gamegear` | | Mobygames | -| Game Wave | `game-wave` | | Mobygames | -| Game.Com | `game-dot-com` | | Mobygames | -| Game.com | `game-dot-com` | IGDB | Mobygames | -| GameStick | `gamestick` | | Mobygames | +| Game Boy | `gb` | IGDB | MobyGames | +| Game Boy Advance | `gba` | IGDB | MobyGames | +| Game Boy Color | `gbc` | IGDB | MobyGames | +| Game Gear | `gamegear` | | MobyGames | +| Game Wave | `game-wave` | | MobyGames | +| Game.Com | `game-dot-com` | | MobyGames | +| Game.com | `game-dot-com` | IGDB | MobyGames | +| GameStick | `gamestick` | | MobyGames | | Gear VR | `gear-vr` | IGDB | | -| Genesis/Mega Drive | `genesis-slash-megadrive` | | Mobygames | -| Gizmondo | `gizmondo` | IGDB | Mobygames | -| Gloud | `gloud` | | Mobygames | -| Glulx | `glulx` | | Mobygames | -| Google Stadia | `stadia` | IGDB | Mobygames | -| HD DVD Player | `hd-dvd-player` | | Mobygames | +| Genesis/Mega Drive | `genesis-slash-megadrive` | | MobyGames | +| Gizmondo | `gizmondo` | IGDB | MobyGames | +| Gloud | `gloud` | | MobyGames | +| Glulx | `glulx` | | MobyGames | +| Google Stadia | `stadia` | IGDB | MobyGames | +| HD DVD Player | `hd-dvd-player` | | MobyGames | | HP 2100 | `hp2100` | IGDB | | | HP 3000 | `hp3000` | IGDB | | -| HP 9800 | `hp-9800` | | Mobygames | -| HP Programmable Calculator | `hp-programmable-calculator` | | Mobygames | +| HP 9800 | `hp-9800` | | MobyGames | +| HP Programmable Calculator | `hp-programmable-calculator` | | MobyGames | | Handheld Electronic LCD | `handheld-electronic-lcd` | IGDB | | -| Heath/Zenith H8/H89 | `heathzenith` | | Mobygames | -| Heathkit H11 | `heathkit-h11` | | Mobygames | -| Hitachi S1 | `hitachi-s1` | | Mobygames | -| Hugo | `hugo` | | Mobygames | +| Heath/Zenith H8/H89 | `heathzenith` | | MobyGames | +| Heathkit H11 | `heathkit-h11` | | MobyGames | +| Hitachi S1 | `hitachi-s1` | | MobyGames | +| Hugo | `hugo` | | MobyGames | | Hyper Neo Geo 64 | `hyper-neo-geo-64` | IGDB | | -| HyperScan | `hyperscan` | IGDB | Mobygames | -| IBM 5100 | `ibm-5100` | | Mobygames | -| Ideal-Computer | `ideal-computer` | | Mobygames | -| Intel 8008 | `intel-8008` | | Mobygames | -| Intel 8080 | `intel-8080` | | Mobygames | -| Intel 8086 / 8088 | `intel-8086` | | Mobygames | -| Intellivision | `intellivision` | IGDB | Mobygames | +| HyperScan | `hyperscan` | IGDB | MobyGames | +| IBM 5100 | `ibm-5100` | | MobyGames | +| Ideal-Computer | `ideal-computer` | | MobyGames | +| Intel 8008 | `intel-8008` | | MobyGames | +| Intel 8080 | `intel-8080` | | MobyGames | +| Intel 8086 / 8088 | `intel-8086` | | MobyGames | +| Intellivision | `intellivision` | IGDB | MobyGames | | Intellivision Amico | `intellivision-amico` | IGDB | | -| Interact Model One | `interact-model-one` | | Mobygames | -| Interton Video 2000 | `interton-video-2000` | | Mobygames | +| Interact Model One | `interact-model-one` | | MobyGames | +| Interton Video 2000 | `interton-video-2000` | | MobyGames | | Interton VC 4000 | `vc-4000` | IGDB | | -| J2ME | `j2me` | | Mobygames | -| Jolt | `jolt` | | Mobygames | -| Jupiter Ace | `jupiter-ace` | | Mobygames | -| KIM-1 | `kim-1` | | Mobygames | -| KaiOS | `kaios` | | Mobygames | -| Kindle Classic | `kindle` | | Mobygames | -| Laser 200 | `laser200` | | Mobygames | -| LaserActive | `laseractive` | | Mobygames | -| LeapTV | `leaptv` | IGDB | Mobygames | -| Leapster | `leapster` | IGDB | Mobygames | -| Leapster Explorer/LeadPad Explorer | `leapster-explorer-slash-leadpad-explorer` | IGDB | Mobygames | -| Leapster Explorer/LeapPad Explorer | `leapster-explorer-slash-leadpad-explorer` | | Mobygames | +| J2ME | `j2me` | | MobyGames | +| Jolt | `jolt` | | MobyGames | +| Jupiter Ace | `jupiter-ace` | | MobyGames | +| KIM-1 | `kim-1` | | MobyGames | +| KaiOS | `kaios` | | MobyGames | +| Kindle Classic | `kindle` | | MobyGames | +| Laser 200 | `laser200` | | MobyGames | +| LaserActive | `laseractive` | | MobyGames | +| LeapTV | `leaptv` | IGDB | MobyGames | +| Leapster | `leapster` | IGDB | MobyGames | +| Leapster Explorer/LeadPad Explorer | `leapster-explorer-slash-leadpad-explorer` | IGDB | MobyGames | +| Leapster Explorer/LeapPad Explorer | `leapster-explorer-slash-leadpad-explorer` | | MobyGames | | Legacy Computer | `legacy-computer` | IGDB | | | Legacy Mobile Device | `mobile` | IGDB | | -| Linux | `linux` | IGDB | Mobygames | -| Luna | `luna` | | Mobygames | -| MOS Technology 6502 | `mos-technology-6502` | | Mobygames | -| MRE | `mre` | | Mobygames | -| MSX | `msx` | IGDB | Mobygames | +| Linux | `linux` | IGDB | MobyGames | +| Luna | `luna` | | MobyGames | +| MOS Technology 6502 | `mos-technology-6502` | | MobyGames | +| MRE | `mre` | | MobyGames | +| MSX | `msx` | IGDB | MobyGames | | MSX2 | `msx2` | IGDB | | -| Mac | `mac` | IGDB | Mobygames | -| Macintosh | `mac` | | Mobygames | -| Maemo | `maemo` | | Mobygames | -| Mainframe | `mainframe` | | Mobygames | -| Matsushita/Panasonic JR | `matsushitapanasonic-jr` | | Mobygames | -| Mattel Aquarius | `mattel-aquarius` | | Mobygames | -| MeeGo | `meego` | | Mobygames | +| Mac | `mac` | IGDB | MobyGames | +| Macintosh | `mac` | | MobyGames | +| Maemo | `maemo` | | MobyGames | +| Mainframe | `mainframe` | | MobyGames | +| Matsushita/Panasonic JR | `matsushitapanasonic-jr` | | MobyGames | +| Mattel Aquarius | `mattel-aquarius` | | MobyGames | +| MeeGo | `meego` | | MobyGames | | Mega Duck/Cougar Boy | `mega-duck-slash-cougar-boy` | IGDB | | -| Memotech MTX | `memotech-mtx` | | Mobygames | -| Meritum | `meritum` | | Mobygames | +| Memotech MTX | `memotech-mtx` | | MobyGames | +| Meritum | `meritum` | | MobyGames | | Meta Quest 2 | `meta-quest-2` | IGDB | | | Meta Quest 3 | `meta-quest-3` | IGDB | | -| Microbee | `microbee` | | Mobygames | -| Microtan 65 | `microtan-65` | | Mobygames | -| Microvision | `microvision--1` | IGDB | Mobygames | -| Mophun | `mophun` | | Mobygames | -| Motorola 6800 | `motorola-6800` | | Mobygames | -| Motorola 68k | `motorola-68k` | | Mobygames | -| N-Gage | `ngage` | IGDB | Mobygames | -| N-Gage (service) | `ngage2` | | Mobygames | +| Microbee | `microbee` | | MobyGames | +| Microtan 65 | `microtan-65` | | MobyGames | +| Microvision | `microvision--1` | IGDB | MobyGames | +| Mophun | `mophun` | | MobyGames | +| Motorola 6800 | `motorola-6800` | | MobyGames | +| Motorola 68k | `motorola-68k` | | MobyGames | +| N-Gage | `ngage` | IGDB | MobyGames | +| N-Gage (service) | `ngage2` | | MobyGames | | NEC PC-6000 Series | `nec-pc-6000-series` | IGDB | | -| Nascom | `nascom` | | Mobygames | -| Neo Geo | `neogeoaes` | | Mobygames | -| Neo Geo AES | `neogeoaes` | IGDB | Mobygames | -| Neo Geo CD | `neo-geo-cd` | IGDB | Mobygames | -| Neo Geo MVS | `neogeomvs` | IGDB | Mobygames | -| Neo Geo Pocket | `neo-geo-pocket` | IGDB | Mobygames | -| Neo Geo Pocket Color | `neo-geo-pocket-color` | IGDB | Mobygames | -| Neo Geo X | `neo-geo-x` | | Mobygames | -| New Nintendo 3DS | `new-nintendo-3ds` | IGDB | Mobygames | -| NewBrain | `newbrain` | | Mobygames | -| Newton | `newton` | | Mobygames | -| Nintendo 3DS | `3ds` | IGDB | Mobygames | -| Nintendo 64 | `n64` | IGDB | Mobygames | +| Nascom | `nascom` | | MobyGames | +| Neo Geo | `neogeoaes` | | MobyGames | +| Neo Geo AES | `neogeoaes` | IGDB | MobyGames | +| Neo Geo CD | `neo-geo-cd` | IGDB | MobyGames | +| Neo Geo MVS | `neogeomvs` | IGDB | MobyGames | +| Neo Geo Pocket | `neo-geo-pocket` | IGDB | MobyGames | +| Neo Geo Pocket Color | `neo-geo-pocket-color` | IGDB | MobyGames | +| Neo Geo X | `neo-geo-x` | | MobyGames | +| New Nintendo 3DS | `new-nintendo-3ds` | IGDB | MobyGames | +| NewBrain | `newbrain` | | MobyGames | +| Newton | `newton` | | MobyGames | +| Nintendo 3DS | `3ds` | IGDB | MobyGames | +| Nintendo 64 | `n64` | IGDB | MobyGames | | Nintendo 64DD | `nintendo-64dd` | IGDB | | -| Nintendo DS | `nds` | IGDB | Mobygames | -| Nintendo DSi | `nintendo-dsi` | IGDB | Mobygames | -| Nintendo Entertainment System | `nes` | IGDB | Mobygames | -| Nintendo GameCube | `ngc` | IGDB | Mobygames | +| Nintendo DS | `nds` | IGDB | MobyGames | +| Nintendo DSi | `nintendo-dsi` | IGDB | MobyGames | +| Nintendo Entertainment System | `nes` | IGDB | MobyGames | +| Nintendo GameCube | `ngc` | IGDB | MobyGames | | Nintendo PlayStation | `nintendo-playstation` | IGDB | | -| Nintendo Switch | `switch` | IGDB | Mobygames | -| North Star | `northstar` | | Mobygames | -| Noval 760 | `noval-760` | | Mobygames | -| Nuon | `nuon` | IGDB | Mobygames | -| OOParts | `ooparts` | IGDB | Mobygames | -| OS/2 | `os2` | | Mobygames | -| Oculus Go | `oculus-go` | IGDB | Mobygames | -| Oculus Quest | `oculus-quest` | IGDB | Mobygames | +| Nintendo Switch | `switch` | IGDB | MobyGames | +| North Star | `northstar` | | MobyGames | +| Noval 760 | `noval-760` | | MobyGames | +| Nuon | `nuon` | IGDB | MobyGames | +| OOParts | `ooparts` | IGDB | MobyGames | +| OS/2 | `os2` | | MobyGames | +| Oculus Go | `oculus-go` | IGDB | MobyGames | +| Oculus Quest | `oculus-quest` | IGDB | MobyGames | | Oculus Rift | `oculus-rift` | IGDB | | -| Odyssey | `odyssey--1` | IGDB | Mobygames | -| Odyssey 2/Videopac G7000 | `odyssey-2-slash-videopac-g7000` | IGDB | Mobygames | -| Ohio Scientific | `ohio-scientific` | | Mobygames | -| OnLive Game System | `onlive-game-system` | IGDB | Mobygames | -| Orao | `orao` | | Mobygames | -| Oric | `oric` | | Mobygames | -| Ouya | `ouya` | IGDB | Mobygames | -| PC (Microsoft Windows) | `win` | IGDB | Mobygames | -| PC Booter | `pc-booter` | | Mobygames | -| PC Engine SuperGrafx | `supergrafx` | IGDB | Mobygames | +| Odyssey | `odyssey--1` | IGDB | MobyGames | +| Odyssey 2/Videopac G7000 | `odyssey-2-slash-videopac-g7000` | IGDB | MobyGames | +| Ohio Scientific | `ohio-scientific` | | MobyGames | +| OnLive Game System | `onlive-game-system` | IGDB | MobyGames | +| Orao | `orao` | | MobyGames | +| Oric | `oric` | | MobyGames | +| Ouya | `ouya` | IGDB | MobyGames | +| PC (Microsoft Windows) | `win` | IGDB | MobyGames | +| PC Booter | `pc-booter` | | MobyGames | +| PC Engine SuperGrafx | `supergrafx` | IGDB | MobyGames | | PC-50X Family | `pc-50x-family` | IGDB | | -| PC-6001 | `pc-6001` | | Mobygames | -| PC-8000 | `pc-8000` | | Mobygames | -| PC-8800 Series | `pc-8800-series` | IGDB | Mobygames | -| PC-9800 Series | `pc-9800-series` | IGDB | Mobygames | -| PC-FX | `pc-fx` | IGDB | Mobygames | +| PC-6001 | `pc-6001` | | MobyGames | +| PC-8000 | `pc-8000` | | MobyGames | +| PC-8800 Series | `pc-8800-series` | IGDB | MobyGames | +| PC-9800 Series | `pc-9800-series` | IGDB | MobyGames | +| PC-FX | `pc-fx` | IGDB | MobyGames | | PDP-1 | `pdp1` | IGDB | | | PDP-10 | `pdp10` | IGDB | | | PDP-11 | `pdp11` | IGDB | | | PDP-8 | `pdp-8--1` | IGDB | | -| PICO | `pico` | | Mobygames | +| PICO | `pico` | | MobyGames | | PLATO | `plato--1` | IGDB | | -| PS Vita | `psvita` | | Mobygames | -| Palm OS | `palm-os` | IGDB | Mobygames | +| PS Vita | `psvita` | | MobyGames | +| Palm OS | `palm-os` | IGDB | MobyGames | | Panasonic Jungle | `panasonic-jungle` | IGDB | | | Panasonic M2 | `panasonic-m2` | IGDB | | -| Pandora | `pandora` | | Mobygames | -| Pebble | `pebble` | | Mobygames | -| Philips CD-i | `philips-cd-i` | IGDB | Mobygames | -| Philips VG 5000 | `philips-vg-5000` | | Mobygames | -| Photo CD | `photocd` | | Mobygames | -| Pippin | `pippin` | | Mobygames | -| PlayStation | `ps` | IGDB | Mobygames | -| PlayStation 2 | `ps2` | IGDB | Mobygames | -| PlayStation 3 | `ps3` | IGDB | Mobygames | -| PlayStation 4 | `ps4--1` | IGDB | Mobygames | -| PlayStation 5 | `ps5` | IGDB | Mobygames | -| PlayStation Now | `playstation-now` | | Mobygames | -| PlayStation Portable | `psp` | IGDB | Mobygames | +| Pandora | `pandora` | | MobyGames | +| Pebble | `pebble` | | MobyGames | +| Philips CD-i | `philips-cd-i` | IGDB | MobyGames | +| Philips VG 5000 | `philips-vg-5000` | | MobyGames | +| Photo CD | `photocd` | | MobyGames | +| Pippin | `pippin` | | MobyGames | +| PlayStation | `ps` | IGDB | MobyGames | +| PlayStation 2 | `ps2` | IGDB | MobyGames | +| PlayStation 3 | `ps3` | IGDB | MobyGames | +| PlayStation 4 | `ps4--1` | IGDB | MobyGames | +| PlayStation 5 | `ps5` | IGDB | MobyGames | +| PlayStation Now | `playstation-now` | | MobyGames | +| PlayStation Portable | `psp` | IGDB | MobyGames | | PlayStation VR | `psvr` | IGDB | | | PlayStation VR2 | `psvr2` | IGDB | | -| PlayStation Vita | `psvita` | IGDB | Mobygames | -| Playdate | `playdate` | IGDB | Mobygames | -| Playdia | `playdia` | IGDB | Mobygames | -| Plex Arcade | `plex-arcade` | | Mobygames | +| PlayStation Vita | `psvita` | IGDB | MobyGames | +| Playdate | `playdate` | IGDB | MobyGames | +| Playdia | `playdia` | IGDB | MobyGames | +| Plex Arcade | `plex-arcade` | | MobyGames | | Plug & Play | `plug-and-play` | IGDB | | | PocketStation | `pocketstation` | IGDB | | -| Pokitto | `pokitto` | | Mobygames | -| Pokémon mini | `pokemon-mini` | IGDB | Mobygames | -| Poly-88 | `poly-88` | | Mobygames | +| Pokitto | `pokitto` | | MobyGames | +| Pokémon mini | `pokemon-mini` | IGDB | MobyGames | +| Poly-88 | `poly-88` | | MobyGames | | R-Zone | `r-zone` | IGDB | | -| RCA Studio II | `rca-studio-ii` | | Mobygames | -| Research Machines 380Z | `research-machines-380z` | | Mobygames | -| Roku | `roku` | | Mobygames | -| SAM Coupé | `sam-coupe` | | Mobygames | -| SC/MP | `scmp` | | Mobygames | -| SD-200/270/290 | `sd-200270290` | | Mobygames | +| RCA Studio II | `rca-studio-ii` | | MobyGames | +| Research Machines 380Z | `research-machines-380z` | | MobyGames | +| Roku | `roku` | | MobyGames | +| SAM Coupé | `sam-coupe` | | MobyGames | +| SC/MP | `scmp` | | MobyGames | +| SD-200/270/290 | `sd-200270290` | | MobyGames | | SDS Sigma 7 | `sdssigma7` | IGDB | | -| SEGA 32X | `sega-32x` | | Mobygames | -| SEGA CD | `segacd` | | Mobygames | -| SEGA Master System | `sega-master-system` | | Mobygames | -| SEGA Saturn | `saturn` | | Mobygames | +| SEGA 32X | `sega-32x` | | MobyGames | +| SEGA CD | `segacd` | | MobyGames | +| SEGA Master System | `sega-master-system` | | MobyGames | +| SEGA Saturn | `saturn` | | MobyGames | | SG-1000 | `sg1000` | IGDB | | -| SK-VM | `sk-vm` | | Mobygames | -| SMC-777 | `smc-777` | | Mobygames | -| SRI-500/1000 | `sri-5001000` | | Mobygames | -| SWTPC 6800 | `swtpc-6800` | | Mobygames | +| SK-VM | `sk-vm` | | MobyGames | +| SMC-777 | `smc-777` | | MobyGames | +| SRI-500/1000 | `sri-5001000` | | MobyGames | +| SWTPC 6800 | `swtpc-6800` | | MobyGames | | Satellaview | `satellaview` | IGDB | | -| Sega 32X | `sega32` | IGDB | Mobygames | -| Sega CD | `segacd` | IGDB | Mobygames | -| Sega Game Gear | `gamegear` | IGDB | Mobygames | +| Sega 32X | `sega32` | IGDB | MobyGames | +| Sega CD | `segacd` | IGDB | MobyGames | +| Sega Game Gear | `gamegear` | IGDB | MobyGames | | Sega Master System/Mark III | `sms` | IGDB | | -| Sega Mega Drive/Genesis | `genesis-slash-megadrive` | IGDB | Mobygames | -| Sega Pico | `sega-pico` | IGDB | Mobygames | -| Sega Saturn | `saturn` | IGDB | Mobygames | +| Sega Mega Drive/Genesis | `genesis-slash-megadrive` | IGDB | MobyGames | +| Sega Pico | `sega-pico` | IGDB | MobyGames | +| Sega Saturn | `saturn` | IGDB | MobyGames | | Sharp MZ-2200 | `sharp-mz-2200` | IGDB | | -| Sharp MZ-80B/2000/2500 | `sharp-mz-80b20002500` | | Mobygames | -| Sharp MZ-80K/700/800/1500 | `sharp-mz-80k7008001500` | | Mobygames | -| Sharp X1 | `x1` | IGDB | Mobygames | -| Sharp X68000 | `sharp-x68000` | IGDB | Mobygames | -| Sharp Zaurus | `sharp-zaurus` | | Mobygames | -| Signetics 2650 | `signetics-2650` | | Mobygames | -| Sinclair QL | `sinclair-ql` | IGDB | Mobygames | -| Sinclair ZX81 | `sinclair-zx81` | IGDB | Mobygames | -| Socrates | `socrates` | | Mobygames | -| Sol-20 | `sol-20` | IGDB | Mobygames | -| Sord M5 | `sord-m5` | | Mobygames | -| Spectravideo | `spectravideo` | | Mobygames | -| Super A'can | `super-acan` | | Mobygames | +| Sharp MZ-80B/2000/2500 | `sharp-mz-80b20002500` | | MobyGames | +| Sharp MZ-80K/700/800/1500 | `sharp-mz-80k7008001500` | | MobyGames | +| Sharp X1 | `x1` | IGDB | MobyGames | +| Sharp X68000 | `sharp-x68000` | IGDB | MobyGames | +| Sharp Zaurus | `sharp-zaurus` | | MobyGames | +| Signetics 2650 | `signetics-2650` | | MobyGames | +| Sinclair QL | `sinclair-ql` | IGDB | MobyGames | +| Sinclair ZX81 | `sinclair-zx81` | IGDB | MobyGames | +| Socrates | `socrates` | | MobyGames | +| Sol-20 | `sol-20` | IGDB | MobyGames | +| Sord M5 | `sord-m5` | | MobyGames | +| Spectravideo | `spectravideo` | | MobyGames | +| Super A'can | `super-acan` | | MobyGames | | Super Famicom | `sfam` | IGDB | | -| Super Nintendo Entertainment System | `snes` | IGDB | Mobygames | -| Super Vision 8000 | `super-vision-8000` | | Mobygames | -| Supervision | `supervision` | | Mobygames | -| Sure Shot HD | `sure-shot-hd` | | Mobygames | +| Super Nintendo Entertainment System | `snes` | IGDB | MobyGames | +| Super Vision 8000 | `super-vision-8000` | | MobyGames | +| Supervision | `supervision` | | MobyGames | +| Sure Shot HD | `sure-shot-hd` | | MobyGames | | SwanCrystal | `swancrystal` | IGDB | | -| Symbian | `symbian` | | Mobygames | -| TADS | `tads` | | Mobygames | -| TI Programmable Calculator | `ti-programmable-calculator` | | Mobygames | -| TI-99/4A | `ti-994a` | | Mobygames | -| TIM | `tim` | | Mobygames | -| TRS-80 | `trs-80` | IGDB | Mobygames | -| TRS-80 Color Computer | `trs-80-color-computer` | IGDB | Mobygames | -| TRS-80 MC-10 | `trs-80-mc-10` | | Mobygames | -| TRS-80 Model 100 | `trs-80-model-100` | | Mobygames | -| Taito X-55 | `taito-x-55` | | Mobygames | +| Symbian | `symbian` | | MobyGames | +| TADS | `tads` | | MobyGames | +| TI Programmable Calculator | `ti-programmable-calculator` | | MobyGames | +| TI-99/4A | `ti-994a` | | MobyGames | +| TIM | `tim` | | MobyGames | +| TRS-80 | `trs-80` | IGDB | MobyGames | +| TRS-80 Color Computer | `trs-80-color-computer` | IGDB | MobyGames | +| TRS-80 MC-10 | `trs-80-mc-10` | | MobyGames | +| TRS-80 Model 100 | `trs-80-model-100` | | MobyGames | +| Taito X-55 | `taito-x-55` | | MobyGames | | Tapwave Zodiac | `zod` | IGDB | | -| Tatung Einstein | `tatung-einstein` | IGDB | Mobygames | -| Tektronix 4050 | `tektronix-4050` | | Mobygames | -| Tele-Spiel ES-2201 | `tele-spiel` | | Mobygames | -| Telstar Arcade | `telstar-arcade` | | Mobygames | +| Tatung Einstein | `tatung-einstein` | IGDB | MobyGames | +| Tektronix 4050 | `tektronix-4050` | | MobyGames | +| Tele-Spiel ES-2201 | `tele-spiel` | | MobyGames | +| Telstar Arcade | `telstar-arcade` | | MobyGames | | Terebikko / See 'n Say Video Phone | `terebikko-slash-see-n-say-video-phone` | IGDB | | -| Terminal | `terminal` | | Mobygames | -| Texas Instruments TI-99 | `ti-99` | IGDB | Mobygames | -| Thomson MO5 | `thomson-mo5` | IGDB | Mobygames | -| Thomson TO | `thomson-to` | | Mobygames | -| Tiki 100 | `tiki-100` | | Mobygames | -| Timex Sinclair 2068 | `timex-sinclair-2068` | | Mobygames | -| Tizen | `tizen` | | Mobygames | -| Tomahawk F1 | `tomahawk-f1` | | Mobygames | -| Tomy Tutor | `tomy-tutor` | | Mobygames | -| Triton | `triton` | | Mobygames | -| TurboGrafx CD | `turbografx-16-slash-pc-engine-cd` | | Mobygames | -| TurboGrafx-16 | `turbografx16--1` | | Mobygames | -| TurboGrafx-16/PC Engine | `turbografx16--1` | IGDB | Mobygames | -| Turbografx-16/PC Engine CD | `turbografx-16-slash-pc-engine-cd` | IGDB | Mobygames | -| V.Flash | `vflash` | | Mobygames | -| V.Smile | `vsmile` | IGDB | Mobygames | -| VIS | `vis` | | Mobygames | -| Vectrex | `vectrex` | IGDB | Mobygames | -| Versatile | `versatile` | | Mobygames | -| VideoBrain | `videobrain` | | Mobygames | -| Videopac+ G7400 | `videopac-g7400` | | Mobygames | -| Virtual Boy | `virtualboy` | IGDB | Mobygames | +| Terminal | `terminal` | | MobyGames | +| Texas Instruments TI-99 | `ti-99` | IGDB | MobyGames | +| Thomson MO5 | `thomson-mo5` | IGDB | MobyGames | +| Thomson TO | `thomson-to` | | MobyGames | +| Tiki 100 | `tiki-100` | | MobyGames | +| Timex Sinclair 2068 | `timex-sinclair-2068` | | MobyGames | +| Tizen | `tizen` | | MobyGames | +| Tomahawk F1 | `tomahawk-f1` | | MobyGames | +| Tomy Tutor | `tomy-tutor` | | MobyGames | +| Triton | `triton` | | MobyGames | +| TurboGrafx CD | `turbografx-16-slash-pc-engine-cd` | | MobyGames | +| TurboGrafx-16 | `turbografx16--1` | | MobyGames | +| TurboGrafx-16/PC Engine | `turbografx16--1` | IGDB | MobyGames | +| Turbografx-16/PC Engine CD | `turbografx-16-slash-pc-engine-cd` | IGDB | MobyGames | +| V.Flash | `vflash` | | MobyGames | +| V.Smile | `vsmile` | IGDB | MobyGames | +| VIS | `vis` | | MobyGames | +| Vectrex | `vectrex` | IGDB | MobyGames | +| Versatile | `versatile` | | MobyGames | +| VideoBrain | `videobrain` | | MobyGames | +| Videopac+ G7400 | `videopac-g7400` | | MobyGames | +| Virtual Boy | `virtualboy` | IGDB | MobyGames | | Virtual Console | `vc` | IGDB | | | Visual Memory Unit / Visual Memory System | `visual-memory-unit-slash-visual-memory-system` | IGDB | | -| WIPI | `wipi` | | Mobygames | -| Wang 2200 | `wang2200` | | Mobygames | +| WIPI | `wipi` | | MobyGames | +| Wang 2200 | `wang2200` | | MobyGames | | Watara/QuickShot Supervision | `watara-slash-quickshot-supervision` | IGDB | | -| Web browser | `browser` | IGDB | Mobygames | -| Wii | `wii` | IGDB | Mobygames | -| Wii U | `wiiu` | IGDB | Mobygames | -| Windows | `win` | | Mobygames | -| Windows 3.x | `win3x` | | Mobygames | -| Windows Apps | `windows-apps` | | Mobygames | -| Windows Mobile | `windows-mobile` | IGDB | Mobygames | -| Windows Phone | `winphone` | IGDB | Mobygames | -| WonderSwan | `wonderswan` | IGDB | Mobygames | -| WonderSwan Color | `wonderswan-color` | IGDB | Mobygames | -| XaviXPORT | `xavixport` | | Mobygames | -| Xbox | `xbox` | IGDB | Mobygames | -| Xbox 360 | `xbox360` | IGDB | Mobygames | -| Xbox Cloud Gaming | `xboxcloudgaming` | | Mobygames | -| Xbox One | `xboxone` | IGDB | Mobygames | -| Xbox Series X | `series-x` | IGDB | Mobygames | -| Xerox Alto | `xerox-alto` | | Mobygames | -| Z-machine | `z-machine` | | Mobygames | +| Web browser | `browser` | IGDB | MobyGames | +| Wii | `wii` | IGDB | MobyGames | +| Wii U | `wiiu` | IGDB | MobyGames | +| Windows | `win` | | MobyGames | +| Windows 3.x | `win3x` | | MobyGames | +| Windows Apps | `windows-apps` | | MobyGames | +| Windows Mobile | `windows-mobile` | IGDB | MobyGames | +| Windows Phone | `winphone` | IGDB | MobyGames | +| WonderSwan | `wonderswan` | IGDB | MobyGames | +| WonderSwan Color | `wonderswan-color` | IGDB | MobyGames | +| XaviXPORT | `xavixport` | | MobyGames | +| Xbox | `xbox` | IGDB | MobyGames | +| Xbox 360 | `xbox360` | IGDB | MobyGames | +| Xbox Cloud Gaming | `xboxcloudgaming` | | MobyGames | +| Xbox One | `xboxone` | IGDB | MobyGames | +| Xbox Series X | `series-x` | IGDB | MobyGames | +| Xerox Alto | `xerox-alto` | | MobyGames | +| Z-machine | `z-machine` | | MobyGames | | ZX Spectrum | `zxs` | IGDB | | -| ZX Spectrum Next | `zx-spectrum-next` | | Mobygames | -| ZX80 | `zx80` | | Mobygames | -| ZX81 | `sinclair-zx81` | | Mobygames | -| Zeebo | `zeebo` | IGDB | Mobygames | -| Zilog Z80 | `z80` | | Mobygames | -| Zilog Z8000 | `zilog-z8000` | | Mobygames | -| Zodiac | `zodiac` | | Mobygames | -| Zune | `zune` | | Mobygames | -| bada | `bada` | | Mobygames | -| digiBlast | `digiblast` | | Mobygames | -| iOS | `ios` | IGDB | Mobygames | -| iPad | `ipad` | | Mobygames | -| iPod Classic | `ipod-classic` | | Mobygames | -| iiRcade | `iircade` | | Mobygames | -| tvOS | `tvos` | | Mobygames | +| ZX Spectrum Next | `zx-spectrum-next` | | MobyGames | +| ZX80 | `zx80` | | MobyGames | +| ZX81 | `sinclair-zx81` | | MobyGames | +| Zeebo | `zeebo` | IGDB | MobyGames | +| Zilog Z80 | `z80` | | MobyGames | +| Zilog Z8000 | `zilog-z8000` | | MobyGames | +| Zodiac | `zodiac` | | MobyGames | +| Zune | `zune` | | MobyGames | +| bada | `bada` | | MobyGames | +| digiBlast | `digiblast` | | MobyGames | +| iOS | `ios` | IGDB | MobyGames | +| iPad | `ipad` | | MobyGames | +| iPod Classic | `ipod-classic` | | MobyGames | +| iiRcade | `iircade` | | MobyGames | +| tvOS | `tvos` | | MobyGames | | visionOS | `visionos` | IGDB | | -| watchOS | `watchos` | | Mobygames | -| webOS | `webos` | | Mobygames | +| watchOS | `watchos` | | MobyGames | +| webOS | `webos` | | MobyGames | + + diff --git a/docs/System-Setup/Synology-Setup-Guide.md b/docs/System-Setup/Synology-Setup-Guide.md index 2a22e354..23751796 100644 --- a/docs/System-Setup/Synology-Setup-Guide.md +++ b/docs/System-Setup/Synology-Setup-Guide.md @@ -44,7 +44,7 @@ mkdir -p /volume1/docker/mariadb-romm ### 2. Network Bridge Setup -Create a new network bridge named `rommbridge` following standard Docker networking practices. You can use [Dr. Frankensteins' guide](https://drfrankenstein.co.uk/step-3-setting-up-a-docker-bridge-network-in-container-manager/) for reference. +Create a new network bridge named `rommbridge` following standard Docker networking practices. You can use [this guide](https://drfrankenstein.co.uk/step-3-setting-up-a-docker-bridge-network-in-container-manager/) for reference. ### 3. Key Generation @@ -61,21 +61,22 @@ Save the output - you'll need it for the `ROMM_AUTH_SECRET_KEY` in your configur #### API Integration Setup -RomM currecntly supports 3 metadata sources: IGDB, MobyGames and SteamGridDB. Follow the dedicated wiki page for [API key generation](../Getting-Started/Generate-API-Keys.md) to set up your API keys. We recommend setting up IGDG at the minimum. +RomM currently supports 3 metadata sources: IGDB, MobyGames and SteamGridDB. Follow the dedicated wiki page for [API key generation](../Getting-Started/Generate-API-Keys.md) to set up your API keys. We recommend setting up IGDG at the minimum. ### 4. MariaDB Configuration -#### Important Notes - -- This guide uses a dedicated MariaDB container for RomM, but you can use an existing MariaDB instance if preferred -- We're using MariaDB version 10.7 for compatibility -- The container uses port 3306 internally, mapped to 3309 externally -- A simplified health check is implemented for stability + +!!! important + - This guide uses a dedicated MariaDB container for RomM, but you can use an existing MariaDB instance if preferred + - We're using MariaDB version 10.7 for compatibility + - The container uses port 3306 internally, mapped to 3309 externally + - A simplified health check is implemented for stability ### 5. Docker Compose Configuration Create a `docker-compose.yml` file with the following content: + ???+ example "Example Docker Compose" ``` yaml --8<-- "synology.docker-compose.yml" @@ -88,12 +89,12 @@ Create a `docker-compose.yml` file with the following content: 3. Monitor progress through container logs 4. Access RomM through your browser at `http://your-server-ip:7676` -## Important Notes - -- Replace placeholder values (UIDs, GIDs, passwords, API keys) with your own -- Ensure proper permissions on all created directories -- Back up your configuration after successful setup -- Monitor logs during initial startup for any errors + +!!! important + - Replace placeholder values (UIDs, GIDs, passwords, API keys) with your own + - Ensure proper permissions on all created directories + - Back up your configuration after successful setup + - Monitor logs during initial startup for any errors ## Troubleshooting @@ -104,4 +105,4 @@ Create a `docker-compose.yml` file with the following content: ## Contributing -This guide is an abbridged version of ChopFoo's original guide. If you have any suggestions or improvements, please submit a pull request to the [RomM wiki](https://github.com/rommapp/wiki). +This guide is an abridged version of ChopFoo's original guide. If you have any suggestions or improvements, please submit a pull request to the [RomM wiki](https://github.com/rommapp/wiki). diff --git a/docs/System-Setup/Tinfoil-Integration.md b/docs/System-Setup/Tinfoil-Integration.md index 0ad3fe6c..b6cf76de 100644 --- a/docs/System-Setup/Tinfoil-Integration.md +++ b/docs/System-Setup/Tinfoil-Integration.md @@ -9,7 +9,7 @@ Please note down the following in order to make this as smooth as possible, as w - RomM updated to at least [3.5.0](https://github.com/rommapp/romm/releases/tag/3.5.0) - Add `DISABLE_DOWNLOAD_ENDPOINT_AUTH=true` to your environment variables and restart the container - The URL you use to access RomM - - This can either be http or https + - This can either be `http` or `https` - The system will prefer local access though to avoid reverse proxy issues - Feed URL: `/api/tinfoil/feed` - The username and password you use to login to RomM @@ -21,7 +21,7 @@ Now it's time to configure your switch - Please follow the steps, this will assu 1. Open Tinfoil and go to File Browser 2. Scroll over to the selection and press - in order to access the new menu. 3. Enter these Options - - Protocol - Http or https depending on your connection + - Protocol - `http` or `https` depending on your connection - Host - Host of your RomM instance - Port - Port of your RomM Instance - Path - /api/tinfoil/feed @@ -30,8 +30,8 @@ Now it's time to configure your switch - Please follow the steps, this will assu - Title - Free text title, make it whatever you want. - Enabled - Yes 4. Press X to save -5. Now close out of Tinfoil and go back in, so it can scan the TitleIDs - if everything is correct you will have this custom motd: - " RomM Swithc Library" +5. Now close out of Tinfoil and go back in, so it can scan the TitleIDs - if everything is correct you will have this custom `motd`: + " RomM Switch Library" Now you will be able to see the files in "New Games" tab of Tinfoil OR you can access it within the "File Browser" section that you setup earlier. @@ -41,7 +41,7 @@ Now you will be able to see the files in "New Games" tab of Tinfoil OR you can a It didn't pull anything through to "New Games" and has not parsed any information about the titles?! -That would be becasue the filename it has tried to pull had no TitleID (Improvement to RomM coming soon :tm:) +That would be because the filename it has tried to pull had no TitleID (Improvement to RomM coming soon :tm:) Make sure the filename has the TitleID within the title like this: ![TitleID](../resources/tinfoil/titleid.jpg) diff --git a/docs/System-Setup/TrueNAS-Setup-Guide.md b/docs/System-Setup/TrueNAS-Setup-Guide.md index 5e9e1d45..c32a61b5 100644 --- a/docs/System-Setup/TrueNAS-Setup-Guide.md +++ b/docs/System-Setup/TrueNAS-Setup-Guide.md @@ -9,19 +9,19 @@ This guide assumes you're familiar with Docker and have basic knowledge of TrueN ### Install through the TrueNAS App Catalog (Recommended) -#### Step 1: Navigate to Romm app +#### Step 1: Navigate to RomM app -Navigate to the App Catalog via Apps (Left Navbar) -> Discover Apps -> Romm -> Install +Navigate to the App Catalog via Apps (Left navigation bar) -> Discover Apps -> RomM -> Install -![Romm app](../resources/truenas/appstore.png) +![RomM app](../resources/truenas/appstore.png) #### Step 2: Installation configuration Step through the installation UI. You will need to supply various credentials per the [Quick Start Guide](../Getting-Started/Quick-Start-Guide.md). Most of the default values will work. -Note: You will likely want to set certain Storage Configurations to a Dataset within TrueNAS, such as your Romm Library and Assets storage. If you do this, ensure you provide ACL access to the UserID specified above (default: 568, apps user). +Note: You will likely want to set certain Storage Configurations to a Dataset within TrueNAS, such as your RomM Library and Assets storage. If you do this, ensure you provide ACL access to the UserID specified above (default: 568, apps user). -![Romm Library Example](../resources/truenas/app-config.png) +![RomM Library Example](../resources/truenas/app-config.png) #### Step 3: Save your configuration @@ -33,7 +33,7 @@ This installation path should only be used in the event that there is a bug with #### Step 1: Navigate to YAML install -Navigate to the `Install via YAML` page via Apps (Left Navbar) -> Discover Apps -> Install via YAML +Navigate to the `Install via YAML` page via Apps (Left navigation bar) -> Discover Apps -> Install via YAML ![Install via YAML](../resources/truenas/install-via-yaml.png) @@ -41,12 +41,13 @@ Navigate to the `Install via YAML` page via Apps (Left Navbar) -> Discover Apps Replace any empty values with credentials you've created per the [Quick Start Guide](../Getting-Started/Quick-Start-Guide.md). + ???+ example "Example Docker Compose" ``` yaml --8<-- "truenas.docker-compose.yml" ``` -#### Step 3: Save your configuration +#### Step 3: Save the configuration Save, and you're done! If the app will not boot, refer to [Troubleshooting](#troubleshooting) or head on over to the [Discord](https://discord.gg/P5HtHnhUDH). @@ -60,11 +61,11 @@ Save, and you're done! If the app will not boot, refer to [Troubleshooting](#tro ### Specific Issues -#### Permissions issues inside the docker image. +#### Permissions issues inside the docker image If you are encountering permissions issues with folders internal to the docker image (not your TrueNAS dataset), consider temporarily setting the user to root (user: 0). If you do this, it is recommended you fix local file permissions via shell and return access back to a non-root user. -In my particular setup, I had to create a user/group in TrueNAS with uid:gid of 1000:1000 and auxiliary group `apps` due to hard-coded values in the Romm docker image. This resolved outstanding issues I had with my instance of Romm talking to its Redis instance. +In my particular setup, I had to create a user/group in TrueNAS with uid:gid of 1000:1000 and auxiliary group `apps` due to hard-coded values in the RomM docker image. This resolved outstanding issues I had with my instance of RomM talking to its Redis instance. ## Contributing diff --git a/docs/System-Setup/Unraid-Setup-Guide.md b/docs/System-Setup/Unraid-Setup-Guide.md index 3560d8aa..88ae441b 100644 --- a/docs/System-Setup/Unraid-Setup-Guide.md +++ b/docs/System-Setup/Unraid-Setup-Guide.md @@ -12,33 +12,35 @@ You'll want to create a custom bridge-type network for both containers to commun MariaDB is required to run RomM, so install it from the plugin registry. Only the [official](https://hub.docker.com/_/mariadb) and [linuxserver](https://github.com/linuxserver/docker-mariadb/pkgs/container/mariadb) versions are supported, but **the official version is preferred**. -![community apps search results for mariadb](https://github.com/user-attachments/assets/76f4b6ef-5b63-454f-9357-d2920b9afd0e) +![community apps search results for MariaDB](https://github.com/user-attachments/assets/76f4b6ef-5b63-454f-9357-d2920b9afd0e) Now fill in all the environment variables; descriptions of the options and sensible defaults are listed in the [example docker-compose.yml](https://github.com/rommapp/romm/blob/release/examples/docker-compose.example.yml) file. + !!! warning - The network type must be set to "Custom: romm" + The network type must be set to `Custom: romm` -![mariadb environment variables](https://github.com/user-attachments/assets/a11906c5-25b2-46f1-906b-451a9ee39dca) +![MariaDB environment variables](https://github.com/user-attachments/assets/a11906c5-25b2-46f1-906b-451a9ee39dca) ## Installation -From the Unraid dashboard, click `APPS` in the navbar. In the search bar, search for `romm`, and install the app listed as "OFFICIAL". This one is maintained by our team and is the most up-to-date. +From the Unraid dashboard, click `APPS` in the navigation bar. In the search bar, search for `romm`, and install the app listed as "OFFICIAL". This one is maintained by our team and is the most up-to-date. -![romm official app](https://github.com/user-attachments/assets/57c4d47a-8604-4e8d-b05a-84dd68dda124) +![RomM official app](https://github.com/user-attachments/assets/57c4d47a-8604-4e8d-b05a-84dd68dda124) ## Configuration Configure the required environment variables, ports and paths as per the [example docker-compose.yml](https://github.com/rommapp/romm/blob/release/examples/docker-compose.example.yml) file. + !!! warning - The network type must also be set to "Custom: romm" + The network type must also be set to `Custom: romm` -![romm docker tab](https://github.com/user-attachments/assets/4c4210c2-ed00-4790-a945-65cbe33620b0) +![RomM docker tab](https://github.com/user-attachments/assets/4c4210c2-ed00-4790-a945-65cbe33620b0) Apply the changes, then head to the `DOCKER` tab. You should see both containers in a running state, and can access RomM using the IP:PORT of the container (highlighted below). -![romm and mariadb running](https://github.com/user-attachments/assets/cba26de1-d2c9-4fff-88d8-bc7701f0dd88) +![RomM and MariaDB running](https://github.com/user-attachments/assets/cba26de1-d2c9-4fff-88d8-bc7701f0dd88) ### Updating @@ -54,6 +56,6 @@ Apply the changes, then head to the `DOCKER` tab. You should see both containers [![IMAGE ALT TEXT HERE](https://img.youtube.com/vi/ls5YcsFdwLQ/0.jpg)](https://www.youtube.com/watch?v=ls5YcsFdwLQ) -## Shoutouts +## Shout-outs -We want to give a special shoutout to @Smurre95 and @sfumat0 for their help documenting this process, and working towards getting RomM listed in CA. 🤝 +We want to give a special shout-out to @Smurre95 and @sfumat0 for their help documenting this process, and working towards getting RomM listed in CA. 🤝 diff --git a/docs/Tools/Igir-Collection-Manager.md b/docs/Tools/Igir-Collection-Manager.md index 808e4366..7efd35af 100644 --- a/docs/Tools/Igir-Collection-Manager.md +++ b/docs/Tools/Igir-Collection-Manager.md @@ -1,4 +1,4 @@ -[Igir](https://igir.io/) is a zero-setup ROM collection manager that sorts, filters, extracts or archives, patches, and reports on collections of any size on any OS. It can be used to rename your roms to match the RomM database, and to move them into a new directory structure. +[Igir](https://igir.io/) is a zero-setup ROM collection manager that sorts, filters, extracts or archives, patches, and reports on collections of any size on any OS. It can be used to rename your ROMs to match the RomM database, and to move them into a new directory structure. ## Setup @@ -6,11 +6,11 @@ The directory structure is important for running the bulk ROM renaming script. Before running the bulk ROM renaming script, set up your directories as follows: -``` +```md . -├── dats/ # DAT files from no-intro.org -├── roms/ # Original ROM collection -├── roms-unverified/ # Working copy of ROMs +├── dats/ # DAT files from no-intro.org +├── roms/ # Original ROM collection +├── roms-unverified/ # Working copy of ROMs └── igir-romm-cleanup.sh ``` @@ -73,11 +73,11 @@ chmod a+x igir-romm-cleanup.sh ### Run the script -Run the script. It will generate a new output directory named `roms-verified`, moving the files from `roms-unverified` if its checksum matches any of the known checksums in the DAT files provided. Any roms not identified will remain in the `roms-unverified` directory. +Run the script. It will generate a new output directory named `roms-verified`, moving the files from `roms-unverified` if its checksum matches any of the known checksums in the DAT files provided. Any ROMs not identified will remain in the `roms-unverified` directory. ### Manually move over remaining files -The script may not identify all of the roms in your input directory. You can choose to migrate them over manually: +The script may not identify all of the ROMs in your input directory. You can choose to migrate them over manually: ```bash npx -y igir@latest \ @@ -87,11 +87,11 @@ npx -y igir@latest \ --dir-mirror ``` -This will move your roms from the input to the output directory, preserving the subdirectory structure. It also cleans up file extensions in the process. +This will move your ROMs from the input to the output directory, preserving the subdirectory structure. It also cleans up file extensions in the process. ### Reorganize multi-disc games -The Igir script will move games that have multiple discs to separate folders. This can confuse Romm's game detection, and those games need to be reorganized into single folders with many discs. +The Igir script will move games that have multiple discs to separate folders. This can confuse RomM's game detection, and those games need to be reorganized into single folders with many discs. To do this enter your platform directory, such as `ps` or `psx` and run the following: diff --git a/docs/Troubleshooting/Authentication-Issues.md b/docs/Troubleshooting/Authentication-Issues.md index d82ec92c..3ff41883 100644 --- a/docs/Troubleshooting/Authentication-Issues.md +++ b/docs/Troubleshooting/Authentication-Issues.md @@ -15,4 +15,4 @@ This error is known to happen on Chrome, but could happen in other browsers; man ### Error: `400 Bad Request` on the Websocket endpoint -If you're running RomM behind a reverse-proxy (Caddy, NGINX, etc.), ensure that websockets are supported and enabled. This may vary depending on the reverse proxy solution being used. In the case of Nginx Proxy Manager, enable the "Websockets Support" toggle when editing the proxy host. +If you're running RomM behind a reverse-proxy (Caddy, Nginx, etc.), ensure that Websockets are supported and enabled. This may vary depending on the reverse proxy solution being used. In the case of Nginx Proxy Manager, enable the "Websockets Support" toggle when editing the proxy host. diff --git a/docs/Troubleshooting/Miscellaneous-Troubleshooting.md b/docs/Troubleshooting/Miscellaneous-Troubleshooting.md index 1ef553b7..245bffef 100644 --- a/docs/Troubleshooting/Miscellaneous-Troubleshooting.md +++ b/docs/Troubleshooting/Miscellaneous-Troubleshooting.md @@ -7,10 +7,10 @@ description: Troubleshooting miscellaneous issues Verify that the database is mapped to a persistent storage volume in your docker compose or Unraid template. -``` - "/path/to/database:/romm/database" # [Optional] Only needed if ROMM_DB_DRIVER=sqlite or not set +```yaml +"/path/to/database:/romm/database" # [Optional] Only needed if ROMM_DB_DRIVER=sqlite or not set ``` ### Error: `Could not get twitch auth token: check client_id and client_secret` -This is likely due to misconfigured environment variables; verify that `CLIENT_ID` and `CLIENT_SECRET` are set correctly, and that both match the values in IGDB. +This is likely due to mis-configured environment variables; verify that `CLIENT_ID` and `CLIENT_SECRET` are set correctly, and that both match the values in IGDB. diff --git a/docs/Troubleshooting/Scanning-Issues.md b/docs/Troubleshooting/Scanning-Issues.md index cceec7f9..08fe6e56 100644 --- a/docs/Troubleshooting/Scanning-Issues.md +++ b/docs/Troubleshooting/Scanning-Issues.md @@ -7,11 +7,11 @@ description: Troubleshooting issues relating to library scanning There are a few common reasons why a scan may end instantly/without scanning platforms -- Badly mounted library: verify that you mounted your roms folder at `/romm/library` +- Badly mounted library: verify that you mounted your ROMs folder at `/romm/library` - Incorrect permissions: the app needs to read the files and folders in your library, check their permissions with `ls -lh` - Invalid folder structure: verify that your folder structure matches the one in the [README](https://github.com/rommapp/romm#-folder-structure) -### Roms not found for platform X, check romm folder structure +### ROMs not found for platform X, check `romm` folder structure This is the same issue as the one above, and can be quickly solved by verifying your folder structure. RomM expects a library with a folder named `roms` in it, for example: @@ -20,8 +20,8 @@ This is the same issue as the one above, and can be quickly solved by verifying ### Scan does not recognize a platform -When scanning the folders mounted in `/library/roms`, the scanner tries to match the folder name with the platform's slug in IGDB. If you notice that the scanner isn't detecting a platform, verify that the folder name matches the slug in the url of the [platform in IGDB](https://www.igdb.com/platforms). For example, the Nintendo 64DD has the URL https://www.igdb.com/platforms/nintendo-64dd, so the folder should be named `nintendo-64dd`. +When scanning the folders mounted in `/library/roms`, the scanner tries to match the folder name with the platform's slug in IGDB. If you notice that the scanner isn't detecting a platform, verify that the folder name matches the slug in the URL of the [platform in IGDB](https://www.igdb.com/platforms). For example, the Nintendo 64DD has the URL , so the folder should be named `nintendo-64dd`. ### Scan times out after ~4 hours -The background scan task times out after 4 hours, which can happen if you have a very large library. The easiest work around is to keep running scans every 4 hours, **without** checking the "Complete rescan" option. +The background scan task times out after 4 hours, which can happen if you have a very large library. The easiest work around is to keep running scans every 4 hours, **without** checking the "Complete re-scan" option. diff --git a/docs/Troubleshooting/Synology-Issues.md b/docs/Troubleshooting/Synology-Issues.md index eb15b526..ec5ebb17 100644 --- a/docs/Troubleshooting/Synology-Issues.md +++ b/docs/Troubleshooting/Synology-Issues.md @@ -7,7 +7,7 @@ description: Troubleshooting issues when using Synology products We have noticed recently a spate of access denied on Synology systems via Portainer or even docker manager. The ErrNo13 is directly related to Synology and it is a simple permission issue. To fix it please do the following: -1. Make sure SSH is enabled on your synology product. Refer to here if it is not [Enable SSH](https://kb.synology.com/en-uk/DSM/tutorial/How_to_login_to_DSM_with_root_permission_via_SSH_Telnet) +1. Make sure SSH is enabled on your Synology product. Refer to here if it is not [Enable SSH](https://kb.synology.com/en-uk/DSM/tutorial/How_to_login_to_DSM_with_root_permission_via_SSH_Telnet) 2. Connect to SSH and login as your admin username and password (Same login used to login to DSM web page) 3. Take a note on your user:group you can find this by typing ID when logged into SSH. 4. Type the following commands in the SSH window. diff --git a/docs/index.md b/docs/index.md index e87c60ef..5e8d45e2 100644 --- a/docs/index.md +++ b/docs/index.md @@ -7,11 +7,11 @@ hide: RomM Logo /// caption -Welcome to the **RomM Project**, the premier self-hosted, open source rom manager. +Welcome to the **RomM Project**, the premier self-hosted, open source ROM manager. ///
-Official Website: https://romm.app | Demo Website: https://demo.romm.app +Official Website: | Demo Website:
RomM (ROM Manager) allows you to scan, enrich, and browse 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. diff --git a/docs/resources/snippets/quick-start.docker-compose.yml b/docs/resources/snippets/quick-start.docker-compose.yml index 0e43eef6..e5d11961 100644 --- a/docs/resources/snippets/quick-start.docker-compose.yml +++ b/docs/resources/snippets/quick-start.docker-compose.yml @@ -1,53 +1,53 @@ version: "3" volumes: - mysql_data: - romm_resources: - romm_redis_data: + mysql_data: + romm_resources: + romm_redis_data: services: - romm: - image: rommapp/romm:latest - container_name: romm - restart: unless-stopped - environment: - - DB_HOST=romm-db - - DB_NAME=romm # Should match MARIADB_DATABASE in mariadb - - DB_USER=romm-user # Should match MARIADB_USER in mariadb - - DB_PASSWD= # Should match MARIADB_PASSWORD in mariadb - - ROMM_AUTH_SECRET_KEY= # Generate a key with `openssl rand -hex 32` - - IGDB_CLIENT_ID= # Generate an ID and SECRET in IGDB - - IGDB_CLIENT_SECRET= # https://api-docs.igdb.com/#account-creation - - MOBYGAMES_API_KEY= # https://www.mobygames.com/info/api/ - - STEAMGRIDDB_API_KEY= # https://github.com/rommapp/romm/wiki/Generate-API-Keys#steamgriddb - volumes: - - romm_resources:/romm/resources # Resources fetched from IGDB (covers, screenshots, etc.) - - romm_redis_data:/redis-data # Cached data for background tasks - - /path/to/library:/romm/library # Your game library. Check https://github.com/rommapp/romm?tab=readme-ov-file#folder-structure for more details. - - /path/to/assets:/romm/assets # Uploaded saves, states, etc. - - /path/to/config:/romm/config # Path where config.yml is stored - ports: - - 80:8080 - depends_on: - romm-db: - condition: service_healthy - restart: true + romm: + image: rommapp/romm:latest + container_name: romm + restart: unless-stopped + environment: + - DB_HOST=romm-db + - DB_NAME=romm # Should match MARIADB_DATABASE in mariadb + - DB_USER=romm-user # Should match MARIADB_USER in mariadb + - DB_PASSWD= # Should match MARIADB_PASSWORD in mariadb + - ROMM_AUTH_SECRET_KEY= # Generate a key with `openssl rand -hex 32` + - IGDB_CLIENT_ID= # Generate an ID and SECRET in IGDB + - IGDB_CLIENT_SECRET= # https://api-docs.igdb.com/#account-creation + - MOBYGAMES_API_KEY= # https://www.mobygames.com/info/api/ + - STEAMGRIDDB_API_KEY= # https://github.com/rommapp/romm/wiki/Generate-API-Keys#steamgriddb + volumes: + - romm_resources:/romm/resources # Resources fetched from IGDB (covers, screenshots, etc.) + - romm_redis_data:/redis-data # Cached data for background tasks + - /path/to/library:/romm/library # Your game library. Check https://github.com/rommapp/romm?tab=readme-ov-file#folder-structure for more details. + - /path/to/assets:/romm/assets # Uploaded saves, states, etc. + - /path/to/config:/romm/config # Path where config.yml is stored + ports: + - 80:8080 + depends_on: + romm-db: + condition: service_healthy + restart: true - romm-db: - image: mariadb:latest - container_name: romm-db - restart: unless-stopped - environment: - - MARIADB_ROOT_PASSWORD= # Use a unique, secure password - - MARIADB_DATABASE=romm - - MARIADB_USER=romm-user - - MARIADB_PASSWORD= - volumes: - - mysql_data:/var/lib/mysql - healthcheck: - test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] - start_period: 30s - start_interval: 10s - interval: 10s - timeout: 5s - retries: 5 + romm-db: + image: mariadb:latest + container_name: romm-db + restart: unless-stopped + environment: + - MARIADB_ROOT_PASSWORD= # Use a unique, secure password + - MARIADB_DATABASE=romm + - MARIADB_USER=romm-user + - MARIADB_PASSWORD= + volumes: + - mysql_data:/var/lib/mysql + healthcheck: + test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] + start_period: 30s + start_interval: 10s + interval: 10s + timeout: 5s + retries: 5 diff --git a/docs/resources/snippets/synology.docker-compose.yml b/docs/resources/snippets/synology.docker-compose.yml index f14695bd..28db29a8 100644 --- a/docs/resources/snippets/synology.docker-compose.yml +++ b/docs/resources/snippets/synology.docker-compose.yml @@ -1,55 +1,55 @@ version: "3" volumes: - mysql_data: + mysql_data: services: - romm: - image: rommapp/romm:latest - container_name: romm - restart: unless-stopped - environment: - - DB_HOST=romm-db - - DB_NAME=romm # Should match MARIADB_DATABASE in mariadb - - DB_USER=romm-user # Should match MARIADB_USER in mariadb - - DB_PASSWD= # Should match MARIADB_PASSWORD in mariadb - - ROMM_AUTH_SECRET_KEY= # Generate a key with `openssl rand -hex 32` - - IGDB_CLIENT_ID= # Generate an ID and SECRET in IGDB - - IGDB_CLIENT_SECRET= # https://api-docs.igdb.com/#account-creation - - MOBYGAMES_API_KEY= # https://www.mobygames.com/info/api/ - - STEAMGRIDDB_API_KEY= # https://github.com/rommapp/romm/wiki/Generate-API-Keys#steamgriddb - volumes: - - /volume1/docker/romm/resources:/romm/resources - - /volume1/docker/romm/redis-data:/redis-data - - /volume1/data/media/games/library:/romm/library - - /volume1/data/media/games/assets:/romm/assets - - /volume1/data/media/games/config:/romm/config - ports: - - 7676:8080 - network_mode: rommbridge - depends_on: - romm-db: - condition: service_healthy - restart: true + romm: + image: rommapp/romm:latest + container_name: romm + restart: unless-stopped + environment: + - DB_HOST=romm-db + - DB_NAME=romm # Should match MARIADB_DATABASE in mariadb + - DB_USER=romm-user # Should match MARIADB_USER in mariadb + - DB_PASSWD= # Should match MARIADB_PASSWORD in mariadb + - ROMM_AUTH_SECRET_KEY= # Generate a key with `openssl rand -hex 32` + - IGDB_CLIENT_ID= # Generate an ID and SECRET in IGDB + - IGDB_CLIENT_SECRET= # https://api-docs.igdb.com/#account-creation + - MOBYGAMES_API_KEY= # https://www.mobygames.com/info/api/ + - STEAMGRIDDB_API_KEY= # https://github.com/rommapp/romm/wiki/Generate-API-Keys#steamgriddb + volumes: + - /volume1/docker/romm/resources:/romm/resources + - /volume1/docker/romm/redis-data:/redis-data + - /volume1/data/media/games/library:/romm/library + - /volume1/data/media/games/assets:/romm/assets + - /volume1/data/media/games/config:/romm/config + ports: + - 7676:8080 + network_mode: rommbridge + depends_on: + romm-db: + condition: service_healthy + restart: true - mariadb-romm: - image: mariadb:latest - container_name: mariadb-romm - restart: unless-stopped - environment: - - MARIADB_ROOT_PASSWORD= # Use a unique, secure password - - MARIADB_DATABASE=romm - - MARIADB_USER=romm-user - - MARIADB_PASSWORD= - ports: - - 3309:3306 - network_mode: rommbridge - volumes: - - /volume1/docker/mariadb-romm:/var/lib/mysql - healthcheck: - test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] - start_period: 30s - start_interval: 10s - interval: 10s - timeout: 5s - retries: 5 + mariadb-romm: + image: mariadb:latest + container_name: mariadb-romm + restart: unless-stopped + environment: + - MARIADB_ROOT_PASSWORD= # Use a unique, secure password + - MARIADB_DATABASE=romm + - MARIADB_USER=romm-user + - MARIADB_PASSWORD= + ports: + - 3309:3306 + network_mode: rommbridge + volumes: + - /volume1/docker/mariadb-romm:/var/lib/mysql + healthcheck: + test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] + start_period: 30s + start_interval: 10s + interval: 10s + timeout: 5s + retries: 5 diff --git a/docs/resources/snippets/truenas.docker-compose.yml b/docs/resources/snippets/truenas.docker-compose.yml index 88a08745..c63e2d95 100644 --- a/docs/resources/snippets/truenas.docker-compose.yml +++ b/docs/resources/snippets/truenas.docker-compose.yml @@ -1,58 +1,58 @@ version: "3" volumes: - mysql_data: - romm_redis_data: + mysql_data: + romm_redis_data: services: - romm: - image: rommapp/romm:latest - container_name: romm - restart: unless-stopped - user: 568:568 - environment: - - DB_HOST=romm-db - - DB_NAME=romm # Should match MARIADB_DATABASE in mariadb - - DB_USER=romm-user # Should match MARIADB_USER in mariadb - - DB_PASSWD= # Should match MARIADB_PASSWORD in mariadb - - ROMM_AUTH_SECRET_KEY= # Generate a key with `openssl rand -hex 32` - - IGDB_CLIENT_ID= # Generate an ID and SECRET in IGDB - - IGDB_CLIENT_SECRET= # https://api-docs.igdb.com/#account-creation - - MOBYGAMES_API_KEY= # https://www.mobygames.com/info/api/ - - STEAMGRIDDB_API_KEY= # https://github.com/rommapp/romm/wiki/Generate-API-Keys#steamgriddb - volumes: # Any /mnt paths may optionally be replaced with a docker volume - - /mnt/tank/truenas/resources:/romm/resources # Replace /mnt...: file path with your own data structure - - romm_redis_data:/romm/redis-data # Docker will manage this volume - - /mnt/tank/truenas/roms:/romm/library # Replace /mnt...: file path with your own data structure - - /mnt/tank/truenas/assets:/romm/assets # Replace /mnt...: file path with your own data structure - - /mnt/tank/truenas/config:/romm/config # Replace /mnt...: file path with your own data structure - ports: - - 31100:8080 - depends_on: - romm-db: - condition: service_healthy - restart: true - deploy: - resources: - limits: - cpus: '2.0' - memory: 4g + romm: + image: rommapp/romm:latest + container_name: romm + restart: unless-stopped + user: 568:568 + environment: + - DB_HOST=romm-db + - DB_NAME=romm # Should match MARIADB_DATABASE in mariadb + - DB_USER=romm-user # Should match MARIADB_USER in mariadb + - DB_PASSWD= # Should match MARIADB_PASSWORD in mariadb + - ROMM_AUTH_SECRET_KEY= # Generate a key with `openssl rand -hex 32` + - IGDB_CLIENT_ID= # Generate an ID and SECRET in IGDB + - IGDB_CLIENT_SECRET= # https://api-docs.igdb.com/#account-creation + - MOBYGAMES_API_KEY= # https://www.mobygames.com/info/api/ + - STEAMGRIDDB_API_KEY= # https://github.com/rommapp/romm/wiki/Generate-API-Keys#steamgriddb + volumes: # Any /mnt paths may optionally be replaced with a docker volume + - /mnt/tank/truenas/resources:/romm/resources # Replace /mnt...: file path with your own data structure + - romm_redis_data:/romm/redis-data # Docker will manage this volume + - /mnt/tank/truenas/roms:/romm/library # Replace /mnt...: file path with your own data structure + - /mnt/tank/truenas/assets:/romm/assets # Replace /mnt...: file path with your own data structure + - /mnt/tank/truenas/config:/romm/config # Replace /mnt...: file path with your own data structure + ports: + - 31100:8080 + depends_on: + romm-db: + condition: service_healthy + restart: true + deploy: + resources: + limits: + cpus: "2.0" + memory: 4g - romm-db: - image: mariadb:latest - container_name: romm-db - restart: unless-stopped - environment: - - MARIADB_ROOT_PASSWORD= # Use a unique, secure password - - MARIADB_DATABASE=romm - - MARIADB_USER=romm-user - - MARIADB_PASSWORD= - volumes: - - mysql_data:/var/lib/mysql - healthcheck: - test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] - start_period: 30s - start_interval: 10s - interval: 10s - timeout: 5s - retries: 5 + romm-db: + image: mariadb:latest + container_name: romm-db + restart: unless-stopped + environment: + - MARIADB_ROOT_PASSWORD= # Use a unique, secure password + - MARIADB_DATABASE=romm + - MARIADB_USER=romm-user + - MARIADB_PASSWORD= + volumes: + - mysql_data:/var/lib/mysql + healthcheck: + test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] + start_period: 30s + start_interval: 10s + interval: 10s + timeout: 5s + retries: 5 diff --git a/mkdocs.yml b/mkdocs.yml index 868bccb6..99d5f03e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -65,10 +65,10 @@ markdown_extensions: anchor_linenums: true - pymdownx.inlinehilite - pymdownx.snippets: - base_path: - - docs - - docs/resources/snippets - check_paths: true + base_path: + - docs + - docs/resources/snippets + check_paths: true - admonition - pymdownx.arithmatex: generic: true