diff --git a/.gitignore b/.gitignore index e43b0f9..e57ba99 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .DS_Store +.cache diff --git a/mkdocs.yml b/mkdocs.yml index 53704ad..984ffd6 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,5 +1,138 @@ site_name: RomM Docs docs_dir: romm.wiki site_url: https://wiki.romma.app/ +site_author: RomM Team +site_description: Your beautiful, powerful, self-hosted rom manager +repo_url: "https://github.com/rommapp/wiki" +repo_name: rommapp/wiki theme: - name: material + name: material + logo: resources/romm/logo.png + features: + - navigation.instant + - navigation.instant.prefetch + - navigation.footer + - navigation.indexes + - navigation.tracking + - navigation.top + - search.suggest + - search.highlight + - content.tabs.link + - content.code.annotation + - content.code.copy + - content.action.edit + - content.action.view + language: en + palette: + # Dark mode + - scheme: slate + toggle: + icon: material/toggle-switch + name: Switch to light mode + primary: custom + accent: custom + # Light mode + - scheme: default + toggle: + icon: material/toggle-switch-off-outline + name: Switch to dark mode + primary: custom + accent: custom + +plugins: + - search + - mkdocs-video + - social: + cards_layout_options: + font_family: Roboto + background_color: "#371f69" + color: "#ede5f8" + logo: romm.wiki/assets/images/romm-logo.png + title: RomM Docs + description: Your beautiful, powerful, self-hosted rom manager + - glightbox: + skip_classes: + - skip-lightbox + - markdownextradata: {} + - literate-nav: + nav_file: Navigation.md + - git-revision-date-localized: + enable_creation_date: true + type: timeago + # - git-committers: + # repository: MisterCalvin/romm-mkdocs + # branch: develop + # exclude_committers: + # - "web-flow" # GitHub web UI edits + # token: !ENV GITHUB_TOKEN + +markdown_extensions: + - pymdownx.blocks.caption + - pymdownx.highlight: + anchor_linenums: true + - pymdownx.inlinehilite + # - pymdownx.snippets: + # base_path: + # - romm.wiki + # - docs/assets/snippets + # check_paths: true + - admonition + - pymdownx.arithmatex: + generic: true + - footnotes + - pymdownx.details + - pymdownx.superfences + - pymdownx.mark + - attr_list + - pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg + +copyright: Copyright © 2025 RomM Team + +extra: + social: + - icon: fontawesome/brands/github + link: https://github.com/rommapp/romm + name: rommapp/romm + - icon: fontawesome/brands/discord + link: https://discord.com/invite/RGPJHNMMwJ + name: RomM Discord Channel + - icon: fontawesome/solid/globe + link: https://romm.app/ + name: romm.app + + analytics: + provider: google + property: !ENV GOOGLE_PROPERTY_ID + feedback: + title: Was this page helpful? + ratings: + - icon: material/emoticon-happy-outline + name: This page was helpful + data: 1 + note: >- + Thanks for your feedback! + - icon: material/emoticon-sad-outline + name: This page could be improved + data: 0 + note: >- + Thanks for your feedback! + + env: + branch: !ENV [GITHUB_REF_NAME, "main"] + commit_sha: !ENV [commit_sha, ""] # Will be empty on main, show SHA on develop + username: !ENV GITHUB_REPOSITORY_OWNER + repo_name: !ENV GITHUB_REPOSITORY + + #version: + #provider: mike + #default: latest + #pre_release: true + +extra_css: + - resources/css/extra.css + +watch: + - romm.wiki + - romm.wiki/resources diff --git a/package.json b/package.json deleted file mode 100644 index e69de29..0000000 diff --git a/pyproject.toml b/pyproject.toml index 15c1df9..e540643 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,14 @@ description = "Add your description here" readme = "README.md" requires-python = ">=3.12" dependencies = [ + "cairosvg>=2.7.1", "mike>=2.1.3", "mkdocs>=1.6.1", + "mkdocs-git-revision-date-localized-plugin>=1.3.0", + "mkdocs-glightbox>=0.4.0", + "mkdocs-literate-nav>=0.6.1", + "mkdocs-markdownextradata-plugin>=0.2.6", "mkdocs-material>=9.6.5", + "mkdocs-video>=1.5.0", + "pillow>=11.1.0", ] diff --git a/romm.wiki/EmulatorJS-Player.md b/romm.wiki/EmulatorJS-Player.md deleted file mode 100644 index 78c830a..0000000 --- a/romm.wiki/EmulatorJS-Player.md +++ /dev/null @@ -1,52 +0,0 @@ -[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. - -> [!CAUTION] -> 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. - -> [!CAUTION] -> 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. - -### Loading saves and states - -Our integration with EmulatorJS automates the process of loading and saving save files and save states. Before starting the game, select a save and/or state file to load (if one is available). Anytime you save the game (or create a save state), the save and state files stored with RomM will be updated, so there's no need to manually download or upload them. - -### Supported systems - -Note that only the following systems are currently supported: - -* 3DO -* Amiga -* Arcade/MAME -* Atari 2600 -* Atari 5200 -* Atari 7800 -* Atari Jaguar -* Atari Lynx -* Commodore 64 -* ColecoVision -* Neo Geo Pocket -* Neo Geo Pocket Color -* Nintendo 64 -* Nintendo Entertainment System (NES) -* Nintendo Family Computer (Famicom) -* Nintendo DS -* Game Boy -* Game Boy Color -* Game Boy Advance -* PC-FX -* PlayStation (PS) -* Sega 32X -* Sega CD -* Sega Game Gear -* Sega Master System -* Sega Genesis/Megadrive -* Sega Saturn -* Super Nintendo Entertainment System (SNES) -* Super Famicom -* TurboGraphx-16/PC Engine -* Virtual Boy -* WonderSwan -* WonderSwan Color diff --git a/romm.wiki/Environment-Variables.md b/romm.wiki/Environment-Variables.md deleted file mode 100644 index a990ed5..0000000 --- a/romm.wiki/Environment-Variables.md +++ /dev/null @@ -1,73 +0,0 @@ -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/) - -## Application settings - -|Variable|Description|Required|Default| -|---|---|:---:|---| -|ROMM_AUTH_SECRET_KEY|Generate a key with `openssl rand -hex 32`|✓|| -|DISABLE_CSRF_PROTECTION|Disables [CSRF protection](https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html) (not recommended)||`false`| -|DISABLE_DOWNLOAD_ENDPOINT_AUTH|Disable auth on download endpoint (WebRcade, Tinfoil)||`false`| -|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](https://github.com/rommapp/romm/wiki/EmulatorJS-Player)||`false`| -|DISABLE_RUFFLE_RS|Disables playing flash games with [RuffleRS](https://github.com/rommapp/romm/wiki/RuffleRS-Player)||`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`| -|LOGLEVEL|Logging level for the app||`INFO`| -|FORCE_COLOR|Forces color output||`false`| -|NO_COLOR|Disables color output||`false`| - -## Dependencies - -|Variable|Description|Required|Default| -|---|---|:---:|---| -|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_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`| -|REDIS_HOST|Host name of Redis/Valkey instance||`127.0.0.1`| -|REDIS_PORT|Port number of Redis/Valkey instance||`6379`| -|REDIS_USERNAME|Username for Redis/Valkey instance||| -|REDIS_PASSWORD|Password for Redis/Valkey instance||| -|REDIS_DB|Database number for Redis/Valkey instance||`0`| -|REDIS_SSL|Enable SSL for Redis instance||`false`| -|SENTRY_DSN|DSN for Sentry error tracking||| - -## Metadata providers - -|Variable|Description|Required|Default| -|---|---|:---:|---| -|IGDB_CLIENT_ID|Client ID for IGDB API||| -|IGDB_CLIENT_SECRET|Client secret for IGDB API||| -|MOBYGAMES_API_KEY|Mobygames secret API key||| -|STEAMGRIDDB_API_KEY|SteamGridDB secret API key||| - -## Authentication - -|Variable|Description|Required|Default| -|---|---|:---:|---| -|OIDC_ENABLED|Enable OpenID Connect (OIDC) authentication||`false`| -|OIDC_PROVIDER|Name of the OIDC provider in use||| -|OIDC_CLIENT_ID|Client ID for OIDC authentication||| -|OIDC_CLIENT_SECRET|Client secret for OIDC authentication||| -|OIDC_REDIRECT_URI|Absolute redirect URI for OIDC authentication||| -|OIDC_SERVER_APPLICATION_URL|Absolute URL of the OIDC server application||| -|OIDC_TLS_CACERTFILE|Path to a file containing trusted CA certificates||| - -## 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 * * *"`| diff --git a/romm.wiki/Authentication.md b/romm.wiki/Getting-Started/Authentication.md similarity index 100% rename from romm.wiki/Authentication.md rename to romm.wiki/Getting-Started/Authentication.md diff --git a/romm.wiki/Getting-Started/Environment-Variables.md b/romm.wiki/Getting-Started/Environment-Variables.md new file mode 100644 index 0000000..8c79483 --- /dev/null +++ b/romm.wiki/Getting-Started/Environment-Variables.md @@ -0,0 +1,73 @@ +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/) + +## Application settings + +| Variable | Description | Required | Default | +| ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------- | :------: | ------- | +| ROMM_AUTH_SECRET_KEY | Generate a key with `openssl rand -hex 32` | ✓ | | +| DISABLE_CSRF_PROTECTION | Disables [CSRF protection](https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html) (not recommended) | | `false` | +| DISABLE_DOWNLOAD_ENDPOINT_AUTH | Disable auth on download endpoint (WebRcade, Tinfoil) | | `false` | +| 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](https://github.com/rommapp/romm/wiki/EmulatorJS-Player) | | `false` | +| DISABLE_RUFFLE_RS | Disables playing flash games with [RuffleRS](https://github.com/rommapp/romm/wiki/RuffleRS-Player) | | `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` | +| LOGLEVEL | Logging level for the app | | `INFO` | +| FORCE_COLOR | Forces color output | | `false` | +| NO_COLOR | Disables color output | | `false` | + +## Dependencies + +| Variable | Description | Required | Default | +| -------------- | ------------------------------------------------------------------ | :------: | ----------- | +| 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_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` | +| REDIS_HOST | Host name of Redis/Valkey instance | | `127.0.0.1` | +| REDIS_PORT | Port number of Redis/Valkey instance | | `6379` | +| REDIS_USERNAME | Username for Redis/Valkey instance | | | +| REDIS_PASSWORD | Password for Redis/Valkey instance | | | +| REDIS_DB | Database number for Redis/Valkey instance | | `0` | +| REDIS_SSL | Enable SSL for Redis instance | | `false` | +| SENTRY_DSN | DSN for Sentry error tracking | | | + +## Metadata providers + +| Variable | Description | Required | Default | +| ------------------- | -------------------------- | :------: | ------- | +| IGDB_CLIENT_ID | Client ID for IGDB API | | | +| IGDB_CLIENT_SECRET | Client secret for IGDB API | | | +| MOBYGAMES_API_KEY | Mobygames secret API key | | | +| STEAMGRIDDB_API_KEY | SteamGridDB secret API key | | | + +## Authentication + +| Variable | Description | Required | Default | +| --------------------------- | ------------------------------------------------- | :------: | ------- | +| OIDC_ENABLED | Enable OpenID Connect (OIDC) authentication | | `false` | +| OIDC_PROVIDER | Name of the OIDC provider in use | | | +| OIDC_CLIENT_ID | Client ID for OIDC authentication | | | +| OIDC_CLIENT_SECRET | Client secret for OIDC authentication | | | +| OIDC_REDIRECT_URI | Absolute redirect URI for OIDC authentication | | | +| OIDC_SERVER_APPLICATION_URL | Absolute URL of the OIDC server application | | | +| OIDC_TLS_CACERTFILE | Path to a file containing trusted CA certificates | | | + +## 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 * * *"` | diff --git a/romm.wiki/Generate-API-Keys.md b/romm.wiki/Getting-Started/Generate-API-Keys.md similarity index 66% rename from romm.wiki/Generate-API-Keys.md rename to romm.wiki/Getting-Started/Generate-API-Keys.md index a537ff2..05f5df4 100644 --- a/romm.wiki/Generate-API-Keys.md +++ b/romm.wiki/Getting-Started/Generate-API-Keys.md @@ -2,26 +2,26 @@ To access the IGDB API you'll need a Twitch account and a valid phone number for 2FA verification. Up-to-date instructions are available in the [IGDB API documentation](https://api-docs.igdb.com/#account-creation). When registering your application in the Twitch Developer Portal, fill out the form like so: -* Name: Something **unique or random** like `correct-horse-battery-staple` or `KVV8NDXMSRFJ2MRNPNRSL7GQT` -* OAuth Redirect URLs: `localhost` -* Category: `Application Integration` -* Client Type: `Confidential` +- Name: Something **unique or random** like `correct-horse-battery-staple` or `KVV8NDXMSRFJ2MRNPNRSL7GQT` +- OAuth Redirect URLs: `localhost` +- 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`** +!!! 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`** 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** +!!! 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** ## ScreenScraper diff --git a/romm.wiki/Quick-Start-Guide.md b/romm.wiki/Getting-Started/Quick-Start-Guide.md similarity index 66% rename from romm.wiki/Quick-Start-Guide.md rename to romm.wiki/Getting-Started/Quick-Start-Guide.md index c397426..4e6b3e4 100644 --- a/romm.wiki/Quick-Start-Guide.md +++ b/romm.wiki/Getting-Started/Quick-Start-Guide.md @@ -8,20 +8,20 @@ This quick start guide will help you get a RomM instance up and running. It is s This guide will assume that you already have the following done, if not - stop here and come back when you do. -* Docker and Docker Compose installed -* 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* -* A MobyGames account (optional) -* Your Roms organized in the correct format +- Docker and Docker Compose installed +- 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_ +- A MobyGames account (optional) +- Your Roms organized in the correct format -> [!CAUTION] -> 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. +!!! 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 -Head over to [API key docs](Generate-API-Keys) to get your Twitch and/or MobyGames keys, then come back here +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 @@ -46,19 +46,19 @@ Now that we have everything gathered, we can begin getting your instance set up! 1. Download a copy of the latest [docker-compose.example.yml](https://github.com/rommapp/romm/blob/release/examples/docker-compose.example.yml) file from GitHub 2. Edit the file and modify the following values to configure the database - * `MYSQL_ROOT_PASSWORD`: Sets the root password of the database. Use a unique and secure password (*use a password generator for simplicity*) - * `MYSQL_DATABASE`: Sets the database name for RomM. This can be modified - but it's not necessary - * `MYSQL_USER`: User to connect to the database with. This can be modified - but it's not necessary - * `MYSQL_PASSWORD`: Password for the user to connect to the database with. Use a unique and secure password (*use a password generator for simplicity*) -3. Modify the following values in the **environment** to configure the application. *-- Other values can be changed, but should not be done unless you know what you are doing, and are outside the scope of this guide* - * `DB_NAME`: Name of the database set in the database section - * `DB_USER`: Name of the user to connect to the database - * `DB_PASSWD`: Password of the user to connect to the database + - `MYSQL_ROOT_PASSWORD`: Sets the root password of the database. Use a unique and secure password (_use a password generator for simplicity_) + - `MYSQL_DATABASE`: Sets the database name for RomM. This can be modified - but it's not necessary + - `MYSQL_USER`: User to connect to the database with. This can be modified - but it's not necessary + - `MYSQL_PASSWORD`: Password for the user to connect to the database with. Use a unique and secure password (_use a password generator for simplicity_) +3. Modify the following values in the **environment** to configure the application. _-- Other values can be changed, but should not be done unless you know what you are doing, and are outside the scope of this guide_ + - `DB_NAME`: Name of the database set in the database section + - `DB_USER`: Name of the user to connect to the database + - `DB_PASSWD`: Password of the user to connect to the database 4. Modify the following values in the **volumes** to configure the application - * `/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: + - `/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: ![336102458-386dbff4-85ca-4926-86e4-48dc47771451](https://github.com/user-attachments/assets/081f8991-92ae-4129-8923-124f8146ab5b) @@ -81,9 +81,9 @@ Now that the container is running, we will configure it by importing your 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 +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 @@ -93,10 +93,10 @@ This method is certainly viable, but not recommended if you have a lot of roms a 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 -6. Navigate to *Library* -> *Scan* +6. Navigate to _Library_ -> _Scan_ 7. The system will now begin scanning the rom files and applying metadata to them. You can click on any of the items that it has tagged to see the metadata it pulled without having to stop the scan 8. After the scan completes, click the RomM logo to go back to the main screen. You should see the platforms and recent games it has scanned. You are now ready to rock and RomM! diff --git a/romm.wiki/Reverse-Proxy.md b/romm.wiki/Getting-Started/Reverse-Proxy.md similarity index 54% rename from romm.wiki/Reverse-Proxy.md rename to romm.wiki/Getting-Started/Reverse-Proxy.md index 69d8a05..c77bf99 100644 --- a/romm.wiki/Reverse-Proxy.md +++ b/romm.wiki/Getting-Started/Reverse-Proxy.md @@ -92,35 +92,36 @@ Items marked with ❗ are important to set, as RomM may not correctly otherwise! #### ⚡ Details -* Domain Names: `romm.mydomain.com` (replace mydomain with your own)* Scheme: `http` -* Forward Hostname/IP: (like 192.168.X.X) -* Forward Port: `8080` -* Cache Assets: `off` -* Block Common Exploits: `on` -* Websockets Support: `on` ❗ -* Access List: - +- Domain Names: `romm.mydomain.com` (replace mydomain with your own)\* Scheme: `http` +- Forward Hostname/IP: (like 192.168.X.X) +- Forward Port: `8080` +- Cache Assets: `off` +- Block Common Exploits: `on` +- Websockets Support: `on` ❗ +- Access List: - #### 🛡️ SSL Strongly recommended, but only required if you plan to secure your site (use HTTPS) -* SSL Certificate: "Request a new SSL Certificate" -* Force SSL: `on` -* HTTP/2 Support: `on` -* HSTS Enabled: `off` -* Email Address for Let's Encrypt: -* I Agree to the TOS: `on` +- SSL Certificate: "Request a new SSL Certificate" +- Force SSL: `on` +- HTTP/2 Support: `on` +- HSTS Enabled: `off` +- Email Address for Let's Encrypt: +- I Agree to the TOS: `on` #### ⚙️ Advanced -Custom Nginx Confguration ❗ +Custom Nginx Confguration ❗ + ``` proxy_max_temp_file_size 0; ``` -|Details|SSL|Advanced| -|---|---|---| -|![image](https://github.com/user-attachments/assets/e106a8e9-8b27-41ef-8ba2-d43c3b68b269)|![image2](https://github.com/user-attachments/assets/6c82c785-792a-410a-80f2-d95839cba47b)|![image3](https://github.com/user-attachments/assets/566ae834-99b5-42f3-b46b-306b8f73b5b4)| +| Details | SSL | Advanced | +| ----------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | +| ![image](https://github.com/user-attachments/assets/e106a8e9-8b27-41ef-8ba2-d43c3b68b269) | ![image2](https://github.com/user-attachments/assets/6c82c785-792a-410a-80f2-d95839cba47b) | ![image3](https://github.com/user-attachments/assets/566ae834-99b5-42f3-b46b-306b8f73b5b4) | ## Traefik @@ -129,32 +130,32 @@ proxy_max_temp_file_size 0; ```yml http: romsdomainse: - entryPoints: - - "https" - rule: "Host(`roms.domain.se`)" - middlewares: - - default-headers - - https-redirectscheme - tls: - certResolver: http - service: romsdomainse + entryPoints: + - "https" + rule: "Host(`roms.domain.se`)" + middlewares: + - default-headers + - https-redirectscheme + tls: + certResolver: http + service: romsdomainse services: romsdomainse: - loadBalancer: - servers: - - url: "http://192.168.1.100:8080" - passHostHeader: true + loadBalancer: + servers: + - url: "http://192.168.1.100:8080" + passHostHeader: true ``` ### Using labels in docker compose ```yml labels: - - "traefik.enable=true" - - "traefik.http.services.romm.loadbalancer.server.port=8080" - - "traefik.http.routers.romm.rule=Host(`romm.YOUR_DOMAIN.com`)" - - "traefik.http.routers.romm.entrypoints=websecure" - - 'traefik.http.routers.romm.tls=true' - - 'traefik.http.routers.romm.tls.certresolver=https' + - "traefik.enable=true" + - "traefik.http.services.romm.loadbalancer.server.port=8080" + - "traefik.http.routers.romm.rule=Host(`romm.YOUR_DOMAIN.com`)" + - "traefik.http.routers.romm.entrypoints=websecure" + - "traefik.http.routers.romm.tls=true" + - "traefik.http.routers.romm.tls.certresolver=https" ``` diff --git a/romm.wiki/Home.md b/romm.wiki/Home.md deleted file mode 100644 index 206dd6a..0000000 --- a/romm.wiki/Home.md +++ /dev/null @@ -1,5 +0,0 @@ -
-Official Website: https://romm.app | Demo Website: https://demo.romm.app -
-
- diff --git a/romm.wiki/Scheduled-Tasks.md b/romm.wiki/Maintenance/Scheduled-Tasks.md similarity index 59% rename from romm.wiki/Scheduled-Tasks.md rename to romm.wiki/Maintenance/Scheduled-Tasks.md index dfe590f..377b81e 100644 --- a/romm.wiki/Scheduled-Tasks.md +++ b/romm.wiki/Maintenance/Scheduled-Tasks.md @@ -2,14 +2,14 @@ Scheduled tasks can be enabled and configured with the following environment variables: -|Variable|Description|Value| -|---|---|:---:| -|ENABLE_SCHEDULED_RESCAN|Enable scheduled rescanning of library|`true`| -|SCHEDULED_RESCAN_CRON|Cron expression for scheduled rescanning|`"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 * * *"`| +| Variable | Description | Value | +| -------------------------------------- | -------------------------------------------------------- | :-----------: | +| ENABLE_SCHEDULED_RESCAN | Enable scheduled rescanning of library | `true` | +| SCHEDULED_RESCAN_CRON | Cron expression for scheduled rescanning | `"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 @@ -33,10 +33,10 @@ RomM can also monitor the filesystem for events (files created/moved/deleted) an 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 rescanning of library when filesystem changes | `true` | +| RESCAN_ON_FILESYSTEM_CHANGE_DELAY | Delay in minutes before rescanning 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/romm.wiki/Upgrading-to-3.0.md b/romm.wiki/Maintenance/Upgrading-to-3.0.md similarity index 97% rename from romm.wiki/Upgrading-to-3.0.md rename to romm.wiki/Maintenance/Upgrading-to-3.0.md index ac1b632..4350f31 100644 --- a/romm.wiki/Upgrading-to-3.0.md +++ b/romm.wiki/Maintenance/Upgrading-to-3.0.md @@ -40,7 +40,7 @@ As Redis is [required for authentication](https://github.com/zurdi15/romm/wiki/A ## Configuration folder -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`: +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`: ``` - /path/to/config:/romm/config diff --git a/romm.wiki/Brand-Guidelines.md b/romm.wiki/Miscellaneous/Brand-Guidelines.md similarity index 70% rename from romm.wiki/Brand-Guidelines.md rename to romm.wiki/Miscellaneous/Brand-Guidelines.md index 9246757..f3d780b 100644 --- a/romm.wiki/Brand-Guidelines.md +++ b/romm.wiki/Miscellaneous/Brand-Guidelines.md @@ -10,20 +10,19 @@ We’ve put together some guidelines for those anyone who wants to use our name The logo should always be used in its standard colors: #ede5f8, #bea4e1, #371f69, #553e98, #e6c7a7, and #e1a38d. - ## Do these things -* Use our logo to link to any page or site owned or operated by the project. -* Use our logo in a blog post or news article about the project. -* Use our logo to inform others that your project integrates with RomM. -* Always use our logo in the colors provided. -* Always use our name in a way that makes it clear you are not affiliated with the project. +- Use our logo to link to any page or site owned or operated by the project. +- Use our logo in a blog post or news article about the project. +- Use our logo to inform others that your project integrates with RomM. +- Always use our logo in the colors provided. +- Always use our name in a way that makes it clear you are not affiliated with the project. If you're working on a project that integrates with RomM and would like to use/remix the logo, **please reach out to us first**. We'd love to hear about what you're working on! ## Please don't do these things -* Use our name or logo in any way that would suggest you are us, are endorsed by us, or are part of the project. -* Use our name or logo in a way that implies partnership, sponsorship, or endorsement. -* Use our name or logo as the name or logo for your project, product, service, social media account, company, or website. -* Use our name or logo to promote, advertise or sell any private business, closed-source software, commercial product, or paid service. +- Use our name or logo in any way that would suggest you are us, are endorsed by us, or are part of the project. +- Use our name or logo in a way that implies partnership, sponsorship, or endorsement. +- Use our name or logo as the name or logo for your project, product, service, social media account, company, or website. +- Use our name or logo to promote, advertise or sell any private business, closed-source software, commercial product, or paid service. diff --git a/romm.wiki/FAQs.md b/romm.wiki/Miscellaneous/FAQs.md similarity index 70% rename from romm.wiki/FAQs.md rename to romm.wiki/Miscellaneous/FAQs.md index b2f067d..b0bf700 100644 --- a/romm.wiki/FAQs.md +++ b/romm.wiki/Miscellaneous/FAQs.md @@ -1,6 +1,6 @@ ### 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. +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? diff --git a/romm.wiki/Navigation.md b/romm.wiki/Navigation.md new file mode 100644 index 0000000..744fea3 --- /dev/null +++ b/romm.wiki/Navigation.md @@ -0,0 +1,41 @@ +--- +search: + exclude: true +--- + +# Navigation + +- [Introduction](index.md) +- Getting Started + - [Quick Start Guide](Getting-Started/Quick-Start-Guide.md) + - [Generate API Keys](Getting-Started/Generate-API-Keys.md) + - [Environment Variables](Getting-Started/Environment-Variables.md) + - [Reverse Proxy](Getting-Started/Reverse-Proxy.md) + - [Authentication](Getting-Started/Authentication.md) +- Platforms and Players + - [Supported Platforms](Platforms-and-Players/Supported-Platforms.md) + - [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 + - [Unraid Setup](System-Setup/Unraid-Setup-Guide.md) + - [Synology Setup](System-Setup/Synology-Setup-Guide.md) + - [TrueNAS Setup](System-Setup/TrueNAS-Setup-Guide.md) + - [Tinfoil Integration](System-Setup/Tinfoil-Integration.md) +- OIDC Setup Guides + - [OIDC Setup With Authelia](OIDC-Guides/OIDC-Setup-With-Authelia.md) + - [OIDC Setup With Authentik](OIDC-Guides/OIDC-Setup-With-Authentik.md) + - [OIDC Setup With PocketID](OIDC-Guides/OIDC-Setup-With-PocketID.md) +- Tools + - [Igir Collection Manager](Tools/Igir-Collection-Manager.md) +- Maintenance + - [Scheduled Tasks](Maintenance/Scheduled-Tasks.md) + - [Upgrading to 3.0](Maintenance/Upgrading-to-3.0.md) +- [Troubleshooting](Troubleshooting/index.md) + - [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 + - [FAQs](Miscellaneous/FAQs.md) + - [Branding Guidelines](Miscellaneous/Brand-Guidelines.md) diff --git a/romm.wiki/OIDC-Guides/OIDC-Setup-With-Authelia.md b/romm.wiki/OIDC-Guides/OIDC-Setup-With-Authelia.md index 359035f..15efe8b 100644 --- a/romm.wiki/OIDC-Guides/OIDC-Setup-With-Authelia.md +++ b/romm.wiki/OIDC-Guides/OIDC-Setup-With-Authelia.md @@ -3,54 +3,62 @@ ## A quick rundown of the technologies ### What is Authelia? + Authelia is an open-source authentication and authorization server providing two-factor authentication and single sign-on (SSO) for your applications via a web portal. It acts as a companion for reverse proxies by allowing, denying, or redirecting requests. Authelia can be deployed alongside your other services to centralize identity management. ### What is OAuth2? + OAuth2 (Open Authorization 2.0) is an industry-standard protocol for authorization. It allows applications (clients) to gain limited access to user accounts on an HTTP service without sharing the user’s credentials. Instead, it uses access tokens to facilitate secure interactions. OAuth2 is commonly used in scenarios where users need to authenticate via a third-party service. ### What is OpenID Connect (OIDC)? + OIDC (OpenID Connect) is an identity layer built on top of OAuth2. While OAuth2 primarily handles authorization, OIDC adds authentication, enabling applications to verify a user’s identity and obtain profile information. This makes OIDC suitable for SSO solutions, where user identity is central to access management. ## Setting up a Provider and Application in Authelia ### Step 1: Install and Configure Authelia + Before setting up a provider and app, ensure that Authelia is installed and running by following the [getting started](https://www.authelia.com/integration/prologue/get-started/) and [OIDC provider](https://www.authelia.com/configuration/identity-providers/openid-connect/provider/) guides. ### Step 2: Add a client + In Authelia's `configuration.yml`, under `identity_providers` → `oidc` → `clients`, add a new entry: -* A **random** `client_id` and `client_secret` - * See the [official recommendations](https://www.authelia.com/integration/openid-connect/frequently-asked-questions/#how-do-i-generate-a-client-identifier-or-client-secret) on how to generate these. -* `public` should be set to `false`. -* `redirect_uris` should include your RomM instance's URL + `/api/oauth/openid` (e.g., `http://romm.host.local/api/oauth/openid`). -* `scopes` includes `openid`, `email` and `profile`. -* `token_endpoint_auth_method` should be set to `client_secret_basic`. -* `userinfo_signed_response_alg` should be set to `none`. + +- A **random** `client_id` and `client_secret` + - See the [official recommendations](https://www.authelia.com/integration/openid-connect/frequently-asked-questions/#how-do-i-generate-a-client-identifier-or-client-secret) on how to generate these. +- `public` should be set to `false`. +- `redirect_uris` should include your RomM instance's URL + `/api/oauth/openid` (e.g., `http://romm.host.local/api/oauth/openid`). +- `scopes` includes `openid`, `email` and `profile`. +- `token_endpoint_auth_method` should be set to `client_secret_basic`. +- `userinfo_signed_response_alg` should be set to `none`. Refer to the [official docs](https://www.authelia.com/configuration/identity-providers/openid-connect/clients/) for more details. This entry should look like this: + ```yaml #identity_providers: # oidc: # clients: - - client_id: "" # read above for how generate - client_name: "RomM" # will be displayed in Authelia to users - client_secret: "$pbkdf2-sha512$randomly_generated" # read above for how generate - public: false - authorization_policy: "two_factor" # or one_factor, depending on your needs - grant_types: - - authorization_code - redirect_uris: - - "http://romm.host.local/api/oauth/openid" - scopes: - - "openid" - - "email" - - "profile" - userinfo_signed_response_alg: "none" - token_endpoint_auth_method: "client_secret_basic" +- client_id: "" # read above for how generate + client_name: "RomM" # will be displayed in Authelia to users + client_secret: "$pbkdf2-sha512$randomly_generated" # read above for how generate + public: false + authorization_policy: "two_factor" # or one_factor, depending on your needs + grant_types: + - authorization_code + redirect_uris: + - "http://romm.host.local/api/oauth/openid" + scopes: + - "openid" + - "email" + - "profile" + userinfo_signed_response_alg: "none" + token_endpoint_auth_method: "client_secret_basic" ``` ### Step 3: Configure RomM Environment Variables + To enable OIDC authentication in RomM, you need to set the following environment variables: - `OIDC_ENABLED`: Set to `true` to enable OIDC authentication. @@ -61,11 +69,13 @@ To enable OIDC authentication in RomM, you need to set the following environment - `OIDC_SERVER_APPLICATION_URL`: The base URL for you Authelia instance, e.g. `http://authelia.host.local`. ### Step 4: Set your Email in RomM + In RomM, open your user profile and set your email address. This email **has to match** your user email in Authelia. -![Set email](https://raw.githubusercontent.com/rommapp/wiki/refs/heads/main/romm.wiki/resources/authelia/1-user-profile.png) +![Set email](../resources/authelia/1-user-profile.png) ### Step 5: Test the Integration + After configuring the environment variables, restart (or stop and remove) your RomM instance and navigate to the login page. You should see an option to log in using OIDC. Click on the OIDC button, and you'll be redirected to Authelia for authentication. Once authenticated, you'll be redirected back to RomM. -![Login with OIDC](https://raw.githubusercontent.com/rommapp/wiki/refs/heads/main/romm.wiki/resources/authelia/2-romm-login.png) +![Login with OIDC](../resources/authelia/2-romm-login.png) diff --git a/romm.wiki/OIDC-Guides/OIDC-Setup-With-Authentik.md b/romm.wiki/OIDC-Guides/OIDC-Setup-With-Authentik.md index 95fbb7c..1e5abae 100644 --- a/romm.wiki/OIDC-Guides/OIDC-Setup-With-Authentik.md +++ b/romm.wiki/OIDC-Guides/OIDC-Setup-With-Authentik.md @@ -3,59 +3,63 @@ ## A quick rundown of the technologies ### What is Authentik? + Authentik is an open-source identity provider (IdP) designed to manage authentication, authorization, and user management across applications. It supports modern authentication protocols and provides tools to simplify integration, including single sign-on (SSO), multi-factor authentication (MFA), and auditing capabilities. Authentik can be deployed alongside your other services to centralize identity management. ### What is OAuth2? + OAuth2 (Open Authorization 2.0) is an industry-standard protocol for authorization. It allows applications (clients) to gain limited access to user accounts on an HTTP service without sharing the user’s credentials. Instead, it uses access tokens to facilitate secure interactions. OAuth2 is commonly used in scenarios where users need to authenticate via a third-party service. ### What is OpenID Connect (OIDC)? + OIDC (OpenID Connect) is an identity layer built on top of OAuth2. While OAuth2 primarily handles authorization, OIDC adds authentication, enabling applications to verify a user’s identity and obtain profile information. This makes OIDC suitable for SSO solutions, where user identity is central to access management. ## Setting up a Provider and Application in Authentik ### Step 1: Install and Configure Authentik + Before setting up a provider and app, ensure that Authentik is installed and running by following the [official installation guide.](https://docs.goauthentik.io/docs/install-config/install/docker-compose). 1. Access Authentik via its web interface. 2. Log in as an administrator. 3. Navigate to the “Admin Interface” to configure the necessary components. -![Authentik user dashboard](https://raw.githubusercontent.com/rommapp/wiki/refs/heads/main/romm.wiki/resources/authentik/1-user-dashboard.png) +![Authentik user dashboard](../resources/authentik/1-user-dashboard.png) ### Step 2: Create a Provider + A provider in Authentik acts as the bridge between RomM and Authentik. 1. **Navigate to Providers**: - - Go to the "Providers" section in the Authentik admin interface. + - Go to the "Providers" section in the Authentik admin interface. 2. **Create a New Provider**: - - Click on “Create” and choose the protocol (e.g., “OIDC Provider”). -![Create a new provider](https://raw.githubusercontent.com/rommapp/wiki/refs/heads/main/romm.wiki/resources/authentik/2-create-provider.png) + - Click on “Create” and choose the protocol (e.g., “OIDC Provider”). + ![Create a new provider](../resources/authentik/2-create-provider.png) 3. **Select "OAuth2/OpenID Provider"** -![Select OAuth2 provider](https://raw.githubusercontent.com/rommapp/wiki/refs/heads/main/romm.wiki/resources/authentik/3-new-provider.png) + ![Select OAuth2 provider](../resources/authentik/3-new-provider.png) 4. **Configure Provider Settings**: - - **Name**: Assign a unique name to the provider (e.g., "RomM OIDC Provider"). - - **Authorization flow**: Select __implicit consent__. - - **Redirect URIs**: Add your RomM instance's URL + `/api/oauth/openid` (e.g., `http://romm.host.local/api/oauth/openid`). + - **Name**: Assign a unique name to the provider (e.g., "RomM OIDC Provider"). + - **Authorization flow**: Select **implicit consent**. + - **Redirect URIs**: Add your RomM instance's URL + `/api/oauth/openid` (e.g., `http://romm.host.local/api/oauth/openid`). 5. **Copy the Client ID and Secret**: - - You'll need these to set `OIDC_CLIENT_ID` and `OIDC_CLIENT_SECRET` in your RomM instance. -![Provider settings](https://raw.githubusercontent.com/rommapp/wiki/refs/heads/main/romm.wiki/resources/authentik/4-provider-secrets.png) + - You'll need these to set `OIDC_CLIENT_ID` and `OIDC_CLIENT_SECRET` in your RomM instance. + ![Provider settings](../resources/authentik/4-provider-secrets.png) 6. **Click Create**. ### Step 3: Register an Application + An app in Authentik represents the external service (in our case RomM) that will use the provider for authentication. 1. **Navigate to Applications**: - - Go to the "Applications" section in the admin interface. -![Applications](https://raw.githubusercontent.com/rommapp/wiki/refs/heads/main/romm.wiki/resources/authentik/5-applications.png) + - 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". -![New application](https://raw.githubusercontent.com/rommapp/wiki/refs/heads/main/romm.wiki/resources/authentik/6-new-application.png) -6. **Click Create**. + - 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**. ### Step 4: Configure RomM Environment Variables + To enable OIDC authentication in RomM, you need to set the following environment variables: - `OIDC_ENABLED`: Set to `true` to enable OIDC authentication. @@ -66,11 +70,13 @@ To enable OIDC authentication in RomM, you need to set the following environment - `OIDC_SERVER_APPLICATION_URL`: The URL of the Authentik application, e.g., `http://authentik.host.local/application/o/romm`. ### Step 5: Set your Email in RomM + In RomM, open your user profile and set your email address. This email **has to match** your user email in Authentik. -![Set email](https://raw.githubusercontent.com/rommapp/wiki/refs/heads/main/romm.wiki/resources/authentik/7-user-profile.png) +![Set email](../resources/authentik/7-user-profile.png) ### Step 6: Test the Integration + After configuring the environment variables, restart (or stop and remove) your RomM instance and navigate to the login page. You should see an option to log in using OIDC. Click on the OIDC button, and you'll be redirected to Authentik for authentication. Once authenticated, you'll be redirected back to RomM. -![Login with OIDC](https://raw.githubusercontent.com/rommapp/wiki/refs/heads/main/romm.wiki/resources/authentik/8-romm-login.png) +![Login with OIDC](../resources/authentik/8-romm-login.png) diff --git a/romm.wiki/OIDC-Guides/OIDC-Setup-With-PocketID.md b/romm.wiki/OIDC-Guides/OIDC-Setup-With-PocketID.md index 84ae715..47440d6 100644 --- a/romm.wiki/OIDC-Guides/OIDC-Setup-With-PocketID.md +++ b/romm.wiki/OIDC-Guides/OIDC-Setup-With-PocketID.md @@ -3,37 +3,41 @@ ## A quick rundown of the technologies ### What is Pocket ID? + Pocket ID is a simple OIDC provider that allows users to authenticate with their passkeys to your services. The goal of Pocket ID is to be a simple and easy-to-use. There are other self-hosted OIDC providers like Keycloak or ORY Hydra but they are often too complex for simple use cases. Additionally, what makes Pocket ID special is that it only supports passkey authentication, which means you don’t need a password. - ### What is OAuth2? + OAuth2 (Open Authorization 2.0) is an industry-standard protocol for authorization. It allows applications (clients) to gain limited access to user accounts on an HTTP service without sharing the user’s credentials. Instead, it uses access tokens to facilitate secure interactions. OAuth2 is commonly used in scenarios where users need to authenticate via a third-party service. ### What is OpenID Connect (OIDC)? + OIDC (OpenID Connect) is an identity layer built on top of OAuth2. While OAuth2 primarily handles authorization, OIDC adds authentication, enabling applications to verify a user’s identity and obtain profile information. This makes OIDC suitable for SSO solutions, where user identity is central to access management. ## Setting up a client in Pocket ID ### 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) ### Step 2: Add a client -Once you have logged in and configured a PassKey you now need to create an OIDC client, this will let Pocket ID know about the application that needs to be configured, and will give you the relevant keys to add to the RomM compose file. +Once you have logged in and configured a PassKey you now need to create an OIDC client, this will let Pocket ID know about the application that needs to be configured, and will give you the relevant keys to add to the RomM compose file. - Make sure within Application Configuration that "Emails Verified" is ticked, most OIDC apps will need this. -- Go to OIDC Client +- Go to OIDC Client - Click Add OIDC Client - - Name: RomM - - Callback URLs: https://{yoururl}/api/oauth/openid -- Click Save + - Name: RomM + - Callback URLs: https://{yoururl}/api/oauth/openid +- Click Save - Stay on this page, you will be shown your client secret only THIS time. ### Step 3: Configure RomM Environment Variables + To enable OIDC authentication in RomM, you need to set the following environment variables: - `OIDC_ENABLED`: Set to `true` to enable OIDC authentication. @@ -44,11 +48,13 @@ To enable OIDC authentication in RomM, you need to set the following environment - `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 + In RomM, open your user profile and set your email address. This email **has to match** your user email in Pocket ID. -![Set email](https://raw.githubusercontent.com/rommapp/wiki/refs/heads/main/romm.wiki/resources/authelia/1-user-profile.png) +![Set email](../resources/authelia/1-user-profile.png) ### Step 5: Test the Integration + After configuring the environment variables, restart (or stop and remove) your RomM instance and navigate to the login page. You should see an option to log in using OIDC. Click on the OIDC button, and you'll be redirected to Pocket ID for authentication. Once authenticated, you'll be redirected back to RomM. -![Login with OIDC](https://raw.githubusercontent.com/rommapp/wiki/refs/heads/main/romm.wiki/resources/pocketid/PocketID-login.png) +![Login with OIDC](../resources/pocketid/PocketID-login.png) diff --git a/romm.wiki/Custom-Platforms.md b/romm.wiki/Platforms-and-Players/Custom-Platforms.md similarity index 100% rename from romm.wiki/Custom-Platforms.md rename to romm.wiki/Platforms-and-Players/Custom-Platforms.md diff --git a/romm.wiki/Platforms-and-Players/EmulatorJS-Player.md b/romm.wiki/Platforms-and-Players/EmulatorJS-Player.md new file mode 100644 index 0000000..621ced8 --- /dev/null +++ b/romm.wiki/Platforms-and-Players/EmulatorJS-Player.md @@ -0,0 +1,52 @@ +[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. + +### Loading saves and states + +Our integration with EmulatorJS automates the process of loading and saving save files and save states. Before starting the game, select a save and/or state file to load (if one is available). Anytime you save the game (or create a save state), the save and state files stored with RomM will be updated, so there's no need to manually download or upload them. + +### Supported systems + +Note that only the following systems are currently supported: + +- 3DO +- Amiga +- Arcade/MAME +- Atari 2600 +- Atari 5200 +- Atari 7800 +- Atari Jaguar +- Atari Lynx +- Commodore 64 +- ColecoVision +- Neo Geo Pocket +- Neo Geo Pocket Color +- Nintendo 64 +- Nintendo Entertainment System (NES) +- Nintendo Family Computer (Famicom) +- Nintendo DS +- Game Boy +- Game Boy Color +- Game Boy Advance +- PC-FX +- PlayStation (PS) +- Sega 32X +- Sega CD +- Sega Game Gear +- Sega Master System +- Sega Genesis/Megadrive +- Sega Saturn +- Super Nintendo Entertainment System (SNES) +- Super Famicom +- TurboGraphx-16/PC Engine +- Virtual Boy +- WonderSwan +- WonderSwan Color diff --git a/romm.wiki/RuffleRS-Player.md b/romm.wiki/Platforms-and-Players/RuffleRS-Player.md similarity index 60% rename from romm.wiki/RuffleRS-Player.md rename to romm.wiki/Platforms-and-Players/RuffleRS-Player.md index b01fd56..ac87810 100644 --- a/romm.wiki/RuffleRS-Player.md +++ b/romm.wiki/Platforms-and-Players/RuffleRS-Player.md @@ -1,4 +1,4 @@ [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. -> [!NOTE] -> **Ruffle will only play games stored in platform folders called `flash` or `browser`.** +!!! important + **Ruffle will only play games stored in platform folders called `flash` or `browser`.** diff --git a/romm.wiki/Platforms-and-Players/Supported-Platforms.md b/romm.wiki/Platforms-and-Players/Supported-Platforms.md new file mode 100644 index 0000000..ba31ef4 --- /dev/null +++ b/romm.wiki/Platforms-and-Players/Supported-Platforms.md @@ -0,0 +1,409 @@ +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 | +| ----------------------------------------------------- | ----------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| 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 | | +| AY-3-8606 | `ay-3-8606` | IGDB | | +| AY-3-8607 | `ay-3-8607` | IGDB | | +| 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 | +| 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 | +| 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 | +| CDC Cyber 70 | `cdccyber70` | IGDB | | +| 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 | +| Donner Model 30 | `donner30` | IGDB | | +| 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 | +| Family Computer | `famicom` | IGDB | | +| Family Computer Disk System | `fds` | IGDB | | +| 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 | +| 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 | +| 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 | +| HP 2100 | `hp2100` | IGDB | | +| HP 3000 | `hp3000` | IGDB | | +| 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 | +| 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 | +| Intellivision Amico | `intellivision-amico` | IGDB | | +| 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 | +| 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 | +| 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 | +| Mega Duck/Cougar Boy | `mega-duck-slash-cougar-boy` | IGDB | | +| 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 | +| 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 | +| 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 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 | +| 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 | +| 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 | +| PDP-1 | `pdp1` | IGDB | | +| PDP-10 | `pdp10` | IGDB | | +| PDP-11 | `pdp11` | IGDB | | +| PDP-8 | `pdp-8--1` | IGDB | | +| PICO | `pico` | | Mobygames | +| PLATO | `plato--1` | IGDB | | +| 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 | +| 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 | +| Plug & Play | `plug-and-play` | IGDB | | +| PocketStation | `pocketstation` | IGDB | | +| 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 | +| 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 | +| 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 | +| Satellaview | `satellaview` | IGDB | | +| 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 | +| 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 | +| 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 | +| 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 | +| 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 | +| 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 | +| 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 | +| 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 | +| 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 | +| visionOS | `visionos` | IGDB | | +| watchOS | `watchos` | | Mobygames | +| webOS | `webos` | | Mobygames | diff --git a/romm.wiki/Supported-Platforms.md b/romm.wiki/Supported-Platforms.md deleted file mode 100644 index 7cf9c4e..0000000 --- a/romm.wiki/Supported-Platforms.md +++ /dev/null @@ -1,410 +0,0 @@ -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| -|---|---|---|---| -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| | -AY-3-8606 | `ay-3-8606` | IGDB| | -AY-3-8607 | `ay-3-8607` | IGDB| | -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 -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 -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 -CDC Cyber 70 | `cdccyber70` | IGDB| | -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 -Donner Model 30 | `donner30` | IGDB| | -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 -Family Computer | `famicom` | IGDB| | -Family Computer Disk System | `fds` | IGDB| | -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 -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 -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 -HP 2100 | `hp2100` | IGDB| | -HP 3000 | `hp3000` | IGDB| | -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 -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 -Intellivision Amico | `intellivision-amico` | IGDB| | -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 -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 -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 -Mega Duck/Cougar Boy | `mega-duck-slash-cougar-boy` | IGDB| | -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 -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 -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 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 -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 -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 -PDP-1 | `pdp1` | IGDB| | -PDP-10 | `pdp10` | IGDB| | -PDP-11 | `pdp11` | IGDB| | -PDP-8 | `pdp-8--1` | IGDB| | -PICO | `pico` | | Mobygames -PLATO | `plato--1` | IGDB| | -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 -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 -Plug & Play | `plug-and-play` | IGDB| | -PocketStation | `pocketstation` | IGDB| | -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 -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 -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 -Satellaview | `satellaview` | IGDB| | -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 -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 -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 -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 -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 -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 -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 -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 -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 -visionOS | `visionos` | IGDB| | -watchOS | `watchos` | | Mobygames -webOS | `webos` | | Mobygames diff --git a/romm.wiki/Synology-Setup-Guide.md b/romm.wiki/System-Setup/Synology-Setup-Guide.md similarity index 59% rename from romm.wiki/Synology-Setup-Guide.md rename to romm.wiki/System-Setup/Synology-Setup-Guide.md index 96c9e55..15fd935 100644 --- a/romm.wiki/Synology-Setup-Guide.md +++ b/romm.wiki/System-Setup/Synology-Setup-Guide.md @@ -1,5 +1,7 @@ ## Prerequisites + This guide assumes you're familiar with Docker and have basic knowledge of server management. You'll need: + - A Synology NAS or similar server - Docker installed - Basic command line knowledge @@ -27,7 +29,7 @@ mkdir -p /volume1/data/media/games/library/roms mkdir -p /volume1/data/media/games/library/bios ``` -Note: For supported platforms and their specific folder names, refer to the [official RomM wiki](https://github.com/rommapp/romm/wiki/Supported-Platforms). +Note: For supported platforms and their specific folder names, refer to the [official RomM wiki](../Platforms-and-Players/Supported-Platforms.md). #### Docker Data Folders @@ -54,11 +56,12 @@ Generate your authentication key using: openssl rand -hex 32 > 03a054b6ca27e0107c5eed552ea66bacd9f3a2a8a91e7595cd462a593f9ecd09 ``` + Save the output - you'll need it for the `ROMM_AUTH_SECRET_KEY` in your configuration. #### API Integration Setup -RomM currecntly supports 3 metadata sources: IGDB, MobyGames and SteamGridDB. Follow the dedicated wiki page for [API key generation](Generate-Api-Keys.md) to set up your API keys. We recommend setting up IGDG at the minimum. +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. ### 4. MariaDB Configuration @@ -75,59 +78,59 @@ Create a `docker-compose.yml` file with the following content: ```yaml services: - romm: - image: rommapp/romm:latest - container_name: romm - restart: unless-stopped - environment: - - PUID=1234 #CHANGE_TO_YOUR_UID - - PGID=12345 #CHANGE_TO_YOUR_GID - - TZ=US/New_York #CHANGE_TO_YOUR_TZ - - DB_HOST=mariadb-romm - - DB_NAME=romm - - DB_ROOT_PASSWORD=DB_ROOT_PASSWORD - - DB_USER=romm-user - - DB_PASSWD=DB_PASSWD - - DB_PORT=3306 - - ROMM_AUTH_SECRET_KEY= # Add your generated key - - IGDB_CLIENT_ID= # Add your IGDB ID - - IGDB_CLIENT_SECRET= # Add your IGDB secret - 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/tcp - network_mode: rommbridge - depends_on: - mariadb-romm: - condition: service_healthy + romm: + image: rommapp/romm:latest + container_name: romm + restart: unless-stopped + environment: + - PUID=1234 #CHANGE_TO_YOUR_UID + - PGID=12345 #CHANGE_TO_YOUR_GID + - TZ=US/New_York #CHANGE_TO_YOUR_TZ + - DB_HOST=mariadb-romm + - DB_NAME=romm + - DB_ROOT_PASSWORD=DB_ROOT_PASSWORD + - DB_USER=romm-user + - DB_PASSWD=DB_PASSWD + - DB_PORT=3306 + - ROMM_AUTH_SECRET_KEY= # Add your generated key + - IGDB_CLIENT_ID= # Add your IGDB ID + - IGDB_CLIENT_SECRET= # Add your IGDB secret + 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/tcp + network_mode: rommbridge + depends_on: + mariadb-romm: + condition: service_healthy - mariadb-romm: - image: mariadb:10.7 - container_name: mariadb-romm - restart: unless-stopped - environment: - - MARIADB_ROOT_PASSWORD=MARIADB_ROOT_PASSWORD - - PUID=1234 #CHANGE_TO_YOUR_UID - - PGID=12345 #CHANGE_TO_YOUR_GID - - TZ=US/New_York #CHANGE_TO_YOUR_TZ - - MARIADB_DATABASE=romm - - MARIADB_USER=romm-user - - MARIADB_PASSWORD=MARIADB_PASSWORD - ports: - - "3309:3306" - network_mode: rommbridge - volumes: - - /volume1/docker/mariadb-romm:/var/lib/mysql - healthcheck: - test: ["CMD", "healthcheck.sh", "--su-mysql", "--connect"] - timeout: 20s - retries: 10 - start_period: 30s - interval: 10s + mariadb-romm: + image: mariadb:10.7 + container_name: mariadb-romm + restart: unless-stopped + environment: + - MARIADB_ROOT_PASSWORD=MARIADB_ROOT_PASSWORD + - PUID=1234 #CHANGE_TO_YOUR_UID + - PGID=12345 #CHANGE_TO_YOUR_GID + - TZ=US/New_York #CHANGE_TO_YOUR_TZ + - MARIADB_DATABASE=romm + - MARIADB_USER=romm-user + - MARIADB_PASSWORD=MARIADB_PASSWORD + ports: + - "3309:3306" + network_mode: rommbridge + volumes: + - /volume1/docker/mariadb-romm:/var/lib/mysql + healthcheck: + test: ["CMD", "healthcheck.sh", "--su-mysql", "--connect"] + timeout: 20s + retries: 10 + start_period: 30s + interval: 10s ``` ### 6. Initial Launch diff --git a/romm.wiki/Tinfoil-Integration.md b/romm.wiki/System-Setup/Tinfoil-Integration.md similarity index 54% rename from romm.wiki/Tinfoil-Integration.md rename to romm.wiki/System-Setup/Tinfoil-Integration.md index e7077f4..0ad3fe6 100644 --- a/romm.wiki/Tinfoil-Integration.md +++ b/romm.wiki/System-Setup/Tinfoil-Integration.md @@ -1,55 +1,49 @@ This will help you configure the [Tinfoil](https://tinfoil.io/) integration for your Switch to work with your RomM library. -- [Prepare](#Prepare) -- [Configure](#Configure) -- [Additional](#Additional) -- Enjoy! - drawing ## Prepare Please note down the following in order to make this as smooth as possible, as well as some pre-reqs: -* 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 - * 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 +- 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 + - 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 -## Configure +## Configure Now it's time to configure your switch - Please follow the steps, this will assume you have Tinfoil installed and know how to use the basic functions of it. 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 - - Host - Host of your RomM instance - - Port - Port of your RomM Instance - - Path - /api/tinfoil/feed - - Username - Username of your RomM instance - - Password - Password of your RomM instance - - Title - Free text title, make it whatever you want. - - Enabled - Yes -4. Press X to save + - Protocol - Http or https depending on your connection + - Host - Host of your RomM instance + - Port - Port of your RomM Instance + - Path - /api/tinfoil/feed + - Username - Username of your RomM instance + - Password - Password of your RomM instance + - 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" + " RomM Swithc 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. -![Image of Tinfoil](https://raw.githubusercontent.com/rommapp/wiki/refs/heads/main/romm.wiki/resources/tinfoil/tinfoilscreen.jpg) +![Image of Tinfoil](../resources/tinfoil/tinfoilscreen.jpg) - -## Additional +## Additional 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:) Make sure the filename has the TitleID within the title like this: -![TitleID](https://raw.githubusercontent.com/rommapp/wiki/refs/heads/main/romm.wiki/resources/tinfoil/titleid.jpg) +![TitleID](../resources/tinfoil/titleid.jpg) -Once this is done, the next time Tinfoil is opened it is always parsed and re-scanned. +Once this is done, the next time Tinfoil is opened it is always parsed and re-scanned. diff --git a/romm.wiki/TrueNAS-Setup-Guide.md b/romm.wiki/System-Setup/TrueNAS-Setup-Guide.md similarity index 50% rename from romm.wiki/TrueNAS-Setup-Guide.md rename to romm.wiki/System-Setup/TrueNAS-Setup-Guide.md index 1c05085..9f5bc3a 100644 --- a/romm.wiki/TrueNAS-Setup-Guide.md +++ b/romm.wiki/System-Setup/TrueNAS-Setup-Guide.md @@ -1,5 +1,7 @@ ## Prerequisites + This guide assumes you're familiar with Docker and have basic knowledge of TrueNAS. You'll need: + - A running TrueNAS installation - Your games setup in the [required folder structure](https://github.com/rommapp/romm/blob/release/README.md) @@ -8,94 +10,97 @@ 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 + Navigate to the App Catalog via Apps (Left Navbar) -> 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](quick-start-guide). Most of the default values will work. + +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). -![Romm Library Example](resources/truenas/app-config.png) +![Romm Library Example](../resources/truenas/app-config.png) #### Step 3: Save your 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). ### Install via YAML + This installation path should only be used in the event that there is a bug with installing through the App Catalog, or you wish to have more flexibility than is provided by the installation UI. #### Step 1: Navigate to YAML install + Navigate to the `Install via YAML` page via Apps (Left Navbar) -> Discover Apps -> Install via YAML -![Install via YAML](resources/truenas/install-via-yaml.png) +![Install via YAML](../resources/truenas/install-via-yaml.png) #### Step 2: Paste in the following YML -Replace any empty values with credentials you've created per the [Quick Start Guide](quick-start-guide). +Replace any empty values with credentials you've created per the [Quick Start Guide](../Getting-Started/Quick-Start-Guide.md). ```yaml services: - romm: - container_name: romm - depends_on: - romm-db: - condition: service_healthy - restart: True - deploy: - resources: # Resource constraints - limits: - cpus: '2.0' - memory: 4g - environment: - - DB_HOST=romm-db - - DB_NAME=romm - - DB_USER=romm-user - - 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 - image: rommapp/romm:latest - ports: - - '31100:8080' - restart: unless-stopped - user: '568:568' - 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 - romm-db: - container_name: romm-db - environment: - - MARIADB_ROOT_PASSWORD= # Use a unique, secure password - - MARIADB_DATABASE=romm - - MARIADB_USER=romm-user - - MARIADB_PASSWORD= # Match MARIADB_ROOT_PASSWORD - healthcheck: - interval: 10s - retries: 5 - start_interval: 10s - start_period: 30s - test: - - CMD - - healthcheck.sh - - '--connect' - - '--innodb_initialized' - timeout: 5s - image: mariadb:latest - restart: unless-stopped - volumes: - - mysql_data:/var/lib/mysql -version: '3' + romm: + container_name: romm + depends_on: + romm-db: + condition: service_healthy + restart: True + deploy: + resources: # Resource constraints + limits: + cpus: "2.0" + memory: 4g + environment: + - DB_HOST=romm-db + - DB_NAME=romm + - DB_USER=romm-user + - 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 + image: rommapp/romm:latest + ports: + - "31100:8080" + restart: unless-stopped + user: "568:568" + 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 + romm-db: + container_name: romm-db + environment: + - MARIADB_ROOT_PASSWORD= # Use a unique, secure password + - MARIADB_DATABASE=romm + - MARIADB_USER=romm-user + - MARIADB_PASSWORD= # Match MARIADB_ROOT_PASSWORD + healthcheck: + interval: 10s + retries: 5 + start_interval: 10s + start_period: 30s + test: + - CMD + - healthcheck.sh + - "--connect" + - "--innodb_initialized" + timeout: 5s + image: mariadb:latest + restart: unless-stopped + volumes: + - mysql_data:/var/lib/mysql +version: "3" volumes: - mysql_data: Null - romm_redis_data: Null - + mysql_data: Null + romm_redis_data: Null ``` #### Step 3: Save your configuration @@ -105,6 +110,7 @@ Save, and you're done! If the app will not boot, refer to [Troubleshooting](#tro ## Troubleshooting ### General + - Ensure you have replaced empty values (UIDs, GIDs, passwords, API keys) with your own - Ensure proper permissions are applied within TrueNAS - Monitor logs via the app bash terminal during for any errors if the app is encountering issues diff --git a/romm.wiki/Unraid-Setup-Guide.md b/romm.wiki/System-Setup/Unraid-Setup-Guide.md similarity index 96% rename from romm.wiki/Unraid-Setup-Guide.md rename to romm.wiki/System-Setup/Unraid-Setup-Guide.md index 9241100..3560d8a 100644 --- a/romm.wiki/Unraid-Setup-Guide.md +++ b/romm.wiki/System-Setup/Unraid-Setup-Guide.md @@ -16,8 +16,8 @@ MariaDB is required to run RomM, so install it from the plugin registry. Only th 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" +!!! warning + The network type must be set to "Custom: romm" ![mariadb environment variables](https://github.com/user-attachments/assets/a11906c5-25b2-46f1-906b-451a9ee39dca) @@ -31,8 +31,8 @@ From the Unraid dashboard, click `APPS` in the navbar. In the search bar, search 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" +!!! warning + The network type must also be set to "Custom: romm" ![romm docker tab](https://github.com/user-attachments/assets/4c4210c2-ed00-4790-a945-65cbe33620b0) @@ -50,7 +50,6 @@ Apply the changes, then head to the `DOCKER` tab. You should see both containers [![IMAGE ALT TEXT HERE](https://img.youtube.com/vi/Oo5obHNy2iw/0.jpg)](https://www.youtube.com/watch?v=Oo5obHNy2iw) - [AlienTech42](https://www.youtube.com/@AlienTech42) has published [a great video](https://www.youtube.com/watch?v=ls5YcsFdwLQ) on installing and running RomM on Unraid. While a bit out of date vis-a-vis install instructions, it's still very useful for general setup and debugging. Check it out! [![IMAGE ALT TEXT HERE](https://img.youtube.com/vi/ls5YcsFdwLQ/0.jpg)](https://www.youtube.com/watch?v=ls5YcsFdwLQ) diff --git a/romm.wiki/Igir-Collection-Manager-Guide.md b/romm.wiki/Tools/Igir-Collection-Manager.md similarity index 82% rename from romm.wiki/Igir-Collection-Manager-Guide.md rename to romm.wiki/Tools/Igir-Collection-Manager.md index b265682..808e436 100644 --- a/romm.wiki/Igir-Collection-Manager-Guide.md +++ b/romm.wiki/Tools/Igir-Collection-Manager.md @@ -17,20 +17,23 @@ The directory structure is important for running the bulk ROM renaming script. B ### Initial Setup Steps 1. Create a working copy of your ROMs: - ```bash - cp -r roms/ roms-unverified/ - ``` - This provides a safe working environment and allows for easy script adjustment if needed. + + ```bash + cp -r roms/ roms-unverified/ + ``` + + This provides a safe working environment and allows for easy script adjustment if needed. 2. Download DAT Files: - - For cartridge-based systems: - - Visit [No-Intro.org Daily Download](https://datomatic.no-intro.org/index.php?page=download&op=daily) - - Download the latest DAT compilation - - For optical media (e.g., PlayStation): - - Visit [redump.org](http://redump.org/downloads/) - - Download platform-specific DAT files - Extract the DAT files to your `dats` directory. You can optionally extract a subset of the .dat files into the directory instead. + - For cartridge-based systems: + - Visit [No-Intro.org Daily Download](https://datomatic.no-intro.org/index.php?page=download&op=daily) + - Download the latest DAT compilation + - For optical media (e.g., PlayStation): + - Visit [redump.org](http://redump.org/downloads/) + - Download platform-specific DAT files + + Extract the DAT files to your `dats` directory. You can optionally extract a subset of the .dat files into the directory instead. ## Configuration @@ -61,6 +64,7 @@ time npx -y igir@latest \ ``` Make the script executable: + ```bash chmod a+x igir-romm-cleanup.sh ``` @@ -103,12 +107,14 @@ done This will find any directory with `(Disc` in the name and move the files into a new directory without the `(Disc #)` string. For example: Before: + ```bash Final Fantasy VII (Disc 1) (USA) Final Fantasy VII (Disc 2) (USA) ``` Gets combined to: + ```bash Final Fantasy VII (USA) ``` diff --git a/romm.wiki/Troubleshooting.md b/romm.wiki/Troubleshooting.md deleted file mode 100644 index b0a1c12..0000000 --- a/romm.wiki/Troubleshooting.md +++ /dev/null @@ -1,85 +0,0 @@ -## Scanning - -### Scan is skipping all platforms/ends instantly - -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` -* 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/zurdi15/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: -- `/server/media/library:/romm/library` -- `/server/media/games/roms:/romm/library/roms` - -### 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`. - -### 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. - -## Authentication - -### Error: `403 Forbidden` - -When authentication is enabled, most endpoints will return a `403 Forbidden` response if you're not authenticated, or if your sessions is in a broken state. The session key can be reset by [clearing your cookies](https://support.google.com/accounts/answer/32050). - -CSRF protection is also enabled, which helps to mitigates [CSRF attacks](https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html) (useful if your instance is public). If you encounter a `Forbidden (403) CSRF verification failed` error, simply reloading your browser should force it to fetch a fresh CSRF cookie. - -### Error: `Unable to login: CSRF token verification failed` - -This error is known to happen on Chrome, but could happen in other browsers; manually clear your cookies (specifically one called `csrftoken`) and hard reload your browser window (CMD+SHIFT+R on macOS, CTRL+F5 on Windows). - -### 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. - - - -## Synology - -### ErrNo 13: Access Denied - -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) -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. - -``` sudo chown -R user:group /path/to/library ``` - -``` sudo chmod -R a=,a+rX,u+w,g+w /path/to/library ``` - -``` sudo chown -R user:group /path/to/assets ``` - -``` sudo chmod -R a=,a+rX,u+w,g+w /path/to/assets ``` - -``` sudo chown -R user:group /path/to/config ``` - -``` sudo chmod -R a=,a+rX,u+w,g+w /path/to/config ``` - -You will find the relevant directories in your compose, this is basically the folders where you store your RomM information and we are just resetting permissions. Restart the containers and you should now have no issues scanning information in! - - -Any issues please ask in the Discord. - -Thanks to [Docker IDs - DrFrankenstein](https://drfrankenstein.co.uk/step-2-setting-up-a-restricted-docker-user-and-obtaining-ids/) for the guidance from his blog. - -## Miscellaneous - -### Restarting the container when using SQLite drops all the data/requires a full re-scan - -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 -``` - -### 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. diff --git a/romm.wiki/Troubleshooting/Authentication-Issues.md b/romm.wiki/Troubleshooting/Authentication-Issues.md new file mode 100644 index 0000000..d82ec92 --- /dev/null +++ b/romm.wiki/Troubleshooting/Authentication-Issues.md @@ -0,0 +1,18 @@ +--- +title: Troubleshooting Authentication +description: Troubleshooting issues relating to authentication +--- + +### Error: `403 Forbidden` + +When authentication is enabled, most endpoints will return a `403 Forbidden` response if you're not authenticated, or if your sessions is in a broken state. The session key can be reset by [clearing your cookies](https://support.google.com/accounts/answer/32050). + +CSRF protection is also enabled, which helps to mitigates [CSRF attacks](https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html) (useful if your instance is public). If you encounter a `Forbidden (403) CSRF verification failed` error, simply reloading your browser should force it to fetch a fresh CSRF cookie. + +### Error: `Unable to login: CSRF token verification failed` + +This error is known to happen on Chrome, but could happen in other browsers; manually clear your cookies (specifically one called `csrftoken`) and hard reload your browser window (CMD+SHIFT+R on macOS, CTRL+F5 on Windows). + +### 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. diff --git a/romm.wiki/Troubleshooting/Miscellaneous-Troubleshooting.md b/romm.wiki/Troubleshooting/Miscellaneous-Troubleshooting.md new file mode 100644 index 0000000..1ef553b --- /dev/null +++ b/romm.wiki/Troubleshooting/Miscellaneous-Troubleshooting.md @@ -0,0 +1,16 @@ +--- +title: Miscellaneous Troubleshooting +description: Troubleshooting miscellaneous issues +--- + +### Restarting the container when using SQLite drops all the data/requires a full re-scan + +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 +``` + +### 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. diff --git a/romm.wiki/Troubleshooting/Scanning-Issues.md b/romm.wiki/Troubleshooting/Scanning-Issues.md new file mode 100644 index 0000000..6a22e9e --- /dev/null +++ b/romm.wiki/Troubleshooting/Scanning-Issues.md @@ -0,0 +1,27 @@ +--- +title: Troubleshooting Scanning +description: Troubleshooting issues relating to library scanning +--- + +### Scan is skipping all platforms/ends instantly + +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` +- 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/zurdi15/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: + +- `/server/media/library:/romm/library` +- `/server/media/games/roms:/romm/library/roms` + +### 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`. + +### 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. diff --git a/romm.wiki/Troubleshooting/Synology-Issues.md b/romm.wiki/Troubleshooting/Synology-Issues.md new file mode 100644 index 0000000..eb15b52 --- /dev/null +++ b/romm.wiki/Troubleshooting/Synology-Issues.md @@ -0,0 +1,31 @@ +--- +title: Troubleshooting Synology +description: Troubleshooting issues when using Synology products +--- + +### ErrNo 13: Access Denied + +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) +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. + +`sudo chown -R user:group /path/to/library` + +`sudo chmod -R a=,a+rX,u+w,g+w /path/to/library` + +`sudo chown -R user:group /path/to/assets` + +`sudo chmod -R a=,a+rX,u+w,g+w /path/to/assets` + +`sudo chown -R user:group /path/to/config` + +`sudo chmod -R a=,a+rX,u+w,g+w /path/to/config` + +You will find the relevant directories in your compose, this is basically the folders where you store your RomM information and we are just resetting permissions. Restart the containers and you should now have no issues scanning information in! + +Any issues please ask in the Discord. + +Thanks to [Docker IDs - DrFrankenstein](https://drfrankenstein.co.uk/step-2-setting-up-a-restricted-docker-user-and-obtaining-ids/) for the guidance from his blog. diff --git a/romm.wiki/Troubleshooting/index.md b/romm.wiki/Troubleshooting/index.md new file mode 100644 index 0000000..bf6b592 --- /dev/null +++ b/romm.wiki/Troubleshooting/index.md @@ -0,0 +1,6 @@ +--- +title: Troubleshooting +description: Common troubleshooting guides +--- + +Use the side-bar to your left for navigation diff --git a/romm.wiki/WebRcade-Integration-[DEPRECATED].md b/romm.wiki/WebRcade-Integration-[DEPRECATED].md deleted file mode 100644 index 6e08310..0000000 --- a/romm.wiki/WebRcade-Integration-[DEPRECATED].md +++ /dev/null @@ -1,47 +0,0 @@ -## ⚠️ Support for webRcade will be removed in version 3.0 in favor the built-in [EmulatorJS player](https://github.com/zurdi15/romm/wiki/EmulatorJS-Player) ⚠️ - -[WebRcade](https://github.com/webrcade/webrcade) is a platform that enables playing games entirely within the context of the browser across a [wide variety of platforms](https://docs.webrcade.com/platforms/), with support for game pads (Bluetooth and USB) for both front-end navigation and in-game. - -RomM exposes an API endpoint that serves a compatible JSON feed of supported platforms and games. Since webRcade runs within the context of your browser, you RomM instances _does not_ need to be exposed to the web. Further documentation can be found in the [User Guide](https://docs.webrcade.com/userguide/). - -**IMPORTANT: You must set the `ROMM_HOST` environment variable to your host ip or domain name (including http(s)://, subdomain and port if needed).** - -**IMPORTANT: Due to limitations with webRcade, RomM authentication must be DISABLED for the integration to work.** - - -### Some notes and limitations before starting - -* Save & state files cannot be exported from webRcade -* The JSON feed does not currently support [BIOS files](https://docs.webrcade.com/apps/emulators/psx/#bios-files) -* [Local feeds](#customizing-the-feed) will not stay up-to-date with your RomM library -* A bug in the latest release causes the game covers not to load if RomM is not accessible to the internet - -### Loading the RomM feed - -Head to the [main page](https://play.webrcade.com/) and after hovering over "Categories" click "Show Feeds". Hit the "Add Feed" button at the bottom, select "URL" and paste the following URL, replacing `host` with the URL of your RomM instance: `https:///api/platforms/webrcade/feed`. - -|Home page|Feeds|Feed URL| -|---|---|---| -|Screenshot 2023-12-27 at 11 24 26 PM|Screenshot 2023-12-27 at 11 24 41 PM|Screenshot 2023-12-27 at 11 25 01 PM| - -At this point webRcade should automatically load your library; if it doesn't, head back to the Feeds list, select "RomM Feed" at the bottom and click "Load". - -### Customizing the feed - -WebRcade also boasts an [editor](https://editor.webrcade.com/) that can identify supported games and download custom assets. You can leverage this editor to enhance your RomM feed by loading content served by the API and saving the modified feed locally. In the editor, click "Import", paste the RomM feed URL (as above) and hit "Ok". The page should refresh with the contents of the RomM feed. - -|Editor|Import| -|---|---| -|Screenshot 2023-12-27 at 11 23 56 PM|Screenshot 2023-12-27 at 10 39 24 PM| - -Now select one of the platforms (or all of them) and, under the 3-dot menu, hit "Analyze". A window will appear displaying the progress of the analysis; webRcade is fetching assets from [webrcade-assets](https://github.com/webrcade-assets). - -|Analyze|Progress| -|---|---| -|Screenshot 2023-12-27 at 11 27 11 PM|Screenshot 2023-12-27 at 11 27 34 PM| - -When you've finished analyzing your library (and making any edits), hit "Save" in the sidebar. A local feed will then be created and stored in the browser's cache, which you can export with the "Export" option in the sidebar. Back in the [main window](https://play.webrcade.com), the local should now appear in your Feed list. - -### Screenshot - -Screenshot 2023-12-27 at 11 28 14 PM diff --git a/romm.wiki/_Sidebar.md b/romm.wiki/_Sidebar.md deleted file mode 100644 index 48af579..0000000 --- a/romm.wiki/_Sidebar.md +++ /dev/null @@ -1,35 +0,0 @@ -### Getting Started -- [Quick Start Guide](Quick-Start-Guide) -- [Generate API Keys](Generate-API-Keys) -- [Environment Variables](Environment-Variables) -- [Reverse Proxy](Reverse-Proxy) -- [Authentication](Authentication) - -### Platforms and Players -- [Supported Platforms](Supported-Platforms) -- [Custom Platforms](Custom-Platforms) -- [EmulatorJS Player](EmulatorJS-Player) -- [RuffleRS Player](RuffleRS-Player) - -### System Setup Guides -- [Unraid Setup](Unraid-Setup-Guide) -- [Synology Setup](Synology-Setup-Guide) -- [TrueNAS Setup](TrueNAS-Setup-Guide) -- [Tinfoil Integration](Tinfoil-Integration) - -### OIDC Setup Guides -- [OIDC Setup With Authelia](OIDC-Setup-With-Authelia) -- [OIDC Setup With Authentik](OIDC-Setup-With-Authentik) -- [OIDC Setup With PockedID](OIDC-Setup-With-PocketID) - -### Tools -- [Igir Collection Manager](Igir-Collection-Manager-Guide) - -### Maintenance -- [Scheduled Tasks](Scheduled-Tasks) -- [Troubleshooting](Troubleshooting) -- [Upgrading to 3.0](Upgrading-to-3.0) - -### Miscellaneous -- [FAQs](FAQs) -- [Branding Guidelines](Brand-Guidelines) diff --git a/romm.wiki/index.md b/romm.wiki/index.md index 000ea34..8f82755 100644 --- a/romm.wiki/index.md +++ b/romm.wiki/index.md @@ -1,17 +1,47 @@ -# Welcome to MkDocs +--- +title: Introduction +description: An introduction to your beautiful, powerful, self-hosted rom manager +hide: + - toc +--- -For full documentation visit [mkdocs.org](https://www.mkdocs.org). +RomM Logo +/// caption +Welcome to the **RomM Project**, the ecosystem around the premier self-hosted, open source rom manager. +/// -## Commands +
+Official Website: https://romm.app | Demo Website: https://demo.romm.app +
-* `mkdocs new [dir-name]` - Create a new project. -* `mkdocs serve` - Start the live-reloading docs server. -* `mkdocs build` - Build the documentation site. -* `mkdocs -h` - Print help message and exit. +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. -## Project layout +To get started with RomM, head over to the [Quick Start guide](Getting-Started/Quick-Start-Guide.md) in the main repository. - mkdocs.yml # The configuration file. - docs/ - index.md # The documentation homepage. - ... # Other markdown pages, images and other files. +### Philosophy + +At the heart of this project is a commitment to freedom, collaboration, and transparency. We believe that software should be built for the benefit of its users, rather than solely to maximize profit or serve the interests of a few stakeholders, ensuring that it doesn't manipulate, exploit, or prioritize data collection. + +By offering RomM as a self-hosted, open-source solution, we ensure that everyone has the ability to manage their game collections on their own terms, and own their data, all without being tied to proprietary systems or services. + +**Rom is and will always be free and open-source software.** + +The core app is licensed under [GNU AGPLv3](https://choosealicense.com/licenses/agpl-3.0/), which requires that all modifications to the code be made available under the same license. This ensures that the community can benefit from and build upon the contributions of others, promoting trust and transparency. + +Other projects under the umbrella will be licensed under similar permissive licenses, such as [GNU GPLv3](https://choosealicense.com/licenses/gpl-3.0/) for software, or [CC0](https://choosealicense.com/licenses/cc0-1.0/) for documentation. + +### Contributing + +RomM is a collaborative project, and we welcome contributions from the community. Our code is available on GitHub, and we encourage you to contribute to the project by submitting bug reports, feature requests, or pull requests. Please check the contribution guidelines in each project for more information. + +### Community + +We strive to create a safe and respectful space where everyone can contribute and benefit from the project by fostering a welcoming and inclusive environment for all users, regardless of their background or identity. + +Join us on Discord, where you can ask questions, submit ideas, get help, showcase your collection, and discuss RomM with other users. + + diff --git a/romm.wiki/resources/css/extra.css b/romm.wiki/resources/css/extra.css new file mode 100644 index 0000000..e83e724 --- /dev/null +++ b/romm.wiki/resources/css/extra.css @@ -0,0 +1,50 @@ +[data-md-color-scheme="slate"] { + --md-primary-fg-color: #371f69; + --md-primary-fg-color--light: #553e98; + --md-primary-fg-color--dark: #371f69; + --md-accent-fg-color: #bea4e1; + --md-accent-fg-color--transparent: #bea4e133; + --md-accent-bg-color: #ede5f8; + --md-accent-bg-color--light: #e1a38d; + + /* Improve active link visibility in dark mode */ + --md-typeset-a-color: #bea4e1; + --md-nav-link-color--active: #ede5f8; +} + +[data-md-color-scheme="default"] { + --md-primary-fg-color: #553e98; + --md-primary-fg-color--light: #bea4e1; + --md-primary-fg-color--dark: #371f69; + --md-accent-fg-color: #e6c7a7; + --md-accent-fg-color--transparent: #e6c7a733; + --md-accent-bg-color: #ede5f8; + --md-accent-bg-color--light: #e1a38d; +} + +.banner { + height: 24px; /* Made slightly taller for the warning icon */ + position: sticky; + top: 0; + left: 0; + width: 100%; + z-index: 100; /* Increased to ensure it stays above other elements */ + text-align: center; + background-color: #856404; + line-height: 24px; /* Vertically center the text */ + font-weight: 500; /* Make text slightly bolder */ +} + +.banner + .md-header { + top: 24px; /* Match the banner height */ +} + +/* Adjust the main content area when banner is present */ +.banner ~ .md-main { + height: calc(100vh - 88px); /* Adjust for banner + header height */ +} + +.banner a:hover { + color: #ffffff; + text-decoration: none; +} diff --git a/romm.wiki/resources/romm/logotype.png b/romm.wiki/resources/romm/logotype.png new file mode 100644 index 0000000..3379e88 Binary files /dev/null and b/romm.wiki/resources/romm/logotype.png differ diff --git a/romm.wiki/resources/romm/logotype.svg b/romm.wiki/resources/romm/logotype.svg new file mode 100644 index 0000000..8958857 --- /dev/null +++ b/romm.wiki/resources/romm/logotype.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/uv.lock b/uv.lock index 782dc31..3e8e7e2 100644 --- a/uv.lock +++ b/uv.lock @@ -11,6 +11,34 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537 }, ] +[[package]] +name = "cairocffi" +version = "1.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/70/c5/1a4dc131459e68a173cbdab5fad6b524f53f9c1ef7861b7698e998b837cc/cairocffi-1.7.1.tar.gz", hash = "sha256:2e48ee864884ec4a3a34bfa8c9ab9999f688286eb714a15a43ec9d068c36557b", size = 88096 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/d8/ba13451aa6b745c49536e87b6bf8f629b950e84bd0e8308f7dc6883b67e2/cairocffi-1.7.1-py3-none-any.whl", hash = "sha256:9803a0e11f6c962f3b0ae2ec8ba6ae45e957a146a004697a1ac1bbf16b073b3f", size = 75611 }, +] + +[[package]] +name = "cairosvg" +version = "2.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cairocffi" }, + { name = "cssselect2" }, + { name = "defusedxml" }, + { name = "pillow" }, + { name = "tinycss2" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d5/e6/ec5900b724e3c44af7f6f51f719919137284e5da4aabe96508baec8a1b40/CairoSVG-2.7.1.tar.gz", hash = "sha256:432531d72347291b9a9ebfb6777026b607563fd8719c46ee742db0aef7271ba0", size = 8399085 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/a5/1866b42151f50453f1a0d28fc4c39f5be5f412a2e914f33449c42daafdf1/CairoSVG-2.7.1-py3-none-any.whl", hash = "sha256:8a5222d4e6c3f86f1f7046b63246877a63b49923a1cd202184c3a634ef546b3b", size = 43235 }, +] + [[package]] name = "certifi" version = "2025.1.31" @@ -20,6 +48,39 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, ] +[[package]] +name = "cffi" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, + { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, + { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, + { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, + { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, + { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, + { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, + { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, + { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, + { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, + { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, +] + [[package]] name = "charset-normalizer" version = "3.4.1" @@ -76,6 +137,28 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, ] +[[package]] +name = "cssselect2" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tinycss2" }, + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e7/fc/326cb6f988905998f09bb54a3f5d98d4462ba119363c0dfad29750d48c09/cssselect2-0.7.0.tar.gz", hash = "sha256:1ccd984dab89fc68955043aca4e1b03e0cf29cad9880f6e28e3ba7a74b14aa5a", size = 35888 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/3a/e39436efe51894243ff145a37c4f9a030839b97779ebcc4f13b3ba21c54e/cssselect2-0.7.0-py3-none-any.whl", hash = "sha256:fd23a65bfd444595913f02fc71f6b286c29261e354c41d722ca7a261a49b5969", size = 15586 }, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604 }, +] + [[package]] name = "ghp-import" version = "2.1.0" @@ -88,6 +171,30 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034 }, ] +[[package]] +name = "gitdb" +version = "4.0.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "smmap" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794 }, +] + +[[package]] +name = "gitpython" +version = "3.1.44" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "gitdb" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/89/37df0b71473153574a5cdef8f242de422a0f5d26d7a9e231e6f169b4ad14/gitpython-3.1.44.tar.gz", hash = "sha256:c87e30b26253bf5418b01b0660f818967f3c503193838337fe5e573331249269", size = 214196 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/9a/4114a9057db2f1462d5c8f8390ab7383925fe1ac012eaa42402ad65c2963/GitPython-3.1.44-py3-none-any.whl", hash = "sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110", size = 207599 }, +] + [[package]] name = "idna" version = "3.10" @@ -130,6 +237,48 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/bd/0f/2ba5fbcd631e3e88689309dbe978c5769e883e4b84ebfe7da30b43275c5a/jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb", size = 134596 }, ] +[[package]] +name = "lxml" +version = "5.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ef/f6/c15ca8e5646e937c148e147244817672cf920b56ac0bf2cc1512ae674be8/lxml-5.3.1.tar.gz", hash = "sha256:106b7b5d2977b339f1e97efe2778e2ab20e99994cbb0ec5e55771ed0795920c8", size = 3678591 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/f4/5121aa9ee8e09b8b8a28cf3709552efe3d206ca51a20d6fa471b60bb3447/lxml-5.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e69add9b6b7b08c60d7ff0152c7c9a6c45b4a71a919be5abde6f98f1ea16421c", size = 8191889 }, + { url = "https://files.pythonhosted.org/packages/0a/ca/8e9aa01edddc74878f4aea85aa9ab64372f46aa804d1c36dda861bf9eabf/lxml-5.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4e52e1b148867b01c05e21837586ee307a01e793b94072d7c7b91d2c2da02ffe", size = 4450685 }, + { url = "https://files.pythonhosted.org/packages/b2/b3/ea40a5c98619fbd7e9349df7007994506d396b97620ced34e4e5053d3734/lxml-5.3.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4b382e0e636ed54cd278791d93fe2c4f370772743f02bcbe431a160089025c9", size = 5051722 }, + { url = "https://files.pythonhosted.org/packages/3a/5e/375418be35f8a695cadfe7e7412f16520e62e24952ed93c64c9554755464/lxml-5.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2e49dc23a10a1296b04ca9db200c44d3eb32c8d8ec532e8c1fd24792276522a", size = 4786661 }, + { url = "https://files.pythonhosted.org/packages/79/7c/d258eaaa9560f6664f9b426a5165103015bee6512d8931e17342278bad0a/lxml-5.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4399b4226c4785575fb20998dc571bc48125dc92c367ce2602d0d70e0c455eb0", size = 5311766 }, + { url = "https://files.pythonhosted.org/packages/03/bc/a041415be4135a1b3fdf017a5d873244cc16689456166fbdec4b27fba153/lxml-5.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5412500e0dc5481b1ee9cf6b38bb3b473f6e411eb62b83dc9b62699c3b7b79f7", size = 4836014 }, + { url = "https://files.pythonhosted.org/packages/32/88/047f24967d5e3fc97848ea2c207eeef0f16239cdc47368c8b95a8dc93a33/lxml-5.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c93ed3c998ea8472be98fb55aed65b5198740bfceaec07b2eba551e55b7b9ae", size = 4961064 }, + { url = "https://files.pythonhosted.org/packages/3d/b5/ecf5a20937ecd21af02c5374020f4e3a3538e10a32379a7553fca3d77094/lxml-5.3.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:63d57fc94eb0bbb4735e45517afc21ef262991d8758a8f2f05dd6e4174944519", size = 4778341 }, + { url = "https://files.pythonhosted.org/packages/a4/05/56c359e07275911ed5f35ab1d63c8cd3360d395fb91e43927a2ae90b0322/lxml-5.3.1-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:b450d7cabcd49aa7ab46a3c6aa3ac7e1593600a1a0605ba536ec0f1b99a04322", size = 5345450 }, + { url = "https://files.pythonhosted.org/packages/b7/f4/f95e3ae12e9f32fbcde00f9affa6b0df07f495117f62dbb796a9a31c84d6/lxml-5.3.1-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:4df0ec814b50275ad6a99bc82a38b59f90e10e47714ac9871e1b223895825468", size = 4908336 }, + { url = "https://files.pythonhosted.org/packages/c5/f8/309546aec092434166a6e11c7dcecb5c2d0a787c18c072d61e18da9eba57/lxml-5.3.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d184f85ad2bb1f261eac55cddfcf62a70dee89982c978e92b9a74a1bfef2e367", size = 4986049 }, + { url = "https://files.pythonhosted.org/packages/71/1c/b951817cb5058ca7c332d012dfe8bc59dabd0f0a8911ddd7b7ea8e41cfbd/lxml-5.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b725e70d15906d24615201e650d5b0388b08a5187a55f119f25874d0103f90dd", size = 4860351 }, + { url = "https://files.pythonhosted.org/packages/31/23/45feba8dae1d35fcca1e51b051f59dc4223cbd23e071a31e25f3f73938a8/lxml-5.3.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a31fa7536ec1fb7155a0cd3a4e3d956c835ad0a43e3610ca32384d01f079ea1c", size = 5421580 }, + { url = "https://files.pythonhosted.org/packages/61/69/be245d7b2dbef81c542af59c97fcd641fbf45accf2dc1c325bae7d0d014c/lxml-5.3.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3c3c8b55c7fc7b7e8877b9366568cc73d68b82da7fe33d8b98527b73857a225f", size = 5285778 }, + { url = "https://files.pythonhosted.org/packages/69/06/128af2ed04bac99b8f83becfb74c480f1aa18407b5c329fad457e08a1bf4/lxml-5.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d61ec60945d694df806a9aec88e8f29a27293c6e424f8ff91c80416e3c617645", size = 5054455 }, + { url = "https://files.pythonhosted.org/packages/8a/2d/f03a21cf6cc75cdd083563e509c7b6b159d761115c4142abb5481094ed8c/lxml-5.3.1-cp312-cp312-win32.whl", hash = "sha256:f4eac0584cdc3285ef2e74eee1513a6001681fd9753b259e8159421ed28a72e5", size = 3486315 }, + { url = "https://files.pythonhosted.org/packages/2b/9c/8abe21585d20ef70ad9cec7562da4332b764ed69ec29b7389d23dfabcea0/lxml-5.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:29bfc8d3d88e56ea0a27e7c4897b642706840247f59f4377d81be8f32aa0cfbf", size = 3816925 }, + { url = "https://files.pythonhosted.org/packages/94/1c/724931daa1ace168e0237b929e44062545bf1551974102a5762c349c668d/lxml-5.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c093c7088b40d8266f57ed71d93112bd64c6724d31f0794c1e52cc4857c28e0e", size = 8171881 }, + { url = "https://files.pythonhosted.org/packages/67/0c/857b8fb6010c4246e66abeebb8639eaabba60a6d9b7c606554ecc5cbf1ee/lxml-5.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b0884e3f22d87c30694e625b1e62e6f30d39782c806287450d9dc2fdf07692fd", size = 4440394 }, + { url = "https://files.pythonhosted.org/packages/61/72/c9e81de6a000f9682ccdd13503db26e973b24c68ac45a7029173237e3eed/lxml-5.3.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1637fa31ec682cd5760092adfabe86d9b718a75d43e65e211d5931809bc111e7", size = 5037860 }, + { url = "https://files.pythonhosted.org/packages/24/26/942048c4b14835711b583b48cd7209bd2b5f0b6939ceed2381a494138b14/lxml-5.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a364e8e944d92dcbf33b6b494d4e0fb3499dcc3bd9485beb701aa4b4201fa414", size = 4782513 }, + { url = "https://files.pythonhosted.org/packages/e2/65/27792339caf00f610cc5be32b940ba1e3009b7054feb0c4527cebac228d4/lxml-5.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:779e851fd0e19795ccc8a9bb4d705d6baa0ef475329fe44a13cf1e962f18ff1e", size = 5305227 }, + { url = "https://files.pythonhosted.org/packages/18/e1/25f7aa434a4d0d8e8420580af05ea49c3e12db6d297cf5435ac0a054df56/lxml-5.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c4393600915c308e546dc7003d74371744234e8444a28622d76fe19b98fa59d1", size = 4829846 }, + { url = "https://files.pythonhosted.org/packages/fe/ed/faf235e0792547d24f61ee1448159325448a7e4f2ab706503049d8e5df19/lxml-5.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:673b9d8e780f455091200bba8534d5f4f465944cbdd61f31dc832d70e29064a5", size = 4949495 }, + { url = "https://files.pythonhosted.org/packages/e5/e1/8f572ad9ed6039ba30f26dd4c2c58fb90f79362d2ee35ca3820284767672/lxml-5.3.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:2e4a570f6a99e96c457f7bec5ad459c9c420ee80b99eb04cbfcfe3fc18ec6423", size = 4773415 }, + { url = "https://files.pythonhosted.org/packages/a3/75/6b57166b9d1983dac8f28f354e38bff8d6bcab013a241989c4d54c72701b/lxml-5.3.1-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:71f31eda4e370f46af42fc9f264fafa1b09f46ba07bdbee98f25689a04b81c20", size = 5337710 }, + { url = "https://files.pythonhosted.org/packages/cc/71/4aa56e2daa83bbcc66ca27b5155be2f900d996f5d0c51078eaaac8df9547/lxml-5.3.1-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:42978a68d3825eaac55399eb37a4d52012a205c0c6262199b8b44fcc6fd686e8", size = 4897362 }, + { url = "https://files.pythonhosted.org/packages/65/10/3fa2da152cd9b49332fd23356ed7643c9b74cad636ddd5b2400a9730d12b/lxml-5.3.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:8b1942b3e4ed9ed551ed3083a2e6e0772de1e5e3aca872d955e2e86385fb7ff9", size = 4977795 }, + { url = "https://files.pythonhosted.org/packages/de/d2/e1da0f7b20827e7b0ce934963cb6334c1b02cf1bb4aecd218c4496880cb3/lxml-5.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:85c4f11be9cf08917ac2a5a8b6e1ef63b2f8e3799cec194417e76826e5f1de9c", size = 4858104 }, + { url = "https://files.pythonhosted.org/packages/a5/35/063420e1b33d3308f5aa7fcbdd19ef6c036f741c9a7a4bd5dc8032486b27/lxml-5.3.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:231cf4d140b22a923b1d0a0a4e0b4f972e5893efcdec188934cc65888fd0227b", size = 5416531 }, + { url = "https://files.pythonhosted.org/packages/c3/83/93a6457d291d1e37adfb54df23498101a4701834258c840381dd2f6a030e/lxml-5.3.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:5865b270b420eda7b68928d70bb517ccbe045e53b1a428129bb44372bf3d7dd5", size = 5273040 }, + { url = "https://files.pythonhosted.org/packages/39/25/ad4ac8fac488505a2702656550e63c2a8db3a4fd63db82a20dad5689cecb/lxml-5.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dbf7bebc2275016cddf3c997bf8a0f7044160714c64a9b83975670a04e6d2252", size = 5050951 }, + { url = "https://files.pythonhosted.org/packages/82/74/f7d223c704c87e44b3d27b5e0dde173a2fcf2e89c0524c8015c2b3554876/lxml-5.3.1-cp313-cp313-win32.whl", hash = "sha256:d0751528b97d2b19a388b302be2a0ee05817097bab46ff0ed76feeec24951f78", size = 3485357 }, + { url = "https://files.pythonhosted.org/packages/80/83/8c54533b3576f4391eebea88454738978669a6cad0d8e23266224007939d/lxml-5.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:91fb6a43d72b4f8863d21f347a9163eecbf36e76e2f51068d59cd004c506f332", size = 3814484 }, +] + [[package]] name = "markdown" version = "3.7" @@ -243,6 +392,55 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521 }, ] +[[package]] +name = "mkdocs-git-revision-date-localized-plugin" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "babel" }, + { name = "gitpython" }, + { name = "mkdocs" }, + { name = "pytz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/73/85/6dc9d4eca486ed5734a05f7fd5c612a8e60a35e65610dad6aa9c58118c3f/mkdocs_git_revision_date_localized_plugin-1.3.0.tar.gz", hash = "sha256:439e2f14582204050a664c258861c325064d97cdc848c541e48bb034a6c4d0cb", size = 384797 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/e5/ffeb92db53af8c3aa2d92e21a3cf6b5f83eee7e03b9cf9234ef6b30230d5/mkdocs_git_revision_date_localized_plugin-1.3.0-py3-none-any.whl", hash = "sha256:c99377ee119372d57a9e47cff4e68f04cce634a74831c06bc89b33e456e840a1", size = 22549 }, +] + +[[package]] +name = "mkdocs-glightbox" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/86/5a/0bc456397ba0acc684b5b1daa4ca232ed717938fd37198251d8bcc4053bf/mkdocs-glightbox-0.4.0.tar.gz", hash = "sha256:392b34207bf95991071a16d5f8916d1d2f2cd5d5bb59ae2997485ccd778c70d9", size = 32010 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/72/b0c2128bb569c732c11ae8e49a777089e77d83c05946062caa19b841e6fb/mkdocs_glightbox-0.4.0-py3-none-any.whl", hash = "sha256:e0107beee75d3eb7380ac06ea2d6eac94c999eaa49f8c3cbab0e7be2ac006ccf", size = 31154 }, +] + +[[package]] +name = "mkdocs-literate-nav" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mkdocs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4d/f9/c48a04f3cf484f8016a343c1d7d99c3a1ef01dbb33ceabb1d02e0ecabda7/mkdocs_literate_nav-0.6.1.tar.gz", hash = "sha256:78a7ab6d878371728acb0cdc6235c9b0ffc6e83c997b037f4a5c6ff7cef7d759", size = 16437 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/3b/e00d839d3242844c77e248f9572dd34644a04300839a60fe7d6bf652ab19/mkdocs_literate_nav-0.6.1-py3-none-any.whl", hash = "sha256:e70bdc4a07050d32da79c0b697bd88e9a104cf3294282e9cb20eec94c6b0f401", size = 13182 }, +] + +[[package]] +name = "mkdocs-markdownextradata-plugin" +version = "0.2.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mkdocs" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/c4/142510a1ea41465f63dc0419748ce693d96d714f4fe06d086fcd11b4435b/mkdocs_markdownextradata_plugin-0.2.6.tar.gz", hash = "sha256:4aed9b43b8bec65b02598387426ca4809099ea5f5aa78bf114f3296fd46686b5", size = 6882 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/4e/c09876f08fa9faaa5e1178f3d77b7af3f343258689bd6f3b72593b2f74e3/mkdocs_markdownextradata_plugin-0.2.6-py3-none-any.whl", hash = "sha256:34dd40870781784c75809596b2d8d879da783815b075336d541de1f150c94242", size = 6665 }, +] + [[package]] name = "mkdocs-material" version = "9.6.5" @@ -274,6 +472,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728 }, ] +[[package]] +name = "mkdocs-video" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "lxml" }, + { name = "mkdocs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cf/16/45213649b6756744f36f31014fc8673df1d7c998bb9a801c2d769fff4114/mkdocs-video-1.5.0.tar.gz", hash = "sha256:0defc018f4b7927f8afffc4d8e039c84dfba636dffc5e25e2bfa8d6350bc8eca", size = 5633 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/3a/b51e305eca21cdd58f4eb06973099ba0ea679b1f437a92a49f8fc576310e/mkdocs_video-1.5.0-py3-none-any.whl", hash = "sha256:b35613d4dacbac2dfa94d8c2600383cda14ad99a1fa1542b5fc4e9c6d19e9fe1", size = 6570 }, +] + [[package]] name = "packaging" version = "24.2" @@ -301,6 +512,44 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 }, ] +[[package]] +name = "pillow" +version = "11.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/af/c097e544e7bd278333db77933e535098c259609c4eb3b85381109602fb5b/pillow-11.1.0.tar.gz", hash = "sha256:368da70808b36d73b4b390a8ffac11069f8a5c85f29eff1f1b01bcf3ef5b2a20", size = 46742715 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/20/9ce6ed62c91c073fcaa23d216e68289e19d95fb8188b9fb7a63d36771db8/pillow-11.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2062ffb1d36544d42fcaa277b069c88b01bb7298f4efa06731a7fd6cc290b81a", size = 3226818 }, + { url = "https://files.pythonhosted.org/packages/b9/d8/f6004d98579a2596c098d1e30d10b248798cceff82d2b77aa914875bfea1/pillow-11.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a85b653980faad27e88b141348707ceeef8a1186f75ecc600c395dcac19f385b", size = 3101662 }, + { url = "https://files.pythonhosted.org/packages/08/d9/892e705f90051c7a2574d9f24579c9e100c828700d78a63239676f960b74/pillow-11.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9409c080586d1f683df3f184f20e36fb647f2e0bc3988094d4fd8c9f4eb1b3b3", size = 4329317 }, + { url = "https://files.pythonhosted.org/packages/8c/aa/7f29711f26680eab0bcd3ecdd6d23ed6bce180d82e3f6380fb7ae35fcf3b/pillow-11.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fdadc077553621911f27ce206ffcbec7d3f8d7b50e0da39f10997e8e2bb7f6a", size = 4412999 }, + { url = "https://files.pythonhosted.org/packages/c8/c4/8f0fe3b9e0f7196f6d0bbb151f9fba323d72a41da068610c4c960b16632a/pillow-11.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:93a18841d09bcdd774dcdc308e4537e1f867b3dec059c131fde0327899734aa1", size = 4368819 }, + { url = "https://files.pythonhosted.org/packages/38/0d/84200ed6a871ce386ddc82904bfadc0c6b28b0c0ec78176871a4679e40b3/pillow-11.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9aa9aeddeed452b2f616ff5507459e7bab436916ccb10961c4a382cd3e03f47f", size = 4496081 }, + { url = "https://files.pythonhosted.org/packages/84/9c/9bcd66f714d7e25b64118e3952d52841a4babc6d97b6d28e2261c52045d4/pillow-11.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3cdcdb0b896e981678eee140d882b70092dac83ac1cdf6b3a60e2216a73f2b91", size = 4296513 }, + { url = "https://files.pythonhosted.org/packages/db/61/ada2a226e22da011b45f7104c95ebda1b63dcbb0c378ad0f7c2a710f8fd2/pillow-11.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:36ba10b9cb413e7c7dfa3e189aba252deee0602c86c309799da5a74009ac7a1c", size = 4431298 }, + { url = "https://files.pythonhosted.org/packages/e7/c4/fc6e86750523f367923522014b821c11ebc5ad402e659d8c9d09b3c9d70c/pillow-11.1.0-cp312-cp312-win32.whl", hash = "sha256:cfd5cd998c2e36a862d0e27b2df63237e67273f2fc78f47445b14e73a810e7e6", size = 2291630 }, + { url = "https://files.pythonhosted.org/packages/08/5c/2104299949b9d504baf3f4d35f73dbd14ef31bbd1ddc2c1b66a5b7dfda44/pillow-11.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:a697cd8ba0383bba3d2d3ada02b34ed268cb548b369943cd349007730c92bddf", size = 2626369 }, + { url = "https://files.pythonhosted.org/packages/37/f3/9b18362206b244167c958984b57c7f70a0289bfb59a530dd8af5f699b910/pillow-11.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:4dd43a78897793f60766563969442020e90eb7847463eca901e41ba186a7d4a5", size = 2375240 }, + { url = "https://files.pythonhosted.org/packages/b3/31/9ca79cafdce364fd5c980cd3416c20ce1bebd235b470d262f9d24d810184/pillow-11.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae98e14432d458fc3de11a77ccb3ae65ddce70f730e7c76140653048c71bfcbc", size = 3226640 }, + { url = "https://files.pythonhosted.org/packages/ac/0f/ff07ad45a1f172a497aa393b13a9d81a32e1477ef0e869d030e3c1532521/pillow-11.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cc1331b6d5a6e144aeb5e626f4375f5b7ae9934ba620c0ac6b3e43d5e683a0f0", size = 3101437 }, + { url = "https://files.pythonhosted.org/packages/08/2f/9906fca87a68d29ec4530be1f893149e0cb64a86d1f9f70a7cfcdfe8ae44/pillow-11.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:758e9d4ef15d3560214cddbc97b8ef3ef86ce04d62ddac17ad39ba87e89bd3b1", size = 4326605 }, + { url = "https://files.pythonhosted.org/packages/b0/0f/f3547ee15b145bc5c8b336401b2d4c9d9da67da9dcb572d7c0d4103d2c69/pillow-11.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b523466b1a31d0dcef7c5be1f20b942919b62fd6e9a9be199d035509cbefc0ec", size = 4411173 }, + { url = "https://files.pythonhosted.org/packages/b1/df/bf8176aa5db515c5de584c5e00df9bab0713548fd780c82a86cba2c2fedb/pillow-11.1.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:9044b5e4f7083f209c4e35aa5dd54b1dd5b112b108648f5c902ad586d4f945c5", size = 4369145 }, + { url = "https://files.pythonhosted.org/packages/de/7c/7433122d1cfadc740f577cb55526fdc39129a648ac65ce64db2eb7209277/pillow-11.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:3764d53e09cdedd91bee65c2527815d315c6b90d7b8b79759cc48d7bf5d4f114", size = 4496340 }, + { url = "https://files.pythonhosted.org/packages/25/46/dd94b93ca6bd555588835f2504bd90c00d5438fe131cf01cfa0c5131a19d/pillow-11.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31eba6bbdd27dde97b0174ddf0297d7a9c3a507a8a1480e1e60ef914fe23d352", size = 4296906 }, + { url = "https://files.pythonhosted.org/packages/a8/28/2f9d32014dfc7753e586db9add35b8a41b7a3b46540e965cb6d6bc607bd2/pillow-11.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b5d658fbd9f0d6eea113aea286b21d3cd4d3fd978157cbf2447a6035916506d3", size = 4431759 }, + { url = "https://files.pythonhosted.org/packages/33/48/19c2cbe7403870fbe8b7737d19eb013f46299cdfe4501573367f6396c775/pillow-11.1.0-cp313-cp313-win32.whl", hash = "sha256:f86d3a7a9af5d826744fabf4afd15b9dfef44fe69a98541f666f66fbb8d3fef9", size = 2291657 }, + { url = "https://files.pythonhosted.org/packages/3b/ad/285c556747d34c399f332ba7c1a595ba245796ef3e22eae190f5364bb62b/pillow-11.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c", size = 2626304 }, + { url = "https://files.pythonhosted.org/packages/e5/7b/ef35a71163bf36db06e9c8729608f78dedf032fc8313d19bd4be5c2588f3/pillow-11.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:11633d58b6ee5733bde153a8dafd25e505ea3d32e261accd388827ee987baf65", size = 2375117 }, + { url = "https://files.pythonhosted.org/packages/79/30/77f54228401e84d6791354888549b45824ab0ffde659bafa67956303a09f/pillow-11.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:70ca5ef3b3b1c4a0812b5c63c57c23b63e53bc38e758b37a951e5bc466449861", size = 3230060 }, + { url = "https://files.pythonhosted.org/packages/ce/b1/56723b74b07dd64c1010fee011951ea9c35a43d8020acd03111f14298225/pillow-11.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8000376f139d4d38d6851eb149b321a52bb8893a88dae8ee7d95840431977081", size = 3106192 }, + { url = "https://files.pythonhosted.org/packages/e1/cd/7bf7180e08f80a4dcc6b4c3a0aa9e0b0ae57168562726a05dc8aa8fa66b0/pillow-11.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ee85f0696a17dd28fbcfceb59f9510aa71934b483d1f5601d1030c3c8304f3c", size = 4446805 }, + { url = "https://files.pythonhosted.org/packages/97/42/87c856ea30c8ed97e8efbe672b58c8304dee0573f8c7cab62ae9e31db6ae/pillow-11.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:dd0e081319328928531df7a0e63621caf67652c8464303fd102141b785ef9547", size = 4530623 }, + { url = "https://files.pythonhosted.org/packages/ff/41/026879e90c84a88e33fb00cc6bd915ac2743c67e87a18f80270dfe3c2041/pillow-11.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e63e4e5081de46517099dc30abe418122f54531a6ae2ebc8680bcd7096860eab", size = 4465191 }, + { url = "https://files.pythonhosted.org/packages/e5/fb/a7960e838bc5df57a2ce23183bfd2290d97c33028b96bde332a9057834d3/pillow-11.1.0-cp313-cp313t-win32.whl", hash = "sha256:dda60aa465b861324e65a78c9f5cf0f4bc713e4309f83bc387be158b077963d9", size = 2295494 }, + { url = "https://files.pythonhosted.org/packages/d7/6c/6ec83ee2f6f0fda8d4cf89045c6be4b0373ebfc363ba8538f8c999f63fcd/pillow-11.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ad5db5781c774ab9a9b2c4302bbf0c1014960a0a7be63278d13ae6fdf88126fe", size = 2631595 }, + { url = "https://files.pythonhosted.org/packages/cf/6c/41c21c6c8af92b9fea313aa47c75de49e2f9a467964ee33eb0135d47eb64/pillow-11.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756", size = 2377651 }, +] + [[package]] name = "platformdirs" version = "4.3.6" @@ -310,6 +559,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439 }, ] +[[package]] +name = "pycparser" +version = "2.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, +] + [[package]] name = "pygments" version = "2.19.1" @@ -353,6 +611,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, ] +[[package]] +name = "pytz" +version = "2025.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/57/df1c9157c8d5a05117e455d66fd7cf6dbc46974f832b1058ed4856785d8a/pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e", size = 319617 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/38/ac33370d784287baa1c3d538978b5e2ea064d4c1b93ffbd12826c190dd10/pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57", size = 507930 }, +] + [[package]] name = "pyyaml" version = "6.0.2" @@ -453,6 +720,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, ] +[[package]] +name = "smmap" +version = "5.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303 }, +] + +[[package]] +name = "tinycss2" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610 }, +] + [[package]] name = "urllib3" version = "2.3.0" @@ -495,21 +783,44 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067 }, ] +[[package]] +name = "webencodings" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774 }, +] + [[package]] name = "wiki" version = "0.1.0" source = { virtual = "." } dependencies = [ + { name = "cairosvg" }, { name = "mike" }, { name = "mkdocs" }, + { name = "mkdocs-git-revision-date-localized-plugin" }, + { name = "mkdocs-glightbox" }, + { name = "mkdocs-literate-nav" }, + { name = "mkdocs-markdownextradata-plugin" }, { name = "mkdocs-material" }, + { name = "mkdocs-video" }, + { name = "pillow" }, ] [package.metadata] requires-dist = [ + { name = "cairosvg", specifier = ">=2.7.1" }, { name = "mike", specifier = ">=2.1.3" }, { name = "mkdocs", specifier = ">=1.6.1" }, + { name = "mkdocs-git-revision-date-localized-plugin", specifier = ">=1.3.0" }, + { name = "mkdocs-glightbox", specifier = ">=0.4.0" }, + { name = "mkdocs-literate-nav", specifier = ">=0.6.1" }, + { name = "mkdocs-markdownextradata-plugin", specifier = ">=0.2.6" }, { name = "mkdocs-material", specifier = ">=9.6.5" }, + { name = "mkdocs-video", specifier = ">=1.5.0" }, + { name = "pillow", specifier = ">=11.1.0" }, ] [[package]]