diff --git a/apps/docs/.vscode/settings.json b/apps/docs/.vscode/settings.json index c5a1b2892..2eef88bf3 100644 --- a/apps/docs/.vscode/settings.json +++ b/apps/docs/.vscode/settings.json @@ -1,10 +1,3 @@ { - "cSpell.words": [ - "Homarr", - "Lidarr", - "Nextcloud", - "Radarr", - "Readarr", - "Sonarr" - ] -} \ No newline at end of file + "cSpell.words": ["Homarr", "Lidarr", "Nextcloud", "Radarr", "Readarr", "Sonarr"] +} diff --git a/apps/docs/README.md b/apps/docs/README.md index b66530488..f704c92f0 100644 --- a/apps/docs/README.md +++ b/apps/docs/README.md @@ -71,7 +71,7 @@ Each integration/widget doc follows a consistent pattern: The docs app has `@homarr/definitions` as a workspace dependency. You can import integration kinds, widget kinds, and other definitions directly: ```typescript -import { IntegrationKind } from '@homarr/definitions'; +import { IntegrationKind } from "@homarr/definitions"; ``` This enables type-safe references to homarr domain concepts within documentation code. @@ -90,15 +90,15 @@ pnpm verify:search ## Tech Stack -| Layer | Technology | -|---|---| +| Layer | Technology | +| -------------- | ------------------------------------------- | | Site generator | Docusaurus 3 (`@docusaurus/preset-classic`) | -| Styling | Tailwind CSS 3 + Docusaurus Infima | -| Icons | `@tabler/icons-react` | -| Diagrams | Mermaid (`@docusaurus/theme-mermaid`) | -| Search | Algolia DocSearch | -| Analytics | PostHog | -| Charts | @nivo/line | +| Styling | Tailwind CSS 3 + Docusaurus Infima | +| Icons | `@tabler/icons-react` | +| Diagrams | Mermaid (`@docusaurus/theme-mermaid`) | +| Search | Algolia DocSearch | +| Analytics | PostHog | +| Charts | @nivo/line | ## Contributing diff --git a/apps/docs/docs/advanced/command-line/_category_.json b/apps/docs/docs/advanced/command-line/_category_.json index f3ee30aa5..4b4aec4c3 100644 --- a/apps/docs/docs/advanced/command-line/_category_.json +++ b/apps/docs/docs/advanced/command-line/_category_.json @@ -1,4 +1,4 @@ { "collapsed": true, "label": "Command line interface" -} \ No newline at end of file +} diff --git a/apps/docs/docs/advanced/command-line/fix-usernames/index.mdx b/apps/docs/docs/advanced/command-line/fix-usernames/index.mdx index d3b9f50cc..bf8808118 100644 --- a/apps/docs/docs/advanced/command-line/fix-usernames/index.mdx +++ b/apps/docs/docs/advanced/command-line/fix-usernames/index.mdx @@ -14,4 +14,4 @@ homarr fix-usernames This will convert all credential usernames to lowercase and update the database accordingly. -![](./img/screenshot-cli.png) \ No newline at end of file +![](./img/screenshot-cli.png) diff --git a/apps/docs/docs/advanced/command-line/index.mdx b/apps/docs/docs/advanced/command-line/index.mdx index 0e3e802f7..287985739 100644 --- a/apps/docs/docs/advanced/command-line/index.mdx +++ b/apps/docs/docs/advanced/command-line/index.mdx @@ -1,7 +1,7 @@ # Command line interface The Homarr image ships with a built-in recovery tool. This can be useful, if you do not have access to Homarr or if something is not working. -Please note that the CLI is an *emergency tool*, not an API tool. +Please note that the CLI is an _emergency tool_, not an API tool. :::caution @@ -12,10 +12,10 @@ You should also create a backup of the database, in case you break something. ## Execute CLI with Docker -1. Execute ``docker ps | grep homarr`` on the root system with Docker to find the container ID of your Homarr container. -2. Run ``docker exec -it /bin/bash homarr ``. \ -Replace ```` with your container ID from step 1. \ -Replace ```` with the command you want to execute (see sub-pages). +1. Execute `docker ps | grep homarr` on the root system with Docker to find the container ID of your Homarr container. +2. Run `docker exec -it /bin/bash homarr `. \ + Replace `` with your container ID from step 1. \ + Replace `` with the command you want to execute (see sub-pages). ## Execute CLI with QNAP diff --git a/apps/docs/docs/advanced/command-line/integrations/index.mdx b/apps/docs/docs/advanced/command-line/integrations/index.mdx index dfdb587b0..b958e9d2b 100644 --- a/apps/docs/docs/advanced/command-line/integrations/index.mdx +++ b/apps/docs/docs/advanced/command-line/integrations/index.mdx @@ -7,6 +7,7 @@ This guide requires that you understand [how to access the CLI](../). ::: Using these commands, you can manage the integrations from the CLI: + ```bash Group of commands to manage integrations @@ -43,7 +44,7 @@ Flags: ## Delete Integration - Requires a database connection -- Requires one parameter: ``id`` or ``name`` +- Requires one parameter: `id` or `name` - Deletes an integration permanently from the database ```bash @@ -57,4 +58,4 @@ Flags: -n, --name string Name of the integration -h, --help help for integrations delete -v, --version version for homarr-cli -``` \ No newline at end of file +``` diff --git a/apps/docs/docs/advanced/command-line/password-recovery/index.mdx b/apps/docs/docs/advanced/command-line/password-recovery/index.mdx index e5a80f669..844b44140 100644 --- a/apps/docs/docs/advanced/command-line/password-recovery/index.mdx +++ b/apps/docs/docs/advanced/command-line/password-recovery/index.mdx @@ -12,8 +12,8 @@ All sessions for that user will be terminated and the user must re-login. ![](./img/screenshot-cli.png) -Using the ``--username`` parameter, you can specify who you want to reset the password for. +Using the `--username` parameter, you can specify who you want to reset the password for. Executing the command will create a new random password, update the database and display the new password. All sessions for this user will be terminated and they must re-login. -![](./img/screenshot-cli-result.png) \ No newline at end of file +![](./img/screenshot-cli-result.png) diff --git a/apps/docs/docs/advanced/command-line/users/index.mdx b/apps/docs/docs/advanced/command-line/users/index.mdx index a867fa72d..93170259a 100644 --- a/apps/docs/docs/advanced/command-line/users/index.mdx +++ b/apps/docs/docs/advanced/command-line/users/index.mdx @@ -7,6 +7,7 @@ This guide requires that you understand [how to access the CLI](../). ::: Using these commands, you can manage the users from the CLI: + ```bash Group of commands to manage users @@ -42,7 +43,7 @@ yj52ek5cyb6du4bp4osbkjry admin xxxx@example.com ## Delete User - Requires a database connection -- Requires one parameter: ``id`` or ``username`` +- Requires one parameter: `id` or `username` ```bash Delete a user by id or username @@ -76,4 +77,4 @@ Flags: -p, --password New password -h, --help help for users update-password -v, --version version for homarr-cli -``` \ No newline at end of file +``` diff --git a/apps/docs/docs/advanced/development/_category_.json b/apps/docs/docs/advanced/development/_category_.json index 9f659a536..bf0464672 100644 --- a/apps/docs/docs/advanced/development/_category_.json +++ b/apps/docs/docs/advanced/development/_category_.json @@ -1,9 +1,8 @@ { - "label": "Developer guides", - "position": 6, - "collapsed": true, - "link": { - "type": "generated-index" - } + "label": "Developer guides", + "position": 6, + "collapsed": true, + "link": { + "type": "generated-index" } - \ No newline at end of file +} diff --git a/apps/docs/docs/advanced/development/getting-started.mdx b/apps/docs/docs/advanced/development/getting-started.mdx index 7c16813ba..fb2cb9560 100644 --- a/apps/docs/docs/advanced/development/getting-started.mdx +++ b/apps/docs/docs/advanced/development/getting-started.mdx @@ -63,6 +63,7 @@ This guide will help you set up your development environment to start contributi - `pnpm typecheck`: Run the typescript type checker. #### Building the project + - `pnpm build`: Build the project for production. - `docker build -t homarr .`: Build a docker image for the project. -- `docker run -p 7575:7575 -e SECRET_ENCRYPTION_KEY='your_64_character_hex_string' homarr:latest`: Run the created docker image. \ No newline at end of file +- `docker run -p 7575:7575 -e SECRET_ENCRYPTION_KEY='your_64_character_hex_string' homarr:latest`: Run the created docker image. diff --git a/apps/docs/docs/advanced/development/kubernetes.mdx b/apps/docs/docs/advanced/development/kubernetes.mdx index e27b3ccbc..ff58b6c0a 100644 --- a/apps/docs/docs/advanced/development/kubernetes.mdx +++ b/apps/docs/docs/advanced/development/kubernetes.mdx @@ -132,4 +132,4 @@ This command should return CPU and memory usage statistics for each node. ## Conclusion -You have successfully set up a multi-node Kubernetes cluster using kind and installed the Metrics Server for monitoring resource usage. This setup is useful for local development and testing Kubernetes workloads before deploying them to a production environment. \ No newline at end of file +You have successfully set up a multi-node Kubernetes cluster using kind and installed the Metrics Server for monitoring resource usage. This setup is useful for local development and testing Kubernetes workloads before deploying them to a production environment. diff --git a/apps/docs/docs/advanced/environment-variables/index.mdx b/apps/docs/docs/advanced/environment-variables/index.mdx index f1a70b371..cc57e06ba 100644 --- a/apps/docs/docs/advanced/environment-variables/index.mdx +++ b/apps/docs/docs/advanced/environment-variables/index.mdx @@ -25,15 +25,13 @@ This is especially useful for [docker secrets](https://docs.docker.com/engine/sw Using the `PUID` and `PGID` will require you to set the correct permissions on the mounted volumes and if used the docker socket. See more in the [Running as a different user](/docs/advanced/running-as-different-user) documentation. ::: -| Environment Variable | Description | Possible values | Default | -| ------------------------ | ----------- | --------------- | ------- | -| ``PUID`` | User ID to run the container as | Any valid user ID | ``0`` | -| ``PGID`` | Group ID to run the container as | Any valid group ID | ``0`` | -| ``LOG_LEVEL`` | Log level to use | ``debug`` / ``info`` / ``warn`` / ``error`` | ``info`` | -| ``NO_EXTERNAL_CONNECTION`` | Disables some requests that need internet connection | `true` or `false` | `false` | -| ``ENABLE_DNS_CACHING`` | Enables dns caching. Enabled by default, but if you experience issues with IPv6 or static IPs, see [#4006](https://github.com/homarr-labs/homarr/issues/4006) or disable this flag | `true` or `false` | `true` | - - +| Environment Variable | Description | Possible values | Default | +| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------- | ------- | +| `PUID` | User ID to run the container as | Any valid user ID | `0` | +| `PGID` | Group ID to run the container as | Any valid group ID | `0` | +| `LOG_LEVEL` | Log level to use | `debug` / `info` / `warn` / `error` | `info` | +| `NO_EXTERNAL_CONNECTION` | Disables some requests that need internet connection | `true` or `false` | `false` | +| `ENABLE_DNS_CACHING` | Enables dns caching. Enabled by default, but if you experience issues with IPv6 or static IPs, see [#4006](https://github.com/homarr-labs/homarr/issues/4006) or disable this flag | `true` or `false` | `true` | ## Authentication @@ -43,9 +41,9 @@ See [Single Sign-On](/docs/advanced/single-sign-on) for more informations. The `SECRET_ENCRYPTION_KEY` is required. If none is specified before starting the container, a random key will be shown in the error message and the container will exit. -| Environment Variable | Description | Possible values | Default | -| ------------------------ | ----------- | --------------- | ------- | -| ``SECRET_ENCRYPTION_KEY`` | Secret used to encrypt secrets in database. | 64 character hex string | - | +| Environment Variable | Description | Possible values | Default | +| ----------------------- | ------------------------------------------- | ----------------------- | ------- | +| `SECRET_ENCRYPTION_KEY` | Secret used to encrypt secrets in database. | 64 character hex string | - | :::info A random secret can be generated by using the following command: `openssl rand -hex 32` @@ -53,27 +51,27 @@ A random secret can be generated by using the following command: `openssl rand - ## Docker -| Environment Variable | Description | Possible values | Default | -| ------------------------ | ----------- | --------------- | ------- | -| ``DOCKER_HOSTNAMES`` | Comma seperated list of hostnames to connect to | For example `localhost,docker.example.com` | - | -| ``DOCKER_PORTS`` | Comma seperated list of ports to connect to | For example `2375,2376` | - | -| ``DOCKER_SOCKET_PATHS`` | Comma seperated list of paths to sockets | For example `/var/run/docker.sock,/run/user/1000/podman/podman.sock` | - | +| Environment Variable | Description | Possible values | Default | +| --------------------- | ----------------------------------------------- | -------------------------------------------------------------------- | ------- | +| `DOCKER_HOSTNAMES` | Comma seperated list of hostnames to connect to | For example `localhost,docker.example.com` | - | +| `DOCKER_PORTS` | Comma seperated list of ports to connect to | For example `2375,2376` | - | +| `DOCKER_SOCKET_PATHS` | Comma seperated list of paths to sockets | For example `/var/run/docker.sock,/run/user/1000/podman/podman.sock` | - | ## Database -| Environment Variable | Description | Possible values | Default | -| ------------------------ | ----------- | --------------- | ------- | -| ``DB_DRIVER`` | Database driver to use. Currently `better-sqlite3` is used for sqlite, `mysql2` for mysql and `node-postgres` for postgresql | ``better-sqlite3`` / ``mysql2`` / ``node-postgres`` | ``better-sqlite3`` | -| ``DB_DIALECT`` | Database dialect to use. | ``sqlite`` / ``mysql`` / ``postgresql`` | ``sqlite`` | -| ``DB_URL`` | Database URL to connect to. | Any valid database URL | ``/appdata/db/db.sqlite`` | -| ``DB_HOST`` | Database host to connect to. | Any valid database host | - | -| ``DB_PORT`` | Database port to connect to. | Any valid database port | - | -| ``DB_NAME`` | Database name to connect to. | Any valid database name | - | -| ``DB_USER`` | Database user to connect with. | Any valid database user | - | -| ``DB_PASSWORD`` | Database password to connect with. | Any valid database password | - | + +| Environment Variable | Description | Possible values | Default | +| -------------------- | ---------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------- | ----------------------- | +| `DB_DRIVER` | Database driver to use. Currently `better-sqlite3` is used for sqlite, `mysql2` for mysql and `node-postgres` for postgresql | `better-sqlite3` / `mysql2` / `node-postgres` | `better-sqlite3` | +| `DB_DIALECT` | Database dialect to use. | `sqlite` / `mysql` / `postgresql` | `sqlite` | +| `DB_URL` | Database URL to connect to. | Any valid database URL | `/appdata/db/db.sqlite` | +| `DB_HOST` | Database host to connect to. | Any valid database host | - | +| `DB_PORT` | Database port to connect to. | Any valid database port | - | +| `DB_NAME` | Database name to connect to. | Any valid database name | - | +| `DB_USER` | Database user to connect with. | Any valid database user | - | +| `DB_PASSWORD` | Database password to connect with. | Any valid database password | - | You can either use the url or host, port, name and credentials combined. The URL will be prioritized over the other values. - ## Redis By default Redis is running within the installation. (for example in Docker). @@ -83,25 +81,23 @@ However for example for K8s it can be useful to use an external Redis instance. External redis is currently not supported with Proxmox Community Scripts ::: -| Environment Variable | Description | Possible values | Default | -| ------------------------ | ----------- | --------------- | ------- | -| `REDIS_IS_EXTERNAL` | Whether Redis is running externally. | `true` / `false` | `false` | -| `REDIS_HOST` | Hostname of the Redis instance. | Any valid hostname | - | -| `REDIS_PORT` | Port of the Redis instance. | Any valid port | `6379` | -| `REDIS_USERNAME` | Username to connect to the Redis instance. | Any valid username | - | -| `REDIS_PASSWORD` | Password to connect to the Redis instance. | Any valid password | - | -| `REDIS_DATABASE_INDEX` | Select which database of your redis instance should be used. | Any numeric index | - | -| `REDIS_TLS_CA` | CA certificate for Redis TLS connections. If a certificate is specified the connection will use TLS. | Any valid CA certificate | - | - +| Environment Variable | Description | Possible values | Default | +| ---------------------- | ---------------------------------------------------------------------------------------------------- | ------------------------ | ------- | +| `REDIS_IS_EXTERNAL` | Whether Redis is running externally. | `true` / `false` | `false` | +| `REDIS_HOST` | Hostname of the Redis instance. | Any valid hostname | - | +| `REDIS_PORT` | Port of the Redis instance. | Any valid port | `6379` | +| `REDIS_USERNAME` | Username to connect to the Redis instance. | Any valid username | - | +| `REDIS_PASSWORD` | Password to connect to the Redis instance. | Any valid password | - | +| `REDIS_DATABASE_INDEX` | Select which database of your redis instance should be used. | Any numeric index | - | +| `REDIS_TLS_CA` | CA certificate for Redis TLS connections. If a certificate is specified the connection will use TLS. | Any valid CA certificate | - | ## Proxy -| Environment Variable | Description | Possible values | Default | -| ------------------------ | ----------- | --------------- | ------- | -| ``HTTP_PROXY`` | HTTP proxy to use | Any valid HTTP proxy URL | - | -| ``HTTPS_PROXY`` | HTTPS proxy to use | Any valid HTTPS proxy URL | - | -| ``NO_PROXY`` | Comma separated list of hosts that should be excluded from proxying | Any valid hostnames | - | - +| Environment Variable | Description | Possible values | Default | +| -------------------- | ------------------------------------------------------------------- | ------------------------- | ------- | +| `HTTP_PROXY` | HTTP proxy to use | Any valid HTTP proxy URL | - | +| `HTTPS_PROXY` | HTTPS proxy to use | Any valid HTTPS proxy URL | - | +| `NO_PROXY` | Comma separated list of hosts that should be excluded from proxying | Any valid hostnames | - | ## Advanced deployments @@ -109,6 +105,6 @@ External redis is currently not supported with Proxmox Community Scripts The advanced deployments environment variables should only be used if you know what you are doing. ::: -| Environment Variable | Description | -| ------------------------ | ----------- | -| ``DB_MIGRATIONS_DISABLED`` | Disable db migrations. For example for helm charts | +| Environment Variable | Description | +| ------------------------ | -------------------------------------------------- | +| `DB_MIGRATIONS_DISABLED` | Disable db migrations. For example for helm charts | diff --git a/apps/docs/docs/advanced/icons/index.mdx b/apps/docs/docs/advanced/icons/index.mdx index 2876559ac..04b5f3890 100644 --- a/apps/docs/docs/advanced/icons/index.mdx +++ b/apps/docs/docs/advanced/icons/index.mdx @@ -9,14 +9,16 @@ tags: --- ## Icon picker + Icons in Homarr are automatically requested from multiple sources: - - [Dashboard Icons](https://dashboardicons.com/) - Our recommended source with over 1888+ curated, high-quality icons - - [selfh.st icons](https://github.com/selfhst/icons) - - [Simple icons](https://github.com/simple-icons/simple-icons) - - [Tabler icons](https://tabler-icons.io/) - - [Papirus icons](https://github.com/PapirusDevelopmentTeam/papirus-icon-theme) - - [Homelab Svg assets](https://github.com/loganmarchione/homelab-svg-assets) - - **Local icons**: automatically fetched from the [medias feature](/docs/management/media/) + +- [Dashboard Icons](https://dashboardicons.com/) - Our recommended source with over 1888+ curated, high-quality icons +- [selfh.st icons](https://github.com/selfhst/icons) +- [Simple icons](https://github.com/simple-icons/simple-icons) +- [Tabler icons](https://tabler-icons.io/) +- [Papirus icons](https://github.com/PapirusDevelopmentTeam/papirus-icon-theme) +- [Homelab Svg assets](https://github.com/loganmarchione/homelab-svg-assets) +- **Local icons**: automatically fetched from the [medias feature](/docs/management/media/) Using these icon sources, Homarr provides a total collection of over 11,000 icons at your fingertips. The icon picker is a fast searcher that helps you to find your desired icon simply by entering a search term. @@ -30,5 +32,6 @@ If you can't find the icon you're looking for in Homarr's built-in picker, we st Icons that are high quality and printable ([SVG](https://wikipedia.org/wiki/Scalable_Vector_Graphics)) are marked with a red badge "SVG" at the top right. ### Using external icons + If you don't find the icon you're looking for on Dashboard Icons or wish to use a different source, you can simply enter a URL that points to an icon. It is important that the URL directly points to the file without any advertisements or elements around it. diff --git a/apps/docs/docs/advanced/keyboard-shortcuts/index.mdx b/apps/docs/docs/advanced/keyboard-shortcuts/index.mdx index 8dfe0f285..fa504f82b 100644 --- a/apps/docs/docs/advanced/keyboard-shortcuts/index.mdx +++ b/apps/docs/docs/advanced/keyboard-shortcuts/index.mdx @@ -6,11 +6,11 @@ tags: Homarr has the following keyboard shortcuts: -| Shortcut | Description | -| -------- | ----------- | +| Shortcut | Description | +| ----------- | -------------------- | | `MOD` + `K` | Opens the search bar | -| `MOD` + `J` | Toggles Dark Mode | -| `MOD` + `E` | Toggles Edit Mode | +| `MOD` + `J` | Toggles Dark Mode | +| `MOD` + `E` | Toggles Edit Mode | :::tip diff --git a/apps/docs/docs/advanced/proxy/index.mdx b/apps/docs/docs/advanced/proxy/index.mdx index ef4e41f1d..02af599ec 100644 --- a/apps/docs/docs/advanced/proxy/index.mdx +++ b/apps/docs/docs/advanced/proxy/index.mdx @@ -9,16 +9,17 @@ tags: - Security --- -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; ## Allowing self-signed certificates + Some users may come across a barrier, where they're unable to receive a 200 response from the Ping widget for some apps, while using self-signed certificates or a local certificate authory. :::note What's going on? Homarr is trying to communicate to your apps via the integrations. -It usually doesn't matter if Homarr is running on ``http`` or ``https``. +It usually doesn't matter if Homarr is running on `http` or `https`. Your apps have a self-signed certificate - Homarr will recognize that the certificate was signed by an unknown authority and requests will be blocked. ::: @@ -28,8 +29,9 @@ To allow self-signed certificates, you can configure them on the certificates ma ## Securing Homarr with Traefik Copying the configuration straight from the docker-compose file won't work if you are running Homarr behind Traefik, such as a Portainer setup, or docker-swarm. In that case, you should use the following slightly modified configuration: + ```yaml -version: '3' +version: "3" services: homarr: container_name: homarr @@ -54,11 +56,12 @@ networks: external: true ``` -
+
A sample Traefik docker-compose.yml using Cloudflare for certificate generation that works with the configuration above would be: + ```yaml -version: '3' +version: "3" apps: traefik: @@ -104,7 +107,6 @@ networks: external: true ``` - :::tip Of particular note here is that both configurations explicitly define which network they are using, in this case "proxy", but it can be named anything. It just has to be the same across all apps for which Traefik is serving as a proxy. These are marked as external because the proxy network was manually created by running: `docker network create proxy` but this might be unnecessary depending on HOW exactly you are running Traefik. For example, if running [Traefik with Portainer](https://docs.portainer.io/advanced/reverse-proxy/traefik#deploying-in-a-docker-standalone-scenario), you can follow their official docs on how to set up Traefik and Portainer together, and you can just focus on the Homarr docker labels instead. ::: @@ -115,7 +117,6 @@ If you are using Caddy as the reverse proxy for your setup, your `docker-compose ```yaml services: - # <-- [Homarr installation] caddy: @@ -141,14 +142,17 @@ networks: proxy: external: true ``` + :::important Homarr needs to be on the same network so you will need to add the following property to your homarr install: + ```yaml homarr: ... networks: - proxy ``` + ::: Next, create a file named `Caddyfile` at the same level as your `docker-compose.yml` file with the following content: diff --git a/apps/docs/docs/advanced/running-as-different-user/index.mdx b/apps/docs/docs/advanced/running-as-different-user/index.mdx index a4ebcf0f4..91c02fb9d 100644 --- a/apps/docs/docs/advanced/running-as-different-user/index.mdx +++ b/apps/docs/docs/advanced/running-as-different-user/index.mdx @@ -8,7 +8,7 @@ tags: - PUID --- -By default the container is running with user `root` and group `root`. +By default the container is running with user `root` and group `root`. You can change the user and group by using the `PUID` and `PGID` environment variables. Important to note is, that you'll also need to change the permissions for the mounted directories accordingly. @@ -32,11 +32,11 @@ services: volumes: - ./homarr/appdata:/appdata environment: - - SECRET_ENCRYPTION_KEY=your_64_character_hex_string # <--- can be generated with `openssl rand -hex 32` - - PUID=1000 - - PGID=1000 + - SECRET_ENCRYPTION_KEY=your_64_character_hex_string # <--- can be generated with `openssl rand -hex 32` + - PUID=1000 + - PGID=1000 ports: - - '7575:7575' + - "7575:7575" ``` After that you'll need to create the appdata directory and set the correct permissions: @@ -76,11 +76,11 @@ services: - /var/run/docker.sock:/var/run/docker.sock - ./homarr/appdata:/appdata environment: - - SECRET_ENCRYPTION_KEY=your_64_character_hex_string # <--- can be generated with `openssl rand -hex 32` - - PUID=1000 - - PGID=999 + - SECRET_ENCRYPTION_KEY=your_64_character_hex_string # <--- can be generated with `openssl rand -hex 32` + - PUID=1000 + - PGID=999 ports: - - '7575:7575' + - "7575:7575" ``` And set the permissions for the mounted directories: @@ -90,4 +90,4 @@ mkdir -p ./homarr/appdata chown -R 1000:999 ./homarr/appdata ``` -Important here is that the group ID is set to `999` as we created the `docker` group with this ID. \ No newline at end of file +Important here is that the group ID is set to `999` as we created the `docker` group with this ID. diff --git a/apps/docs/docs/advanced/single-sign-on/index.mdx b/apps/docs/docs/advanced/single-sign-on/index.mdx index b4865ec88..f8e4c1ca7 100644 --- a/apps/docs/docs/advanced/single-sign-on/index.mdx +++ b/apps/docs/docs/advanced/single-sign-on/index.mdx @@ -10,20 +10,21 @@ tags: - Active Directory --- -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; # Single Sign On Homarr supports multiple authentication options, from internal userbase (credentials), to LDAP (with Active directory support), and OIDC. ### Auth configuration common variables -| Environment Variable | Description | Default Value | -|---------------------------|-------------|---------------| -| AUTH_PROVIDERS | Select Which provider to use between *credentials*, *ldap* and *oidc*.
Multiple providers can be enabled with by separating them with `,`, (ex. `AUTH_PROVIDERS=credentials,oidc`, it is highly recommended to just enable one provider). | credentials | -| AUTH_LOGOUT_REDIRECT_URL | URL to redirect to after clicking logging out. | --- | -| AUTH_SESSION_EXPIRY_TIME | Time for the session to time out. Can be set as pure number, which will automatically be used in seconds, or followed by s, m, h or d for seconds, minutes, hours or days. (ex: "30m") | "30d" | -| AUTH_COOKIE_PREFIX | Prefix used for all authentication cookies (session, csrf, callback, pkce, state, nonce). Change this if you run another Auth.js/NextAuth app on the same hostname as Homarr (browsers scope cookies by host, not by port) to avoid cookie name collisions. Only letters, numbers, hyphens and underscores are allowed. | `homarr` | + +| Environment Variable | Description | Default Value | +| ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | +| AUTH_PROVIDERS | Select Which provider to use between _credentials_, _ldap_ and _oidc_.
Multiple providers can be enabled with by separating them with `,`, (ex. `AUTH_PROVIDERS=credentials,oidc`, it is highly recommended to just enable one provider). | credentials | +| AUTH_LOGOUT_REDIRECT_URL | URL to redirect to after clicking logging out. | --- | +| AUTH_SESSION_EXPIRY_TIME | Time for the session to time out. Can be set as pure number, which will automatically be used in seconds, or followed by s, m, h or d for seconds, minutes, hours or days. (ex: "30m") | "30d" | +| AUTH_COOKIE_PREFIX | Prefix used for all authentication cookies (session, csrf, callback, pkce, state, nonce). Change this if you run another Auth.js/NextAuth app on the same hostname as Homarr (browsers scope cookies by host, not by port) to avoid cookie name collisions. Only letters, numbers, hyphens and underscores are allowed. | `homarr` | diff --git a/apps/docs/docs/advanced/styling/index.mdx b/apps/docs/docs/advanced/styling/index.mdx index 9be382ec3..56d4305e5 100644 --- a/apps/docs/docs/advanced/styling/index.mdx +++ b/apps/docs/docs/advanced/styling/index.mdx @@ -19,12 +19,14 @@ Homarr uses https://mantine.dev/ under the hood. You can change the look & feel using custom CSS, that extends or overwrites the styles from Mantine. ## Getting into CSS + If you don't have any experience with CSS, we strongly recommend you to go through the courses here: https://www.w3schools.com/css/. Due to the infinite scenarios and setups possible with custom CSS, our support team will not provide any support with your own written CSS. ## Limitations and dangers + When using custom CSS, you can break the page or certain functionalities. Although CSS can improve the design & feel of the page, it **cannot do any of the following**: @@ -33,21 +35,23 @@ Although CSS can improve the design & feel of the page, it **cannot do any - Completely revamp the design of the page, only smaller changes are possible Here are some dangers of using custom CSS: + - Updates may contain breaking changes in the structure, built-in styling or how styling is processed. Therefore, -custom CSS may break unexpectedly without any warning + custom CSS may break unexpectedly without any warning - Custom CSS may make certain elements invisible or not possible to click / interact with - Custom CSS could make readability and accessibility worse for impaired people ## How to inspect the page -When styling the page, you can use the ``Inspector`` to inspect elements on the page and try out styles. + +When styling the page, you can use the `Inspector` to inspect elements on the page and try out styles. This may vary depending on your browser and operating system, but the workflow usually goes like this: - Open the Homarr page -- Press ``Ctrl`` + ``Shift`` + ``I`` at the same time. -Alternatively, right-click on the page and choose ``Inspect`` or ``Inspect element``. -- Open the tab ``Elements`` if it isn't open yet. +- Press `Ctrl` + `Shift` + `I` at the same time. + Alternatively, right-click on the page and choose `Inspect` or `Inspect element`. +- Open the tab `Elements` if it isn't open yet. - Search the element you want to change in the DOM tree or use the element picker (usually at the top left) -to select it by clicking on the page. + to select it by clicking on the page. - Experiment by changing the CSS code on the right side When writing custom CSS, it is important to also remember or create a selector, which tells the browser @@ -55,17 +59,19 @@ which element to apply the styles to. If you accidentally broke something or wan simply reload the page. ## Using Homarr's classes + Homarr's elements will already have a lot of classes and styles pre-applied. You can reuse those classes to apply additional styles or overwrite them. -When overwriting, remember to add the ``!important`` flag to your CSS property to tell the browser to use our instruction instead. +When overwriting, remember to add the `!important` flag to your CSS property to tell the browser to use our instruction instead. -Classes with random number suffixes, such as ``mantine-Card-x2fske``, should be avoided, since those are dynamic +Classes with random number suffixes, such as `mantine-Card-x2fske`, should be avoided, since those are dynamic CSS classes that will change with every build. This means, every time you update Homarr, your styles will no longer apply to them ## Defining custom classes for widgets + If you want to apply the styles only for one widget, you can define custom class names only for that widget. -To do that, enter edit mode on your board, click the three dots of your widget, click ``Edit item`` and click ``Advanced options``. +To do that, enter edit mode on your board, click the three dots of your widget, click `Edit item` and click `Advanced options`. Then, you can enter as many custom classes as you'd like: ![](./img/widget-custom-classes.png) @@ -73,6 +79,7 @@ Then, you can enter as many custom classes as you'd like: To save them, click `Save changes` on both modals and exit edit mode. ## Where to enter custom CSS + After you wrote your custom CSS, it is time to permanently save it, so you don't need to use the inspector anymore. To do this, enter the board settings: @@ -84,11 +91,12 @@ Here you can enter your CSS code, which will be applied on the respective board ![](./img/custom-css-setting.png) ## Using variables + You can also change the values of the theme variables, which are located here: https://mantine.dev/styles/css-variables-list/. To do this, see the following example CSS: ```css :root { - --mantine-primary-color-filled: #ffbb00; + --mantine-primary-color-filled: #ffbb00; } -``` \ No newline at end of file +``` diff --git a/apps/docs/docs/community/donate.mdx b/apps/docs/docs/community/donate.mdx index aeb95dcac..3651a2a7b 100644 --- a/apps/docs/docs/community/donate.mdx +++ b/apps/docs/docs/community/donate.mdx @@ -7,12 +7,15 @@ tags: --- # Donate + ## Why to donate + Our team of 4 developers is working on Homarr in their free time. Homarr has become a big part of our daily things we work on - and therefore we invest a lot of time into maintaining Homarr, providing support and implementing new features. We also incur monetary costs while developing Homarr for the tools that we need. A few examples include: + - Renting for a Cloud VPS for our cloud services (status page, monitoring, email, analytics, [demo instance](https://demo.homarr.dev/), ...) - Paying for (IDE-) licenses @@ -20,6 +23,7 @@ Using a donation, you help us to cover these expenses and enable the development Homarr is completely free to use. We'd highly appreciate if you consider donating, especially if you use Homarr in a commercial environment. ## Where to donate + We accept donations on our official [OpenCollective](https://opencollective.com/homarr). You may also sponsor us directly by providing a useful service / product to us other means. -You can get into contact with us [here](/docs/community/get-in-touch). \ No newline at end of file +You can get into contact with us [here](/docs/community/get-in-touch). diff --git a/apps/docs/docs/community/get-in-touch.mdx b/apps/docs/docs/community/get-in-touch.mdx index 7651f5ea2..eecd2e1f3 100644 --- a/apps/docs/docs/community/get-in-touch.mdx +++ b/apps/docs/docs/community/get-in-touch.mdx @@ -9,16 +9,16 @@ tags: We're happy to talk with you! Shoot us a message at the following places: ## E-Mail + We are open to discuss sponsorships, security vulnerabilities and other private requests through our email. Please do not report any bugs / feature requests here - they will be ignored and deleted. [homarr-labs@proton.me](mailto:homarr-labs@proton.me) ## Discord + We have a Discord Server, where we announce new releases, discuss features and bugs and show off our dashboards. There are over 4'000 members and we're happy to answer your questions or concerns. You're also open to discuss new / upcoming features and any offtopic selfhosting content. [_![](https://discordapp.com/api/guilds/972958686051962910/widget.png?style=banner2)_](https://discord.gg/aCsmEV5RgA) - - diff --git a/apps/docs/docs/community/license.mdx b/apps/docs/docs/community/license.mdx index e36a5d684..3d1f82890 100644 --- a/apps/docs/docs/community/license.mdx +++ b/apps/docs/docs/community/license.mdx @@ -7,6 +7,7 @@ tags: Homarr is licensed under [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0). ## TL;DR + | Action | Allowed | | -------------- | ------- | | Copy | ✅ | @@ -24,8 +25,6 @@ Please consider [making a donation](/docs/community/donate) to Homarr, if this p ::: - - ## Full License ```txt diff --git a/apps/docs/docs/community/translations.mdx b/apps/docs/docs/community/translations.mdx index 074db939d..68eea8a1e 100644 --- a/apps/docs/docs/community/translations.mdx +++ b/apps/docs/docs/community/translations.mdx @@ -5,30 +5,31 @@ tags: - Translations --- -We want to make Homarr accessible for everyone. -But to do that, we need your help. -We are running a community program that enables everyone to translate Homarr into their language – no programming required. -We are using [Crowdin](https://crowdin.com/) to manage our translations. +We want to make Homarr accessible for everyone. +But to do that, we need your help. +We are running a community program that enables everyone to translate Homarr into their language – no programming required. +We are using [Crowdin](https://crowdin.com/) to manage our translations. You can find the translations [here](https://translate.homarr.dev/). ## How to translate - ### Using crowdin's online platform -Go to the [Crowdin translations](https://translate.homarr.dev/) and select a language you want to translate. -You can then enter the translation mode and start translating. -After you've submitted your translations, a Proofreader will review your changes. -After a translation has been approved, it will be merged to the language development branch. -We merge this one periodically to the development branch. + +Go to the [Crowdin translations](https://translate.homarr.dev/) and select a language you want to translate. +You can then enter the translation mode and start translating. +After you've submitted your translations, a Proofreader will review your changes. +After a translation has been approved, it will be merged to the language development branch. +We merge this one periodically to the development branch. After the next update of Homarr, all changes from the development branch will be merged, including the changes in the translations. ### Using live translate + You can also help translate homarr directly from the app! For this you can simply change your language to "Crowdin (live translations)" ![](./img/crowdin-language-select.png) -Then you'll be prompted to connect to your Crowdin account and choose the language in which you want to transalte. +Then you'll be prompted to connect to your Crowdin account and choose the language in which you want to transalte. You can then start translating directly from the app by selecting some text on the app. If some text cannot be selected to be edited with the live translation tool, you can still translate it inside of the In-Context popup at the Home tab, it will be red if it's not translated yet. @@ -47,7 +48,8 @@ Do you want to become a proofreader? [Let us know on our Discord](/docs/communit ::: ## Guidelines + 1. Translate with context: Some translations can't be translated 1:1 - they need context. Ensure that your translations make sense in the context. 2. Keep things simple and original - no additional characters are needed. 3. Don't translate the same thing twice - if you see a translation that is already translated, don't translate it again unless you have a better translation. -5. Keep your translations as close to the original as possible. +4. Keep your translations as close to the original as possible. diff --git a/apps/docs/docs/getting-started/after-the-installation.mdx b/apps/docs/docs/getting-started/after-the-installation.mdx index 7ac904bf4..00ed4c6b2 100644 --- a/apps/docs/docs/getting-started/after-the-installation.mdx +++ b/apps/docs/docs/getting-started/after-the-installation.mdx @@ -54,11 +54,7 @@ You must choose a username and password (both can later be changed). We enforce strict password requirements when you enter your password to protect your instance if you accidentally expose it to the internet. -{"Screenshot +{"Screenshot If you selected external providers (such as LDAP or OIDC), you'll be prompted to create an admin group. This group will be used to synchronize users from your provider to Homarr. @@ -116,22 +112,14 @@ The onboarding can no longer be started again. From here you can click on one of the provided links to continue your journey. We recommend you to continue with the section [creating your first board on this page](#creating-your-first-board). -{"Screenshot +{"Screenshot ### Importing a ZIP from version before 1.0.0 This is recommended when you used Homarr before and want to re-import your data. It is important that you first migrate correctly using [the list of breaking changes for 1.0](/blog/2024/09/23/version-1.0). -Export from old Homarr +Export from old Homarr **How to export and import data** @@ -197,38 +185,23 @@ Here you have the following options in the header: When entering the edit mode, you'll get some additional buttons to work with: -{"Screenshot +{"Screenshot - **Add item**: Click this button to add new elements to your page. - **Exit edit mode**: Click this btuton to save your changes and exit edit mode. To continue, click the option "New Item": -{"Screenshot +{"Screenshot Next, you can choose what item you'd like to add. We will discuss the other options in the following sections - for now choose "App" to continue. -{"Screenshot +{"Screenshot As soon as you chose the app, the modal will close and you'll get the following item on your board: -Screenshot of the No app element on the board +Screenshot of the No app element on the board This is expected, because you haven't told Homarr what app it should show in this item. To configure this, click on the small 3 dots at the top of the item in the edit mode and choose "Edit item" in the menu. diff --git a/apps/docs/docs/getting-started/glossary.mdx b/apps/docs/docs/getting-started/glossary.mdx index 8d690245c..ee6301ee8 100644 --- a/apps/docs/docs/getting-started/glossary.mdx +++ b/apps/docs/docs/getting-started/glossary.mdx @@ -1,8 +1,9 @@ # Glossary + In the glossary, you'll learn the different components and their names of Homarr. | Term | Definition | -|-----------------|----------------------------------------------------------------------------------------------------------------| +| --------------- | -------------------------------------------------------------------------------------------------------------- | | Apps | An piece of software that you or a third party hosts (eg. Google) | | Integration | A connection to a service outside of Homarr | | Dynamic section | Resizeable area where items on your board can be placed and grouped | diff --git a/apps/docs/docs/getting-started/index.mdx b/apps/docs/docs/getting-started/index.mdx index 4dc986658..0d6a44a4e 100644 --- a/apps/docs/docs/getting-started/index.mdx +++ b/apps/docs/docs/getting-started/index.mdx @@ -8,13 +8,14 @@ tags: - Unraid --- -import Link from '@docusaurus/Link'; -import { IconArrowRight } from '@tabler/icons-react'; +import Link from "@docusaurus/Link"; +import { IconArrowRight } from "@tabler/icons-react"; Before you try to install Homarr, please review if your device meets the requirements. Installing on an unsupported device may lead to unstable behaviour and no support will be provided. ## Hardware + - At least 500MB RAM - At least 600MB of free disk space for the Docker image. SSD is preferred. - Single or dual core CPU @@ -24,8 +25,8 @@ Installing on an unsupported device may lead to unstable behaviour and no suppor We build Homarr for a bunch of different architectures, including ARM. Please ensure that your device architecture is supported by Homarr. We won't be able to provide support for unusual or outdated architectures. -| Architecture | Supported | -|--------------|-----------------| +| Architecture | Supported | +| ------------ | ---------------- | | linux/amd64 | ✅ Supported | | linux/arm64 | ✅ Supported | | linux/arm/v7 | ❌ Not supported | @@ -34,10 +35,10 @@ We build Homarr for a bunch of different architectures, including ARM. Please en -
+
Go to Installation
diff --git a/apps/docs/docs/getting-started/installation/docker.mdx b/apps/docs/docs/getting-started/installation/docker.mdx index 956a6c2d6..5a56a848a 100644 --- a/apps/docs/docs/getting-started/installation/docker.mdx +++ b/apps/docs/docs/getting-started/installation/docker.mdx @@ -1,21 +1,23 @@ -import { DockerInstallSnippet } from '@site/src/components/pages/installation/docker/dynamic-docker-install' +import { DockerInstallSnippet } from "@site/src/components/pages/installation/docker/dynamic-docker-install"; # Docker + Docker is our recommended installation method for beginners and professionals. It is easy to use, ships with all dependencies inside a single container and is easy to use and maintain. It requires at least some basic knowledge of [Docker](https://www.docker.com/). We recommend [NetworkChuck's Docker Containers 101](https://www.youtube.com/watch?v=eGz9DS-aIeY) as a good start for complete beginners. ## Docker compose + ### Prerequisites - A Linux or Windows based system that meets the [hardware prerequisites](/docs/getting-started/#hardware) and [architecture prerequisites](/docs/getting-started/#architecture). - [Docker](https://docs.docker.com/get-docker/) -- [Docker Compose](https://docs.docker.com/compose/install/) - *preinstalled on many systems nowadays* +- [Docker Compose](https://docs.docker.com/compose/install/) - _preinstalled on many systems nowadays_ ### Installation - + Finally, run ``docker compose up -d`` in the same directory. This will start the Homarr container in the background. :::caution @@ -26,27 +28,26 @@ Docker compose creates a network by default. Some integrations may not work (spe ### Updating -To update, navigate to the directory with the ``docker-compose.yaml`` located. +To update, navigate to the directory with the `docker-compose.yaml` located. -- Stop Homarr using ``docker compose down`` -- Pull the newest image of Homarr using ``docker compose pull`` -- Start Homarr again using ``docker compose up -d`` (``-d`` for detached mode - start in background) -- Delete the old image using ``docker image prune`` (*Warning: this also removes you other unused images - not just Homarr*) +- Stop Homarr using `docker compose down` +- Pull the newest image of Homarr using `docker compose pull` +- Start Homarr again using `docker compose up -d` (`-d` for detached mode - start in background) +- Delete the old image using `docker image prune` (_Warning: this also removes you other unused images - not just Homarr_) You can automate this process using [Watchtower](https://containrrr.dev/watchtower/). ### Uninstalling -To uninstall, navigate to the directory with the ``docker-compose.yaml`` located. +To uninstall, navigate to the directory with the `docker-compose.yaml` located. -- Stop Homarr using ``docker compose down`` -- Delete the created directories & files on your root file system (check ``docker-compose.yaml`` file for your specific locations) -- Delete compose file using ``rm docker-compose.yaml`` -- Prune unused Docker images using ``docker image prune`` (*Warning: this also removes you other unused images - not just Homarr*) +- Stop Homarr using `docker compose down` +- Delete the created directories & files on your root file system (check `docker-compose.yaml` file for your specific locations) +- Delete compose file using `rm docker-compose.yaml` +- Prune unused Docker images using `docker image prune` (_Warning: this also removes you other unused images - not just Homarr_) - (Optional): Prune any network or volumes if you use any. - (Optional): Remove Homarr from your reverse proxy, VPNs or tunnels if you use any. - ## Docker standalone :::caution @@ -77,15 +78,16 @@ docker run \ :::note -Docker will mount the configuration files and icons to your host machine. Please make sure to replace ```` from the docker run command with your desired storage location. The path must be absolute. +Docker will mount the configuration files and icons to your host machine. Please make sure to replace `` from the docker run command with your desired storage location. The path must be absolute. ::: ### Updating + To update Homarr, you must remove your container first. Make sure that you've mounted your data and that you have access to it, so your configuration doesn't get lost. -1. Run ``docker rm homarr`` to remove the container. -2. Pull the latest Homarr image ``docker pull ghcr.io/homarr-labs/homarr:latest``. +1. Run `docker rm homarr` to remove the container. +2. Pull the latest Homarr image `docker pull ghcr.io/homarr-labs/homarr:latest`. 3. Re-run the command you used to install Homarr. This process can get tideous, if you update frequently. Thus, we recommend [using docker-compose](#docker-compose) @@ -98,8 +100,8 @@ Want to update all your containers automatically? Checkout [Watchtower](https:// ### Uninstalling -1. Obtain the container ID of your Homarr container using ``docker ps | grep homarr``. -2. Delete the container using ``docker rm `` -3. Prune unused Docker images using ``docker image prune`` (*Warning: this also removes you other unused images - not just Homarr*) +1. Obtain the container ID of your Homarr container using `docker ps | grep homarr`. +2. Delete the container using `docker rm ` +3. Prune unused Docker images using `docker image prune` (_Warning: this also removes you other unused images - not just Homarr_) 4. (Optional): Prune any network or volumes if you use any. 5. (Optional): Remove Homarr from your reverse proxy, VPNs or tunnels if you use any. diff --git a/apps/docs/docs/getting-started/installation/helm.md b/apps/docs/docs/getting-started/installation/helm.md index 039f76ed4..75f132d14 100644 --- a/apps/docs/docs/getting-started/installation/helm.md +++ b/apps/docs/docs/getting-started/installation/helm.md @@ -12,7 +12,7 @@ A Helm chart to deploy homarr for Kubernetes ## Source Code -* +- ## Requirements @@ -76,38 +76,38 @@ To avoid including sensitive information in plain text within your version contr Below is an exhaustive list of all secrets: -| FEATURE | SECRET NAME | SECRET KEYS | Required | -|-----------|-------------------------|-----------------------------------------|----------| -| OIDC | auth-oidc-secret | oidc-client-id
oidc-client-secret | No | -| LDAP | auth-ldap-secret | bind-password | No | -| DATABASE | db-secret | db-url | No | -| DATABASE | db-encryption | db-encryption-key | yes | +| FEATURE | SECRET NAME | SECRET KEYS | Required | +| -------- | ---------------- | ------------------------------------ | -------- | +| OIDC | auth-oidc-secret | oidc-client-id
oidc-client-secret | No | +| LDAP | auth-ldap-secret | bind-password | No | +| DATABASE | db-secret | db-url | No | +| DATABASE | db-encryption | db-encryption-key | yes | ### Database You have multiple options for configuring the database: -| DRIVER TYPE | Persistence mode | -|----------------|---------------------------------| -| better-sqlite3 | Pod disk | -| better-sqlite3 | homarr-database PVC | -| mysql2 | External MySql database | -| node-postgres | External Postgresql database | +| DRIVER TYPE | Persistence mode | +| -------------- | ---------------------------- | +| better-sqlite3 | Pod disk | +| better-sqlite3 | homarr-database PVC | +| mysql2 | External MySql database | +| node-postgres | External Postgresql database | #### Pod disk -No additional configuration is required. However, keep in mind that if the pod restarts, all data will be lost. This setup is not *recommended* for production use. +No additional configuration is required. However, keep in mind that if the pod restarts, all data will be lost. This setup is not _recommended_ for production use. To create the necessary database secret, execute the following command:
Required Secrets -````yaml +```yaml kubectl create secret generic db-encryption \ --from-literal=db-encryption-key='' \ --namespace homarr -```` +```
@@ -120,11 +120,11 @@ Associated secret to create :
DB Required Secrets -````yaml +```yaml kubectl create secret generic db-encryption \ --from-literal=db-encryption-key='' \ --namespace homarr -```` +```
@@ -133,13 +133,13 @@ Bellow an example of the override value file :
values.yaml -````yaml +```yaml persistence: homarrDatabase: enabled: true storageClassName: "default" size: "1Gi" -```` +```
@@ -150,17 +150,18 @@ To create the necessary database secrets, execute the following command:
Required Secrets -````yaml +```yaml kubectl create secret generic db-encryption \ --from-literal=db-encryption-key='' \ --namespace homarr -```` +``` -````yaml +```yaml kubectl create secret generic db-secret \ --from-literal=db-url='mysql://user:password@host:port/homarrdb' \ --namespace homarr -```` +``` +
Below is an example of the override values file: @@ -168,10 +169,11 @@ Below is an example of the override values file:
values.yaml -````yaml +```yaml database: type: mysql -```` +``` +
#### External Postgresql database @@ -181,17 +183,17 @@ To create the necessary database secrets, execute the following command:
Required Secrets -````yaml +```yaml kubectl create secret generic db-encryption \ --from-literal=db-encryption-key='' \ --namespace homarr -```` +``` -````yaml +```yaml kubectl create secret generic db-secret \ --from-literal=db-url='postgresql://user:password@host:port/homarrdb' \ --namespace homarr -```` +```
@@ -200,10 +202,11 @@ Below is an example of the override values file:
values.yaml -````yaml +```yaml database: type: postgresql -```` +``` +
### Ingress @@ -213,7 +216,7 @@ The ingress section in the values.yaml file allows you to configure how external
values.yaml -````yaml +```yaml service: enabled: true # Ensure the service is enabled for Ingress to route traffic ingress: @@ -231,7 +234,8 @@ ingress: - "homarr.homelab.dev" - "www.homarr.homelab.dev" secretName: homelab-tls -```` +``` +
### HTTPRoute (Gateway API) @@ -242,9 +246,9 @@ This provides a more expressive and future-proof alternative to Ingress, with su
values.yaml -````yaml +```yaml service: - enabled: true # must be enabled for HTTPRoute to forward traffic + enabled: true # must be enabled for HTTPRoute to forward traffic httproute: enabled: true parentRefs: @@ -260,14 +264,15 @@ httproute: backendRefs: - name: homarr port: 8080 -```` +``` +
#### Notes: - parentRefs: the Gateway(s) this route attaches to. Gateways must already exist. - hostnames: domain names this route applies to. -- rules: each rule can define matches (paths, headers, queries), optional filters, and backendRefs to services +- rules: each rule can define matches (paths, headers, queries), optional filters, and backendRefs to services - TLS must be configured on the Gateway (not on HTTPRoute). For example, the Gateway can have a TLS listener for homarr.homelab.dev, and this route will automatically apply once matched. ### Certificates @@ -284,7 +289,7 @@ Use inline certificates to generate a ConfigMap, mounted as individual files.
values.yaml -````yaml +```yaml persistence: homarrTrustedCerts: enabled: true @@ -298,7 +303,8 @@ persistence: -----BEGIN CERTIFICATE----- MIID...EFGH== -----END CERTIFICATE----- -```` +``` +
Behavior: @@ -313,7 +319,7 @@ Use inline certificates to generate a Kubernetes Secret, mounted as files.
values.yaml -````yaml +```yaml persistence: homarrTrustedCerts: enabled: true @@ -327,7 +333,8 @@ persistence: -----BEGIN CERTIFICATE----- MIIC...XYZ== -----END CERTIFICATE----- -```` +``` +
Behavior: @@ -342,16 +349,17 @@ Use an existing Kubernetes Secret, assuming its keys are filenames.
values.yaml -````yaml +```yaml persistence: homarrTrustedCerts: enabled: true type: existingSecret existingSecretName: "existingSecretName" existingSecretKeys: - - cert3.crt - - cert4.crt -```` + - cert3.crt + - cert4.crt +``` +
Behavior: @@ -372,114 +380,115 @@ All available values are listed on the [artifacthub](https://artifacthub.io/pack ## Values -| Key | Type | Default | Description | -|-----|------|---------|-------------| -| additionalObjects | list | `[]` | Additional resources to deploy. These objects are templated. | -| affinity | object | `{}` | Node affinity for pod scheduling | -| autoscaling.enabled | bool | `false` | Enable autoscaling | -| autoscaling.maxReplicas | int | `100` | Maximum replicas | -| autoscaling.minReplicas | int | `1` | Minimum replicas | -| autoscaling.targetCPUUtilizationPercentage | int | `80` | Target CPU utilization for autoscaling | -| containerPorts | object | `{"http":{"port":7575,"protocol":"TCP"}}` | containerPorts defines the ports to open on the container. It is a map where each entry specifies: - `port` (int) (required): The port number to expose inside the container. - `protocol` (string) (required): The network protocol (TCP or UDP) used for the port. - `disabled` (bool) : Optional flag to disable this port (defaults to false). Can be overridden via Helm values. By default, this configuration exposes TCP port 7575 with the name `http`. | -| database.migrationEnabled | bool | `true` | Database migration configuration. DB_MIGRATIONS_DISABLED Set to `true` to disable database migrations. Migrations are enabled by default (`false`). | -| database.type | string | `"sqlite"` | Database type: sqlite, mysql or postgresql | -| env.AUTH_COOKIE_PREFIX | string | `"homarr"` | Prefix used for all authentication cookies. Change if you run another Auth.js/NextAuth app on the same hostname to avoid cookie name collisions. Only letters, numbers, hyphens and underscores. | -| env.AUTH_LDAP_BASE | string | `nil` | Base dn of your LDAP server | -| env.AUTH_LDAP_BIND_DN | string | `nil` | User used for finding users and groups | -| env.AUTH_LDAP_GROUP_CLASS | string | `"groupOfUniqueNames"` | Class used for querying groups | -| env.AUTH_LDAP_GROUP_FILTER_EXTRA_ARG | string | `nil` | Extra arguments for user's groups search filter (& based) | -| env.AUTH_LDAP_GROUP_MEMBER_ATTRIBUTE | string | `"member"` | Attribute used for querying group member | -| env.AUTH_LDAP_GROUP_MEMBER_USER_ATTRIBUTE | string | `"dn"` | User attribute used for comparing with group member | -| env.AUTH_LDAP_SEARCH_SCOPE | string | `"base"` | LDAP search scope between base, one or sub | -| env.AUTH_LDAP_URI | string | `nil` | URI of your LDAP server | -| env.AUTH_LDAP_USERNAME_ATTRIBUTE | string | `"uid"` | Attribute used for username | -| env.AUTH_LDAP_USERNAME_FILTER_EXTRA_ARG | string | `nil` | Extra arguments for user search filter (& based) | -| env.AUTH_LDAP_USER_MAIL_ATTRIBUTE | string | `"mail"` | Attribute used for mail field | -| env.AUTH_LOGOUT_REDIRECT_URL | string | `nil` | URL to redirect to after clicking logging out. | -| env.AUTH_OIDC_AUTO_LOGIN | string | `"false"` | Automatically redirect to OIDC login | -| env.AUTH_OIDC_CLIENT_NAME | string | `"OIDC"` | Display name of provider (in login screen) | -| env.AUTH_OIDC_GROUPS_ATTRIBUTE | string | `"groups"` | Attribute used for groups (roles) claim | -| env.AUTH_OIDC_ISSUER | string | `nil` | Issuer URI of OIDC provider without trailing slash (/) | -| env.AUTH_OIDC_NAME_ATTRIBUTE_OVERWRITE | string | `nil` | Overwrite name attribute. By default, it will use preferred_username if it does not contain a @ and otherwise name. | -| env.AUTH_OIDC_SCOPE_OVERWRITE | string | `"openid email profile groups"` | Override the OIDC scopes | -| env.AUTH_PROVIDERS | string | `"credentials"` | Enabled authentication methods. Multiple providers can be enabled with by separating them with , (ex. AUTH_PROVIDERS=credentials,oidc, it is highly recommended to just enable one provider). | -| env.AUTH_SESSION_EXPIRY_TIME | string | `"30d"` | Time for the session to time out. Can be set as pure number, which will automatically be used in seconds, or followed by s, m, h or d for seconds, minutes, hours or days. (ex: "30m") | -| env.ENABLE_DNS_CACHING | string | `"false"` | Enables dns caching. This is not yet working for all users. See #4006 | -| env.LOG_LEVEL | string | `"info"` | Log level to use. Possible values: debug/info/warn/error | -| env.NO_EXTERNAL_CONNECTION | string | `"false"` | Disables some requests that need internet connection | -| env.TZ | string | `"Europe/Paris"` | Your local time zone | -| envSecrets.authLdapCredentials.existingSecret | string | `"auth-ldap-secret"` | Name of existing secret containing LDAP credentials | -| envSecrets.authLdapCredentials.ldapBindingPassword | string | `"bind-password"` | Password for bind user secret key | -| envSecrets.authOidcCredentials.existingSecret | string | `"auth-oidc-secret"` | Name of existing secret containing OIDC credentials | -| envSecrets.authOidcCredentials.oidcClientId | string | `"oidc-client-id"` | ID of OIDC client (application) secret key | -| envSecrets.authOidcCredentials.oidcClientSecret | string | `"oidc-client-secret"` | Secret of OIDC client (application) secret key | -| envSecrets.dbCredentials.dbUrlKey | string | `"db-url"` | Secret key for DB_URL Example for external database: `mysql://username:password@host:port/homarrdb` or `postgresql://username:password@host:port/homarrdb` | -| envSecrets.dbCredentials.existingSecret | string | `"db-secret"` | Name of existing secret containing DB credentials | -| envSecrets.dbEncryption.existingSecret | string | `"db-encryption"` | Name of existing secret containing DB encryption | -| envSecrets.dbEncryption.key | string | `"db-encryption-key"` | Secret key for SECRET_ENCRYPTION_KEY can be generated with `openssl rand -hex 32` | -| fullnameOverride | string | `""` | Overrides chart's fullname | -| hostAliases | list | `[]` | Add static entries to /etc/hosts in the Pod. This is useful in the following cases: - You are running in a dual-stack cluster (IPv4 + IPv6) and want to force usage of IPv4 for specific hostnames - Your application is having DNS resolution issues or IPv6 preference issues - You need to override or simulate DNS entries without changing global DNS - You are running in an air-gapped or isolated environment without external DNS Example: hostAliases: - ip: "192.168.1.10" hostnames: - "example.com" - "example.internal" | -| httproute | object | `{"enabled":false,"hostnames":["chart-example.local"],"parentRefs":[{"name":"my-gateway","namespace":"default"}],"rules":[{"backendRefs":[{"name":"homarr","port":8080}],"filters":[],"matches":[{"path":{"type":"PathPrefix","value":"/"}}]}]}` | Gateway API HTTPRoute configuration | -| httproute.enabled | bool | `false` | Enable HTTPRoute | -| httproute.hostnames | list | `["chart-example.local"]` | Hostnames this route matches (similar to ingress.hosts.host) | -| httproute.parentRefs | list | `[{"name":"my-gateway","namespace":"default"}]` | References to the parent Gateway(s) this route attaches to. Each item must include at least a `name`, and optionally a `namespace`. | -| httproute.rules | list | `[{"backendRefs":[{"name":"homarr","port":8080}],"filters":[],"matches":[{"path":{"type":"PathPrefix","value":"/"}}]}]` | List of routing rules. Each rule can include: - matches: path/header/query matching - filters: optional transformations (redirects, header modifications, etc.) - backendRefs: one or more Kubernetes Services to forward traffic to | -| httproute.rules[0].filters | list | `[]` | Optional filters for this rule (default: empty) | -| httproute.rules[0].matches[0].path.type | string | `"PathPrefix"` | Path match type. One of: Exact, PathPrefix, RegularExpression | -| httproute.rules[0].matches[0].path.value | string | `"/"` | Path value to match | -| image.pullPolicy | string | `"IfNotPresent"` | Image pull policy | -| image.repository | string | `"ghcr.io/homarr-labs/homarr"` | Image repository | -| image.tag | string | `"v1.70.0"` | Overrides the image tag whose default is the chart appVersion | -| imagePullSecrets | list | `[]` | Secrets for Docker registry | -| ingress.annotations | object | `{}` | Ingress annotations | -| ingress.enabled | bool | `false` | Enable ingress | -| ingress.hosts | list | `[{"host":"chart-example.local","paths":[{"path":"/"}]}]` | Ingress hosts configuration | -| ingress.ingressClassName | string | `""` | Ingress class name | -| ingress.tls | list | `[]` | Ingress TLS configuration | -| livenessProbe.failureThreshold | int | `3` | Failure threshold for liveness probe - number of consecutive failures before pod is restarted | -| livenessProbe.httpGet.path | string | `"/api/health/live"` | This is the liveness check endpoint used by Kubernetes to determine if the application is still running. | -| livenessProbe.httpGet.port | int | `7575` | The port on which the liveness check will be performed. This must be the same as the container port exposed by the application. | -| livenessProbe.initialDelaySeconds | int | `10` | Initial delay in seconds before the liveness probe starts | -| livenessProbe.periodSeconds | int | `10` | Period in seconds between liveness probe checks | -| livenessProbe.timeoutSeconds | int | `1` | Timeout in seconds for each liveness probe check | -| nameOverride | string | `""` | Overrides chart's name | -| nodeSelector | object | `{}` | Node selectors for pod scheduling | -| persistence.homarrDatabase.accessMode | string | `"ReadWriteOnce"` | homarr-database access mode | -| persistence.homarrDatabase.enabled | bool | `false` | Enable homarr-database persistent storage | -| persistence.homarrDatabase.mountPath | string | `"/appdata"` | homarr-database mount path inside the pod | -| persistence.homarrDatabase.name | string | `"homarr-database"` | homarr-database persistent storage name | -| persistence.homarrDatabase.size | string | `"50Mi"` | homarr-database storage size | -| persistence.homarrDatabase.storageClassName | string | `"local-path"` | homarr-database storage class name | -| persistence.homarrDatabase.volumeClaimName | string | `""` | homarr-database optional volumeClaimName to target specific PV | -| persistence.homarrTrustedCerts.certificates | string | `nil` | homarr-trusted-certificates certificates, each entry will become a new trusted certificate as a dedicated file (works only for "configmap" and "secret" mode) | -| persistence.homarrTrustedCerts.enabled | bool | `false` | Enable trusted certificates persistence | -| persistence.homarrTrustedCerts.existingSecretKeys | string | `nil` | List of keys (filenames) to mount from the existing secret (used only when type is "existingSecret") | -| persistence.homarrTrustedCerts.existingSecretName | string | `""` | Name of the existing Kubernetes Secret to mount (required if type is "existingSecret") | -| persistence.homarrTrustedCerts.mountPath | string | `"/appdata/trusted-certificates"` | homarr-trusted-certificates mount path inside the pod | -| persistence.homarrTrustedCerts.type | string | `"configmap"` | Persistence mode can be : configmap (declarative), secret (declarative) or existingSecret (mount an existing Kubernetes Secret by name and specify which keys to mount as files) | -| podAnnotations | object | `{}` | Pod annotations | -| podLabels | object | `{}` | Pod labels | -| podSecurityContext | object | `{}` | Pod security context | -| rbac | object | `{"enabled":false}` | Enable RBAC resources for Kubernetes integration Creates Role, ClusterRole, and associated bindings for Homarr's Kubernetes features | -| rbac.enabled | bool | `false` | Enable to create RBAC resources and activate Kubernetes integration | -| readinessProbe.failureThreshold | int | `3` | Failure threshold for readiness probe - number of consecutive failures before pod is considered unready | -| readinessProbe.httpGet.path | string | `"/api/health/ready"` | This is the readiness check endpoint used by Kubernetes to determine if the application is ready to handle traffic. | -| readinessProbe.httpGet.port | int | `7575` | The port on which the readiness check will be performed. This must match the container's exposed port. | -| readinessProbe.initialDelaySeconds | int | `10` | Initial delay in seconds before the readiness probe starts. increase this value if the pod is slow to fully start. | -| readinessProbe.periodSeconds | int | `10` | Period in seconds between readiness probe checks | -| readinessProbe.timeoutSeconds | int | `1` | Timeout in seconds for each readiness probe check | -| replicaCount | int | `1` | Number of replicas | -| resources | object | `{}` | Resource configuration | -| securityContext | object | `{}` | Security context | -| service.enabled | bool | `true` | Enable service | -| service.ipFamilies | list | `[]` | List of IP families to use for the service. Examples: - ["IPv4"] - ["IPv6"] - ["IPv4", "IPv6"] for dual-stack Leave empty to use cluster default behavior | -| service.ipFamilyPolicy | string | `"SingleStack"` | Defines how the service assigns IP families (IPv4/IPv6) Possible values: - SingleStack (default): Only one IP family, usually IPv4 - PreferDualStack: Use dual-stack if the cluster supports it, fallback to single - RequireDualStack: Fail if dual-stack cannot be assigned | -| service.ports.app.port | int | `7575` | Service port | -| service.ports.app.protocol | string | `"TCP"` | Service protocol | -| service.ports.app.targetPort | string | `"http"` | Service target port | -| service.type | string | `"ClusterIP"` | Service type | -| strategyType | string | `"RollingUpdate"` | `strategyType` specifies the strategy used to replace old Pods by new ones. `strategyType` can be `"Recreate"` or `"RollingUpdate"`. `"RollingUpdate"` is the default value and updates Pods in a rolling update fashion. `"Recreate"` will kill all existing Pods before new ones are created. The `"Recreate"` strategy is necessary when persistent volume's `accessMode` is set to `"ReadWriteOnce"` when using `helm upgrade`, as pod volume attachments to an existing PersistentVolumeClaim need to be cleared before a new pod can attach to it. | -| tolerations | list | `[]` | Node tolerations for pod scheduling | +| Key | Type | Default | Description | +| -------------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| additionalObjects | list | `[]` | Additional resources to deploy. These objects are templated. | +| affinity | object | `{}` | Node affinity for pod scheduling | +| autoscaling.enabled | bool | `false` | Enable autoscaling | +| autoscaling.maxReplicas | int | `100` | Maximum replicas | +| autoscaling.minReplicas | int | `1` | Minimum replicas | +| autoscaling.targetCPUUtilizationPercentage | int | `80` | Target CPU utilization for autoscaling | +| containerPorts | object | `{"http":{"port":7575,"protocol":"TCP"}}` | containerPorts defines the ports to open on the container. It is a map where each entry specifies: - `port` (int) (required): The port number to expose inside the container. - `protocol` (string) (required): The network protocol (TCP or UDP) used for the port. - `disabled` (bool) : Optional flag to disable this port (defaults to false). Can be overridden via Helm values. By default, this configuration exposes TCP port 7575 with the name `http`. | +| database.migrationEnabled | bool | `true` | Database migration configuration. DB_MIGRATIONS_DISABLED Set to `true` to disable database migrations. Migrations are enabled by default (`false`). | +| database.type | string | `"sqlite"` | Database type: sqlite, mysql or postgresql | +| env.AUTH_COOKIE_PREFIX | string | `"homarr"` | Prefix used for all authentication cookies. Change if you run another Auth.js/NextAuth app on the same hostname to avoid cookie name collisions. Only letters, numbers, hyphens and underscores. | +| env.AUTH_LDAP_BASE | string | `nil` | Base dn of your LDAP server | +| env.AUTH_LDAP_BIND_DN | string | `nil` | User used for finding users and groups | +| env.AUTH_LDAP_GROUP_CLASS | string | `"groupOfUniqueNames"` | Class used for querying groups | +| env.AUTH_LDAP_GROUP_FILTER_EXTRA_ARG | string | `nil` | Extra arguments for user's groups search filter (& based) | +| env.AUTH_LDAP_GROUP_MEMBER_ATTRIBUTE | string | `"member"` | Attribute used for querying group member | +| env.AUTH_LDAP_GROUP_MEMBER_USER_ATTRIBUTE | string | `"dn"` | User attribute used for comparing with group member | +| env.AUTH_LDAP_SEARCH_SCOPE | string | `"base"` | LDAP search scope between base, one or sub | +| env.AUTH_LDAP_URI | string | `nil` | URI of your LDAP server | +| env.AUTH_LDAP_USERNAME_ATTRIBUTE | string | `"uid"` | Attribute used for username | +| env.AUTH_LDAP_USERNAME_FILTER_EXTRA_ARG | string | `nil` | Extra arguments for user search filter (& based) | +| env.AUTH_LDAP_USER_MAIL_ATTRIBUTE | string | `"mail"` | Attribute used for mail field | +| env.AUTH_LOGOUT_REDIRECT_URL | string | `nil` | URL to redirect to after clicking logging out. | +| env.AUTH_OIDC_AUTO_LOGIN | string | `"false"` | Automatically redirect to OIDC login | +| env.AUTH_OIDC_CLIENT_NAME | string | `"OIDC"` | Display name of provider (in login screen) | +| env.AUTH_OIDC_GROUPS_ATTRIBUTE | string | `"groups"` | Attribute used for groups (roles) claim | +| env.AUTH_OIDC_ISSUER | string | `nil` | Issuer URI of OIDC provider without trailing slash (/) | +| env.AUTH_OIDC_NAME_ATTRIBUTE_OVERWRITE | string | `nil` | Overwrite name attribute. By default, it will use preferred_username if it does not contain a @ and otherwise name. | +| env.AUTH_OIDC_SCOPE_OVERWRITE | string | `"openid email profile groups"` | Override the OIDC scopes | +| env.AUTH_PROVIDERS | string | `"credentials"` | Enabled authentication methods. Multiple providers can be enabled with by separating them with , (ex. AUTH_PROVIDERS=credentials,oidc, it is highly recommended to just enable one provider). | +| env.AUTH_SESSION_EXPIRY_TIME | string | `"30d"` | Time for the session to time out. Can be set as pure number, which will automatically be used in seconds, or followed by s, m, h or d for seconds, minutes, hours or days. (ex: "30m") | +| env.ENABLE_DNS_CACHING | string | `"false"` | Enables dns caching. This is not yet working for all users. See #4006 | +| env.LOG_LEVEL | string | `"info"` | Log level to use. Possible values: debug/info/warn/error | +| env.NO_EXTERNAL_CONNECTION | string | `"false"` | Disables some requests that need internet connection | +| env.TZ | string | `"Europe/Paris"` | Your local time zone | +| envSecrets.authLdapCredentials.existingSecret | string | `"auth-ldap-secret"` | Name of existing secret containing LDAP credentials | +| envSecrets.authLdapCredentials.ldapBindingPassword | string | `"bind-password"` | Password for bind user secret key | +| envSecrets.authOidcCredentials.existingSecret | string | `"auth-oidc-secret"` | Name of existing secret containing OIDC credentials | +| envSecrets.authOidcCredentials.oidcClientId | string | `"oidc-client-id"` | ID of OIDC client (application) secret key | +| envSecrets.authOidcCredentials.oidcClientSecret | string | `"oidc-client-secret"` | Secret of OIDC client (application) secret key | +| envSecrets.dbCredentials.dbUrlKey | string | `"db-url"` | Secret key for DB_URL Example for external database: `mysql://username:password@host:port/homarrdb` or `postgresql://username:password@host:port/homarrdb` | +| envSecrets.dbCredentials.existingSecret | string | `"db-secret"` | Name of existing secret containing DB credentials | +| envSecrets.dbEncryption.existingSecret | string | `"db-encryption"` | Name of existing secret containing DB encryption | +| envSecrets.dbEncryption.key | string | `"db-encryption-key"` | Secret key for SECRET_ENCRYPTION_KEY can be generated with `openssl rand -hex 32` | +| fullnameOverride | string | `""` | Overrides chart's fullname | +| hostAliases | list | `[]` | Add static entries to /etc/hosts in the Pod. This is useful in the following cases: - You are running in a dual-stack cluster (IPv4 + IPv6) and want to force usage of IPv4 for specific hostnames - Your application is having DNS resolution issues or IPv6 preference issues - You need to override or simulate DNS entries without changing global DNS - You are running in an air-gapped or isolated environment without external DNS Example: hostAliases: - ip: "192.168.1.10" hostnames: - "example.com" - "example.internal" | +| httproute | object | `{"enabled":false,"hostnames":["chart-example.local"],"parentRefs":[{"name":"my-gateway","namespace":"default"}],"rules":[{"backendRefs":[{"name":"homarr","port":8080}],"filters":[],"matches":[{"path":{"type":"PathPrefix","value":"/"}}]}]}` | Gateway API HTTPRoute configuration | +| httproute.enabled | bool | `false` | Enable HTTPRoute | +| httproute.hostnames | list | `["chart-example.local"]` | Hostnames this route matches (similar to ingress.hosts.host) | +| httproute.parentRefs | list | `[{"name":"my-gateway","namespace":"default"}]` | References to the parent Gateway(s) this route attaches to. Each item must include at least a `name`, and optionally a `namespace`. | +| httproute.rules | list | `[{"backendRefs":[{"name":"homarr","port":8080}],"filters":[],"matches":[{"path":{"type":"PathPrefix","value":"/"}}]}]` | List of routing rules. Each rule can include: - matches: path/header/query matching - filters: optional transformations (redirects, header modifications, etc.) - backendRefs: one or more Kubernetes Services to forward traffic to | +| httproute.rules[0].filters | list | `[]` | Optional filters for this rule (default: empty) | +| httproute.rules[0].matches[0].path.type | string | `"PathPrefix"` | Path match type. One of: Exact, PathPrefix, RegularExpression | +| httproute.rules[0].matches[0].path.value | string | `"/"` | Path value to match | +| image.pullPolicy | string | `"IfNotPresent"` | Image pull policy | +| image.repository | string | `"ghcr.io/homarr-labs/homarr"` | Image repository | +| image.tag | string | `"v1.70.0"` | Overrides the image tag whose default is the chart appVersion | +| imagePullSecrets | list | `[]` | Secrets for Docker registry | +| ingress.annotations | object | `{}` | Ingress annotations | +| ingress.enabled | bool | `false` | Enable ingress | +| ingress.hosts | list | `[{"host":"chart-example.local","paths":[{"path":"/"}]}]` | Ingress hosts configuration | +| ingress.ingressClassName | string | `""` | Ingress class name | +| ingress.tls | list | `[]` | Ingress TLS configuration | +| livenessProbe.failureThreshold | int | `3` | Failure threshold for liveness probe - number of consecutive failures before pod is restarted | +| livenessProbe.httpGet.path | string | `"/api/health/live"` | This is the liveness check endpoint used by Kubernetes to determine if the application is still running. | +| livenessProbe.httpGet.port | int | `7575` | The port on which the liveness check will be performed. This must be the same as the container port exposed by the application. | +| livenessProbe.initialDelaySeconds | int | `10` | Initial delay in seconds before the liveness probe starts | +| livenessProbe.periodSeconds | int | `10` | Period in seconds between liveness probe checks | +| livenessProbe.timeoutSeconds | int | `1` | Timeout in seconds for each liveness probe check | +| nameOverride | string | `""` | Overrides chart's name | +| nodeSelector | object | `{}` | Node selectors for pod scheduling | +| persistence.homarrDatabase.accessMode | string | `"ReadWriteOnce"` | homarr-database access mode | +| persistence.homarrDatabase.enabled | bool | `false` | Enable homarr-database persistent storage | +| persistence.homarrDatabase.mountPath | string | `"/appdata"` | homarr-database mount path inside the pod | +| persistence.homarrDatabase.name | string | `"homarr-database"` | homarr-database persistent storage name | +| persistence.homarrDatabase.size | string | `"50Mi"` | homarr-database storage size | +| persistence.homarrDatabase.storageClassName | string | `"local-path"` | homarr-database storage class name | +| persistence.homarrDatabase.volumeClaimName | string | `""` | homarr-database optional volumeClaimName to target specific PV | +| persistence.homarrTrustedCerts.certificates | string | `nil` | homarr-trusted-certificates certificates, each entry will become a new trusted certificate as a dedicated file (works only for "configmap" and "secret" mode) | +| persistence.homarrTrustedCerts.enabled | bool | `false` | Enable trusted certificates persistence | +| persistence.homarrTrustedCerts.existingSecretKeys | string | `nil` | List of keys (filenames) to mount from the existing secret (used only when type is "existingSecret") | +| persistence.homarrTrustedCerts.existingSecretName | string | `""` | Name of the existing Kubernetes Secret to mount (required if type is "existingSecret") | +| persistence.homarrTrustedCerts.mountPath | string | `"/appdata/trusted-certificates"` | homarr-trusted-certificates mount path inside the pod | +| persistence.homarrTrustedCerts.type | string | `"configmap"` | Persistence mode can be : configmap (declarative), secret (declarative) or existingSecret (mount an existing Kubernetes Secret by name and specify which keys to mount as files) | +| podAnnotations | object | `{}` | Pod annotations | +| podLabels | object | `{}` | Pod labels | +| podSecurityContext | object | `{}` | Pod security context | +| rbac | object | `{"enabled":false}` | Enable RBAC resources for Kubernetes integration Creates Role, ClusterRole, and associated bindings for Homarr's Kubernetes features | +| rbac.enabled | bool | `false` | Enable to create RBAC resources and activate Kubernetes integration | +| readinessProbe.failureThreshold | int | `3` | Failure threshold for readiness probe - number of consecutive failures before pod is considered unready | +| readinessProbe.httpGet.path | string | `"/api/health/ready"` | This is the readiness check endpoint used by Kubernetes to determine if the application is ready to handle traffic. | +| readinessProbe.httpGet.port | int | `7575` | The port on which the readiness check will be performed. This must match the container's exposed port. | +| readinessProbe.initialDelaySeconds | int | `10` | Initial delay in seconds before the readiness probe starts. increase this value if the pod is slow to fully start. | +| readinessProbe.periodSeconds | int | `10` | Period in seconds between readiness probe checks | +| readinessProbe.timeoutSeconds | int | `1` | Timeout in seconds for each readiness probe check | +| replicaCount | int | `1` | Number of replicas | +| resources | object | `{}` | Resource configuration | +| securityContext | object | `{}` | Security context | +| service.enabled | bool | `true` | Enable service | +| service.ipFamilies | list | `[]` | List of IP families to use for the service. Examples: - ["IPv4"] - ["IPv6"] - ["IPv4", "IPv6"] for dual-stack Leave empty to use cluster default behavior | +| service.ipFamilyPolicy | string | `"SingleStack"` | Defines how the service assigns IP families (IPv4/IPv6) Possible values: - SingleStack (default): Only one IP family, usually IPv4 - PreferDualStack: Use dual-stack if the cluster supports it, fallback to single - RequireDualStack: Fail if dual-stack cannot be assigned | +| service.ports.app.port | int | `7575` | Service port | +| service.ports.app.protocol | string | `"TCP"` | Service protocol | +| service.ports.app.targetPort | string | `"http"` | Service target port | +| service.type | string | `"ClusterIP"` | Service type | +| strategyType | string | `"RollingUpdate"` | `strategyType` specifies the strategy used to replace old Pods by new ones. `strategyType` can be `"Recreate"` or `"RollingUpdate"`. `"RollingUpdate"` is the default value and updates Pods in a rolling update fashion. `"Recreate"` will kill all existing Pods before new ones are created. The `"Recreate"` strategy is necessary when persistent volume's `accessMode` is set to `"ReadWriteOnce"` when using `helm upgrade`, as pod volume attachments to an existing PersistentVolumeClaim need to be cleared before a new pod can attach to it. | +| tolerations | list | `[]` | Node tolerations for pod scheduling | --- + Autogenerated from chart metadata using [helm-docs](https://github.com/norwoodj/helm-docs) diff --git a/apps/docs/docs/getting-started/installation/home-assistant.mdx b/apps/docs/docs/getting-started/installation/home-assistant.mdx index 9f5a50f52..9ba9c5d01 100644 --- a/apps/docs/docs/getting-started/installation/home-assistant.mdx +++ b/apps/docs/docs/getting-started/installation/home-assistant.mdx @@ -14,7 +14,7 @@ Homarr can be seamlessly integrated into your Home Assistant setup with this add ## Installation 1. **Add Repository**: Navigate to your Home Assistant Supervisor panel, and go to the Add-on Store. Add the following repository URL: `https://github.com/Wiggen94/ha-homarr-v1-server` or click this button -[![Open your Home Assistant instance and show the add add-on repository dialog with a specific repository URL pre-filled.](https://my.home-assistant.io/badges/supervisor_add_addon_repository.svg)](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2FWiggen94%2Fha-homarr-v1-server) + [![Open your Home Assistant instance and show the add add-on repository dialog with a specific repository URL pre-filled.](https://my.home-assistant.io/badges/supervisor_add_addon_repository.svg)](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2FWiggen94%2Fha-homarr-v1-server) 2. **Install the Add-on**: Search for "Homarr Server" in the Add-on Store and select it. Click on "Install" to start the installation process. diff --git a/apps/docs/docs/getting-started/installation/portainer.mdx b/apps/docs/docs/getting-started/installation/portainer.mdx index f816d77fe..0442b215e 100644 --- a/apps/docs/docs/getting-started/installation/portainer.mdx +++ b/apps/docs/docs/getting-started/installation/portainer.mdx @@ -1,5 +1,7 @@ # Portainer + ## Portainer Stacks + ### Prerequisites - [Portainer Stacks](https://www.portainer.io/blog/stacks-docker-compose-the-portainer-way) @@ -23,15 +25,14 @@ services: environment: - SECRET_ENCRYPTION_KEY=your_64_character_hex_string # <--- can be generated with `openssl rand -hex 32` ports: - - '7575:7575' + - "7575:7575" ``` - :::note -Portainer will mount the files to your host machine. Please make sure to replace ```` from the docker run command with your desired storage location. The path must be absolute. +Portainer will mount the files to your host machine. Please make sure to replace `` from the docker run command with your desired storage location. The path must be absolute. ::: -Then, click on ``Deploy the stack`` and wait until the container has started. +Then, click on `Deploy the stack` and wait until the container has started. :::tip @@ -43,5 +44,5 @@ If you're unsure how to create a stack, checkout the [Portainer Documentation](h To update Homarr using Docker Compose or Portainer Stacks, simply pull the latest image and restart the container. -1. Run ``docker pull ghcr.io/homarr-labs/homarr:latest`` to pull the latest image. -2. Re-run ``docker-compose up -d`` or re-deploy the stack in Portainer. +1. Run `docker pull ghcr.io/homarr-labs/homarr:latest` to pull the latest image. +2. Re-run `docker-compose up -d` or re-deploy the stack in Portainer. diff --git a/apps/docs/docs/getting-started/installation/proxmox.mdx b/apps/docs/docs/getting-started/installation/proxmox.mdx index f6f5fb120..bd33b4040 100644 --- a/apps/docs/docs/getting-started/installation/proxmox.mdx +++ b/apps/docs/docs/getting-started/installation/proxmox.mdx @@ -31,7 +31,7 @@ After you've installed Homarr, you can find a new LXC "homarr". # Updating -Updating is as simple as executing +Updating is as simple as executing ```bash update @@ -49,17 +49,19 @@ Some Homarr features require setting environment variables. When installing Homa # Troubleshooting -If something does not work after an update, please first try rebooting the LXC or the homarr Service with +If something does not work after an update, please first try rebooting the LXC or the homarr Service with ```bash systemctl restart homarr ``` # Getting help + - If you are looking for help with the script, updating the LXC or troubleshooting the installer, please get in contact with the support of the community scripts. They provide support on their [Discord](https://discord.gg/2wvnMDgdnU). If you found vulnerabilities, bugs or have a request for the script, [create a new issue here](https://github.com/community-scripts/ProxmoxVE/issues/new/choose). - If you are looking to report a bug, vulnerability or request a new feature, use https://github.com/homarr-labs/homarr . You can ask for help on our Discord. # How to find logs + Homarr runs under a system service called `homarr`, so getting the logs is a simple as using the following command inside the LXC (Container) Shell ```bash diff --git a/apps/docs/docs/getting-started/installation/qnap.mdx b/apps/docs/docs/getting-started/installation/qnap.mdx index a655db5b3..b8c1f977b 100644 --- a/apps/docs/docs/getting-started/installation/qnap.mdx +++ b/apps/docs/docs/getting-started/installation/qnap.mdx @@ -4,6 +4,6 @@ QNAP installation guide has not updated to 1.0 yet. There guide is still for 0.15.10. ::: -When installing on QNAP, we recommend you to install Homarr using [Container Station]( https://www.qnap.com/en/software/container-station) or [this third-party image](https://www.myqnap.org/product/homarr/). +When installing on QNAP, we recommend you to install Homarr using [Container Station](https://www.qnap.com/en/software/container-station) or [this third-party image](https://www.myqnap.org/product/homarr/). There is also a guide available, but note that it is written in Chinese: https://post.smzdm.com/p/awzm7op2/ diff --git a/apps/docs/docs/getting-started/installation/runtipi.mdx b/apps/docs/docs/getting-started/installation/runtipi.mdx index 53a669c90..c2b2823b7 100644 --- a/apps/docs/docs/getting-started/installation/runtipi.mdx +++ b/apps/docs/docs/getting-started/installation/runtipi.mdx @@ -1,4 +1,4 @@ -# Runtipi +# Runtipi Runtipi is a self-hosted orchestrator that makes it easy to manage and run multiple services on a single server. It is based on Docker and comes with a simple web interface to manage your services. Runtipi is designed to be easy to use, so you don't have to worry about manual configuration or networking. @@ -11,6 +11,7 @@ https://runtipi.io # Installation Installing Homarr is pretty untuitive, the app is available in the default appstore : + 1. Search for **"Homarr"** in the App-Store page and select it 2. Click on **"Install"**. 3. Choose the method you want to access Homarr, through any port or domain name then select **"Install"** @@ -18,13 +19,15 @@ Installing Homarr is pretty untuitive, the app is available in the default appst # Maintenance After installation, all you need is available from the WebUI in **"My apps"** > **"Homarr"** : - - Start/Stop - - Update - - Backup - - Logs - + +- Start/Stop +- Update +- Backup +- Logs + If you like to tinker with your apps, you can also edit your app's docker-compose with a [user-config](https://runtipi.io/docs/guides/customize-app-config). # Getting help + - If you are looking for help with anything in Runtipi. They provide support on their [Discord](https://discord.gg/Bu9qEPnHsc) and [forums](https://forums.runtipi.io/). If you found vulnerabilities or bugs, [create a new issue here](https://github.com/runtipi/runtipi-appstore/issues). -- If you are looking to report a bug, vulnerability or request a new feature for Homarr, use https://github.com/homarr-labs/homarr . You can ask for help on our Discord. \ No newline at end of file +- If you are looking to report a bug, vulnerability or request a new feature for Homarr, use https://github.com/homarr-labs/homarr . You can ask for help on our Discord. diff --git a/apps/docs/docs/getting-started/installation/saltbox.mdx b/apps/docs/docs/getting-started/installation/saltbox.mdx index 2f284d72b..88805eafb 100644 --- a/apps/docs/docs/getting-started/installation/saltbox.mdx +++ b/apps/docs/docs/getting-started/installation/saltbox.mdx @@ -5,6 +5,7 @@ Saltbox installation command has not updated to 1.0 yet. There command still run ::: You can also use this to install on Saltbox: + ```bash sb install sandbox-homarr -``` \ No newline at end of file +``` diff --git a/apps/docs/docs/getting-started/installation/source.mdx b/apps/docs/docs/getting-started/installation/source.mdx index 933b264dd..838f0d0a2 100644 --- a/apps/docs/docs/getting-started/installation/source.mdx +++ b/apps/docs/docs/getting-started/installation/source.mdx @@ -28,15 +28,29 @@ This method is only useful, when you want to develop on Homarr or extend it with ## Steps
    -
  1. Clone the Repository using git clone https://github.com/homarr-labs/homarr.git
  2. -
  3. Enter the created directory using cd homarr
  4. -
  5. Install all dependencies using pnpm install
  6. -
  7. Copy the `.env.example` file to `.env` and replace `DB_URL` with the full path you want to use for the sqlite database file. For example `DB_URL='/home/username/homarr/db.sqlite`
  8. -
  9. Replace `AUTH_SECRET` and `SECRET_ENCRYPTION_KEY` both with a secure random string by using `openssl rand -hex 32`
  10. +
  11. + Clone the Repository using git clone https://github.com/homarr-labs/homarr.git +
  12. +
  13. + Enter the created directory using cd homarr +
  14. +
  15. + Install all dependencies using pnpm install +
  16. +
  17. + Copy the `.env.example` file to `.env` and replace `DB_URL` with the full path you want to use for the sqlite + database file. For example `DB_URL='/home/username/homarr/db.sqlite` +
  18. +
  19. + Replace `AUTH_SECRET` and `SECRET_ENCRYPTION_KEY` both with a secure random string by using `openssl rand -hex 32` +
  20. Replace `CRON_JOB_API_KEY` with a secure random string by using `openssl rand -base64 32`
  21. Run `pnpm run db:migration:sqlite:run` and wait that it completes
  22. Build the source using `pnpm build`
  23. -
  24. Copy better-sqlite3.node files with `mkdir build` and `cp ./node_modules/better-sqlite3/build/Release/better_sqlite3.node ./build/better_sqlite3.node`
  25. +
  26. + Copy better-sqlite3.node files with `mkdir build` and `cp + ./node_modules/better-sqlite3/build/Release/better_sqlite3.node ./build/better_sqlite3.node` +
  27. Start a redis server using `redis-server`
  28. Run the server using `pnpm start`
  29. Open `http://localhost:3000` in your browser
  30. diff --git a/apps/docs/docs/getting-started/installation/unraid.mdx b/apps/docs/docs/getting-started/installation/unraid.mdx index 5fa7cc9b0..18588c5d4 100644 --- a/apps/docs/docs/getting-started/installation/unraid.mdx +++ b/apps/docs/docs/getting-started/installation/unraid.mdx @@ -1,5 +1,5 @@ -import Link from '@docusaurus/Link'; -import { IconDownload } from '@tabler/icons-react'; +import Link from "@docusaurus/Link"; +import { IconDownload } from "@tabler/icons-react"; # Unraid @@ -14,17 +14,17 @@ You can install Homarr directly from your Unraid Dashboard, no terminal required -
    +
    Install community applications plugin
    -
    -
    +
    +
    :::tip @@ -46,4 +46,3 @@ After you've installed the Community Apps Plugin, you can install Homarr from th After you've installed Homarr, you can find it under the tab "Docker". The official support thread is located [here](https://forums.unraid.net/topic/123478-support-smartphonelover-homarr/), but we prefer to communicate over GitHub and Discord instead. - diff --git a/apps/docs/docs/integrations/adguard-home/index.mdx b/apps/docs/docs/integrations/adguard-home/index.mdx index b4cb6cdb6..52b26f66f 100644 --- a/apps/docs/docs/integrations/adguard-home/index.mdx +++ b/apps/docs/docs/integrations/adguard-home/index.mdx @@ -1,37 +1,44 @@ --- -title: 'AdGuard Home' +title: "AdGuard Home" description: "AdGuard Home is a network-wide software for blocking ads and trackers, providing a safer and faster internet experience." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconAd, IconDeviceGamepad } from "@tabler/icons-react"; -import { adguardHomeIntegration } from '.'; -import { dnsHoleSummaryWidget } from '@site/docs/widgets/dns-hole-summary'; -import { dnsHoleControlsWidget } from '@site/docs/widgets/dns-hole-controls'; +import { adguardHomeIntegration } from "."; +import { dnsHoleSummaryWidget } from "@site/docs/widgets/dns-hole-summary"; +import { dnsHoleControlsWidget } from "@site/docs/widgets/dns-hole-controls"; - + ### Widgets & Capabilities + ### Adding the integration + ### Secrets - \ No newline at end of file + + diff --git a/apps/docs/docs/integrations/anchor/index.mdx b/apps/docs/docs/integrations/anchor/index.mdx index e4d897767..2e43195cc 100644 --- a/apps/docs/docs/integrations/anchor/index.mdx +++ b/apps/docs/docs/integrations/anchor/index.mdx @@ -1,40 +1,45 @@ --- -title: 'Anchor' +title: "Anchor" description: "Anchor is a self-hosted note-taking application." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; -import { anchorIntegration } from '.'; -import { anchorNoteWidget } from '@site/docs/widgets/anchor-note'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; +import { anchorIntegration } from "."; +import { anchorNoteWidget } from "@site/docs/widgets/anchor-note"; - - + The Anchor integration lets Homarr connect to your Anchor instance so you can display and edit selected notes directly from your dashboard. ### Widgets & Capabilities + ### Adding the integration + ### Secrets - + + diff --git a/apps/docs/docs/integrations/aria2/index.mdx b/apps/docs/docs/integrations/aria2/index.mdx index 9950fec2f..8ec92a5d0 100644 --- a/apps/docs/docs/integrations/aria2/index.mdx +++ b/apps/docs/docs/integrations/aria2/index.mdx @@ -1,38 +1,43 @@ --- -title: 'Aria2' +title: "Aria2" description: "Lightweight multiprotocol & multi-source command-line download utility. It supports HTTP/HTTPS, FTP, SFTP, BitTorrent and Metalink" hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; -import { aria2Integration } from '.'; -import { downloadsWidget } from '@site/docs/widgets/downloads'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; +import { aria2Integration } from "."; +import { downloadsWidget } from "@site/docs/widgets/downloads"; - + ### Widgets & Capabilities + ### Adding the integration + ### Secrets - \ No newline at end of file + + diff --git a/apps/docs/docs/integrations/audiobookshelf/index.mdx b/apps/docs/docs/integrations/audiobookshelf/index.mdx index 156525ba5..a052d2fff 100644 --- a/apps/docs/docs/integrations/audiobookshelf/index.mdx +++ b/apps/docs/docs/integrations/audiobookshelf/index.mdx @@ -1,41 +1,40 @@ --- -title: 'Audiobookshelf' +title: "Audiobookshelf" description: "Audiobookshelf is a self-hosted audiobook and podcast server that lets you manage and stream your audio library." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; -import { audiobookshelfIntegration } from '.'; -import { audioStatsWidget } from '@site/docs/widgets/audio-stats'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; +import { audiobookshelfIntegration } from "."; +import { audioStatsWidget } from "@site/docs/widgets/audio-stats"; - - + Audiobookshelf provides library statistics including audiobook and podcast counts, listening time, and active sessions. ### Widgets & Capabilities - + + ### Adding the integration + ### Secrets - + + diff --git a/apps/docs/docs/integrations/bazarr/index.mdx b/apps/docs/docs/integrations/bazarr/index.mdx index f9400a45e..7e1ad2d64 100644 --- a/apps/docs/docs/integrations/bazarr/index.mdx +++ b/apps/docs/docs/integrations/bazarr/index.mdx @@ -1,31 +1,30 @@ --- -title: 'Bazarr' +title: "Bazarr" description: "Bazarr is a companion application to Sonarr and Radarr that manages and downloads subtitles." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; -import { bazarrIntegration } from '.'; -import { bazarrWidget } from '@site/docs/widgets/bazarr'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; +import { bazarrIntegration } from "."; +import { bazarrWidget } from "@site/docs/widgets/bazarr"; - + Bazarr complements Sonarr and Radarr by managing subtitle downloads. The Homarr integration uses your Bazarr API key to fetch missing subtitle counts and health badges. ### Screenshots -import apiKeySettings from './img/api-key-settings.png'; -import widgetOverview from '@site/docs/widgets/bazarr/img/widget-overview.png'; +import apiKeySettings from "./img/api-key-settings.png"; +import widgetOverview from "@site/docs/widgets/bazarr/img/widget-overview.png";
    -

    API key location in Bazarr (Settings → General → Security):

    +

    + API key location in Bazarr (Settings → General → Security): +

    bazarr-api-key-settings
    @@ -35,20 +34,25 @@ import widgetOverview from '@site/docs/widgets/bazarr/img/widget-overview.png';
    ### Widgets & Capabilities - + + ### Adding the integration + ### Secrets + You can find your Bazarr API key under **Settings → General → Security**. - + diff --git a/apps/docs/docs/integrations/beszel/index.mdx b/apps/docs/docs/integrations/beszel/index.mdx index 0c93cdc9f..8ddda77c6 100644 --- a/apps/docs/docs/integrations/beszel/index.mdx +++ b/apps/docs/docs/integrations/beszel/index.mdx @@ -1,25 +1,22 @@ --- -title: 'Beszel' +title: "Beszel" description: "Beszel is a lightweight server monitoring platform with Docker stats, historical data, and alert functions." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; -import { beszelIntegration } from '.'; -import { beszelSystemStatsWidget } from '@site/docs/widgets/beszel-system-stats'; -import { beszelSystemGridWidget } from '@site/docs/widgets/beszel-system-grid'; -import { beszelSystemTableWidget } from '@site/docs/widgets/beszel-system-table'; -import { beszelAlertsWidget } from '@site/docs/widgets/beszel-alerts'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; +import { beszelIntegration } from "."; +import { beszelSystemStatsWidget } from "@site/docs/widgets/beszel-system-stats"; +import { beszelSystemGridWidget } from "@site/docs/widgets/beszel-system-grid"; +import { beszelSystemTableWidget } from "@site/docs/widgets/beszel-system-table"; +import { beszelAlertsWidget } from "@site/docs/widgets/beszel-alerts"; -import beszelDashboard from './img/beszel-dashboard.png'; +import beszelDashboard from "./img/beszel-dashboard.png"; - + Beszel monitors your servers in real time via lightweight agents, collecting CPU, memory, disk, network, GPU, temperature, and Docker container metrics. It stores historical data and supports configurable alerts. @@ -28,26 +25,33 @@ Beszel monitors your servers in real time via lightweight agents, collecting CPU Beszel dashboard overview showing all four widgets ### Widgets & Capabilities + ### Adding the integration + ### Secrets - + + :::tip Beszel uses PocketBase under the hood. The default admin credentials are set during the initial Beszel setup. diff --git a/apps/docs/docs/integrations/coolify/index.mdx b/apps/docs/docs/integrations/coolify/index.mdx index 56e5e6c29..7b828cc18 100644 --- a/apps/docs/docs/integrations/coolify/index.mdx +++ b/apps/docs/docs/integrations/coolify/index.mdx @@ -1,29 +1,24 @@ --- -title: 'Coolify' -description: 'Self-hosted PaaS and deployment platform' +title: "Coolify" +description: "Self-hosted PaaS and deployment platform" hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; -import { coolifyIntegration } from '.'; -import { coolifyWidget } from '../../widgets/coolify'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; +import { coolifyIntegration } from "."; +import { coolifyWidget } from "../../widgets/coolify"; - + ### Widgets & Capabilities - + + ### Adding the integration + :::info URL configuration @@ -31,16 +26,28 @@ Use the root URL of your Coolify instance, for example `https://coolify.example. ::: ### Secrets -Enable API access under Settings > Advanced if it is disabled.), - (Go to Security > API Tokens.), - 'Enter a name, e.g. "Homarr".', - (Select the read permission. The Coolify widget only reads version, server, project, application, and service data.), - 'Click "Create".', - 'Copy the generated token immediately. Coolify only shows it once.', - 'Paste the token into the API Key field in Homarr.' - ] -}]} /> + + + Enable API access under Settings > Advanced if it is disabled. + , + + Go to Security > API Tokens. + , + 'Enter a name, e.g. "Homarr".', + + Select the read permission. The Coolify widget only reads version, server, project, application, + and service data. + , + 'Click "Create".', + "Copy the generated token immediately. Coolify only shows it once.", + "Paste the token into the API Key field in Homarr.", + ], + }, + ]} +/> diff --git a/apps/docs/docs/integrations/dash-dot/index.mdx b/apps/docs/docs/integrations/dash-dot/index.mdx index 512bc6c8d..9c400321c 100644 --- a/apps/docs/docs/integrations/dash-dot/index.mdx +++ b/apps/docs/docs/integrations/dash-dot/index.mdx @@ -1,32 +1,33 @@ --- -title: 'Dash.' +title: "Dash." description: "Dash. is a system performance and resource monitoring tool" hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconHeartRateMonitor } from "@tabler/icons-react"; -import { dashDotIntegration } from '.'; -import { healthMonitoringWidget } from '@site/docs/widgets/health-monitoring'; -import { systemResourcesWidget } from '@site/docs/widgets/system-resources'; +import { dashDotIntegration } from "."; +import { healthMonitoringWidget } from "@site/docs/widgets/health-monitoring"; +import { systemResourcesWidget } from "@site/docs/widgets/system-resources"; - - + ### Widgets & Capabilities + ### Adding the integration - \ No newline at end of file + + diff --git a/apps/docs/docs/integrations/deluge/index.mdx b/apps/docs/docs/integrations/deluge/index.mdx index 24aadb910..89f906c0c 100644 --- a/apps/docs/docs/integrations/deluge/index.mdx +++ b/apps/docs/docs/integrations/deluge/index.mdx @@ -1,36 +1,41 @@ --- -title: 'Deluge' +title: "Deluge" description: "Deluge is a lightweight, Free Software, cross-platform BitTorrent client." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconDownload } from "@tabler/icons-react"; -import Alert from '@theme/Admonition'; -import { delugeIntegration } from '.'; -import { downloadsWidget } from '@site/docs/widgets/downloads'; +import Alert from "@theme/Admonition"; +import { delugeIntegration } from "."; +import { downloadsWidget } from "@site/docs/widgets/downloads"; - - + ### Widgets & Capabilities + ### Adding the integration + ### Secrets - \ No newline at end of file + + diff --git a/apps/docs/docs/integrations/docker/index.mdx b/apps/docs/docs/integrations/docker/index.mdx index e48c46e9b..568bf8be4 100644 --- a/apps/docs/docs/integrations/docker/index.mdx +++ b/apps/docs/docs/integrations/docker/index.mdx @@ -1,32 +1,31 @@ --- -title: 'Docker' +title: "Docker" description: "Docker is a platform where you can run your applications in containers, allowing for easy deployment and management of applications." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconBrandDocker, IconTool } from "@tabler/icons-react"; -import { dockerIntegration } from '.'; -import { dockerContainersWidget } from '@site/docs/widgets/docker-containers'; +import { dockerIntegration } from "."; +import { dockerContainersWidget } from "@site/docs/widgets/docker-containers"; - - + ### Widgets & Capabilities + - ## Enabling the Docker integration + This integration must first be enabled. If you directly run on the host system and you have docker installed, it will be enabled by default. Otherwise, you'll need to mount the [docker socket](https://docs.docker.com/engine/security/protect-access/) to the Homarr container, @@ -49,15 +48,17 @@ services: environment: - SECRET_ENCRYPTION_KEY=your_64_character_hex_string # <--- can be generated with `openssl rand -hex 32` ports: - - '7575:7575' + - "7575:7575" ``` With docker run, add this parameter: `-v /var/run/docker.sock:/var/run/docker.sock`. In Windows, you'll need to adjust the slashes: `-v //var/run/docker.sock:/var/run/docker.sock` ### Managing your Docker containers within Homarr + Homarr allows you to interact with Docker containers running on your system. Each container row has an action menu with the following options: + - **View logs** - opens a dedicated logs page with a live terminal - **Start** - start a stopped container - **Stop** - stop a running container @@ -98,11 +99,13 @@ Currently Homarr supports one label for configuration of the containers: - **homarr.hide:** If set to any value, the container will be hidden from the Docker Containers widget and tools page. ### Security + Mounting docker sockets can be risky, as they permit full control over your docker service. As an example, a thread actor could abuse Homarr use the socket to start, stop or delete containers on your system. Therefore we recommend the usage of a socket proxy, which can prohibit certain actions. A few examples include: + - https://github.com/linuxserver/docker-socket-proxy - https://github.com/Tecnativa/docker-socket-proxy @@ -110,36 +113,44 @@ See documentation of the respective proxies on how to configure them. Homarr may behave in unexpected ways when you use proxies. #### Permissions + Homarr needs the following permissions from the Docker API: + - Containers/Start - Containers/Stop - Containers/Restart - Containers/Remove For socket proxies, you will need these permissions: + - `CONTAINERS=1` - `POST=1` **Caution:** `POST` access is security critical as it provides extensive capabilities to modify your docker environment. Please leave it disabled if you're concerned about this. As a workaround, you can use [LSIO's socket proxy](https://github.com/linuxserver/docker-socket-proxy) and set the following: + - ALLOW_START=1 - ALLOW_STOP=1 - ALLOW_RESTARTS=1 -These will work even with `POST=0`. +These will work even with `POST=0`. You lose the ability to remove containers, but start, stop and restarts should work just fine. #### Connecting to Docker via Socket Proxies + To connect to Docker via a socket proxy, you'll need to add these two environment variables in the compose file: + - `DOCKER_HOSTNAMES=` - `DOCKER_PORTS=` Refer: https://homarr.dev/docs/advanced/environment-variables/ You will also need to add Homarr to the network of your socket proxy. You can do it like this: + 1. Add the network to your compose file (with appropriate changes): + ```yaml networks: socket-proxy: @@ -148,6 +159,7 @@ networks: ``` 2. Add the network to the homarr service in the compose file: + ```yaml networks: - socket-proxy diff --git a/apps/docs/docs/integrations/emby/index.mdx b/apps/docs/docs/integrations/emby/index.mdx index 907d2bd96..2426a1561 100644 --- a/apps/docs/docs/integrations/emby/index.mdx +++ b/apps/docs/docs/integrations/emby/index.mdx @@ -1,37 +1,35 @@ --- -title: 'Emby' +title: "Emby" description: "Emby is a media server platform that allows you to organize, manage, and stream your personal media collection." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconVideo, IconTicket } from "@tabler/icons-react"; -import { embyIntegration } from '.'; -import { mediaServerWidget } from '@site/docs/widgets/media-server'; -import { mediaReleasesWidget } from '@site/docs/widgets/media-releases'; +import { embyIntegration } from "."; +import { mediaServerWidget } from "@site/docs/widgets/media-server"; +import { mediaReleasesWidget } from "@site/docs/widgets/media-releases"; - - + ### Widgets & Capabilities - + + ### Adding the integration + ### Secrets - \ No newline at end of file + + diff --git a/apps/docs/docs/integrations/glances/index.mdx b/apps/docs/docs/integrations/glances/index.mdx index 2639f87e5..bd047e81d 100644 --- a/apps/docs/docs/integrations/glances/index.mdx +++ b/apps/docs/docs/integrations/glances/index.mdx @@ -1,37 +1,43 @@ --- -title: 'Glances' +title: "Glances" description: "Glances is a cross-platform system monitoring tool." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; -import { glancesIntegration } from '.'; -import { systemResourcesWidget } from '@site/docs/widgets/system-resources'; -import { healthMonitoringWidget } from '@site/docs/widgets/health-monitoring'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; +import { glancesIntegration } from "."; +import { systemResourcesWidget } from "@site/docs/widgets/system-resources"; +import { healthMonitoringWidget } from "@site/docs/widgets/health-monitoring"; - - + ### Widgets & Capabilities + ### Adding the integration + ### Secrets - \ No newline at end of file + + diff --git a/apps/docs/docs/integrations/gluetun/index.mdx b/apps/docs/docs/integrations/gluetun/index.mdx index 7c936fc1f..dca490781 100644 --- a/apps/docs/docs/integrations/gluetun/index.mdx +++ b/apps/docs/docs/integrations/gluetun/index.mdx @@ -1,20 +1,17 @@ --- -title: 'Gluetun' -description: 'Connect Gluetun to Homarr as a VPN integration.' +title: "Gluetun" +description: "Connect Gluetun to Homarr as a VPN integration." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; -import { gluetunIntegration } from '.'; -import { vpnWidget } from '@site/docs/widgets/vpn'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; +import { gluetunIntegration } from "."; +import { vpnWidget } from "@site/docs/widgets/vpn"; - + [Gluetun](https://github.com/qdm12/gluetun) exposes a control server that Homarr can query to report the VPN tunnel status, DNS status, public IP address, and active provider details in the VPN widget. @@ -22,9 +19,11 @@ status, DNS status, public IP address, and active provider details in the VPN wi ### Widgets & Capabilities ### Setting up the Gluetun control server @@ -40,13 +39,20 @@ Refer to the [Gluetun control server documentation](https://github.com/qdm12/glu Gluetun's control server can be left unprotected or secured with either an API key or HTTP Basic authentication. Choose the option that matches how your Gluetun instance integration is set up. - + diff --git a/apps/docs/docs/integrations/gotify/index.mdx b/apps/docs/docs/integrations/gotify/index.mdx index 09c81265b..43cde77b0 100644 --- a/apps/docs/docs/integrations/gotify/index.mdx +++ b/apps/docs/docs/integrations/gotify/index.mdx @@ -1,33 +1,39 @@ --- -title: 'Gotify' +title: "Gotify" description: "Gotify is a simple, self-hosted server for sending and receiving messages in real time." hide_title: true --- -import { notificationsWidget } from '@site/docs/widgets/notifications'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { gotifyIntegration } from '.'; +import { notificationsWidget } from "@site/docs/widgets/notifications"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { gotifyIntegration } from "."; - + ### Widgets & Capabilities + ### Adding the integration + ### Secrets - + + diff --git a/apps/docs/docs/integrations/home-assistant/index.mdx b/apps/docs/docs/integrations/home-assistant/index.mdx index 98ad591d6..65d09d166 100644 --- a/apps/docs/docs/integrations/home-assistant/index.mdx +++ b/apps/docs/docs/integrations/home-assistant/index.mdx @@ -1,45 +1,51 @@ --- -title: 'Home Assistant' +title: "Home Assistant" description: "Home Assistant is an open-source home automation platform that focuses on privacy and local control, allowing you to automate and control your smart home devices." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconBinaryTree } from "@tabler/icons-react"; -import { homeAssistantIntegration } from '.'; -import { smartHomeEntityStateWidget } from '@site/docs/widgets/smart-home-entity-state'; -import { smartHomeExecuteAutomationWidget } from '@site/docs/widgets/smart-home-execute-automation'; +import { homeAssistantIntegration } from "."; +import { smartHomeEntityStateWidget } from "@site/docs/widgets/smart-home-entity-state"; +import { smartHomeExecuteAutomationWidget } from "@site/docs/widgets/smart-home-execute-automation"; - - + ### Widgets & Capabilities + ### Adding the integration + ### Secrets - \ No newline at end of file + ], + }, + ]} +/> diff --git a/apps/docs/docs/integrations/ical/index.mdx b/apps/docs/docs/integrations/ical/index.mdx index 5f5ffc422..475229a34 100644 --- a/apps/docs/docs/integrations/ical/index.mdx +++ b/apps/docs/docs/integrations/ical/index.mdx @@ -1,38 +1,44 @@ --- -title: 'iCal' +title: "iCal" description: "iCal is a standard for calendar data exchange, allowing users to share and manage calendar events across different platforms." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconZoomQuestion, IconChartBar, IconSearch } from "@tabler/icons-react"; -import { icalIntegration } from '.'; -import { calendarWidget } from '@site/docs/widgets/calendar'; +import { icalIntegration } from "."; +import { calendarWidget } from "@site/docs/widgets/calendar"; - + ### Widgets & Capabilities + ### Adding the integration + ### Secrets - + + ## Using the iCal integration -The iCal integration allows you to add external calendars to Homarr. Any calendar that provides a public iCal URL can be integrated, such as Google Calendar, Apple Calendar, or Outlook. \ No newline at end of file +The iCal integration allows you to add external calendars to Homarr. Any calendar that provides a public iCal URL can be integrated, such as Google Calendar, Apple Calendar, or Outlook. diff --git a/apps/docs/docs/integrations/immich/index.mdx b/apps/docs/docs/integrations/immich/index.mdx index ed88466ce..952921bfb 100644 --- a/apps/docs/docs/integrations/immich/index.mdx +++ b/apps/docs/docs/integrations/immich/index.mdx @@ -1,36 +1,29 @@ --- -title: 'Immich' +title: "Immich" description: "Self-hosted photo and video management solution" hide_title: true --- -import { immichAlbumCarouselWidget } from '../../widgets/immich-album-carousel';import { - IntegrationHeader -} from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; -import { immichIntegration } from '.'; -import { immichServerStatsWidget } from '../../widgets/immich-server-stats'; +import { immichAlbumCarouselWidget } from "../../widgets/immich-album-carousel"; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; +import { immichIntegration } from "."; +import { immichServerStatsWidget } from "../../widgets/immich-server-stats"; - - + ### Widgets & Capabilities - + + ### Adding the integration + ### Secrets + server.about.
    Additional permissions may be required depending on your Immich version. If you encounter authorization errors, grant any missing permissions requested by the server. + ), - 'Create the integration in Homarr and copy the API key to there' - ] +'Create the integration in Homarr and copy the API key to there' +] }]} /> diff --git a/apps/docs/docs/integrations/jellyfin/index.mdx b/apps/docs/docs/integrations/jellyfin/index.mdx index 4826386b8..83e23fd45 100644 --- a/apps/docs/docs/integrations/jellyfin/index.mdx +++ b/apps/docs/docs/integrations/jellyfin/index.mdx @@ -1,40 +1,39 @@ --- -title: 'Jellyfin' +title: "Jellyfin" description: "Jellyfin is a free and open-source media server software that allows you to organize, manage, and share your media files." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconVideo, IconTicket } from "@tabler/icons-react"; -import { jellyfinIntegration } from '.'; -import { mediaServerWidget } from '@site/docs/widgets/media-server'; -import { mediaReleasesWidget } from '@site/docs/widgets/media-releases'; +import { jellyfinIntegration } from "."; +import { mediaServerWidget } from "@site/docs/widgets/media-server"; +import { mediaReleasesWidget } from "@site/docs/widgets/media-releases"; - - + ### Widgets & Capabilities - + + ### Adding the integration + ### Secrets - \ No newline at end of file + + diff --git a/apps/docs/docs/integrations/jellyseerr/index.mdx b/apps/docs/docs/integrations/jellyseerr/index.mdx index a85d7bd9f..e752906bb 100644 --- a/apps/docs/docs/integrations/jellyseerr/index.mdx +++ b/apps/docs/docs/integrations/jellyseerr/index.mdx @@ -1,45 +1,52 @@ --- -title: 'Jellyseerr' +title: "Jellyseerr" description: "Jellyseerr is a self-hosted media request management system that integrates with Jellyfin and other media servers." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconZoomQuestion, IconChartBar, IconSearch } from "@tabler/icons-react"; -import { jellyseerrIntegration } from '.'; -import { mediaRequestListWidget } from '@site/docs/widgets/media-request-list'; -import { mediaRequestStatsWidget } from '@site/docs/widgets/media-request-stats'; +import { jellyseerrIntegration } from "."; +import { mediaRequestListWidget } from "@site/docs/widgets/media-request-list"; +import { mediaRequestStatsWidget } from "@site/docs/widgets/media-request-stats"; - - + ### Widgets & Capabilities + ### Adding the integration + ### Secrets - \ No newline at end of file + + diff --git a/apps/docs/docs/integrations/kubernetes/index.mdx b/apps/docs/docs/integrations/kubernetes/index.mdx index 899c60931..662874467 100644 --- a/apps/docs/docs/integrations/kubernetes/index.mdx +++ b/apps/docs/docs/integrations/kubernetes/index.mdx @@ -1,20 +1,16 @@ --- -title: 'Kubernetes' +title: "Kubernetes" description: "Kubernetes is a powerful container orchestration platform that automates the deployment, scaling, and management of containerized applications." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconBrandDocker, IconTool } from "@tabler/icons-react"; -import { kubernetesIntegration } from '.'; +import { kubernetesIntegration } from "."; - - + Homarr provides a user-friendly Kubernetes dashboard that offers an overview of your cluster’s resources in a clear and structured interface. It allows users to view key Kubernetes objects, including `Pods`, `Services`, `Ingresses`, `Nodes`, `ConfigMaps`, `Secrets`, `Namespaces`, and `Volumes`, as well as basic metrics when the Kubernetes Metrics Server is enabled. @@ -47,7 +43,7 @@ Enabling RBAC in the Helm chart creates the necessary Kubernetes Role-Based Acce - Service Account: A dedicated service account for Homarr. - Role & RoleBinding: Grants permissions within a specific namespace to list, watch, and get pods, services, secrets, configmaps, and more. - ClusterRole & ClusterRoleBinding: Extends the same permissions cluster-wide for additional flexibility. -::: + ::: ### Homarr Dashboard Overview diff --git a/apps/docs/docs/integrations/lidarr/index.mdx b/apps/docs/docs/integrations/lidarr/index.mdx index 498503617..ad5916a3f 100644 --- a/apps/docs/docs/integrations/lidarr/index.mdx +++ b/apps/docs/docs/integrations/lidarr/index.mdx @@ -1,35 +1,40 @@ --- -title: 'Lidarr' +title: "Lidarr" description: "Lidarr is a music management tool that automates the process of downloading, sorting, and renaming music." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconCalendar } from "@tabler/icons-react"; -import { lidarrIntegration } from '.'; -import { calendarWidget } from '@site/docs/widgets/calendar'; +import { lidarrIntegration } from "."; +import { calendarWidget } from "@site/docs/widgets/calendar"; - - + ### Widgets & Capabilities + ### Adding the integration + ### Secrets - \ No newline at end of file + + diff --git a/apps/docs/docs/integrations/navidrome/index.mdx b/apps/docs/docs/integrations/navidrome/index.mdx index 664e6fc58..93c5b076b 100644 --- a/apps/docs/docs/integrations/navidrome/index.mdx +++ b/apps/docs/docs/integrations/navidrome/index.mdx @@ -1,39 +1,38 @@ --- -title: 'Navidrome' +title: "Navidrome" description: "Navidrome is a self-hosted music server and streamer compatible with the Subsonic API." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; -import { navidromeIntegration } from '.'; -import { audioStatsWidget } from '@site/docs/widgets/audio-stats'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; +import { navidromeIntegration } from "."; +import { audioStatsWidget } from "@site/docs/widgets/audio-stats"; - - + Navidrome provides music library statistics including artist, album, and song counts, as well as now playing information via the Subsonic API. ### Widgets & Capabilities - + + ### Adding the integration + ### Secrets - + + diff --git a/apps/docs/docs/integrations/nextcloud/index.mdx b/apps/docs/docs/integrations/nextcloud/index.mdx index ba5ab8ee9..f7d7e05fa 100644 --- a/apps/docs/docs/integrations/nextcloud/index.mdx +++ b/apps/docs/docs/integrations/nextcloud/index.mdx @@ -1,40 +1,43 @@ --- -title: 'Nextcloud' +title: "Nextcloud" description: "Nextcloud is a self-hosted productivity platform that provides file storage, collaboration tools, and more." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconCalendar } from "@tabler/icons-react"; -import Alert from '@theme/Admonition'; -import { nextcloudIntegration } from '.'; -import { calendarWidget } from '@site/docs/widgets/calendar'; -import { notificationsWidget } from '@site/docs/widgets/notifications'; +import Alert from "@theme/Admonition"; +import { nextcloudIntegration } from "."; +import { calendarWidget } from "@site/docs/widgets/calendar"; +import { notificationsWidget } from "@site/docs/widgets/notifications"; - + ### Widgets & Capabilities - + + ### Adding the integration + ### Secrets - - Users who use 2FA will have to use Nextcloud's App Password tool to grant Homarr access, as 2FA breaks the traditional process. For more information, see [Nextcloud's Documentation](https://docs.nextcloud.com/server/stable/admin_manual/configuration_user/authentication.html#app-passwords) - , -}]} /> + + + Users who use 2FA will have to use Nextcloud's App Password tool to grant Homarr access, as 2FA breaks the + traditional process. For more information, see [Nextcloud's + Documentation](https://docs.nextcloud.com/server/stable/admin_manual/configuration_user/authentication.html#app-passwords) + + ), + }, + ]} +/> diff --git a/apps/docs/docs/integrations/ntfy/index.mdx b/apps/docs/docs/integrations/ntfy/index.mdx index 4b21d16a4..a132de923 100644 --- a/apps/docs/docs/integrations/ntfy/index.mdx +++ b/apps/docs/docs/integrations/ntfy/index.mdx @@ -1,37 +1,44 @@ --- -title: 'Ntfy' +title: "Ntfy" description: "Ntfy is a simple, open-source notification service that allows you to send and receive notifications across devices." hide_title: true --- -import { notificationsWidget } from '@site/docs/widgets/notifications'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; +import { notificationsWidget } from "@site/docs/widgets/notifications"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; import { IconMessage } from "@tabler/icons-react"; -import { ntfyIntegration } from '.'; +import { ntfyIntegration } from "."; - + ### Widgets & Capabilities + ### Adding the integration + ### Secrets - \ No newline at end of file + + diff --git a/apps/docs/docs/integrations/nzbget/index.mdx b/apps/docs/docs/integrations/nzbget/index.mdx index 3479f317a..1b7c23a1f 100644 --- a/apps/docs/docs/integrations/nzbget/index.mdx +++ b/apps/docs/docs/integrations/nzbget/index.mdx @@ -1,36 +1,41 @@ --- -title: 'NZBGet' +title: "NZBGet" description: "NZBGet is a lightweight and efficient Usenet downloader." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconDownload } from "@tabler/icons-react"; -import { nzbgetIntegration } from '.'; -import Alert from '@theme/Admonition'; -import { downloadsWidget } from '@site/docs/widgets/downloads'; +import { nzbgetIntegration } from "."; +import Alert from "@theme/Admonition"; +import { downloadsWidget } from "@site/docs/widgets/downloads"; - - + ### Widgets & Capabilities + ### Adding the integration + ### Secrets - \ No newline at end of file + + diff --git a/apps/docs/docs/integrations/open-media-vault/index.mdx b/apps/docs/docs/integrations/open-media-vault/index.mdx index ac0a42290..b934bf797 100644 --- a/apps/docs/docs/integrations/open-media-vault/index.mdx +++ b/apps/docs/docs/integrations/open-media-vault/index.mdx @@ -1,42 +1,52 @@ --- -title: 'Open Media Vault' +title: "Open Media Vault" description: "Open Media Vault is a free network-attached storage server based on the Debian operating system." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconHeartRateMonitor } from "@tabler/icons-react"; -import { openMediaVaultIntegration } from '.'; -import Alert from '@theme/Admonition' -import { healthMonitoringWidget } from '@site/docs/widgets/health-monitoring'; -import { systemResourcesWidget } from '@site/docs/widgets/system-resources'; +import { openMediaVaultIntegration } from "."; +import Alert from "@theme/Admonition"; +import { healthMonitoringWidget } from "@site/docs/widgets/health-monitoring"; +import { systemResourcesWidget } from "@site/docs/widgets/system-resources"; - + ### Widgets & Capabilities + ### Adding the integration + ### Secrets - - The user used here must have administrative permissions or Homarr won't be able to read the system performance and resource data. - -}]} /> \ No newline at end of file + + + The user used here must have administrative permissions or Homarr won't be able to read the system performance + and resource data. + + ), + }, + ]} +/> diff --git a/apps/docs/docs/integrations/opnsense/index.mdx b/apps/docs/docs/integrations/opnsense/index.mdx index 37e9a78c6..9a3a2b1ee 100644 --- a/apps/docs/docs/integrations/opnsense/index.mdx +++ b/apps/docs/docs/integrations/opnsense/index.mdx @@ -1,65 +1,75 @@ --- -title: 'OPNsense' +title: "OPNsense" description: "OPNsense is an open-source, easy-to-use, and easy-to-build firewall and routing platform." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconHeartRateMonitor } from "@tabler/icons-react"; -import { opnsenseIntegration } from '.'; -import Alert from '@theme/Admonition' -import { firewallWidget } from '../../widgets/firewall'; +import { opnsenseIntegration } from "."; +import Alert from "@theme/Admonition"; +import { firewallWidget } from "../../widgets/firewall"; - + ### Widgets & Capabilities + ### Adding the integration + ### Secrets - - This integration does not require full API access to the firewall. The following guide outlines the process for creating a restricted OPNsense user with a scrambled password, designed exclusively for API access. This ensures minimal permissions and prevents local login capability. - , - steps: [ + + + This integration does not require full API access to the firewall. The following guide outlines the process + for creating a restricted OPNsense user with a scrambled password, designed exclusively for API access. This + ensures minimal permissions and prevents local login capability. + + ), + steps: [ "Log in to the OPNsense web interface as an administrator", "Navigate to System → Access → Users", "Click the + (Add) button to create a new user", <> - Fill in the user details: -
      -
    • Username: Enter a unique name
    • -
    • Password: Leave empty
    • -
    • Scrambled Password: Enable this option
    • -
    • Full name: (Optional) Add a descriptive name
    • -
    + Fill in the user details: +
      +
    • Username: Enter a unique name
    • +
    • Password: Leave empty
    • +
    • Scrambled Password: Enable this option
    • +
    • Full name: (Optional) Add a descriptive name
    • +
    , <> - In Privileges section → Select the option below: -
      -
    • Lobby: Dashboard
    • -
    • Reporting: Traffic
    • -
    + In Privileges section → Select the option below: +
      +
    • Lobby: Dashboard
    • +
    • Reporting: Traffic
    • +
    , "Click Save", "Return to the Users list", "Find the user and click the ticket icon in the Commands column", "Click Yes in the popup to confirm", "A txt file will download automatically, containing: Key and Secret", - "Save this file securely—this information will only be shown once" - ], -}]} /> \ No newline at end of file + "Save this file securely—this information will only be shown once", + ], + }, + ]} +/> diff --git a/apps/docs/docs/integrations/overseerr/index.mdx b/apps/docs/docs/integrations/overseerr/index.mdx index ce9e0a3e5..2dd2d7c8a 100644 --- a/apps/docs/docs/integrations/overseerr/index.mdx +++ b/apps/docs/docs/integrations/overseerr/index.mdx @@ -1,45 +1,52 @@ --- -title: 'Overseerr' +title: "Overseerr" description: "Overseerr is a self-hosted media request management system that integrates with Plex." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconZoomQuestion, IconChartBar, IconSearch } from "@tabler/icons-react"; -import { overseerrIntegration } from '.'; -import { mediaRequestListWidget } from '@site/docs/widgets/media-request-list'; -import { mediaRequestStatsWidget } from '@site/docs/widgets/media-request-stats'; +import { overseerrIntegration } from "."; +import { mediaRequestListWidget } from "@site/docs/widgets/media-request-list"; +import { mediaRequestStatsWidget } from "@site/docs/widgets/media-request-stats"; - - + ### Widgets & Capabilities + ### Adding the integration + ### Secrets - \ No newline at end of file + + diff --git a/apps/docs/docs/integrations/paperless-ngx/index.mdx b/apps/docs/docs/integrations/paperless-ngx/index.mdx index e08840110..175fdb15a 100644 --- a/apps/docs/docs/integrations/paperless-ngx/index.mdx +++ b/apps/docs/docs/integrations/paperless-ngx/index.mdx @@ -1,41 +1,40 @@ --- -title: 'Paperless-ngx' +title: "Paperless-ngx" description: "Paperless-ngx is a document management system that transforms your physical documents into a searchable online archive." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; -import { paperlessNgxIntegration } from '.'; -import { paperlessNgxWidget } from '@site/docs/widgets/paperless-ngx'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; +import { paperlessNgxIntegration } from "."; +import { paperlessNgxWidget } from "@site/docs/widgets/paperless-ngx"; - - + Paperless-ngx provides document statistics including total documents, inbox count, correspondents, tags, and document types. ### Widgets & Capabilities - + + ### Adding the integration + ### Secrets - + + diff --git a/apps/docs/docs/integrations/patchmon/index.mdx b/apps/docs/docs/integrations/patchmon/index.mdx index 95b827df0..b60c20962 100644 --- a/apps/docs/docs/integrations/patchmon/index.mdx +++ b/apps/docs/docs/integrations/patchmon/index.mdx @@ -1,43 +1,42 @@ --- -title: 'PatchMon' +title: "PatchMon" description: "PatchMon is a patch management and monitoring solution for Linux hosts." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; -import { patchmonIntegration } from '.'; -import { patchmonWidget } from '@site/docs/widgets/patchmon'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; +import { patchmonIntegration } from "."; +import { patchmonWidget } from "@site/docs/widgets/patchmon"; - - + PatchMon provides host and package update statistics including total hosts, hosts needing updates, and security update counts. The PatchMon widget requires users to be **signed in to Homarr**; see the [PatchMon widget documentation](/docs/widgets/patchmon#authentication) for details on authentication and public boards. ### Widgets & Capabilities - + + ### Adding the integration + ### Secrets - + + diff --git a/apps/docs/docs/integrations/peanut/index.mdx b/apps/docs/docs/integrations/peanut/index.mdx index 751200bed..7eb7b845b 100644 --- a/apps/docs/docs/integrations/peanut/index.mdx +++ b/apps/docs/docs/integrations/peanut/index.mdx @@ -1,48 +1,53 @@ --- -title: 'PeaNUT' -description: 'A tiny dashboard for Network UPS Tools (NUT) servers.' +title: "PeaNUT" +description: "A tiny dashboard for Network UPS Tools (NUT) servers." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; -import { peaNutIntegration } from '.'; -import { upsWidget } from '@site/docs/widgets/ups'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; +import { peaNutIntegration } from "."; +import { upsWidget } from "@site/docs/widgets/ups"; - + [PeaNUT](https://github.com/Brandawg93/PeaNUT) exposes the data of your [Network UPS Tools](https://networkupstools.org/) servers over a REST API, which Homarr reads to display the status of your UPS devices. ### Widgets & Capabilities + ### Adding the integration + ### Secrets + PeaNUT secures its API with HTTP Basic authentication when the `WEB_USERNAME` and `WEB_PASSWORD` environment variables are set on the PeaNUT instance. Provide the same credentials here. If the instance runs with `AUTH_DISABLED=true`, no secrets are required. - + diff --git a/apps/docs/docs/integrations/pi-hole/index.mdx b/apps/docs/docs/integrations/pi-hole/index.mdx index ca2b400e7..d724b026d 100644 --- a/apps/docs/docs/integrations/pi-hole/index.mdx +++ b/apps/docs/docs/integrations/pi-hole/index.mdx @@ -1,47 +1,54 @@ --- -title: 'Pi-hole' +title: "Pi-hole" description: "Pi-hole is a network-wide ad blocker that acts as a DNS sinkhole, blocking unwanted content and improving your browsing experience." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconAd, IconDeviceGamepad } from "@tabler/icons-react"; -import Alert from '@theme/Admonition'; -import { dnsHoleSummaryWidget } from '@site/docs/widgets/dns-hole-summary'; -import { dnsHoleControlsWidget } from '@site/docs/widgets/dns-hole-controls'; -import { piHoleIntegration } from '.'; +import Alert from "@theme/Admonition"; +import { dnsHoleSummaryWidget } from "@site/docs/widgets/dns-hole-summary"; +import { dnsHoleControlsWidget } from "@site/docs/widgets/dns-hole-controls"; +import { piHoleIntegration } from "."; + - - - - Homarr supports both Pi-hole v5 and v6. It automatically detects the version and uses the correct API. + + Homarr supports both Pi-hole v5 and v6. It automatically detects the version and uses the correct API. ### Widgets & Capabilities + ### Adding the integration + ### Secrets - \ No newline at end of file + + diff --git a/apps/docs/docs/integrations/plex/index.mdx b/apps/docs/docs/integrations/plex/index.mdx index b6394b918..b6e35a6e3 100644 --- a/apps/docs/docs/integrations/plex/index.mdx +++ b/apps/docs/docs/integrations/plex/index.mdx @@ -1,41 +1,47 @@ --- -title: 'Plex' +title: "Plex" description: "Plex is a media server platform that allows you to organize, manage, and stream your personal media collection." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconVideo, IconTicket } from "@tabler/icons-react"; -import { plexIntegration } from '.'; -import { mediaServerWidget } from '@site/docs/widgets/media-server'; -import { mediaReleasesWidget } from '@site/docs/widgets/media-releases'; +import { plexIntegration } from "."; +import { mediaServerWidget } from "@site/docs/widgets/media-server"; +import { mediaReleasesWidget } from "@site/docs/widgets/media-releases"; - - + ### Widgets & Capabilities - + + ### Adding the integration + ### Secrets - - Follow the official Plex documentation to find your authentication token. - - ] -}]} /> \ No newline at end of file + Follow the official{" "} + + Plex documentation + {" "} + to find your authentication token. + , + ], + }, + ]} +/> diff --git a/apps/docs/docs/integrations/prowlarr/index.mdx b/apps/docs/docs/integrations/prowlarr/index.mdx index 0c5561f91..b3624a97e 100644 --- a/apps/docs/docs/integrations/prowlarr/index.mdx +++ b/apps/docs/docs/integrations/prowlarr/index.mdx @@ -1,32 +1,34 @@ --- -title: 'Prowlarr' +title: "Prowlarr" description: "Prowlarr is an indexer manager for Usenet and BitTorrent, providing a unified interface to manage your indexers." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconHeartRateMonitor } from "@tabler/icons-react"; -import { prowlarrIntegration } from '.'; -import { indexerManagerWidget } from '@site/docs/widgets/indexer-manager'; +import { prowlarrIntegration } from "."; +import { indexerManagerWidget } from "@site/docs/widgets/indexer-manager"; - + ### Widgets & Capabilities - + + ### Adding the integration + ### Secrets - \ No newline at end of file + + diff --git a/apps/docs/docs/integrations/proxmox/index.mdx b/apps/docs/docs/integrations/proxmox/index.mdx index 4ea8eda98..f038dd007 100644 --- a/apps/docs/docs/integrations/proxmox/index.mdx +++ b/apps/docs/docs/integrations/proxmox/index.mdx @@ -1,103 +1,107 @@ --- -title: 'Proxmox' +title: "Proxmox" description: "Proxmox is a powerful open-source virtualization platform that allows you to run virtual machines and containers." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconHeartRateMonitor } from "@tabler/icons-react"; -import { proxmoxIntegration } from '.'; -import Alert from '@theme/Admonition' -import { healthMonitoringWidget } from '@site/docs/widgets/health-monitoring'; -import { systemResourcesWidget } from '@site/docs/widgets/system-resources'; +import { proxmoxIntegration } from "."; +import Alert from "@theme/Admonition"; +import { healthMonitoringWidget } from "@site/docs/widgets/health-monitoring"; +import { systemResourcesWidget } from "@site/docs/widgets/system-resources"; - + ### Widgets & Capabilities - + + ### Adding the integration + ### Secrets - - The Proxmox API may not work with Linux PAM standard authentication. It is strongly recommended to use the Proxmox VE authentication server realm when creating your API user. - , - credentials: ['username', 'tokenId', 'realm', 'apiKey'], - steps: [ + + + The Proxmox API may not work with Linux PAM standard authentication. It is strongly recommended to use the + Proxmox VE authentication server realm when creating your API user. + + ), + credentials: ["username", "tokenId", "realm", "apiKey"], + steps: [ "Navigate to the Proxmox portal, click on Datacenter", "Expand Permissions, click on Groups", "Click the Create button", "Name the group something informative, like api-users", "Click on the Permissions 'folder'", <> - Click Add {"->"} Group Permission -
      -
    • Path: /
    • -
    • Group: group from Step 4 above
    • -
    • Role: PVEAuditor
    • -
    • Propagate: Checked
    • -
    + Click Add {"->"} Group Permission +
      +
    • Path: /
    • +
    • Group: group from Step 4 above
    • +
    • Role: PVEAuditor
    • +
    • Propagate: Checked
    • +
    , "Expand Permissions, click on Users", <> - Click the Add button -
      -
    • User name: something informative like api
    • -
    • Realm: Proxmox VE authentication server
    • -
    • Password: create a secure password for the user
    • -
    • Confirm Password: re-enter the password
    • -
    • Group: group from Step 4 above
    • -
    + Click the Add button +
      +
    • User name: something informative like api
    • +
    • Realm: Proxmox VE authentication server
    • +
    • Password: create a secure password for the user
    • +
    • Confirm Password: re-enter the password
    • +
    • Group: group from Step 4 above
    • +
    , "Expand Permissions, click on API Tokens", <> - Click the Add button -
      -
    • User: user from Step 8 above
    • -
    • Token ID: something informative like the application or purpose like homarr
    • -
    • Privilege Separation: unchecked
    • -
    + Click the Add button +
      +
    • User: user from Step 8 above
    • +
    • Token ID: something informative like the application or purpose like homarr
    • +
    • Privilege Separation: unchecked
    • +
    , "Copy the Secret that is shown in Step 10 because it is only shown once", "Go back to the 'Permissions' menu", <> - Click Add {"->"} API Token Permission -
      -
    • Path: /
    • -
    • API Token: select the API token created in Step 10
    • -
    • Role: PVE Auditor
    • -
    • Propagate: Checked
    • -
    + Click Add {"->"} API Token Permission +
      +
    • Path: /
    • +
    • API Token: select the API token created in Step 10
    • +
    • Role: PVE Auditor
    • +
    • Propagate: Checked
    • +
    , - ], - body: <> - - Sometimes you'll also find the api@pve!homarr format, - within Homarr you'll have to split it up into: - -
      + ], + body: ( + <> + + Sometimes you'll also find the api@pve!homarr format, within Homarr you'll have to split it up + into: + +
      • - Username: api + Username: api
      • - Realm: pve + Realm: pve
      • - Token ID: homarr + Token ID: homarr
      • -
      - -}]} /> \ No newline at end of file +
    + + ), + }, + ]} +/> diff --git a/apps/docs/docs/integrations/q-bittorent/index.mdx b/apps/docs/docs/integrations/q-bittorent/index.mdx index ae85fc0ea..0bf2474ec 100644 --- a/apps/docs/docs/integrations/q-bittorent/index.mdx +++ b/apps/docs/docs/integrations/q-bittorent/index.mdx @@ -1,37 +1,39 @@ --- -title: 'qBittorrent' +title: "qBittorrent" description: "qBittorrent is a free and open-source BitTorrent client." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconDownload } from "@tabler/icons-react"; -import { qBittorentIntegration } from '.'; -import Alert from '@theme/Admonition'; -import { downloadsWidget } from '@site/docs/widgets/downloads'; +import { qBittorentIntegration } from "."; +import Alert from "@theme/Admonition"; +import { downloadsWidget } from "@site/docs/widgets/downloads"; - - + ### Widgets & Capabilities - + + ### Adding the integration + ### Secrets - \ No newline at end of file + + diff --git a/apps/docs/docs/integrations/radarr/index.mdx b/apps/docs/docs/integrations/radarr/index.mdx index 286e1b0b7..09548cab7 100644 --- a/apps/docs/docs/integrations/radarr/index.mdx +++ b/apps/docs/docs/integrations/radarr/index.mdx @@ -1,33 +1,34 @@ --- -title: 'Radarr' +title: "Radarr" description: "Radarr is a movie management tool that automates the process of downloading, sorting, and renaming movies." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconCalendar } from "@tabler/icons-react"; -import { radarrIntegration } from '.'; -import { calendarWidget } from '@site/docs/widgets/calendar'; +import { radarrIntegration } from "."; +import { calendarWidget } from "@site/docs/widgets/calendar"; - - + ### Widgets & Capabilities - + + ### Adding the integration + ### Secrets - \ No newline at end of file + + diff --git a/apps/docs/docs/integrations/readarr/index.mdx b/apps/docs/docs/integrations/readarr/index.mdx index a2c153a91..aec31fe1a 100644 --- a/apps/docs/docs/integrations/readarr/index.mdx +++ b/apps/docs/docs/integrations/readarr/index.mdx @@ -1,33 +1,34 @@ --- -title: 'Readarr' +title: "Readarr" description: "Readarr is a book management tool that automates the process of downloading, sorting, and renaming books." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconCalendar } from "@tabler/icons-react"; -import { readarrIntegration } from '.'; -import { calendarWidget } from '@site/docs/widgets/calendar'; +import { readarrIntegration } from "."; +import { calendarWidget } from "@site/docs/widgets/calendar"; - - + ### Widgets & Capabilities - + + ### Adding the integration + ### Secrets - \ No newline at end of file + + diff --git a/apps/docs/docs/integrations/sabnzbd/index.mdx b/apps/docs/docs/integrations/sabnzbd/index.mdx index 5de72d8c3..8c91c6fef 100644 --- a/apps/docs/docs/integrations/sabnzbd/index.mdx +++ b/apps/docs/docs/integrations/sabnzbd/index.mdx @@ -1,34 +1,35 @@ --- -title: 'SABnzbd' +title: "SABnzbd" description: "SABnzbd is an Open Source Binary Newsreader." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconDownload } from "@tabler/icons-react"; -import { sabnzbdIntegration } from '.'; -import Alert from '@theme/Admonition'; -import { downloadsWidget } from '@site/docs/widgets/downloads'; +import { sabnzbdIntegration } from "."; +import Alert from "@theme/Admonition"; +import { downloadsWidget } from "@site/docs/widgets/downloads"; - - + ### Widgets & Capabilities - + + ### Adding the integration + ### Secrets - \ No newline at end of file + + diff --git a/apps/docs/docs/integrations/seerr/index.mdx b/apps/docs/docs/integrations/seerr/index.mdx index 81b7e0fb1..a1e30798e 100644 --- a/apps/docs/docs/integrations/seerr/index.mdx +++ b/apps/docs/docs/integrations/seerr/index.mdx @@ -1,45 +1,52 @@ --- -title: 'Seerr' +title: "Seerr" description: "Seerr is a self-hosted media request management system that integrates with various media servers." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconZoomQuestion, IconChartBar, IconSearch } from "@tabler/icons-react"; -import { seerrIntegration } from '.'; -import { mediaRequestListWidget } from '@site/docs/widgets/media-request-list'; -import { mediaRequestStatsWidget } from '@site/docs/widgets/media-request-stats'; +import { seerrIntegration } from "."; +import { mediaRequestListWidget } from "@site/docs/widgets/media-request-list"; +import { mediaRequestStatsWidget } from "@site/docs/widgets/media-request-stats"; - - + ### Widgets & Capabilities + ### Adding the integration + ### Secrets - \ No newline at end of file + + diff --git a/apps/docs/docs/integrations/slskd/index.mdx b/apps/docs/docs/integrations/slskd/index.mdx index 70674cb04..705ab43c0 100644 --- a/apps/docs/docs/integrations/slskd/index.mdx +++ b/apps/docs/docs/integrations/slskd/index.mdx @@ -1,34 +1,39 @@ --- -title: 'Slskd' +title: "Slskd" description: "A modern client-server application for the Soulseek file sharing network." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; -import { slskdIntegration } from '.'; -import { downloadsWidget } from '@site/docs/widgets/downloads'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; +import { slskdIntegration } from "."; +import { downloadsWidget } from "@site/docs/widgets/downloads"; - - + ### Widgets & Capabilities + ### Adding the integration + ### Secrets - \ No newline at end of file + + diff --git a/apps/docs/docs/integrations/sonarr/index.mdx b/apps/docs/docs/integrations/sonarr/index.mdx index 7dc3c7a64..c65d3ce3d 100644 --- a/apps/docs/docs/integrations/sonarr/index.mdx +++ b/apps/docs/docs/integrations/sonarr/index.mdx @@ -1,33 +1,34 @@ --- -title: 'Sonarr' +title: "Sonarr" description: "Sonarr is a TV series management tool that automates the process of downloading, sorting, and renaming episodes." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconCalendar } from "@tabler/icons-react"; -import { sonarrIntegration } from '.'; -import { calendarWidget } from '@site/docs/widgets/calendar'; +import { sonarrIntegration } from "."; +import { calendarWidget } from "@site/docs/widgets/calendar"; - - + ### Widgets & Capabilities - + + ### Adding the integration + ### Secrets - \ No newline at end of file + + diff --git a/apps/docs/docs/integrations/speedtest-tracker/index.mdx b/apps/docs/docs/integrations/speedtest-tracker/index.mdx index 2041dad5c..146a09eca 100644 --- a/apps/docs/docs/integrations/speedtest-tracker/index.mdx +++ b/apps/docs/docs/integrations/speedtest-tracker/index.mdx @@ -1,34 +1,39 @@ --- -title: 'Speedtest Tracker' -description: 'Speedtest Tracker is a self-hosted internet performance tracking application.' +title: "Speedtest Tracker" +description: "Speedtest Tracker is a self-hosted internet performance tracking application." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; -import { speedtestTrackerIntegration } from '.'; -import { speedtestTrackerWidget } from '@site/docs/widgets/speedtest-tracker'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; +import { speedtestTrackerIntegration } from "."; +import { speedtestTrackerWidget } from "@site/docs/widgets/speedtest-tracker"; - - + ### Widgets & Capabilities + ### Adding the integration + ### Secrets - + + diff --git a/apps/docs/docs/integrations/synology/index.mdx b/apps/docs/docs/integrations/synology/index.mdx index 4d836513e..c3f50fc3f 100644 --- a/apps/docs/docs/integrations/synology/index.mdx +++ b/apps/docs/docs/integrations/synology/index.mdx @@ -19,11 +19,7 @@ import Alert from "@theme/Admonition"; ### Widgets & Capabilities ### Supported metrics diff --git a/apps/docs/docs/integrations/tdarr/index.mdx b/apps/docs/docs/integrations/tdarr/index.mdx index 89a0730d2..47956343d 100644 --- a/apps/docs/docs/integrations/tdarr/index.mdx +++ b/apps/docs/docs/integrations/tdarr/index.mdx @@ -1,36 +1,38 @@ --- -title: 'Tdarr' +title: "Tdarr" description: "Tdarr is a distributed media transcoding system that allows you to process and optimize your media files across multiple nodes." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconTransform } from "@tabler/icons-react"; -import { tdarrIntegration } from '.'; -import { mediaTranscodingWidget } from '@site/docs/widgets/media-transcoding'; +import { tdarrIntegration } from "."; +import { mediaTranscodingWidget } from "@site/docs/widgets/media-transcoding"; - - + ### Widgets & Capabilities - + + ### Adding the integration + ### Secrets - \ No newline at end of file + + diff --git a/apps/docs/docs/integrations/technitium-dns/index.mdx b/apps/docs/docs/integrations/technitium-dns/index.mdx index 3ca8bda7c..3bf39d820 100644 --- a/apps/docs/docs/integrations/technitium-dns/index.mdx +++ b/apps/docs/docs/integrations/technitium-dns/index.mdx @@ -1,62 +1,72 @@ --- -title: 'Technitium DNS' +title: "Technitium DNS" description: "Technitium DNS Server is a self-hosted DNS server with ad-blocking and network-wide filtering capabilities." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; -import Alert from '@theme/Admonition'; -import { technitiumDnsIntegration } from '.'; -import { dnsHoleSummaryWidget } from '@site/docs/widgets/dns-hole-summary'; -import { dnsHoleControlsWidget } from '@site/docs/widgets/dns-hole-controls'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; +import Alert from "@theme/Admonition"; +import { technitiumDnsIntegration } from "."; +import { dnsHoleSummaryWidget } from "@site/docs/widgets/dns-hole-summary"; +import { dnsHoleControlsWidget } from "@site/docs/widgets/dns-hole-controls"; - + - - Homarr supports Technitium DNS v11 and above. The correct API version is detected automatically - no manual configuration is required. + + Homarr supports Technitium DNS v11 and above. The correct API version is detected automatically - no manual + configuration is required. ### Widgets & Capabilities + ### Adding the integration + ### Secrets - - The **API token** option is recommended. API tokens are non-expiring and do not require storing your admin password in Homarr. - Username and password authentication uses a session token that expires after inactivity, triggering a silent re-login on the next request. + + The **API token** option is recommended. API tokens are non-expiring and do not require storing your admin password in + Homarr. Username and password authentication uses a session token that expires after inactivity, triggering a silent + re-login on the next request. - - The **DNS Hole Controls** widget (enabling, disabling, and timed disabling of blocking) requires the token to have settings-level permissions. - The **DNS Hole Summary** widget (stats only) works with any valid token. - If Homarr cannot read the blocking status due to insufficient permissions, the status indicator will be hidden but statistics will still be shown. + + The **DNS Hole Controls** widget (enabling, disabling, and timed disabling of blocking) requires the token to have + settings-level permissions. The **DNS Hole Summary** widget (stats only) works with any valid token. If Homarr cannot + read the blocking status due to insufficient permissions, the status indicator will be hidden but statistics will + still be shown. - + 'Click on your username in the top-right corner and select "Create API Token".', + 'Give the token a name (e.g. "Homarr") and click "Create Token".', + "Copy the generated token and paste it into the API Key field in Homarr.", + ], + }, + { + credentials: ["username", "password"], + steps: [], + body: "Enter your Technitium DNS admin credentials. Homarr will exchange them for a session token and transparently re-authenticate when the session expires.", + }, + ]} +/> diff --git a/apps/docs/docs/integrations/tracearr/index.mdx b/apps/docs/docs/integrations/tracearr/index.mdx index dc4dde8e0..03954a1cc 100644 --- a/apps/docs/docs/integrations/tracearr/index.mdx +++ b/apps/docs/docs/integrations/tracearr/index.mdx @@ -1,38 +1,37 @@ --- -title: 'Tracearr' +title: "Tracearr" description: "Tracearr is a comprehensive media monitoring solution that tracks streams, user activity, and policy violations in your media server (including Plex, Jellyfin, Emby)." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; -import { tracearrIntegration } from '.'; -import { tracearrWidget } from '@site/docs/widgets/tracearr'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; +import { tracearrIntegration } from "."; +import { tracearrWidget } from "@site/docs/widgets/tracearr"; - - + ### Widgets & Capabilities - + + ### Adding the integration + ### Secrets - - In Tracearr, go to Settings → API and generate or copy your API key. - - ] -}]} /> + In Tracearr, go to Settings → API and generate or copy your API key. + , + ], + }, + ]} +/> diff --git a/apps/docs/docs/integrations/transmission/index.mdx b/apps/docs/docs/integrations/transmission/index.mdx index da0c0209e..c17dbe862 100644 --- a/apps/docs/docs/integrations/transmission/index.mdx +++ b/apps/docs/docs/integrations/transmission/index.mdx @@ -1,34 +1,35 @@ --- -title: 'Transmission' +title: "Transmission" description: "A Fast, Easy and Free Bittorrent Client." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconDownload } from "@tabler/icons-react"; -import { transmissionIntegration } from '.'; -import Alert from '@theme/Admonition'; -import { downloadsWidget } from '@site/docs/widgets/downloads'; +import { transmissionIntegration } from "."; +import Alert from "@theme/Admonition"; +import { downloadsWidget } from "@site/docs/widgets/downloads"; - - + ### Widgets & Capabilities - + + ### Adding the integration + ### Secrets - \ No newline at end of file + + diff --git a/apps/docs/docs/integrations/truenas/index.mdx b/apps/docs/docs/integrations/truenas/index.mdx index 5d29a7019..3ec09bbcf 100644 --- a/apps/docs/docs/integrations/truenas/index.mdx +++ b/apps/docs/docs/integrations/truenas/index.mdx @@ -1,61 +1,67 @@ --- -title: 'TrueNAS' +title: "TrueNAS" description: "Enterprise network-attached storage for your home, office, and cloud." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; -import { truenasIntegration } from '.'; -import { systemResourcesWidget } from '@site/docs/widgets/system-resources'; -import { healthMonitoringWidget } from '@site/docs/widgets/health-monitoring'; -import Alert from '@theme/Admonition'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; +import { truenasIntegration } from "."; +import { systemResourcesWidget } from "@site/docs/widgets/system-resources"; +import { healthMonitoringWidget } from "@site/docs/widgets/health-monitoring"; +import Alert from "@theme/Admonition"; - - + ### Widgets & Capabilities - + + ### Adding the integration + - TrueNAS only serves its API over HTTPS, so enter the https:// URL of your TrueNAS web interface. If it uses a self-signed certificate (the default), add it under Management > Tools > Certificates so Homarr can establish the connection. + TrueNAS only serves its API over HTTPS, so enter the https:// URL of your TrueNAS web interface. If it + uses a self-signed certificate (the default), add it under{" "} + Management > Tools > Certificates so Homarr can establish the + connection. ### Secrets - - API key authentication is the recommended method. It works across current TrueNAS versions and does not depend on user group membership. - , - steps: [ - "In the TrueNAS web interface, click your user avatar in the top-right corner and select \"API Keys\".", - "Click \"Add\", give the key a name such as \"Homarr\", and confirm.", - "Copy the generated key immediately - TrueNAS only shows it once - and paste it as the API Key when creating the integration in Homarr.", - ], + credentials: ["apiKey"], + header: ( + + API key authentication is the recommended method. It works across current TrueNAS versions and does not depend + on user group membership. + + ), + steps: [ + 'In the TrueNAS web interface, click your user avatar in the top-right corner and select "API Keys".', + 'Click "Add", give the key a name such as "Homarr", and confirm.', + "Copy the generated key immediately - TrueNAS only shows it once - and paste it as the API Key when creating the integration in Homarr.", + ], }, { - credentials: ['username', 'password'], - steps: [ - "In the TrueNAS web interface, go to \"Credentials\" > \"Users\" > \"Add\" and create a user with a secure password.", - "Grant the user administrative access so Homarr can read system, pool, and reporting data.", - "Save the user and create the integration in Homarr with these credentials.", - ], - body: - The account must have administrative API access. The auxiliary_administrator group was removed in TrueNAS 25.10; on that version or newer, use API key authentication instead, or assign the user a full-admin role. - , + credentials: ["username", "password"], + steps: [ + 'In the TrueNAS web interface, go to "Credentials" > "Users" > "Add" and create a user with a secure password.', + "Grant the user administrative access so Homarr can read system, pool, and reporting data.", + "Save the user and create the integration in Homarr with these credentials.", + ], + body: ( + + The account must have administrative API access. The auxiliary_administrator group was removed in + TrueNAS 25.10; on that version or newer, use API key authentication instead, or assign the user a full-admin + role. + + ), }, -]} /> + ]} +/> diff --git a/apps/docs/docs/integrations/umami/index.mdx b/apps/docs/docs/integrations/umami/index.mdx index 8aeb3c194..6aa5ddced 100644 --- a/apps/docs/docs/integrations/umami/index.mdx +++ b/apps/docs/docs/integrations/umami/index.mdx @@ -1,53 +1,52 @@ --- -title: 'Umami' -description: 'Privacy-focused, open-source web analytics' +title: "Umami" +description: "Privacy-focused, open-source web analytics" hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; -import { umamiIntegration } from '.'; -import { umamiWidget } from '../../widgets/umami'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; +import { umamiIntegration } from "."; +import { umamiWidget } from "../../widgets/umami"; - + ### Widgets & Capabilities - + + ### Adding the integration + :::tip URL configuration + - **Umami Cloud:** Use `https://api.umami.is/v1` - **Self-hosted:** Use `http://your-umami-host:3000/api` -::: + ::: ### Secrets - + + diff --git a/apps/docs/docs/integrations/unifi-controller/index.mdx b/apps/docs/docs/integrations/unifi-controller/index.mdx index 134ce91b8..f25cecaac 100644 --- a/apps/docs/docs/integrations/unifi-controller/index.mdx +++ b/apps/docs/docs/integrations/unifi-controller/index.mdx @@ -1,40 +1,40 @@ --- -title: 'Unifi Controller' +title: "Unifi Controller" description: "Unifi Controller is a network management platform for Unifi devices." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import {IntegrationSecrets} from '@site/src/components/integrations/secrets'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; import { IconTopologyFull } from "@tabler/icons-react"; -import { unifiControllerIntegration } from '.'; -import { networkControllerSummaryWidget } from '@site/docs/widgets/network-controller-summary'; -import { networkControllerStatusWidget } from '@site/docs/widgets/network-controller-status'; +import { unifiControllerIntegration } from "."; +import { networkControllerSummaryWidget } from "@site/docs/widgets/network-controller-summary"; +import { networkControllerStatusWidget } from "@site/docs/widgets/network-controller-status"; - - + This integration is using the [node-unifi](https://www.npmjs.com/package/node-unifi) library under the hood to connect to the Unifi Controller. Therfore it should support CloudKey Gen1, CloudKey Gen2, UnifiOS-based UDM-Pro controllers as well as self-hosted UniFi controllers. ### Widgets & Capabilities + ### Adding the integration + ### Secrets - \ No newline at end of file + + diff --git a/apps/docs/docs/integrations/unraid/index.mdx b/apps/docs/docs/integrations/unraid/index.mdx index bd1546a78..a629fe844 100644 --- a/apps/docs/docs/integrations/unraid/index.mdx +++ b/apps/docs/docs/integrations/unraid/index.mdx @@ -1,59 +1,71 @@ --- -title: 'Unraid' +title: "Unraid" description: "Versatile operating system that lets you run applications, virtual machines, and storage devices on your server" hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; -import { unraidIntegration } from '.'; -import { systemResourcesWidget } from '@site/docs/widgets/system-resources'; -import { healthMonitoringWidget } from '@site/docs/widgets/health-monitoring'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; +import { unraidIntegration } from "."; +import { systemResourcesWidget } from "@site/docs/widgets/system-resources"; +import { healthMonitoringWidget } from "@site/docs/widgets/health-monitoring"; import imgManagement from "./imgs/unraid-management.png"; import imgCreateApiKey from "./imgs/unraid-create-api-key.png"; import imgCopyApiKey from "./imgs/copy-api-key.png"; import imgSelectApikeyPreset from "./imgs/unraid-select-api-key-preset.png"; - - + ### Widgets & Capabilities - + + ### Adding the integration + ### Secrets -Are you using Unraid pre-7.2? If yes, please first follow the steps here to install the Unraid API., - <> - Open the settings and open the management access
    - Unraid management - , - <> - Click on the "API Keys" tab at the top and click on the "create API key" button. Choose "Create new"
    - Unraid management - , - <> - Enter a suitable name for your API key (e.g. Homarr), select the "Viewer" preset and submit the modal.
    - Unraid management - , - <> - Last, copy the API key after your API key has been created
    - Unraid management - - ], -}]} /> \ No newline at end of file + + + Are you using Unraid pre-7.2? If yes, please first{" "} + + follow the steps here to install the Unraid API + + . + , + <> + Open the settings and open the management access +
    + Unraid management + , + <> + + Click on the "API Keys" tab at the top and click on the "create API key" button. Choose "Create new" + +
    + Unraid management + , + <> + + Enter a suitable name for your API key (e.g. Homarr), select the "Viewer" preset and submit the modal. + +
    + Unraid management + , + <> + Last, copy the API key after your API key has been created +
    + Unraid management + , + ], + }, + ]} +/> diff --git a/apps/docs/docs/integrations/uptime-kuma/index.mdx b/apps/docs/docs/integrations/uptime-kuma/index.mdx index 63e6df82b..14834969f 100644 --- a/apps/docs/docs/integrations/uptime-kuma/index.mdx +++ b/apps/docs/docs/integrations/uptime-kuma/index.mdx @@ -1,43 +1,42 @@ --- -title: 'Uptime Kuma' +title: "Uptime Kuma" description: "Uptime Kuma is a self-hosted monitoring tool that tracks the availability of your services and websites." hide_title: true --- -import { IntegrationHeader } from '@site/src/components/integrations/header'; -import { IntegrationCapabilites } from '@site/src/components/integrations/widgets'; -import { AddingIntegration } from '@site/src/components/integrations/adding'; -import { IntegrationSecrets } from '@site/src/components/integrations/secrets'; -import { uptimeKumaIntegration } from '.'; -import { uptimeKumaWidget } from '@site/docs/widgets/uptime-kuma'; +import { IntegrationHeader } from "@site/src/components/integrations/header"; +import { IntegrationCapabilites } from "@site/src/components/integrations/widgets"; +import { AddingIntegration } from "@site/src/components/integrations/adding"; +import { IntegrationSecrets } from "@site/src/components/integrations/secrets"; +import { uptimeKumaIntegration } from "."; +import { uptimeKumaWidget } from "@site/docs/widgets/uptime-kuma"; - - + Uptime Kuma monitors the availability of your services and provides uptime statistics through its status page API. ### Widgets & Capabilities - + + ### Adding the integration + ### Secrets - + ], + }, + ]} +/> :::tip If you don't specify a slug, Homarr will use `default` as the status page slug. diff --git a/apps/docs/docs/management/apps/index.mdx b/apps/docs/docs/management/apps/index.mdx index c5c0a2ad7..955a8a3fc 100644 --- a/apps/docs/docs/management/apps/index.mdx +++ b/apps/docs/docs/management/apps/index.mdx @@ -7,8 +7,8 @@ tags: - Ping --- -Apps are the building blocks of your Homarr board. -Most of the time they are a simple link to a website, but used on your board they also support a simple ping to check if your service is up. +Apps are the building blocks of your Homarr board. +Most of the time they are a simple link to a website, but used on your board they also support a simple ping to check if your service is up. Apps are used in the bookmark and app widget. ## Create an app @@ -27,7 +27,7 @@ The name must be at least one character long and can be chosen freely. ### Icon URL -This is the URL to the icon that will be displayed on the app widget. +This is the URL to the icon that will be displayed on the app widget. It can be a url to an image in the internet, one from the included icon repositories or a local file uploaded through the upload button. ![Icon URL](./img/app-icon-url.png) @@ -42,7 +42,7 @@ The URL to the website you want to link to. Clicking on the app widget or bookma ### Ping URL -When you want to use another url for the simple status check you can set it here. +When you want to use another url for the simple status check you can set it here. This will allow you to set a different URL for the ping than the URL that is opened when clicking on the app widget. It's useful when you want to ping the service internally for example with a custom ip but open the website externally. @@ -50,4 +50,4 @@ It's useful when you want to ping the service internally for example with a cust On the apps management page you find all apps that exist in your Homarr instance. You can edit and delete them. -![Apps list](./img/app-list.png) \ No newline at end of file +![Apps list](./img/app-list.png) diff --git a/apps/docs/docs/management/backup.mdx b/apps/docs/docs/management/backup.mdx index 558afb82e..6fb5521bf 100644 --- a/apps/docs/docs/management/backup.mdx +++ b/apps/docs/docs/management/backup.mdx @@ -24,10 +24,10 @@ Navigate to `Management` → `Tools` → `Backup`. You must have **admin** permi Click the **Export** button in the export card. You'll be prompted to type `I understand` to confirm. Once confirmed, a ZIP file downloads containing: -| File | Description | -| -------------------- | ------------------------------------------------------------------- | -| `db.sqlite` | Full SQLite database with all entities | -| `metadata.json` | Backup metadata: Homarr version, creation timestamp, encryption key | +| File | Description | +| --------------- | ------------------------------------------------------------------- | +| `db.sqlite` | Full SQLite database with all entities | +| `metadata.json` | Backup metadata: Homarr version, creation timestamp, encryption key | The backup includes everything: apps, integrations, secrets, boards, users, groups, permissions, search engines, custom widgets, and server settings. (It just backs-up the whole database) diff --git a/apps/docs/docs/management/boards/index.mdx b/apps/docs/docs/management/boards/index.mdx index f1eb3c572..1240c7a76 100644 --- a/apps/docs/docs/management/boards/index.mdx +++ b/apps/docs/docs/management/boards/index.mdx @@ -9,11 +9,11 @@ tags: - Layout --- -import iconColorImage from './img/icon-color.png' -import itemRadiusImage from './img/item-radius.png' -import layoutLargeImage from './img/layout-large.png' -import layoutMediumImage from './img/layout-medium.png' -import layoutSmallImage from './img/layout-small.png' +import iconColorImage from "./img/icon-color.png"; +import itemRadiusImage from "./img/item-radius.png"; +import layoutLargeImage from "./img/layout-large.png"; +import layoutMediumImage from "./img/layout-medium.png"; +import layoutSmallImage from "./img/layout-small.png"; Each dashboard is called a "board". You can create as many boards as you want. @@ -24,24 +24,29 @@ Other boards can be viewed by direct links (e.g. my-homarr.com/board/smart-home) Names of boards must be unique because this will be used in the URL to load the desired board. ## Create a new board + When creating a board, the availability of the board name will be checked for you. ![](./img/create-board-modal.png) ### Name + The name must not include any special characters and must be at least one character long. Underscores and hyphen-minus are allowed. ### Column count + Homarr has a complex drag and drop system that can be used from the browser. The column count defines how many horizontal columns are available to drag and drop elements to. ### Public + This will enable public access for everyone - regardless of whether they are logged in or not. This can be really useful if you want to have public boards in your company or for family and fiends. Modifications for public boards must be allowed explicitly using user groups and their permissions. ## Board settings + You navigate to the board settings by clicking on these three dots: ![](./img/navigate-to-settings.png) @@ -51,7 +56,9 @@ Alternatively, you can also navigate from the board page itself using the cog ic ![](./img/navigate-to-settings-2.png) ### General + #### Page title + This is the title that will be visible at the top left in the navigation bar: ![](./img/page-title.png) @@ -59,6 +66,7 @@ This is the title that will be visible at the top left in the navigation bar: This field is optional and Homarr will fall back to "Homarr" if nothing is set. #### Meta title + This is the secondary title of the page that is not directly visible in the page itself. Browser will use it to set the title of tabs: @@ -67,10 +75,12 @@ Browser will use it to set the title of tabs: Homarr will fall back to the board name and a suffix if nothing is set. #### Logo image URL + This is the URL that is used for the image at the top left. Homarr will fall back to the Homarr logo if nothing is set. #### Favicon image URL + This is the URL that is used for the favicon in the tab title. Homarr will fall back to the Homarr logo if nothing is set. @@ -94,51 +104,65 @@ Amount of columns for this layout. Defines how many items can be placed in a row #### Breakpoint -Minimum width of the screen where the layout will be used. +Minimum width of the screen where the layout will be used. Once the minmum of the next layout is reached the layout will change. #### Preview - - - + + + ### Background + #### Background image URL + Homarr can display a background image behind apps and widgets. This URL can be used to define what image should be shown. #### Background image attachment + This defines whether the background should move when the user scrolls. #### Background image size + This defines whether the background should cover the entire page (and possibly be cropped) or never be cropped but may not cover the entire page. #### Background image repeat + This defines whether the background should be repeated if it cannot cover the entire page. This option can be useful if you have patterns that can be repeated easily (e.g. patterns): ![](./img/background-repeat.png) ### Appearance + #### Primary color + Color that can be chosen freely to give accents to active elements. + #### Secondary color + Color that can be chosen freely to give accents. + #### Opacity + Opacity of the colors. + #### Icon color + Change the color of your bookmark / app icons. - + #### Item radius + Change the radius of your items / categories. - - + ### Custom CSS + This is the field where you can enter custom CSS. The styling will only be applied on the respective board page. @@ -147,14 +171,16 @@ The styling will only be applied on the respective board page. ### Behaviour #### Disable app status + This will disable the status check for apps. ### Access control + With the access control, you can permit a single user or a group to your board. The users and groups can have one of these three levels of access: | **Permission Level** | View board | Edit mode | Settings | Danger zone (eg. delete) | -|----------------------|------------|-----------|----------|--------------------------| +| -------------------- | ---------- | --------- | -------- | ------------------------ | | View board | X | | | | | Modify board | X | X | X | | | Full access | X | X | X | X | @@ -173,18 +199,23 @@ After editing permissions, the save button below the table must be pressed. Otherwise, all changes will be discarded. ### Danger zone + #### Rename + Renaming a board will break all existing links to it permanently with no redirect. #### Board visibility + By default, boards will be private. This means only authenticated users that are authorized have access. Making a board public will expose it to everyone - including unauthenticated users. #### Delete + This will permanently delete the board. This action is irreversible and cannot be undone. ## Delete boards + The deletion of boards is permanent and cannot be undone. There are two ways to delete a board: @@ -196,7 +227,7 @@ Both actions will execute the same deletion process. ## Duplicate boards :::note -Duplicating a board will not copy the users and groups that have access to the board +Duplicating a board will not copy the users and groups that have access to the board nor the integrations the user does not have access to. ::: @@ -206,47 +237,51 @@ You can duplicate a board by clicking on the three dots in the list of boards an ![](./img/duplicate-board-modal.png) ## Setting boards as your home board + The home board is the dashboard, that will be shown at the root path of Homarr or if no board name was passed in the URL. All the following paths will lead to the home board: -- ``my-homarr.com`` -- ``my-homarr.com/boards`` + +- `my-homarr.com` +- `my-homarr.com/boards` Your home board will have a special small badge at the top right in the list of boards: ![](./img/home-board-flag.png) ### For yourself + To set the home board yourself, the easiest option is to set it directly in the list of boards: ![](./img/set-as-home-board-menu.png) Alternatively, you can also define it via your user profile: + 1. Click on your user profile at the top right -2. Click on ``Your preferences`` -3. Change the home board in the ``home board`` dropdown and click on ``Save``. +2. Click on `Your preferences` +3. Change the home board in the `home board` dropdown and click on `Save`. ### For other users -1. Navigate to the users: ``Management`` > ``Users`` > ``Manage`` +1. Navigate to the users: `Management` > `Users` > `Manage` 2. Click on the username of the user that you want to adjust -3. Select the desired home board via the dropdown and click on ``Save`` \ -![](./img/set-home-board-other-user.png) +3. Select the desired home board via the dropdown and click on `Save` \ + ![](./img/set-home-board-other-user.png) ### For user groups -1. Navigate to the user groups: ``Management`` > ``Users`` > ``Groups`` > ``Manage`` -2. Go to tab ``Settings`` -3. Select the desired home board via the dropdown and click on ``Save`` \ -![](./img/set-home-board-user-group.png) +1. Navigate to the user groups: `Management` > `Users` > `Groups` > `Manage` +2. Go to tab `Settings` +3. Select the desired home board via the dropdown and click on `Save` \ + ![](./img/set-home-board-user-group.png) ### For whole server You can also set a global home board that will be used for all users that have not set a home board themselves. It will also be used for anonymous users. -1. Navigate to the settings: ``Management`` > ``Settings`` > ``Boards`` -2. Select the desired home board via the dropdown and click on ``Save`` \ -![](./img/set-home-board-global.png) +1. Navigate to the settings: `Management` > `Settings` > `Boards` +2. Select the desired home board via the dropdown and click on `Save` \ + ![](./img/set-home-board-global.png) :::note For the global home board you can only select boards that are public. @@ -255,4 +290,4 @@ For the global home board you can only select boards that are public. ### Mobile home board Same as the home board, you can also set a mobile home board. -It will be used for devices that are detected as mobile devices. (Using User-Agent header) \ No newline at end of file +It will be used for devices that are detected as mobile devices. (Using User-Agent header) diff --git a/apps/docs/docs/management/certificates/index.mdx b/apps/docs/docs/management/certificates/index.mdx index cceaa54fd..aa843bfe0 100644 --- a/apps/docs/docs/management/certificates/index.mdx +++ b/apps/docs/docs/management/certificates/index.mdx @@ -7,27 +7,29 @@ tags: --- # Certificates -On this page you can manage your trusted certificates. + +On this page you can manage your trusted certificates. For example if you use a self signed certificate for one of the integrations you want to connect, you can add it here. -Below you can see a screenshot of the certificates page. -The items show the subject, filename and when it expires. +Below you can see a screenshot of the certificates page. +The items show the subject, filename and when it expires. The color of the icon indicates how long it is valid. ![](./img/screenshot.png) -| Color | Meaning | -| --- | --- | -| 🟩 Green | Valid for more than 30 days | +| Color | Meaning | +| --------- | --------------------------- | +| 🟩 Green | Valid for more than 30 days | | 🟨 Yellow | Valid for less than 30 days | -| 🟧 Orange | Valid for less than a week | -| 🟥 Red | Valid for less than a day | - +| 🟧 Orange | Valid for less than a week | +| 🟥 Red | Valid for less than a day | ## Opening the certificates page -Navigate to ``Management`` > ``Tools`` > ``Certificates``. + +Navigate to `Management` > `Tools` > `Certificates`. ## Add a certificate + To add a certificate click on the "Add certificate" button. ![](./img/add-button.png) @@ -62,4 +64,4 @@ Below you can find instructions for some of the integrations. Since version 6 of Pi-hole, the web interface can be accessed through HTTPS. The certificate can be found in the path `/etc/pihole/tls_ca.crt`. To add the certificate, this file needs to be copied and uploaded to Homarr. -You can find more details regarding SSL / TLS for Pi-hole [here](https://docs.pi-hole.net/api/tls/). \ No newline at end of file +You can find more details regarding SSL / TLS for Pi-hole [here](https://docs.pi-hole.net/api/tls/). diff --git a/apps/docs/docs/management/integrations/index.mdx b/apps/docs/docs/management/integrations/index.mdx index 51b3424d3..de819e692 100644 --- a/apps/docs/docs/management/integrations/index.mdx +++ b/apps/docs/docs/management/integrations/index.mdx @@ -6,11 +6,13 @@ tags: --- # Integrations + Integrations are connections to supported third party applications. This page will describe the process of managing integrations but the process may vary depending on your specific integration. Check [the available integrations](/docs/category/integrations) for further information. ## Create an integration + To create an integration, you can choose the supported application from the dropdown at the top right: ![](./img/create-integration-dropdown.png) @@ -20,19 +22,24 @@ Next, you'll need to fill out the required fields to configure the integration: ![](./img/form-create-integration.png) ### Name + Must be at least 1 character long, can be chosen freely. ### Url + This must be the base URL of the application where Homarr should connect to. A few examples for this field include: + - http://sabnzbd.example.com - https://example.com/sabnzbd You must not append any path after the base URL. Some examples for incorrect usage: + - http://sabnzbd.example.com/settings - https://example.com/sabnzbd/settings ### Secrets + An integration may or may not require secrets to function. To process to obtain them is usually [documented in the integration pages](/docs/category/integrations). Secrets are encrypted using a symmetric encryption and stored in the database. @@ -47,6 +54,7 @@ If you already have an application created, you can also link it to the integrat On the edit page you can always change or remove the linked application. ### Testing and saving integration + It is not allowed to create an integration without passing the test. This is to ensure that you minimize the amount of broken applications on your Homarr instance. The test and create button will perform a network request to the application and authenticate if required. @@ -62,6 +70,7 @@ On the edit page of an integration, you can manage which users / groups can ![](./img/integration-permissions.png) ## Troubleshooting connection + The connection to your integrations can fail due to many factors. Most of the time it should show you the reason why it failed. If it doesn't, you can follow these steps to troubleshoot the issue: @@ -70,23 +79,23 @@ If it doesn't, you can follow these steps to troubleshoot the issue: - The secrets must be correct and have the correct permissions. 2. If you use https to connect to the application, check the chapter below about [certificate issues](#certificate-issues). 3. Check whether you followed the Homarr documentation and didn't skip any steps. -This is the most often mistake that create many noisy support requests and following all steps will often resolve the problems. + This is the most often mistake that create many noisy support requests and following all steps will often resolve the problems. 4. Check Homarr's logs for more information. As we have no control over breaking changes in upstream APIs and third party software, -they can break without notice in unexpected ways which can also lead to errors within Homarr. In such case, these occurrences must be reported -and fixed within the source code of Homarr. -5. Check whether the host can reach the destination hostname / IP using ``ping`` and ``curl`` or ``wget`` afterward. -Execute this command on the host machine, not inside containers, to check whether it can connect or not. + they can break without notice in unexpected ways which can also lead to errors within Homarr. In such case, these occurrences must be reported + and fixed within the source code of Homarr. +5. Check whether the host can reach the destination hostname / IP using `ping` and `curl` or `wget` afterward. + Execute this command on the host machine, not inside containers, to check whether it can connect or not. 6. Check whether the container / pod can reach the destination hostname / IP. Execute the same commands in the shell inside the container / pod. 7. Check your reverse proxy / authentication proxy logs for failures / hints 8. Check your security log of tunnels and VPNs 9. Check your router for security events 10. Check your VLAN configuration and firewall rules 11. Check your DNS settings for the host machine and the containers / pods and whether they can resolve the hostnames -12. Check throughput and stability of your network connection using ``iperf3`` +12. Check throughput and stability of your network connection using `iperf3` 13. Check syslog / drivers of your OS for hints 14. Check logs of your destination applications (eg. SABnzbd) 15. Attempt to disable CSRF / tamper protections when absolutely no other workaround available -> this comes with some security implications - be careful! -Re-enable if this didn't fix the issue. + Re-enable if this didn't fix the issue. If none of these troubleshooting steps worked, you can request support from our team in Discord or GitHub. @@ -95,4 +104,4 @@ If none of these troubleshooting steps worked, you can request support from our If you are using a self-signed certificate you'll need to add it to the [trusted certificates](../certificates) in Homarr. Most of the time you should also get a button to add the certificate automatically when you try to connect to the integration. Please check that the certificate is the one you are expecting to prevent Man in the Middle attacks. -For some integrations, you can find a guide on how to retrieve the certificate [here](../certificates/#obtaining-certificates). \ No newline at end of file +For some integrations, you can find a guide on how to retrieve the certificate [here](../certificates/#obtaining-certificates). diff --git a/apps/docs/docs/management/media/index.mdx b/apps/docs/docs/management/media/index.mdx index 090a6559b..e55a05659 100644 --- a/apps/docs/docs/management/media/index.mdx +++ b/apps/docs/docs/management/media/index.mdx @@ -7,7 +7,8 @@ tags: --- # Media + Using the media feature, you can upload images for custom icons to Homarr. Images will be stored in the database. They can be selected in the [icon picker](/docs/advanced/icons). -![](./img/screenshot.png) \ No newline at end of file +![](./img/screenshot.png) diff --git a/apps/docs/docs/management/search-engines/index.mdx b/apps/docs/docs/management/search-engines/index.mdx index ef9fba2a3..07f2f3098 100644 --- a/apps/docs/docs/management/search-engines/index.mdx +++ b/apps/docs/docs/management/search-engines/index.mdx @@ -6,6 +6,7 @@ tags: --- # Search Engines + Using the search engines, terms can be quickly searched simply by opening the search bar at the top or using the keyboard shortcut `CTRL + K`. ![](./img/search-engines.png) @@ -13,31 +14,36 @@ Using the search engines, terms can be quickly searched simply by opening the se You can add any search engine that has a search URL that accepts a search term as a parameter. ## Create search engine + To create a custom search engine, you can click the button at the top of the page. ![](./img/create-search-engine.png) ### Name + The name can be chosen freely. It will be displayed in the search box popover. ### Short + Prefix that is used to choose the search engine in the popover using the keyboard. -It is recommended that this value is kept short (for example ``g`` for Google and ``e`` for Ecosia). +It is recommended that this value is kept short (for example `g` for Google and `e` for Ecosia). ### Configuration In the configuration section you can select between two options. #### Search template -The template must be a valid URL that incldues the ``%s`` placeholder. -Homarr will replace the ``%s`` with the term that the user entered. + +The template must be a valid URL that incldues the `%s` placeholder. +Homarr will replace the `%s` with the term that the user entered. ##### Examples -- Google: ``https://www.google.com/search?q=%s`` -- Ecosia: ``https://www.ecosia.org/search?q=%s`` -- DuckDuckGo: ``https://duckduckgo.com/?q=%s`` -- Bing: ``https://www.bing.com/search?q=%s`` -- YouTube: ``https://www.youtube.com/results?search_query=%s`` + +- Google: `https://www.google.com/search?q=%s` +- Ecosia: `https://www.ecosia.org/search?q=%s` +- DuckDuckGo: `https://duckduckgo.com/?q=%s` +- Bing: `https://www.bing.com/search?q=%s` +- YouTube: `https://www.youtube.com/results?search_query=%s` ## Media request search @@ -45,12 +51,14 @@ Jellyseerr, Overseerr, and Seerr integrations have a dedicated **Spotlight mode* This mode does not require creating a search engine entry - it is available automatically when you have a compatible integration configured. You can access it from: + - The **Modes list** in Spotlight (opened with `CTRL + K`) - The **search button** on the media request list and stats widgets ### Availability indicators Search results display colored status badges showing the media's current state in your integration: + - **Available** - fully available in your media library - **Partial** - some content (e.g. seasons) is available - **Processing** - currently being downloaded or processed diff --git a/apps/docs/docs/management/settings/index.mdx b/apps/docs/docs/management/settings/index.mdx index d7705e61a..d5ffcff8b 100644 --- a/apps/docs/docs/management/settings/index.mdx +++ b/apps/docs/docs/management/settings/index.mdx @@ -9,10 +9,12 @@ tags: --- # Settings + The settings page has a few options that will be applied to the entire Homarr application. They may require a full page reload for changes to apply. ## Analytics + By default, Homarr is collecting anonymous analytics to identify issues and prioritize bugfixes and improvements. The data is never shared with any third-parties and is fully GDPR & CCPA compliant. The software being used is [Umami Analytics](https://umami.is/) which is fully open source. @@ -21,25 +23,29 @@ The main server software can be found [here](https://github.com/umami-software/u A full list of the collected data by default can be found here: https://umami.is/docs/metric-definitions. We understand that you might not want Homarr to communicate with our services. -By unchecking the ``Send anonymous analytics`` checkbox and reloading the full page, all communication by Umami will be disabled and no data will be collected. -If you are paranoid, you can permanently block ``umami.homarr.dev`` from your DNS / firewall. +By unchecking the `Send anonymous analytics` checkbox and reloading the full page, all communication by Umami will be disabled and no data will be collected. +If you are paranoid, you can permanently block `umami.homarr.dev` from your DNS / firewall. Additionally, you opt in to more data collection to help us provide more useful data. ### Integration data + Enabling this optional data will send the types of integrations (e.g. SABnzbd, Sonarr, ...) and how many you have configured of them. This will not include any URLs, names, secrets, errors and others. This is disabled by default. ### Widget data + Enabling this optional data will send the types of widgets (e.g. downloads, media streams, iframe, ...) and how many you have configured of them. This will not include any URLs, names, secrets, errors and others. This is disabled by default. ### Users data + Enabling this optional data will send the count of users and whether you activated SSO. This will not include any usernames, passwords, emails, URLs, authentication flows or client IDs. This is disabled by default. ## Search Engine Optimization (SEO) + Big companies [like Google, Microsoft, Baidu and Yandex](https://de.wikipedia.org/wiki/Web-Index) will use [web crawlers](https://de.wikipedia.org/wiki/Webcrawler) to index the Internet for new websites & pages. This is desirable in many cases (for example when selling products in an online shop) but can lead to unwanted traffic and attention to your personal dashboard. Homarr is requesting the crawlers to not index Homarr instances by default for this reason. @@ -47,22 +53,26 @@ If you use Homarr as a public website and want it to be searchable on these sear Please note that Homarr doesn't have control over what the crawlers do; it is a mere request to them to not perform these actions but will not guarantee that your website doesn't land on some index. ### No index + This will ask crawlers to not index your Homarr instance on any indexes. It is up to the crawler to properly respect this request. By default, this setting is enabled. Disabling it will allow indexing. ### No follow + If indexing is allowed, crawlers will also attempt to follow any links on your page to further "discover" new parts of the Internet and on your website. By default, this setting is enabled and will ask crawlers to not follow any links. Crawler of different companies may behave differently when indexing is prohibited and following is allowed. ### No translate + Google and Chrome on Android will prompt users to translate pages that are not in their device language. This can lead to some shifting and can be undesired in some cases. By enabling this, you ask crawlers to never translate and never prompt users for translation. It should be noted that some browsers will ignore this and translate regardless. ### No site links search box + This setting is exclusive to Google. [Google will create a box below your domain](https://developers.google.com/search/docs/appearance/structured-data/sitelinks-searchbox) that lists the paths that were discovered by the "folowing". The user can search them directly in Google. @@ -72,7 +82,8 @@ This setting is disabled by default. ## Boards ### Global home board -You can set a global home board that will be used for all users that have not set a home board themselves. + +You can set a global home board that will be used for all users that have not set a home board themselves. It will also be used for anonymous users. Note that the board must be public to be used as a global home board. @@ -97,9 +108,11 @@ You can decide if the app status should be disabled for all boards. ## Appearance ### Default color scheme + You can set the default color scheme for all users that have not set a color scheme themselves. ## Culture ### Default language -You can set the default language for all users that have not set a language themselves. \ No newline at end of file + +You can set the default language for all users that have not set a language themselves. diff --git a/apps/docs/docs/management/tasks/index.mdx b/apps/docs/docs/management/tasks/index.mdx index bd9395610..c47eb1a74 100644 --- a/apps/docs/docs/management/tasks/index.mdx +++ b/apps/docs/docs/management/tasks/index.mdx @@ -38,6 +38,3 @@ You can disable a task by clicking the "Power" button, which will change it to a When a task is disabled, it will not run automatically according to its schedule. You can enable it again by clicking the "Power-Off" button, which will change it back to a "Power" button. Running a task manually is still possible when it is disabled. - - - diff --git a/apps/docs/docs/management/users/index.mdx b/apps/docs/docs/management/users/index.mdx index 7be233af0..6170a02eb 100644 --- a/apps/docs/docs/management/users/index.mdx +++ b/apps/docs/docs/management/users/index.mdx @@ -20,8 +20,10 @@ Homarr supports [single sign on for easier and seamless authentication](/docs/ad ::: ## Manage users + ### Creating new users -To create new users, you must navigate to ``Mangement`` > ``Users`` > ``Manage`` and click on the create button to create a new one: \ + +To create new users, you must navigate to `Mangement` > `Users` > `Manage` and click on the create button to create a new one: \ ![](./img/button-create-user.png) You'll be guided through the process using a wizard: \ @@ -35,25 +37,31 @@ After you completed all steps, you can start over to create another user or choo ![](./img/wizard-complete.png) ## Editing a user -A user can be edited on the ``Mangement`` > ``Users`` > ``Manage`` page when you click on the username. + +A user can be edited on the `Mangement` > `Users` > `Manage` page when you click on the username. Here you'll have access to two tabs: **General** and **Security**. ### General tab + #### Username + This is the unique username that identifies this user. It can be changed to anything but must be at least 3 characters long with a limit of 255 characters. This name will be used for the credential's login. It is also used to auto-generate profile pictures if no picture was uploaded. #### E-Mail + This is the unique email of the user. As of 1.0, it is not used for any notifications and only for organizational purposes. This field is optional. #### Language + This is the currently selected language of the user. Changing the language will change all text & the right to left (RTL) feature in some languages. By default, Homarr will choose English as the default language. Here you can override the language for this specific user. The user may choose a different language by themselves afterward. #### Home board + Optional field for the board that is loaded by default if no board was specified in the URL. Only boards that the user has permission to are being shown. @@ -70,6 +78,7 @@ Choose the first day of the week for the user. This will affect the calendar wid Option to show icons for status check instead of colored dots. #### Delete + This action will permanently delete the user from the database, including any preferences they set. If the user created boards, they wil **not** be deleted. This action is **irreversible** and cannot be undone. All data is permanently lost. @@ -77,6 +86,7 @@ This action is **irreversible** and cannot be undone. All data is permanently lo ### Security tab #### Change password + Here the password for this user can be changed. It must also meet the password requirements of Homarr. The password is stored as an encrypted value with a salt in the database - this means the value cannot be read out from the database afterward. @@ -85,50 +95,63 @@ This functionality can also be useful to lock out a bad actor without tampering For security reasons, you must confirm the password a second time. ## Groups + Using groups, you can manage the permissions of users. Members can be directly assigned to groups. -A user will have the permissions of all groups they are a member of. +A user will have the permissions of all groups they are a member of. Some permissions include other permissions, for example the "Full board access" permission includes all board permissions. By default, a group called "credentials-admin" will be generated where the first user will be placed. However, you can create as many groups as you'd like. ### Creating a group -Click on the button ``New group`` to create a new one. + +Click on the button `New group` to create a new one. Homarr will prompt you for a group name. ### Managing a group + #### General tab + ##### Name + Name for the group that can be chosen freely. ##### Transfer ownership + Every group has an owner. Using this button, the ownership can be transferred to a different user. Group ownership is only organizational. ##### Delete + Deletes the group permanently. This change is irreversible. #### Settings tab + In this tab, you can configure some settings for the group. Those settings will be prioritized by the order of the groups on the groups list page ##### Priorization + The higher a group in the list, the higher the priority. This means that if a user is in multiple groups, the permissions of the group with the highest priority will be used. It will always fallback to the everyone group if no other group permissions are set. ![](./img/groups-list.png) ##### Boards + Configure board settings for a group. User specific settings will override group settings. ###### Home board + The board that is loaded by default if no board was specified in the URL. ###### Mobile board + The board that is loaded by default on mobile devices. #### Members tab + In this tab, you can assign users to the group. With the button at the top right, a new member can be added to the group: ![](./img/add-group-member.png) @@ -138,6 +161,7 @@ Members can be removed from the group using the remove button at the end: ![](./img/remove-group-member.png) #### Permissions tab + In this tab, you manage what permissions the members of this group will have. Currently, the following permissions are available: @@ -158,9 +182,11 @@ When you changed permissions, you must confirm your changes by clicking the bann ![](./img/changing-group-permissions.png) #### Special groups + Currently one special group exists. This group is `everyone`. It automatically adds every user that is known to Homarr to its members. Neither its name nor its members can be changed. ## Invites + Invites are an easy-to-use system to allow users to onboard themselves. It is useful in companies or large-scale homelabs where many users must be onboarded at the same time. You should trust the end user that they enter their data truthfully as the administrator will not confirm the entered data after the user has completed the onboarding. @@ -169,6 +195,7 @@ This feature can only be used when credentials authentication is enabled. An invitation link can be used indefinitely. ### Creating an invitation + Click on the button: ![](./img/create-invitation-button.png) @@ -179,14 +206,15 @@ The default is 4 hours in the future. ![](./img/invitation-expiry-date.png) -Next, click ``Create`` and you'll get a confirmation with an ID, Token and a link that can be copied: +Next, click `Create` and you'll get a confirmation with an ID, Token and a link that can be copied: ![](./img/create-invitation-confirmation.png) Both ID and Token are also in the URL. Ensure that you copy either ID & Token or the URL - it will never be shown again. -Clicking the ``Copy & close`` button will copy the URL to your clipboard. +Clicking the `Copy & close` button will copy the URL to your clipboard. ### Self-onboarding + Clicking the invitation link will bring up a form with fields for the username and password: ![](./img/invitation-self-onboarding.png) @@ -194,6 +222,7 @@ Clicking the invitation link will bring up a form with fields for the username a At the bottom of the page, the user who created the invitation can be seen. ### Deleting an invitation + If an invitation needs to be deleted before or after the expiry, the delete button at the end of the table can be used: ![](./img/deleting-invitation.png) diff --git a/apps/docs/docs/widgets/anchor-note/index.mdx b/apps/docs/docs/widgets/anchor-note/index.mdx index 453a5b51c..db925e95a 100644 --- a/apps/docs/docs/widgets/anchor-note/index.mdx +++ b/apps/docs/docs/widgets/anchor-note/index.mdx @@ -1,35 +1,35 @@ --- -title: 'Anchor Note' -description: 'Display and edit a selected note from Anchor' +title: "Anchor Note" +description: "Display and edit a selected note from Anchor" hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; -import { anchorNoteWidget } from '.'; -import { anchorIntegration } from '@site/docs/integrations/anchor'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; +import { anchorNoteWidget } from "."; +import { anchorIntegration } from "@site/docs/integrations/anchor"; - - + The Anchor Note widget shows a selected note from your Anchor integration. If your note permissions allow it, you can also edit the note title and content directly in Homarr. ### Screenshots -import anchorNoteWidgetScreenshot from './img/widget.png'; +import anchorNoteWidgetScreenshot from "./img/widget.png"; anchor-note-widget ### Supported Integrations - + ### Interactions diff --git a/apps/docs/docs/widgets/app/index.mdx b/apps/docs/docs/widgets/app/index.mdx index ec62d862e..77d8ec878 100644 --- a/apps/docs/docs/widgets/app/index.mdx +++ b/apps/docs/docs/widgets/app/index.mdx @@ -1,30 +1,26 @@ --- -title: 'App' -description: 'Embeds an app into the board.' +title: "App" +description: "Embeds an app into the board." hide_title: true --- -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { appWidget } from '.'; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { appWidget } from "."; - - + The app widget allows you to add a link to an application or a website that you want to access quickly from your Homarr board. It also supports a status check to indicate whether Homarr can reach the application or website. ### Screenshots -import githubApp from './img/github.png'; -import jellyseerrApp from './img/jellyseerr-description-tooltip.png'; -import piHoleApp from './img/pi-hole-ping-icon.png'; +import githubApp from "./img/github.png"; +import jellyseerrApp from "./img/jellyseerr-description-tooltip.png"; +import piHoleApp from "./img/pi-hole-ping-icon.png"; -
    +
    app github with-status-check app pi-hole with-status-check status-check-icon app jellyseerr with-description-tooltip @@ -34,4 +30,5 @@ import piHoleApp from './img/pi-hole-ping-icon.png'; ### Configuration + diff --git a/apps/docs/docs/widgets/audio-stats/index.mdx b/apps/docs/docs/widgets/audio-stats/index.mdx index f37a4eb83..687c1cde9 100644 --- a/apps/docs/docs/widgets/audio-stats/index.mdx +++ b/apps/docs/docs/widgets/audio-stats/index.mdx @@ -1,22 +1,18 @@ --- -title: 'Audio Stats' -description: 'Displays library statistics from Navidrome or Audiobookshelf, adapting its display based on the linked integration.' +title: "Audio Stats" +description: "Displays library statistics from Navidrome or Audiobookshelf, adapting its display based on the linked integration." hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; -import { audioStatsWidget } from '.'; -import { navidromeIntegration } from '@site/docs/integrations/navidrome'; -import { audiobookshelfIntegration } from '@site/docs/integrations/audiobookshelf'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; +import { audioStatsWidget } from "."; +import { navidromeIntegration } from "@site/docs/integrations/navidrome"; +import { audiobookshelfIntegration } from "@site/docs/integrations/audiobookshelf"; - - + This widget adapts its display based on the linked integration: @@ -27,17 +23,23 @@ Only options relevant to your linked integration are shown in the configuration ### Supported Integrations - + ### Adding the widget ### Configuration + diff --git a/apps/docs/docs/widgets/bazarr/index.mdx b/apps/docs/docs/widgets/bazarr/index.mdx index e262cfa75..6a87a4e0f 100644 --- a/apps/docs/docs/widgets/bazarr/index.mdx +++ b/apps/docs/docs/widgets/bazarr/index.mdx @@ -1,26 +1,23 @@ --- -title: 'Bazarr' -description: 'Displays missing subtitle counts and health indicators from your Bazarr instance.' +title: "Bazarr" +description: "Displays missing subtitle counts and health indicators from your Bazarr instance." hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; -import { bazarrWidget } from '.'; -import { bazarrIntegration } from '@site/docs/integrations/bazarr'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; +import { bazarrWidget } from "."; +import { bazarrIntegration } from "@site/docs/integrations/bazarr"; - + This widget shows subtitle status from your Bazarr instance, including missing episode and movie subtitles, provider issues, and health warnings. ### Screenshots -import widgetOverview from './img/widget-overview.png'; +import widgetOverview from "./img/widget-overview.png";
    bazarr-widget-overview @@ -28,14 +25,19 @@ import widgetOverview from './img/widget-overview.png'; ### Supported Integrations - + ### Adding the widget ### Configuration + diff --git a/apps/docs/docs/widgets/beszel-alerts/index.mdx b/apps/docs/docs/widgets/beszel-alerts/index.mdx index 3a4899d17..4a669f3f4 100644 --- a/apps/docs/docs/widgets/beszel-alerts/index.mdx +++ b/apps/docs/docs/widgets/beszel-alerts/index.mdx @@ -1,22 +1,19 @@ --- -title: 'Beszel Alerts' -description: 'View Beszel alert configurations and history with triggered/ok status indicators.' +title: "Beszel Alerts" +description: "View Beszel alert configurations and history with triggered/ok status indicators." hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; -import { beszelAlertsWidget } from '.'; -import { beszelIntegration } from '@site/docs/integrations/beszel'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; +import { beszelAlertsWidget } from "."; +import { beszelIntegration } from "@site/docs/integrations/beszel"; -import beszelAlerts from './img/beszel-alerts.png'; +import beszelAlerts from "./img/beszel-alerts.png"; - + This widget displays your Beszel alert configurations separated by status (triggered and ok). It also shows alert history with timestamps. Alerts are updated in real time via WebSocket subscriptions. @@ -26,14 +23,19 @@ This widget displays your Beszel alert configurations separated by status (trigg ### Supported Integrations - + ### Adding the widget ### Configuration + diff --git a/apps/docs/docs/widgets/beszel-system-grid/index.mdx b/apps/docs/docs/widgets/beszel-system-grid/index.mdx index e3b17623b..993974914 100644 --- a/apps/docs/docs/widgets/beszel-system-grid/index.mdx +++ b/apps/docs/docs/widgets/beszel-system-grid/index.mdx @@ -1,22 +1,19 @@ --- -title: 'Beszel Systems (Grid)' -description: 'Card grid view of all Beszel-monitored systems with real-time metrics.' +title: "Beszel Systems (Grid)" +description: "Card grid view of all Beszel-monitored systems with real-time metrics." hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; -import { beszelSystemGridWidget } from '.'; -import { beszelIntegration } from '@site/docs/integrations/beszel'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; +import { beszelSystemGridWidget } from "."; +import { beszelIntegration } from "@site/docs/integrations/beszel"; -import beszelSystemGrid from './img/beszel-system-grid.png'; +import beszelSystemGrid from "./img/beszel-system-grid.png"; - + This widget displays all your Beszel-monitored systems as a responsive card grid. Each card shows real-time metrics like CPU, memory, disk, network, temperature, and more. Cards adapt their layout based on available space. If Beszel reports multiple filesystems, the disk bar exposes a hover breakdown for the root disk and each extra mount. @@ -28,14 +25,19 @@ Select a system card to open the complete statistics view, including system, fil ### Supported Integrations - + ### Adding the widget ### Configuration + diff --git a/apps/docs/docs/widgets/beszel-system-table/index.mdx b/apps/docs/docs/widgets/beszel-system-table/index.mdx index df68fcc1b..87cb16ac5 100644 --- a/apps/docs/docs/widgets/beszel-system-table/index.mdx +++ b/apps/docs/docs/widgets/beszel-system-table/index.mdx @@ -1,21 +1,17 @@ --- -title: 'Beszel Systems (Table)' -description: 'Table view of all Beszel-monitored systems with sortable columns and status indicators.' +title: "Beszel Systems (Table)" +description: "Table view of all Beszel-monitored systems with sortable columns and status indicators." hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; -import { beszelSystemTableWidget } from '.'; -import { beszelIntegration } from '@site/docs/integrations/beszel'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; +import { beszelSystemTableWidget } from "."; +import { beszelIntegration } from "@site/docs/integrations/beszel"; - - + This widget displays all your Beszel-monitored systems in a sortable data table. Each row shows system metrics like CPU, memory, disk, network, temperature, and more. Columns can be toggled on or off, and the table supports sorting by any column. When Beszel reports extra filesystems, the disk column adds a hover breakdown for each mount alongside the root disk. @@ -23,14 +19,19 @@ Select a system row to open the complete statistics view, including system, file ### Supported Integrations - + ### Adding the widget ### Configuration + diff --git a/apps/docs/docs/widgets/bookmarks/index.mdx b/apps/docs/docs/widgets/bookmarks/index.mdx index c3104ad5b..ed8be9bb6 100644 --- a/apps/docs/docs/widgets/bookmarks/index.mdx +++ b/apps/docs/docs/widgets/bookmarks/index.mdx @@ -1,29 +1,25 @@ --- -title: 'Bookmarks' -description: 'Displays multiple app links' +title: "Bookmarks" +description: "Displays multiple app links" hide_title: true --- -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { bookmarksWidget } from '.'; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { bookmarksWidget } from "."; - - + The bookmarks widget allows you to display multiple app links in a single widget. You can add links to your favorite applications, websites, or any other resources you want quick access to. ### Screenshots -import gridIconsOnly from './img/grid-icons-only.png'; -import gridWithTitle from './img/grid-with-title.png'; -import verticalListAll from './img/vertical-list-all.png'; -import vericalListSimple from './img/vertical-list-simple.png'; +import gridIconsOnly from "./img/grid-icons-only.png"; +import gridWithTitle from "./img/grid-with-title.png"; +import verticalListAll from "./img/vertical-list-all.png"; +import vericalListSimple from "./img/vertical-list-simple.png";
    @@ -33,12 +29,13 @@ import vericalListSimple from './img/vertical-list-simple.png'; bookmarks grid with-title bookmarks vertical-list all-elements -
    +
    ### Adding the widget ### Configuration + diff --git a/apps/docs/docs/widgets/calendar/index.mdx b/apps/docs/docs/widgets/calendar/index.mdx index 5db4e9b30..f84a0daae 100644 --- a/apps/docs/docs/widgets/calendar/index.mdx +++ b/apps/docs/docs/widgets/calendar/index.mdx @@ -1,65 +1,71 @@ --- -title: 'Calendar' -description: 'Display events from your integrations in a calendar view within a certain relative time period' +title: "Calendar" +description: "Display events from your integrations in a calendar view within a certain relative time period" hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; import { IconAd } from "@tabler/icons-react"; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import { calendarWidget } from '.'; -import { lidarrIntegration } from '@site/docs/integrations/lidarr'; -import { nextcloudIntegration } from '@site/docs/integrations/nextcloud'; -import { homeAssistantIntegration } from '@site/docs/integrations/home-assistant'; -import { radarrIntegration } from '@site/docs/integrations/radarr'; -import { readarrIntegration } from '@site/docs/integrations/readarr'; -import { sonarrIntegration } from '@site/docs/integrations/sonarr'; -import { icalIntegration } from '@site/docs/integrations/ical'; +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +import { calendarWidget } from "."; +import { lidarrIntegration } from "@site/docs/integrations/lidarr"; +import { nextcloudIntegration } from "@site/docs/integrations/nextcloud"; +import { homeAssistantIntegration } from "@site/docs/integrations/home-assistant"; +import { radarrIntegration } from "@site/docs/integrations/radarr"; +import { readarrIntegration } from "@site/docs/integrations/readarr"; +import { sonarrIntegration } from "@site/docs/integrations/sonarr"; +import { icalIntegration } from "@site/docs/integrations/ical"; - - + The calendar widget shows a month view of events from different integrations. It allows you to view calendar events or upcoming releases from your media managers. ### Screenshots -import popover from './img/popover.png'; -import withIntegrations from './img/with-integrations.png'; -import withoutIntegrations from './img/without-integrations.png'; +import popover from "./img/popover.png"; +import withIntegrations from "./img/with-integrations.png"; +import withoutIntegrations from "./img/without-integrations.png"; -
    - calendar with-integrations big-size -
    - calendar popover-details the-mandalorian - calendar without-integrations small-size -
    +
    + calendar with-integrations big-size +
    + calendar popover-details the-mandalorian + calendar without-integrations small-size +
    ### Supported Integrations - + ### Interactions @@ -72,4 +78,5 @@ import withoutIntegrations from './img/without-integrations.png'; ### Configuration + diff --git a/apps/docs/docs/widgets/clock/index.mdx b/apps/docs/docs/widgets/clock/index.mdx index efdab31d4..0c41d7ae7 100644 --- a/apps/docs/docs/widgets/clock/index.mdx +++ b/apps/docs/docs/widgets/clock/index.mdx @@ -1,38 +1,34 @@ --- -title: 'Date and time' -description: 'Displays the current date and time.' +title: "Date and time" +description: "Displays the current date and time." hide_title: true --- -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { clockWidget } from '.'; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { clockWidget } from "."; - - + The clock widget displays the current date and time in a customizable format. ### Screenshots -import localClock from './img/local.png'; -import londonClock from './img/london-with-seconds.png'; -import tokyoClock from './img/tokyo-12-hour.png'; +import localClock from "./img/local.png"; +import londonClock from "./img/london-with-seconds.png"; +import tokyoClock from "./img/tokyo-12-hour.png"; -
    - clock format-24-hours timezone-local - clock format-24-hours with-seconds timezone-london - clock format-12-hours timezone-tokyo +
    + clock format-24-hours timezone-local + clock format-24-hours with-seconds timezone-london + clock format-12-hours timezone-tokyo
    - ### Adding the widget ### Configuration + diff --git a/apps/docs/docs/widgets/coolify/index.mdx b/apps/docs/docs/widgets/coolify/index.mdx index 23eb6ba03..807ad502d 100644 --- a/apps/docs/docs/widgets/coolify/index.mdx +++ b/apps/docs/docs/widgets/coolify/index.mdx @@ -1,28 +1,29 @@ --- -title: 'Coolify' -description: 'Overview of your Coolify instance with servers, applications, and services.' +title: "Coolify" +description: "Overview of your Coolify instance with servers, applications, and services." hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; -import { coolifyWidget } from '.'; -import { coolifyIntegration } from '@site/docs/integrations/coolify'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; +import { coolifyWidget } from "."; +import { coolifyIntegration } from "@site/docs/integrations/coolify"; - + The Coolify widget displays a compact overview of your Coolify instance. It can show servers, applications, and services with status indicators, project and environment context, direct links to Coolify, and the installed Coolify version. ### Supported Integrations - + ### Adding the widget @@ -34,11 +35,11 @@ The Coolify widget displays a compact overview of your Coolify instance. It can ### Sections -| Section | Description | -|---|---| -| **Servers** | Lists Coolify servers, reachability status, and application/service counts per server. | +| Section | Description | +| ---------------- | ---------------------------------------------------------------------------------------------------------------------------------- | +| **Servers** | Lists Coolify servers, reachability status, and application/service counts per server. | | **Applications** | Lists applications with runtime status, project and environment context, public URL links, Coolify dashboard links, and log links. | -| **Services** | Lists services with runtime status, project and environment context, public URL links, Coolify dashboard links, and log links. | +| **Services** | Lists services with runtime status, project and environment context, public URL links, Coolify dashboard links, and log links. | ### Notes diff --git a/apps/docs/docs/widgets/dns-hole-controls/index.mdx b/apps/docs/docs/widgets/dns-hole-controls/index.mdx index cea517545..74c8cc88b 100644 --- a/apps/docs/docs/widgets/dns-hole-controls/index.mdx +++ b/apps/docs/docs/widgets/dns-hole-controls/index.mdx @@ -1,47 +1,48 @@ --- -title: 'DNS Hole Controls' +title: "DNS Hole Controls" description: "Control PiHole or AdGuard from your dashboard." hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; import { IconAd } from "@tabler/icons-react"; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import { dnsHoleControlsWidget } from '.'; -import { adguardHomeIntegration } from '@site/docs/integrations/adguard-home'; -import { piHoleIntegration } from '@site/docs/integrations/pi-hole'; -import { technitiumDnsIntegration } from '@site/docs/integrations/technitium-dns'; +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +import { dnsHoleControlsWidget } from "."; +import { adguardHomeIntegration } from "@site/docs/integrations/adguard-home"; +import { piHoleIntegration } from "@site/docs/integrations/pi-hole"; +import { technitiumDnsIntegration } from "@site/docs/integrations/technitium-dns"; - - + This widget allows you to enable or disable your DNS Hole. ### Screenshots -import bigSize from './img/big.png'; -import smallSize from './img/small.png'; - +import bigSize from "./img/big.png"; +import smallSize from "./img/small.png"; dns-hole-controls big-size with-toggle-all-buttons dns-hole-controls small-size no-toggle-all-buttons ### Supported Integrations - + ### Interactions @@ -54,4 +55,5 @@ import smallSize from './img/small.png'; ### Configuration + diff --git a/apps/docs/docs/widgets/dns-hole-summary/index.mdx b/apps/docs/docs/widgets/dns-hole-summary/index.mdx index 1dcb123da..99fd69dbd 100644 --- a/apps/docs/docs/widgets/dns-hole-summary/index.mdx +++ b/apps/docs/docs/widgets/dns-hole-summary/index.mdx @@ -1,38 +1,34 @@ --- -title: 'DNS Hole Summary' +title: "DNS Hole Summary" description: "Displays the summary of your DNS Hole." hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; import { IconAd } from "@tabler/icons-react"; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import { dnsHoleSummaryWidget } from '.'; +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +import { dnsHoleSummaryWidget } from "."; - - + This widget allows you to display statistics about your DNS Hole like total queries, blocked queries, and more. ### Screenshots -import gridLayout from './img/grid.png'; -import verticalLayout from './img/vertical.png'; -import horizontalLayout from './img/horizontal.png'; -import { adguardHomeIntegration } from '@site/docs/integrations/adguard-home'; -import { piHoleIntegration } from '@site/docs/integrations/pi-hole'; -import { technitiumDnsIntegration } from '@site/docs/integrations/technitium-dns'; +import gridLayout from "./img/grid.png"; +import verticalLayout from "./img/vertical.png"; +import horizontalLayout from "./img/horizontal.png"; +import { adguardHomeIntegration } from "@site/docs/integrations/adguard-home"; +import { piHoleIntegration } from "@site/docs/integrations/pi-hole"; +import { technitiumDnsIntegration } from "@site/docs/integrations/technitium-dns"; -
    +
    grid-layout pi-hole-colors -
    +
    vertical-layout no-colors horizontal-layout pi-hole-colors
    @@ -40,17 +36,24 @@ import { technitiumDnsIntegration } from '@site/docs/integrations/technitium-dns ### Supported Integrations - + ### Adding the widget ### Configuration + diff --git a/apps/docs/docs/widgets/docker-containers/index.mdx b/apps/docs/docs/widgets/docker-containers/index.mdx index fe509f86a..898d2f3a5 100644 --- a/apps/docs/docs/widgets/docker-containers/index.mdx +++ b/apps/docs/docs/widgets/docker-containers/index.mdx @@ -1,24 +1,20 @@ --- -title: 'Docker stats' -description: 'Stats of your containers' +title: "Docker stats" +description: "Stats of your containers" hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; import { IconAd } from "@tabler/icons-react"; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import { dockerContainersWidget } from '.'; -import { dockerIntegration } from '@site/docs/integrations/docker'; +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +import { dockerContainersWidget } from "."; +import { dockerIntegration } from "@site/docs/integrations/docker"; - - + This widget displays the resource usage of your Docker containers and allows you to manage them. @@ -28,19 +24,24 @@ This widget can only be used with administrator privileges. ### Screenshots -import dockerTable from './img/table.png'; +import dockerTable from "./img/table.png"; docker-stats table docker-containers ### Supported Integrations - + ### Interactions Each container row has an action menu (accessible via the three-dot icon) with the following options: + - **View logs** - opens a dedicated terminal page streaming the container's logs - **Start** / **Stop** / **Restart** - manage the container's state - **Remove** - remove the container diff --git a/apps/docs/docs/widgets/downloads/index.mdx b/apps/docs/docs/widgets/downloads/index.mdx index 9242a84eb..20c7fbfc0 100644 --- a/apps/docs/docs/widgets/downloads/index.mdx +++ b/apps/docs/docs/widgets/downloads/index.mdx @@ -1,61 +1,66 @@ --- -title: 'Download Client' -description: 'Allows you to view and manage your Downloads from both Torrent and Usenet clients.' +title: "Download Client" +description: "Allows you to view and manage your Downloads from both Torrent and Usenet clients." hide_title: true --- -import { delugeIntegration } from '@site/docs/integrations/deluge'; -import { nzbgetIntegration } from '@site/docs/integrations/nzbget'; -import { qBittorentIntegration } from '@site/docs/integrations/q-bittorent'; -import { sabnzbdIntegration } from '@site/docs/integrations/sabnzbd'; -import { transmissionIntegration } from '@site/docs/integrations/transmission'; -import { slskdIntegration } from '@site/docs/integrations/slskd'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { delugeIntegration } from "@site/docs/integrations/deluge"; +import { nzbgetIntegration } from "@site/docs/integrations/nzbget"; +import { qBittorentIntegration } from "@site/docs/integrations/q-bittorent"; +import { sabnzbdIntegration } from "@site/docs/integrations/sabnzbd"; +import { transmissionIntegration } from "@site/docs/integrations/transmission"; +import { slskdIntegration } from "@site/docs/integrations/slskd"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; import { IconAd } from "@tabler/icons-react"; -import TabItem from '@theme/TabItem'; -import Tabs from '@theme/Tabs'; -import { downloadsWidget } from '.'; +import TabItem from "@theme/TabItem"; +import Tabs from "@theme/Tabs"; +import { downloadsWidget } from "."; - - + This widget displays a list of torrents or usenet-articles that are currently being downloaded, along with their progress and other relevant information. ### Screenshots -import downloadsCard from './img/screenshot.png'; +import downloadsCard from "./img/screenshot.png";
    - downloads + downloads
    ### Supported Integrations - + ### Interactions @@ -68,4 +73,5 @@ import downloadsCard from './img/screenshot.png'; ### Configuration + diff --git a/apps/docs/docs/widgets/firewall/index.mdx b/apps/docs/docs/widgets/firewall/index.mdx index 95aaa56d6..425ab8854 100644 --- a/apps/docs/docs/widgets/firewall/index.mdx +++ b/apps/docs/docs/widgets/firewall/index.mdx @@ -1,22 +1,18 @@ --- -title: 'Firewall Monitoring' -description: 'Displays a summary of firewalls.' +title: "Firewall Monitoring" +description: "Displays a summary of firewalls." hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import { firewallWidget } from '.'; -import { opnsenseIntegration } from '../../integrations/opnsense'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +import { firewallWidget } from "."; +import { opnsenseIntegration } from "../../integrations/opnsense"; - - + ### Screenshots @@ -24,9 +20,13 @@ import { opnsenseIntegration } from '../../integrations/opnsense'; ### Supported Integrations - + ### Adding the widget diff --git a/apps/docs/docs/widgets/iframe/index.mdx b/apps/docs/docs/widgets/iframe/index.mdx index 5be26f3b2..2c183368f 100644 --- a/apps/docs/docs/widgets/iframe/index.mdx +++ b/apps/docs/docs/widgets/iframe/index.mdx @@ -1,19 +1,15 @@ --- -title: 'iFrame' -description: 'Embed any content from the internet. Some websites may restrict access.' +title: "iFrame" +description: "Embed any content from the internet. Some websites may restrict access." hide_title: true --- -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { iframeWidget } from '.'; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { iframeWidget } from "."; - - + If your application is not supported natively by Homarr, you can integrate it using the iframe widget. It uses the [iframe element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe), @@ -22,8 +18,8 @@ This means, no traffic is routed through Homarr (and the URL must be reachable f ### Screenshots -import wikipediaHomepage from './img/wikipedia.png'; -import youtubeStream from './img/nasa-iss-stream.png'; +import wikipediaHomepage from "./img/wikipedia.png"; +import youtubeStream from "./img/nasa-iss-stream.png";
    iframe wikipedia-homepage @@ -50,12 +46,14 @@ the appropriate headers (such as `X-Frame-Options` or `Content-Security-Policy`) For example, to allow your site to be embedded in iframes from specific domains: **Apache (.htaccess or httpd.conf):** + ```apache Header set Content-Security-Policy "frame-ancestors 'self' https://trusted-domain.com" Header set X-Frame-Options "ALLOW-FROM https://trusted-domain.com" ``` **Nginx:** + ```nginx add_header Content-Security-Policy "frame-ancestors 'self' https://trusted-domain.com"; add_header X-Frame-Options "ALLOW-FROM https://trusted-domain.com"; @@ -67,6 +65,7 @@ add_header X-Frame-Options "ALLOW-FROM https://trusted-domain.com"; - **Any YouTube video or stream:** https://www.youtube.com/embed/dQw4w9WgXcQ?si=MWUbbG66UNTla_Ni ### Configuration + ### Transparent iframes @@ -75,15 +74,16 @@ To create a transparent iframe like below you can use the following html code an ```html - + - + ``` ![transparent iframe](./img/transparent-iframe.png) ### Third party content + :::warning The content below is an overview of third party projects. All support requests/problems must be redirected to the appropriate repository. @@ -92,11 +92,12 @@ We cannot guarantee the functionality nor security of these tools. ::: ### homarr-iframes from Diogo Valentim + The project [homarr-iframes](https://github.com/diogovalentte/homarr-iframes) has iframes designed to be used with Homarr, these iframes offer a minimalist view of other systems: - [Vikunja](https://github.com/go-vikunja/vikunja): overview of your tasks with links to them. - [Linkwarden](https://github.com/linkwarden/linkwarden): overview of your bookmarks with links to them. -- [Cinemark Brazil](https://www.cinemark.com.br): overview of the movies in Cinemark theaters in your city (*only in Brazil*). +- [Cinemark Brazil](https://www.cinemark.com.br): overview of the movies in Cinemark theaters in your city (_only in Brazil_). ![Image of the Vikunja (left), Linkwarden (middle), and Cinemark Brazil (right) iframes on a Homarr dashboard](./img/homarr-iframes-example.webp "Image of the Vikunja (left), Linkwarden (middle), and Cinemark Brazil (right) iframes on a Homarr dashboard") diff --git a/apps/docs/docs/widgets/immich-album-carousel/index.mdx b/apps/docs/docs/widgets/immich-album-carousel/index.mdx index 59b1beeb9..d33bf184b 100644 --- a/apps/docs/docs/widgets/immich-album-carousel/index.mdx +++ b/apps/docs/docs/widgets/immich-album-carousel/index.mdx @@ -1,40 +1,38 @@ --- -title: 'Immich Album Carousel' -description: 'Shows a slideshow of your album pictures from Immich' +title: "Immich Album Carousel" +description: "Shows a slideshow of your album pictures from Immich" hide_title: true --- -import { immichIntegration } from '../../integrations/immich';import { - AddingWidget -} from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { immichAlbumCarouselWidget } from '.'; +import { immichIntegration } from "../../integrations/immich"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { immichAlbumCarouselWidget } from "."; - - + ### Screenshots -import screen from './img/screen.png'; +import screen from "./img/screen.png"; immich album size-big ### Supported Integrations - + ### Adding the widget - ### Configuration - + diff --git a/apps/docs/docs/widgets/immich-server-stats/index.mdx b/apps/docs/docs/widgets/immich-server-stats/index.mdx index 73d278a91..4fcb5d4cc 100644 --- a/apps/docs/docs/widgets/immich-server-stats/index.mdx +++ b/apps/docs/docs/widgets/immich-server-stats/index.mdx @@ -1,40 +1,38 @@ --- -title: 'Immich Server Stats' -description: 'Information about your Immich instance' +title: "Immich Server Stats" +description: "Information about your Immich instance" hide_title: true --- -import { immichIntegration } from '../../integrations/immich'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { immichServerStatsWidget } from '.'; +import { immichIntegration } from "../../integrations/immich"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { immichServerStatsWidget } from "."; - - + ### Screenshots -import screen from './img/screen.png'; - +import screen from "./img/screen.png"; immich server stats size-big ### Supported Integrations - + ### Adding the widget - ### Configuration - + diff --git a/apps/docs/docs/widgets/indexer-manager/index.mdx b/apps/docs/docs/widgets/indexer-manager/index.mdx index fad8c341b..aed26828b 100644 --- a/apps/docs/docs/widgets/indexer-manager/index.mdx +++ b/apps/docs/docs/widgets/indexer-manager/index.mdx @@ -1,37 +1,37 @@ --- -title: 'Indexer manager status' -description: 'View the status of your indexers.' +title: "Indexer manager status" +description: "View the status of your indexers." hide_title: true --- -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { indexerManagerWidget } from '.'; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { indexerManagerWidget } from "."; - - + ### Screenshots -import bigItem from './img/big.png'; -import smallItem from './img/small.png'; -import { prowlarrIntegration } from '@site/docs/integrations/prowlarr'; +import bigItem from "./img/big.png"; +import smallItem from "./img/small.png"; +import { prowlarrIntegration } from "@site/docs/integrations/prowlarr"; -
    +
    indexer-manager size-big indexer-manager size-small
    ### Supported Integrations - + ### Interactions @@ -41,7 +41,6 @@ import { prowlarrIntegration } from '@site/docs/integrations/prowlarr'; - ### Configuration - + diff --git a/apps/docs/docs/widgets/media-missing/index.mdx b/apps/docs/docs/widgets/media-missing/index.mdx index 648bd4190..06799ae2e 100644 --- a/apps/docs/docs/widgets/media-missing/index.mdx +++ b/apps/docs/docs/widgets/media-missing/index.mdx @@ -1,29 +1,26 @@ --- -title: 'Media Missing & Queue' -description: 'Track missing media and active downloads from Radarr and Sonarr' +title: "Media Missing & Queue" +description: "Track missing media and active downloads from Radarr and Sonarr" hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; -import { mediaMissingWidget } from '.'; -import { radarrIntegration } from '@site/docs/integrations/radarr'; -import { sonarrIntegration } from '@site/docs/integrations/sonarr'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; +import { mediaMissingWidget } from "."; +import { radarrIntegration } from "@site/docs/integrations/radarr"; +import { sonarrIntegration } from "@site/docs/integrations/sonarr"; - + Monitor which movies and episodes are missing from your library, and track what is currently being downloaded. The widget pulls data from Radarr and Sonarr and groups results by type in two tabs. ### Screenshots -import widgetMissing from './img/missing.png'; -import widgetQueued from './img/queued.png'; -import widgetCompact from './img/compact.png'; +import widgetMissing from "./img/missing.png"; +import widgetQueued from "./img/queued.png"; +import widgetCompact from "./img/compact.png";
    media-missing widget showing missing movies and episodes in a grid @@ -33,18 +30,23 @@ import widgetCompact from './img/compact.png'; ### Supported Integrations - + ### Tabs -| Tab | Description | -|---|---| +| Tab | Description | +| ----------- | ----------------------------------------------------------------------------------------------------- | | **Missing** | Lists movies (Radarr) and episodes (Sonarr) that are monitored but not yet available in your library. | -| **Queued** | Shows items currently being downloaded with a progress bar and estimated time remaining. | +| **Queued** | Shows items currently being downloaded with a progress bar and estimated time remaining. | ### Sizing diff --git a/apps/docs/docs/widgets/media-releases/index.mdx b/apps/docs/docs/widgets/media-releases/index.mdx index fece199eb..71af2b04a 100644 --- a/apps/docs/docs/widgets/media-releases/index.mdx +++ b/apps/docs/docs/widgets/media-releases/index.mdx @@ -1,30 +1,26 @@ --- -title: 'Media releases' -description: 'Display newly added medias or upcoming releases from different integrations' +title: "Media releases" +description: "Display newly added medias or upcoming releases from different integrations" hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; -import { mediaReleasesWidget } from '.'; -import { embyIntegration } from '@site/docs/integrations/emby'; -import { jellyfinIntegration } from '@site/docs/integrations/jellyfin'; -import { plexIntegration } from '@site/docs/integrations/plex'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; +import { mediaReleasesWidget } from "."; +import { embyIntegration } from "@site/docs/integrations/emby"; +import { jellyfinIntegration } from "@site/docs/integrations/jellyfin"; +import { plexIntegration } from "@site/docs/integrations/plex"; - - + Provides a list of newly added media or upcoming releases from your media server. ### Screenshots -import backdrop from './img/backdrop.png'; -import poster from './img/poster.png'; +import backdrop from "./img/backdrop.png"; +import poster from "./img/poster.png";
    media-releases layout-backdrop @@ -33,17 +29,24 @@ import poster from './img/poster.png'; ### Supported Integrations - + ### Adding the widget ### Configuration + diff --git a/apps/docs/docs/widgets/media-request-list/index.mdx b/apps/docs/docs/widgets/media-request-list/index.mdx index 2f52a8e1f..91d0043f5 100644 --- a/apps/docs/docs/widgets/media-request-list/index.mdx +++ b/apps/docs/docs/widgets/media-request-list/index.mdx @@ -1,41 +1,42 @@ --- -title: 'Media Request List' -description: 'See a list of all media requests from your integration' +title: "Media Request List" +description: "See a list of all media requests from your integration" hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; import { IconAd } from "@tabler/icons-react"; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import { mediaRequestListWidget } from '.'; -import { jellyseerrIntegration } from '@site/docs/integrations/jellyseerr'; -import { overseerrIntegration } from '@site/docs/integrations/overseerr'; +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +import { mediaRequestListWidget } from "."; +import { jellyseerrIntegration } from "@site/docs/integrations/jellyseerr"; +import { overseerrIntegration } from "@site/docs/integrations/overseerr"; - - + Provides a list of all open and recently closed requests. It also provides the functionality to approve or reject requests. ### Screenshots -import mediaRequestList from './img/list.png'; +import mediaRequestList from "./img/list.png"; media-request-list ### Supported Integrations - + ### Interactions @@ -47,4 +48,5 @@ import mediaRequestList from './img/list.png'; ### Configuration + diff --git a/apps/docs/docs/widgets/media-request-stats/index.mdx b/apps/docs/docs/widgets/media-request-stats/index.mdx index a7b40f624..fc7d7f465 100644 --- a/apps/docs/docs/widgets/media-request-stats/index.mdx +++ b/apps/docs/docs/widgets/media-request-stats/index.mdx @@ -1,39 +1,40 @@ --- -title: 'Media Requests Stats' -description: 'Statistics about your media requests' +title: "Media Requests Stats" +description: "Statistics about your media requests" hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; import { IconAd } from "@tabler/icons-react"; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import { mediaRequestStatsWidget } from '.'; -import { jellyseerrIntegration } from '@site/docs/integrations/jellyseerr'; -import { overseerrIntegration } from '@site/docs/integrations/overseerr'; +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +import { mediaRequestStatsWidget } from "."; +import { jellyseerrIntegration } from "@site/docs/integrations/jellyseerr"; +import { overseerrIntegration } from "@site/docs/integrations/overseerr"; - - + Provide a statistics overview of your media requests, such as mount of requests, open requests, approvement and rejections. ### Supported Integrations - + ### Screenshots -import mediaRequestStats from './img/stats.png'; +import mediaRequestStats from "./img/stats.png"; media-request-stats diff --git a/apps/docs/docs/widgets/media-server/index.mdx b/apps/docs/docs/widgets/media-server/index.mdx index accd83f8e..f73e07b5c 100644 --- a/apps/docs/docs/widgets/media-server/index.mdx +++ b/apps/docs/docs/widgets/media-server/index.mdx @@ -1,53 +1,53 @@ --- -title: 'Media server streams' -description: 'Show the current streams on your media servers' +title: "Media server streams" +description: "Show the current streams on your media servers" hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; import { IconAd } from "@tabler/icons-react"; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import { mediaServerWidget } from '.'; -import { embyIntegration } from '@site/docs/integrations/emby'; -import { jellyfinIntegration } from '@site/docs/integrations/jellyfin'; -import { plexIntegration } from '@site/docs/integrations/plex'; +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +import { mediaServerWidget } from "."; +import { embyIntegration } from "@site/docs/integrations/emby"; +import { jellyfinIntegration } from "@site/docs/integrations/jellyfin"; +import { plexIntegration } from "@site/docs/integrations/plex"; + - - -The media server widget enables you to watch and view current active sessions over all your media servers. +The media server widget enables you to watch and view current active sessions over all your media servers. It also displays useful information, that you can use when providing support to users or debugging a problem. - - ### Screenshots -import mediaTable from './img/table.png'; +import mediaTable from "./img/table.png"; media-server-streams ### Supported Integrations - + ### Adding the widget ### Configuration - + diff --git a/apps/docs/docs/widgets/media-transcoding/index.mdx b/apps/docs/docs/widgets/media-transcoding/index.mdx index 0fc280021..62dd00af3 100644 --- a/apps/docs/docs/widgets/media-transcoding/index.mdx +++ b/apps/docs/docs/widgets/media-transcoding/index.mdx @@ -1,35 +1,29 @@ --- -title: 'Media transcoding' -description: 'Statistics, current queue and worker status of your media transcoding' +title: "Media transcoding" +description: "Statistics, current queue and worker status of your media transcoding" hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; import { IconAd } from "@tabler/icons-react"; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import { mediaTranscodingWidget } from '.'; -import { tdarrIntegration } from '@site/docs/integrations/tdarr'; +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +import { mediaTranscodingWidget } from "."; +import { tdarrIntegration } from "@site/docs/integrations/tdarr"; + - - -The media transcoding widget provides you with an overview of your media transcoding status. +The media transcoding widget provides you with an overview of your media transcoding status. It shows you the current queue, worker status, and statistics about your transcoding jobs. - - ### Screenshots -import queueCard from './img/queue.png'; -import workersCard from './img/workers.png'; -import statisticsCard from './img/statistics.png'; +import queueCard from "./img/queue.png"; +import workersCard from "./img/workers.png"; +import statisticsCard from "./img/statistics.png";
    media-transcoding workers-tab @@ -39,13 +33,18 @@ import statisticsCard from './img/statistics.png'; ### Supported Integrations - + ### Adding the widget ### Configuration + diff --git a/apps/docs/docs/widgets/minecraft-server-status/index.mdx b/apps/docs/docs/widgets/minecraft-server-status/index.mdx index 51101246b..d96a2f190 100644 --- a/apps/docs/docs/widgets/minecraft-server-status/index.mdx +++ b/apps/docs/docs/widgets/minecraft-server-status/index.mdx @@ -1,32 +1,28 @@ --- -title: 'Minecraft Server Status' -description: 'Displays the status of a Minecraft server.' +title: "Minecraft Server Status" +description: "Displays the status of a Minecraft server." hide_title: true --- -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; import { IconAd } from "@tabler/icons-react"; -import TabItem from '@theme/TabItem'; -import Tabs from '@theme/Tabs'; -import { minecraftServerStatusWidget } from '.'; +import TabItem from "@theme/TabItem"; +import Tabs from "@theme/Tabs"; +import { minecraftServerStatusWidget } from "."; - - + Shows the status and amount of players on a Minecraft server. It supports both Java and Bedrock editions, however only public servers are supported which can be reached through the used api of [api.mcsrvstat.us](https://api.mcsrvstat.us). ### Screenshots -import javaItem from './img/java.png'; -import bedrockItem from './img/bedrock.png'; +import javaItem from "./img/java.png"; +import bedrockItem from "./img/bedrock.png"; -
    +
    minecraft-server-status java-edition minecraft-server-status bedrock-editon
    @@ -36,9 +32,10 @@ import bedrockItem from './img/bedrock.png'; ### Configuration + ### Data source We use the Minecraft Server Status API to fetch the server status. -If you need to whitelist the api, please use the following URL: `hhttps://api.mcsrvstat.us` \ No newline at end of file +If you need to whitelist the api, please use the following URL: `hhttps://api.mcsrvstat.us` diff --git a/apps/docs/docs/widgets/network-controller-status/index.mdx b/apps/docs/docs/widgets/network-controller-status/index.mdx index a01496234..29a5bbb8e 100644 --- a/apps/docs/docs/widgets/network-controller-status/index.mdx +++ b/apps/docs/docs/widgets/network-controller-status/index.mdx @@ -1,44 +1,45 @@ --- -title: 'Network Status' -description: 'Display connected devices on a network' +title: "Network Status" +description: "Display connected devices on a network" hide_title: true --- -import { unifiControllerIntegration } from '@site/docs/integrations/unifi-controller'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { unifiControllerIntegration } from "@site/docs/integrations/unifi-controller"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; import { IconAd } from "@tabler/icons-react"; -import TabItem from '@theme/TabItem'; -import Tabs from '@theme/Tabs'; -import { networkControllerStatusWidget } from '.'; +import TabItem from "@theme/TabItem"; +import Tabs from "@theme/Tabs"; +import { networkControllerStatusWidget } from "."; - - + Shows connected users and connected guest devices on wired or wireless networks. ### Screenshots -import wifiCard from './img/wifi.png'; -import wiredCard from './img/wired.png'; +import wifiCard from "./img/wifi.png"; +import wiredCard from "./img/wired.png"; network-controller-status wifi network-controller-status wired ### Supported Integrations - + ### Adding the widget ### Configuration + diff --git a/apps/docs/docs/widgets/network-controller-summary/index.mdx b/apps/docs/docs/widgets/network-controller-summary/index.mdx index fe4cd3357..c7c2f4d4d 100644 --- a/apps/docs/docs/widgets/network-controller-summary/index.mdx +++ b/apps/docs/docs/widgets/network-controller-summary/index.mdx @@ -1,38 +1,38 @@ --- -title: 'Network Controller Summary' -description: 'Displays the summary of a Network Controller' +title: "Network Controller Summary" +description: "Displays the summary of a Network Controller" hide_title: true --- -import { unifiControllerIntegration } from '@site/docs/integrations/unifi-controller'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { unifiControllerIntegration } from "@site/docs/integrations/unifi-controller"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; import { IconAd } from "@tabler/icons-react"; -import TabItem from '@theme/TabItem'; -import Tabs from '@theme/Tabs'; -import { networkControllerSummaryWidget } from '.'; +import TabItem from "@theme/TabItem"; +import Tabs from "@theme/Tabs"; +import { networkControllerSummaryWidget } from "."; - - + Shows information whether your WAN is connected, Wi-Fi is active and several other information. ### Screenshots -import summaryCard from './img/summary.png'; +import summaryCard from "./img/summary.png"; network-controller-summary ### Supported Integrations - + ### Adding the widget diff --git a/apps/docs/docs/widgets/notifications/index.mdx b/apps/docs/docs/widgets/notifications/index.mdx index 0a715ab3c..3ca096e3c 100644 --- a/apps/docs/docs/widgets/notifications/index.mdx +++ b/apps/docs/docs/widgets/notifications/index.mdx @@ -1,42 +1,35 @@ --- -title: 'Notifications' -description: 'Display notification history from an integration' +title: "Notifications" +description: "Display notification history from an integration" hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; import { IconAd } from "@tabler/icons-react"; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import { notificationsWidget } from '.'; -import { ntfyIntegration } from '@site/docs/integrations/ntfy'; -import { nextcloudIntegration } from '@site/docs/integrations/nextcloud'; -import { gotifyIntegration } from '@site/docs/integrations/gotify'; +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +import { notificationsWidget } from "."; +import { ntfyIntegration } from "@site/docs/integrations/ntfy"; +import { nextcloudIntegration } from "@site/docs/integrations/nextcloud"; +import { gotifyIntegration } from "@site/docs/integrations/gotify"; - + The notifications widget allows you to display notifications from various integrations in a unified view. ### Screenshots -import notificationsScreenshot from './img/notifications.png'; +import notificationsScreenshot from "./img/notifications.png"; notifications ### Supported Integrations ### Adding the widget diff --git a/apps/docs/docs/widgets/paperless-ngx/index.mdx b/apps/docs/docs/widgets/paperless-ngx/index.mdx index 3dd684efd..140d667c0 100644 --- a/apps/docs/docs/widgets/paperless-ngx/index.mdx +++ b/apps/docs/docs/widgets/paperless-ngx/index.mdx @@ -1,34 +1,35 @@ --- -title: 'Paperless-ngx' -description: 'Displays document management statistics including inbox ratio, document counts, and metadata.' +title: "Paperless-ngx" +description: "Displays document management statistics including inbox ratio, document counts, and metadata." hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; -import { paperlessNgxWidget } from '.'; -import { paperlessNgxIntegration } from '@site/docs/integrations/paperless-ngx'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; +import { paperlessNgxWidget } from "."; +import { paperlessNgxIntegration } from "@site/docs/integrations/paperless-ngx"; - - + This widget displays statistics from your Paperless-ngx instance, including an inbox ratio ring showing how many documents are in your inbox versus total, along with counts for correspondents, tags, and document types. ### Supported Integrations - + ### Adding the widget ### Configuration + diff --git a/apps/docs/docs/widgets/patchmon/index.mdx b/apps/docs/docs/widgets/patchmon/index.mdx index d16ab8d68..cde2a0da5 100644 --- a/apps/docs/docs/widgets/patchmon/index.mdx +++ b/apps/docs/docs/widgets/patchmon/index.mdx @@ -1,21 +1,17 @@ --- -title: 'PatchMon' -description: 'Displays host patch statistics from PatchMon including update and security counts.' +title: "PatchMon" +description: "Displays host patch statistics from PatchMon including update and security counts." hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; -import { patchmonWidget } from '.'; -import { patchmonIntegration } from '@site/docs/integrations/patchmon'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; +import { patchmonWidget } from "."; +import { patchmonIntegration } from "@site/docs/integrations/patchmon"; - - + This widget displays patch statistics from your PatchMon instance, including total hosts, hosts needing updates, and security update counts. Each stat is shown with a dedicated icon and severity-tinted card background for quick visual scanning. @@ -39,13 +35,13 @@ In **1-column-wide** layouts (such as 1×1), the compliance hero switches to a r When **Enable threshold colors** is on (default), stat values and card backgrounds are colored for at-a-glance severity: -| Stat | Green | Yellow | Red | -|------|-------|--------|-----| -| Needs Updates | 0 | 1–4 | 5+ | -| Security Updates | 0 | 1–9 | 10+ | -| Hosts with Security Updates | 0 | — | 1+ | -| Up-to-Date Hosts | 100% of total | 90–99% | below 90% | -| Outdated Packages | 0 | 1–49 | 50+ | +| Stat | Green | Yellow | Red | +| --------------------------- | ------------- | ------ | --------- | +| Needs Updates | 0 | 1–4 | 5+ | +| Security Updates | 0 | 1–9 | 10+ | +| Hosts with Security Updates | 0 | — | 1+ | +| Up-to-Date Hosts | 100% of total | 90–99% | below 90% | +| Outdated Packages | 0 | 1–49 | 50+ | Enable **Advanced thresholds** to override warning and critical values per stat, using either absolute counts or percentages of total hosts. @@ -62,13 +58,13 @@ The OS distribution limit defaults to **All**. A widget size of **2×3** or larg The widget adapts its layout based on the available space: -| Widget size | Layout | -|-------------|--------| -| **1×1** | Primary selected content: compliance ring (no label), compact OS distribution, or up to two enabled stats | +| Widget size | Layout | +| ----------------- | ------------------------------------------------------------------------------------------------------------------- | +| **1×1** | Primary selected content: compliance ring (no label), compact OS distribution, or up to two enabled stats | | **2×1** / **1×2** | Compact primary content; **2×1** shows compliance label and host ratio beside the ring; **1×2** uses ring-only hero | -| **2×2** (default) | Compliance hero, stat grid with icons, and tinted cards | -| **2×3** / **3×2** | Hero, stats, OS distribution, and "last updated" footer | -| **3×3** or larger | Full layout with up to 4-column stat grid, donut chart, and optional OS legend | +| **2×2** (default) | Compliance hero, stat grid with icons, and tinted cards | +| **2×3** / **3×2** | Hero, stats, OS distribution, and "last updated" footer | +| **3×3** or larger | Full layout with up to 4-column stat grid, donut chart, and optional OS legend | ### Last updated @@ -76,14 +72,19 @@ When the widget has enough space, a "last updated" timestamp appears at the bott ### Supported Integrations - + ### Adding the widget ### Configuration + diff --git a/apps/docs/docs/widgets/rss-feed/index.mdx b/apps/docs/docs/widgets/rss-feed/index.mdx index 68bbb1071..d4e0b2d74 100644 --- a/apps/docs/docs/widgets/rss-feed/index.mdx +++ b/apps/docs/docs/widgets/rss-feed/index.mdx @@ -1,25 +1,21 @@ --- -title: 'RSS Feed' -description: 'Monitor and display one or more generic RSS, ATOM or JSON feeds.' +title: "RSS Feed" +description: "Monitor and display one or more generic RSS, ATOM or JSON feeds." hide_title: true --- -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { rssFeedWidget } from '.'; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { rssFeedWidget } from "."; - - + Using the RSS standard, you can integrate most News websites, applications and more on your dashboard. ### Screenshots -import screenshot from './img/screenshot.png'; +import screenshot from "./img/screenshot.png"; rss-feed noted-lol @@ -28,10 +24,13 @@ import screenshot from './img/screenshot.png'; ### Configuration + ### Examples + Here's a small collection of examples, that you can use for testing or actual use (in no particular order): + - https://noted.lol/rss/ - https://blog.google/products/chrome/rss/ - https://www.w3.org/blog/feed/ @@ -45,4 +44,4 @@ Here's a small collection of examples, that you can use for testing or actual us - http://feeds.foxnews.com/foxnews/latest There is a good list of feeds here: -https://github.com/greysonp/rss-feeds/blob/master/feeds.json \ No newline at end of file +https://github.com/greysonp/rss-feeds/blob/master/feeds.json diff --git a/apps/docs/docs/widgets/smart-home-entity-state/index.mdx b/apps/docs/docs/widgets/smart-home-entity-state/index.mdx index d101d6376..f01e4f0df 100644 --- a/apps/docs/docs/widgets/smart-home-entity-state/index.mdx +++ b/apps/docs/docs/widgets/smart-home-entity-state/index.mdx @@ -1,34 +1,30 @@ --- -title: 'Entity State' -description: 'Display the state of an entity and toggle it optionally' +title: "Entity State" +description: "Display the state of an entity and toggle it optionally" hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; import { IconAd } from "@tabler/icons-react"; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import { smartHomeEntityStateWidget } from '.'; -import { homeAssistantIntegration } from '@site/docs/integrations/home-assistant'; +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +import { smartHomeEntityStateWidget } from "."; +import { homeAssistantIntegration } from "@site/docs/integrations/home-assistant"; - - + The entity state enables you to display the current state of an entity. -This works with most entities and enables you display almost any data. +This works with most entities and enables you display almost any data. It is recommended that you transform data on the integration as much as possible since Homarr's capabilities in transformation are very limited. ### Screenshots -import sun from './img/sun.png'; -import lightSwitch from './img/light-switch.png'; -import temperature from './img/temperature.png'; +import sun from "./img/sun.png"; +import lightSwitch from "./img/light-switch.png"; +import temperature from "./img/temperature.png"; smart-home-entity-state sun smart-home-entity-state light-switch @@ -36,9 +32,13 @@ import temperature from './img/temperature.png'; ### Supported Integrations - + ### Interactions @@ -49,19 +49,21 @@ import temperature from './img/temperature.png'; ### Configuration + ### How to find the entity ID To find the entity ID in Home Assistant, follow these steps: + 1. Open Home Assistant and go to the **Developer Tools** section (usually found in the sidebar). 2. Click on the **States** tab. 3. In the list of entities, find the entity you want to use. 4. The entity ID will be displayed in the format `domain.object_id` (e.g., `light.living_room_light`). 5. Copy the entity ID and paste it into the widget configuration in Homarr. It will then show the State that is visible in Home Assistant. -import retrieveEntityId from './img/retrieve-entity-id.png'; +import retrieveEntityId from "./img/retrieve-entity-id.png";
    homeassistant retrieve-entity-id -
    \ No newline at end of file +
    diff --git a/apps/docs/docs/widgets/smart-home-execute-automation/index.mdx b/apps/docs/docs/widgets/smart-home-execute-automation/index.mdx index 522c113ca..f31a79b93 100644 --- a/apps/docs/docs/widgets/smart-home-execute-automation/index.mdx +++ b/apps/docs/docs/widgets/smart-home-execute-automation/index.mdx @@ -1,42 +1,47 @@ --- -title: 'Execute Automation' -description: 'Trigger an automation with one click' +title: "Execute Automation" +description: "Trigger an automation with one click" hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; import { IconAd } from "@tabler/icons-react"; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; -import { smartHomeExecuteAutomationWidget } from '.'; -import { homeAssistantIntegration } from '@site/docs/integrations/home-assistant'; +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +import { smartHomeExecuteAutomationWidget } from "."; +import { homeAssistantIntegration } from "@site/docs/integrations/home-assistant"; - - + The execute automation widget allows you to trigger an automation with one click. ### Screenshots -import empty from './img/empty.png'; -import withDisplayname from './img/with-displayname.png'; +import empty from "./img/empty.png"; +import withDisplayname from "./img/with-displayname.png";
    smart-home-execute-automation empty - smart-home-execute-automation with-displayname + smart-home-execute-automation with-displayname
    ### Supported Integrations - + ### Interactions @@ -47,4 +52,5 @@ import withDisplayname from './img/with-displayname.png'; ### Configuration + diff --git a/apps/docs/docs/widgets/speedtest-tracker/index.mdx b/apps/docs/docs/widgets/speedtest-tracker/index.mdx index 94be18dd7..4b0760e0a 100644 --- a/apps/docs/docs/widgets/speedtest-tracker/index.mdx +++ b/apps/docs/docs/widgets/speedtest-tracker/index.mdx @@ -1,39 +1,41 @@ --- -title: 'Speedtest Tracker' -description: 'Displays speed test results from your Speedtest Tracker instance.' +title: "Speedtest Tracker" +description: "Displays speed test results from your Speedtest Tracker instance." hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; -import { speedtestTrackerWidget } from '.'; -import { speedtestTrackerIntegration } from '@site/docs/integrations/speedtest-tracker'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; +import { speedtestTrackerWidget } from "."; +import { speedtestTrackerIntegration } from "@site/docs/integrations/speedtest-tracker"; - + This widget displays internet speed test results from your [Speedtest Tracker](https://docs.speedtest-tracker.dev/) instance, including the latest result, historical averages, and a live chart of the last 12 hours. ### Screenshots -import screenshot from './img/screenshot.png'; +import screenshot from "./img/screenshot.png"; speedtest-tracker image ### Supported Integrations - + ### Adding the widget ### Configuration + diff --git a/apps/docs/docs/widgets/stock-price/index.mdx b/apps/docs/docs/widgets/stock-price/index.mdx index 5d9a24c64..dcd091be7 100644 --- a/apps/docs/docs/widgets/stock-price/index.mdx +++ b/apps/docs/docs/widgets/stock-price/index.mdx @@ -1,28 +1,24 @@ --- -title: 'Stock Price' -description: 'Displays the current stock price of a company.' +title: "Stock Price" +description: "Displays the current stock price of a company." hide_title: true --- -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { stockPriceWidget } from '.'; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { stockPriceWidget } from "."; - - + Using the Stocks widget, you can show the current stock prices of your favorite companies on your dashboard. ### Screenshots -import apple from './img/apple.png'; -import google from './img/google.png'; -import ethereum from './img/ethereum.png'; -import nvidia from './img/nvidia.png'; +import apple from "./img/apple.png"; +import google from "./img/google.png"; +import ethereum from "./img/ethereum.png"; +import nvidia from "./img/nvidia.png";
    @@ -34,17 +30,19 @@ import nvidia from './img/nvidia.png';
    stock-price nvidia
    - ### Adding the widget ### Configuration + ### Examples + Here's a small collection of examples, that you can use for testing or actual use (in no particular order): + - AAPL - GOOGL - AMZN @@ -59,4 +57,4 @@ Here's a small collection of examples, that you can use for testing or actual us ### Data source We use the Yahoo Finance API to fetch the stock prices. -If you need to whitelist the api, please use the following URL: `https://query1.finance.yahoo.com` \ No newline at end of file +If you need to whitelist the api, please use the following URL: `https://query1.finance.yahoo.com` diff --git a/apps/docs/docs/widgets/system-disks/index.ts b/apps/docs/docs/widgets/system-disks/index.ts index 8dd68f057..ade53efc0 100644 --- a/apps/docs/docs/widgets/system-disks/index.ts +++ b/apps/docs/docs/widgets/system-disks/index.ts @@ -19,7 +19,11 @@ export const systemDisksWidget: WidgetDefinition = { description: "How disk usage values are shown", values: { type: "select", - options: ["Percentage (e.g., 76%)", "Absolute values (e.g., 800GB / 1TB)", "Free space percentage (e.g., 24% free)"], + options: [ + "Percentage (e.g., 76%)", + "Absolute values (e.g., 800GB / 1TB)", + "Free space percentage (e.g., 24% free)", + ], }, defaultValue: "Percentage (e.g., 76%)", }, diff --git a/apps/docs/docs/widgets/timetable/index.mdx b/apps/docs/docs/widgets/timetable/index.mdx index e9bdfd326..bea69cfb4 100644 --- a/apps/docs/docs/widgets/timetable/index.mdx +++ b/apps/docs/docs/widgets/timetable/index.mdx @@ -19,16 +19,8 @@ import trainDepartures from "./img/train-departures.png"; import streetDepartures from "./img/street-departures.png";
    - timetable-widget-train-departures - timetable-widget-bus-and-tram-departures + timetable-widget-train-departures + timetable-widget-bus-and-tram-departures
    ### Adding the widget diff --git a/apps/docs/docs/widgets/tracearr/index.mdx b/apps/docs/docs/widgets/tracearr/index.mdx index a579d8af3..797f83a3e 100644 --- a/apps/docs/docs/widgets/tracearr/index.mdx +++ b/apps/docs/docs/widgets/tracearr/index.mdx @@ -1,37 +1,33 @@ --- -title: 'Tracearr' -description: 'Monitor media server streams, user activity, and policy violations.' +title: "Tracearr" +description: "Monitor media server streams, user activity, and policy violations." hide_title: true --- -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; -import { tracearrWidget } from '.'; -import { tracearrIntegration } from '@site/docs/integrations/tracearr'; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; +import { tracearrWidget } from "."; +import { tracearrIntegration } from "@site/docs/integrations/tracearr"; - - + The Tracearr widget provides a real-time monitoring dashboard for your media server activity. It displays active streams, user statistics, recent watching history, and policy violations. ### Sections -| Section | Description | -|---|---| -| **Stats Bar** | Displays Active Streams, Total Users, Transcode Count, and Total Bandwidth at a glance. | -| **Active Streams** | Shows currently playing media with poster art, user info, progress bar, resolution, and transcoding status (Direct Play or Transcode). | -| **Recent Activity** | A paginated list of watching history with user avatars and watched status. | -| **Violations** | Alerts for policy violations (e.g., concurrent stream limits) with severity levels. | +| Section | Description | +| ------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | +| **Stats Bar** | Displays Active Streams, Total Users, Transcode Count, and Total Bandwidth at a glance. | +| **Active Streams** | Shows currently playing media with poster art, user info, progress bar, resolution, and transcoding status (Direct Play or Transcode). | +| **Recent Activity** | A paginated list of watching history with user avatars and watched status. | +| **Violations** | Alerts for policy violations (e.g., concurrent stream limits) with severity levels. | ### Screenshots -import widgetOverview from './img/widget-overview.png'; -import streamsAndStats from './img/streams-and-stats.png'; +import widgetOverview from "./img/widget-overview.png"; +import streamsAndStats from "./img/streams-and-stats.png";
    tracearr-widget-overview @@ -44,9 +40,14 @@ import streamsAndStats from './img/streams-and-stats.png'; ### Supported Integrations - + ### Configuration + diff --git a/apps/docs/docs/widgets/umami/index.mdx b/apps/docs/docs/widgets/umami/index.mdx index 0d0006054..b208a3311 100644 --- a/apps/docs/docs/widgets/umami/index.mdx +++ b/apps/docs/docs/widgets/umami/index.mdx @@ -1,28 +1,29 @@ --- -title: 'Umami Analytics' -description: 'Display visitor stats from your Umami analytics instance' +title: "Umami Analytics" +description: "Display visitor stats from your Umami analytics instance" hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; -import { umamiWidget } from '.'; -import { umamiIntegration } from '@site/docs/integrations/umami'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; +import { umamiWidget } from "."; +import { umamiIntegration } from "@site/docs/integrations/umami"; - + The Umami Analytics widget displays key visitor metrics from a website tracked by your [Umami](https://umami.is) instance - pageviews, unique visitors, visits, bounce rate, avg. visit duration, and real-time active visitor count. The widget body can be switched between a visitor/event chart, a multi-event chart, and ranked top pages or referrers lists. ### Supported Integrations - + ### Adding the widget @@ -34,12 +35,12 @@ The Umami Analytics widget displays key visitor metrics from a website tracked b ### View modes -| View | Description | -|---|---| -| **Chart** | Bar chart or sparkline of unique visitors over the selected time frame. Optionally overlay a single named event as a second series. | -| **Events chart** | Multi-select one or more named events and chart each as its own colored series - no visitor baseline. Supports bar and sparkline. | -| **Top pages** | Ranked list of URLs by pageview count for the selected time frame. | -| **Top referrers** | Ranked list of referrer sources by session count. Direct traffic (no referrer) is labeled "Direct". | +| View | Description | +| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------- | +| **Chart** | Bar chart or sparkline of unique visitors over the selected time frame. Optionally overlay a single named event as a second series. | +| **Events chart** | Multi-select one or more named events and chart each as its own colored series - no visitor baseline. Supports bar and sparkline. | +| **Top pages** | Ranked list of URLs by pageview count for the selected time frame. | +| **Top referrers** | Ranked list of referrer sources by session count. Direct traffic (no referrer) is labeled "Direct". | ### Notes diff --git a/apps/docs/docs/widgets/ups/index.mdx b/apps/docs/docs/widgets/ups/index.mdx index bf512990d..3e57ee57b 100644 --- a/apps/docs/docs/widgets/ups/index.mdx +++ b/apps/docs/docs/widgets/ups/index.mdx @@ -1,20 +1,17 @@ --- -title: 'UPS' -description: 'Monitor the status of your UPS devices through a NUT server.' +title: "UPS" +description: "Monitor the status of your UPS devices through a NUT server." hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; -import { upsWidget } from '.'; -import { peaNutIntegration } from '@site/docs/integrations/peanut'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; +import { upsWidget } from "."; +import { peaNutIntegration } from "@site/docs/integrations/peanut"; - + This widget displays the status of the UPS devices reported by a Network UPS Tools (NUT) server. Each device shows its status (online, on battery, charging or low battery), battery charge and estimated runtime, output load, and input and @@ -22,27 +19,32 @@ output voltage. ### Layouts -import screenshotFull from './img/screenshot.png'; -import screenshotCompact from './img/screenshot-compact.png'; -import screenshotMini from './img/screenshot-mini.png'; +import screenshotFull from "./img/screenshot.png"; +import screenshotCompact from "./img/screenshot-compact.png"; +import screenshotMini from "./img/screenshot-mini.png"; The widget adapts to the size of the tile, so it stays readable from a full dashboard panel down to a single cell. Multiple UPS devices scroll within the widget at any height. -| Layout | Size | Preview | -| --- | --- | --- | -| Full | 3+ columns wide | UPS widget full layout | -| Compact | ~2 columns | UPS widget compact layout | -| Mini | 1 column | UPS widget mini layout | +| Layout | Size | Preview | +| ------- | --------------- | --------------------------------------------------------------------------- | +| Full | 3+ columns wide | UPS widget full layout | +| Compact | ~2 columns | UPS widget compact layout | +| Mini | 1 column | UPS widget mini layout | ### Supported Integrations - + ### Adding the widget ### Configuration + diff --git a/apps/docs/docs/widgets/uptime-kuma/index.mdx b/apps/docs/docs/widgets/uptime-kuma/index.mdx index 3a6592b2e..0a7e649e8 100644 --- a/apps/docs/docs/widgets/uptime-kuma/index.mdx +++ b/apps/docs/docs/widgets/uptime-kuma/index.mdx @@ -1,34 +1,35 @@ --- -title: 'Uptime Kuma' -description: 'Displays monitor uptime statistics, average uptime percentage, and service status counts.' +title: "Uptime Kuma" +description: "Displays monitor uptime statistics, average uptime percentage, and service status counts." hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; -import { uptimeKumaWidget } from '.'; -import { uptimeKumaIntegration } from '@site/docs/integrations/uptime-kuma'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; +import { uptimeKumaWidget } from "."; +import { uptimeKumaIntegration } from "@site/docs/integrations/uptime-kuma"; - - + This widget displays uptime statistics from your Uptime Kuma status page, including a visual uptime ring, average uptime percentage, and per-status monitor counts. ### Supported Integrations - + ### Adding the widget ### Configuration + diff --git a/apps/docs/docs/widgets/video/index.mdx b/apps/docs/docs/widgets/video/index.mdx index 3ccf3760a..e5225a022 100644 --- a/apps/docs/docs/widgets/video/index.mdx +++ b/apps/docs/docs/widgets/video/index.mdx @@ -1,19 +1,15 @@ --- -title: 'Video Stream' -description: 'Embed a video stream or video from a camera or a website.' +title: "Video Stream" +description: "Embed a video stream or video from a camera or a website." hide_title: true --- -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { videoWidget } from '.'; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { videoWidget } from "."; - - + Do you run surveilance cameras? Or maybe you have a favourite video? The video widget enables you to integrate both seamlessly into your dashboard. @@ -22,7 +18,6 @@ This widget uses [video.js](https://videojs.com/) to play HLS or DASH video nati DRM content is not yet supported. More info here: https://videojs.com/guides/faqs/#q-what-is-videojs - You can use the following URL to test: http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4 @@ -35,4 +30,5 @@ http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp ### Configuration + diff --git a/apps/docs/docs/widgets/vpn/index.mdx b/apps/docs/docs/widgets/vpn/index.mdx index 0aa6a1a16..0c774a7b0 100644 --- a/apps/docs/docs/widgets/vpn/index.mdx +++ b/apps/docs/docs/widgets/vpn/index.mdx @@ -1,19 +1,16 @@ --- -title: 'VPN' -description: 'Monitor the status of your VPN integrations.' +title: "VPN" +description: "Monitor the status of your VPN integrations." hide_title: true --- -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetIntegrations } from '@site/src/components/widgets/integrations'; -import { vpnWidget } from '.'; -import { gluetunIntegration } from '@site/docs/integrations/gluetun'; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetIntegrations } from "@site/src/components/widgets/integrations"; +import { vpnWidget } from "."; +import { gluetunIntegration } from "@site/docs/integrations/gluetun"; - + The VPN widget provides a compact overview of each configured VPN integration. It shows whether the tunnel and DNS services are up, the currently exposed public IP address, and the VPN provider and protocol being used. @@ -23,7 +20,7 @@ current status at a glance. ### Screenshots -import singleIntegrationImage from './img/single.png'; +import singleIntegrationImage from "./img/single.png";
    VPN widget showing a single integration @@ -31,9 +28,13 @@ import singleIntegrationImage from './img/single.png'; ### Supported Integrations - + ### Adding the widget diff --git a/apps/docs/docs/widgets/weather/index.mdx b/apps/docs/docs/widgets/weather/index.mdx index 0ff4081d7..05b918785 100644 --- a/apps/docs/docs/widgets/weather/index.mdx +++ b/apps/docs/docs/widgets/weather/index.mdx @@ -1,26 +1,22 @@ --- -title: 'Weather' -description: 'Displays the current weather information of a set location.' +title: "Weather" +description: "Displays the current weather information of a set location." hide_title: true --- -import { AddingWidget } from '@site/src/components/widgets/adding'; -import { WidgetConfig } from '@site/src/components/widgets/configuration'; -import { WidgetHeader } from '@site/src/components/widgets/header'; -import { weatherWidget } from '.'; +import { AddingWidget } from "@site/src/components/widgets/adding"; +import { WidgetConfig } from "@site/src/components/widgets/configuration"; +import { WidgetHeader } from "@site/src/components/widgets/header"; +import { weatherWidget } from "."; - - + The Weather Widget uses your location to display the current, highest and lowest temperature. ### Screenshots -import forecastWeather from './img/forecast.png'; -import currentWeather from './img/current.png'; +import forecastWeather from "./img/forecast.png"; +import currentWeather from "./img/current.png";
    weather forecast-5-days @@ -32,9 +28,10 @@ import currentWeather from './img/current.png'; ### Configuration + ### Data source We use the Open Meteo API to fetch the weather and locations. -If you need to whitelist the api, please use the following URL: `https://open-meteo.com` \ No newline at end of file +If you need to whitelist the api, please use the following URL: `https://open-meteo.com` diff --git a/apps/docs/scripts/dump-contributors.mjs b/apps/docs/scripts/dump-contributors.mjs index f2cd60fb4..b16057c99 100644 --- a/apps/docs/scripts/dump-contributors.mjs +++ b/apps/docs/scripts/dump-contributors.mjs @@ -1,14 +1,14 @@ -import { z } from 'zod'; -import fs from 'fs/promises'; +import { z } from "zod"; +import fs from "fs/promises"; const sources = { crowdin: [ - { projectId: 534422, tokenName: 'HOMARR_CROWDIN_TOKEN' }, - { projectId: 742587, tokenName: 'HOMARR_LABS_CROWDIN_TOKEN' }, + { projectId: 534422, tokenName: "HOMARR_CROWDIN_TOKEN" }, + { projectId: 742587, tokenName: "HOMARR_LABS_CROWDIN_TOKEN" }, ], github: [ - { repository: 'homarr', slug: 'ajnart' }, - { repository: 'homarr', slug: 'homarr-labs' }, + { repository: "homarr", slug: "ajnart" }, + { repository: "homarr", slug: "homarr-labs" }, ], }; @@ -23,11 +23,11 @@ const env = schema.parse(process.env); const fetchGithubContributors = async (slug, repository) => { const url = `https://api.github.com/repos/${slug}/${repository}/contributors?per_page=999`; const options = { - method: 'GET', + method: "GET", headers: { Authorization: `Bearer ${env.GITHUB_TOKEN}`, - Accept: 'application/vnd.github+json', - 'X-GitHub-Api-Version': '2022-11-28', + Accept: "application/vnd.github+json", + "X-GitHub-Api-Version": "2022-11-28", }, }; @@ -39,7 +39,7 @@ const fetchGithubContributors = async (slug, repository) => { login: z.string(), avatar_url: z.string().url(), contributions: z.number(), - }) + }), ); return dataSchema.parse(data); @@ -48,9 +48,9 @@ const fetchGithubContributors = async (slug, repository) => { const fetchCrowdinMembers = async (projectId, tokenName) => { const url = `https://crowdin.com/api/v2/projects/${projectId}/members`; const options = { - method: 'GET', + method: "GET", headers: { - Accept: 'application/json', + Accept: "application/json", Authorization: `Bearer ${env[tokenName]}`, }, }; @@ -65,7 +65,7 @@ const fetchCrowdinMembers = async (projectId, tokenName) => { username: z.string(), avatarUrl: z.string().url(), }), - }) + }), ), }); @@ -88,16 +88,11 @@ const distinctGithubContributors = githubContributors .filter(distinctBy((contributor) => contributor.login)) .sort((a, b) => b.contributions - a.contributions) .map(({ contributions, ...props }) => props) - .filter((contributor) => !contributor.login.includes('[bot]')); -await fs.writeFile('./static/data/contributions.json', JSON.stringify(distinctGithubContributors)); + .filter((contributor) => !contributor.login.includes("[bot]")); +await fs.writeFile("./static/data/contributions.json", JSON.stringify(distinctGithubContributors)); for (const { projectId, tokenName } of sources.crowdin) { crowdinContributors.push(...(await fetchCrowdinMembers(projectId, tokenName))); } -const distinctCrowdinContributors = crowdinContributors.filter( - distinctBy((contributor) => contributor.username) -); -await fs.writeFile( - './static/data/translation-contributions.json', - JSON.stringify(distinctCrowdinContributors) -); +const distinctCrowdinContributors = crowdinContributors.filter(distinctBy((contributor) => contributor.username)); +await fs.writeFile("./static/data/translation-contributions.json", JSON.stringify(distinctCrowdinContributors)); diff --git a/apps/docs/scripts/verify-algolia-search.mjs b/apps/docs/scripts/verify-algolia-search.mjs index 4aa5e30e7..93e83baa8 100644 --- a/apps/docs/scripts/verify-algolia-search.mjs +++ b/apps/docs/scripts/verify-algolia-search.mjs @@ -1,41 +1,32 @@ -const APP_ID = 'N69WSPZTID'; -const API_KEY = 'b2b00f4ed8ca3dc87b5d211c55121416'; -const DOCSEARCH_INDEX = 'Docusaurus'; -const MARKDOWN_INDEX = 'markdown'; +const APP_ID = "N69WSPZTID"; +const API_KEY = "b2b00f4ed8ca3dc87b5d211c55121416"; +const DOCSEARCH_INDEX = "Docusaurus"; +const MARKDOWN_INDEX = "markdown"; const MIN_DOCSEARCH_HITS = 100; const MIN_MARKDOWN_HITS = 10; -const DOCSEARCH_FACETS = [ - 'docusaurus_tag', - 'language', - 'lang', - 'version', - 'type', -]; +const DOCSEARCH_FACETS = ["docusaurus_tag", "language", "lang", "version", "type"]; const SEARCH_CASES = [ - { term: 'docker', minHits: 1 }, - { term: 'coolify', minHits: 1 }, - { term: 'jellyseerr', minHits: 1 }, - { term: 'keyboard shortcuts', minHits: 1 }, - { term: 'version 0.12', minHits: 1 }, + { term: "docker", minHits: 1 }, + { term: "coolify", minHits: 1 }, + { term: "jellyseerr", minHits: 1 }, + { term: "keyboard shortcuts", minHits: 1 }, + { term: "version 0.12", minHits: 1 }, ]; const STALE_URL_PATTERN = /\/docs\/(next|\d+(?:\.\d+)+)\//; async function algoliaQuery(index, body) { - const response = await fetch( - `https://${APP_ID}-dsn.algolia.net/1/indexes/${index}/query`, - { - method: 'POST', - headers: { - 'X-Algolia-Application-Id': APP_ID, - 'X-Algolia-API-Key': API_KEY, - 'Content-Type': 'application/json', - }, - body: JSON.stringify(body), + const response = await fetch(`https://${APP_ID}-dsn.algolia.net/1/indexes/${index}/query`, { + method: "POST", + headers: { + "X-Algolia-Application-Id": APP_ID, + "X-Algolia-API-Key": API_KEY, + "Content-Type": "application/json", }, - ); + body: JSON.stringify(body), + }); if (!response.ok) { throw new Error(`Algolia query on "${index}" failed: HTTP ${response.status}`); @@ -45,7 +36,7 @@ async function algoliaQuery(index, body) { } function reportLine(ok, message) { - const prefix = ok ? 'OK' : 'FAIL'; + const prefix = ok ? "OK" : "FAIL"; console.log(`${prefix}: ${message}`); return ok; } @@ -54,14 +45,14 @@ async function resolveDocsearchIndex() { const candidates = [DOCSEARCH_INDEX, `${DOCSEARCH_INDEX}.tmp`]; for (const index of candidates) { - const result = await algoliaQuery(index, { query: '', hitsPerPage: 0 }); + const result = await algoliaQuery(index, { query: "", hitsPerPage: 0 }); const hitCount = result.nbHits ?? 0; if (hitCount >= MIN_DOCSEARCH_HITS) { return { index, hitCount }; } } - const fallback = await algoliaQuery(DOCSEARCH_INDEX, { query: '', hitsPerPage: 0 }); + const fallback = await algoliaQuery(DOCSEARCH_INDEX, { query: "", hitsPerPage: 0 }); return { index: DOCSEARCH_INDEX, hitCount: fallback.nbHits ?? 0 }; } @@ -69,14 +60,14 @@ async function resolveMarkdownIndex() { const candidates = [MARKDOWN_INDEX, `${MARKDOWN_INDEX}.tmp`]; for (const index of candidates) { - const result = await algoliaQuery(index, { query: '', hitsPerPage: 0 }); + const result = await algoliaQuery(index, { query: "", hitsPerPage: 0 }); const hitCount = result.nbHits ?? 0; if (hitCount >= MIN_MARKDOWN_HITS) { return { index, hitCount }; } } - const fallback = await algoliaQuery(MARKDOWN_INDEX, { query: '', hitsPerPage: 0 }); + const fallback = await algoliaQuery(MARKDOWN_INDEX, { query: "", hitsPerPage: 0 }); return { index: MARKDOWN_INDEX, hitCount: fallback.nbHits ?? 0 }; } @@ -87,13 +78,13 @@ async function verifyDocsearchIndex(index, hitCount) { ); const sample = await algoliaQuery(index, { - query: 'docker', + query: "docker", hitsPerPage: 1, attributesToRetrieve: DOCSEARCH_FACETS, }); const record = sample.hits?.[0] ?? {}; - const recordFields = ['docusaurus_tag', 'language', 'lang', 'version', 'type']; + const recordFields = ["docusaurus_tag", "language", "lang", "version", "type"]; for (const field of recordFields) { const present = record[field] !== undefined && record[field] !== null; ok = reportLine(present, `records include "${field}"`) && ok; @@ -103,7 +94,7 @@ async function verifyDocsearchIndex(index, hitCount) { const result = await algoliaQuery(index, { query: searchCase.term, hitsPerPage: 5, - attributesToRetrieve: ['url'], + attributesToRetrieve: ["url"], }); const caseHits = result.nbHits ?? 0; @@ -113,9 +104,7 @@ async function verifyDocsearchIndex(index, hitCount) { `"${searchCase.term}" returns ${caseHits} hits (need >= ${searchCase.minHits})`, ) && ok; - const staleUrls = (result.hits ?? []) - .map((hit) => hit.url) - .filter((url) => STALE_URL_PATTERN.test(url)); + const staleUrls = (result.hits ?? []).map((hit) => hit.url).filter((url) => STALE_URL_PATTERN.test(url)); ok = reportLine( @@ -134,51 +123,39 @@ async function verifyMarkdownIndex(index, hitCount) { ); const coolify = await algoliaQuery(index, { - query: 'coolify', + query: "coolify", hitsPerPage: 3, - attributesToRetrieve: ['url', 'title', 'heading', 'text'], + attributesToRetrieve: ["url", "title", "heading", "text"], }); ok = - reportLine( - (coolify.nbHits ?? 0) >= 1, - `markdown index "${index}" returns coolify (${coolify.nbHits ?? 0} hits)`, - ) && ok; + reportLine((coolify.nbHits ?? 0) >= 1, `markdown index "${index}" returns coolify (${coolify.nbHits ?? 0} hits)`) && + ok; const sample = coolify.hits?.[0]; - ok = - reportLine( - Boolean(sample?.text?.length), - `markdown records include chunked text content`, - ) && ok; + ok = reportLine(Boolean(sample?.text?.length), `markdown records include chunked text content`) && ok; return ok; } async function main() { - console.log('Verifying Algolia DocSearch + markdown indices...\n'); + console.log("Verifying Algolia DocSearch + markdown indices...\n"); const docsearch = await resolveDocsearchIndex(); console.log(`Using DocSearch index: ${docsearch.index}\n`); - const docsearchOk = await verifyDocsearchIndex( - docsearch.index, - docsearch.hitCount, - ); + const docsearchOk = await verifyDocsearchIndex(docsearch.index, docsearch.hitCount); - console.log(''); + console.log(""); const markdown = await resolveMarkdownIndex(); console.log(`Using markdown index: ${markdown.index}\n`); - const markdownOk = await verifyMarkdownIndex( - markdown.index, - markdown.hitCount, - ); + const markdownOk = await verifyMarkdownIndex(markdown.index, markdown.hitCount); const allOk = docsearchOk && markdownOk; - console.log(''); + console.log(""); console.log( allOk - ? 'All checks passed.' - : 'Some checks failed — ensure the crawler config in docsearch.config.js is applied and a full recrawl has finished.', + ? "All checks passed." + : "Some checks failed — ensure the crawler config in docsearch.config.js is applied and a full recrawl has finished.", ); process.exit(allOk ? 0 : 1); } diff --git a/apps/docs/src/components/pages/home/integrations/available-integrations.module.css b/apps/docs/src/components/pages/home/integrations/available-integrations.module.css index a9c057d1c..d65f59e95 100644 --- a/apps/docs/src/components/pages/home/integrations/available-integrations.module.css +++ b/apps/docs/src/components/pages/home/integrations/available-integrations.module.css @@ -1,20 +1,20 @@ @keyframes scrolling { - 0% { - transform: translateY(0); - } - 100% { - transform: translateY(-50.8%); - } + 0% { + transform: translateY(0); + } + 100% { + transform: translateY(-50.8%); + } } .scrollAnimationContainer { - animation: scrolling; - animation-timing-function: linear; - animation-iteration-count: infinite; + animation: scrolling; + animation-timing-function: linear; + animation-iteration-count: infinite; } @media (prefers-reduced-motion: reduce) { - .scrollAnimationContainer { - animation: none !important; - } -} \ No newline at end of file + .scrollAnimationContainer { + animation: none !important; + } +} diff --git a/apps/docs/src/components/pages/home/review-list/styles.module.css b/apps/docs/src/components/pages/home/review-list/styles.module.css index 5cff5a7d2..53f4abaaa 100644 --- a/apps/docs/src/components/pages/home/review-list/styles.module.css +++ b/apps/docs/src/components/pages/home/review-list/styles.module.css @@ -4,8 +4,6 @@ margin-bottom: 50px; } - - .communityFeedbackPlaceholderImage { display: block; margin: 0 auto; @@ -14,5 +12,3 @@ .communityFeedbackPlaceholderText { text-align: center; } - - diff --git a/apps/docs/src/css/custom.css b/apps/docs/src/css/custom.css index 93d4ab319..ee3f4665b 100644 --- a/apps/docs/src/css/custom.css +++ b/apps/docs/src/css/custom.css @@ -23,14 +23,14 @@ --aa-primary-color-rgb: #fa5252 !important; --aa-muted-color-rgb: #fa5252 !important; - --aa-background-color-rgb: 200,200,200 !important; + --aa-background-color-rgb: 200, 200, 200 !important; - --ifm-font-family-base: 'Work Sans', sans-serif; + --ifm-font-family-base: "Work Sans", sans-serif; --ifm-color-content-inverse: var(--ifm-color-emphasis-100); } /* For readability concerns, you should choose a lighter palette in dark mode. */ -[data-theme='dark'] { +[data-theme="dark"] { --ifm-color-primary: #fa5252; --ifm-color-primary-dark: #f93232; --ifm-color-primary-darker: #f92222; @@ -42,10 +42,9 @@ --homarr-secondary-bg: #181818; --ifm-color-content-inverse: var(--ifm-color-emphasis-100); - --aa-primary-color-rgb: #fa5252 !important; --aa-muted-color-rgb: #fa5252 !important; - --aa-background-color-rgb: 24,24,24 !important; + --aa-background-color-rgb: 24, 24, 24 !important; } .aa-DetachedOverlay { @@ -80,7 +79,7 @@ } .footer__copyright span.copyright_text { - opacity: .6; + opacity: 0.6; } .medium-zoom-overlay { @@ -97,7 +96,7 @@ .announcementBar_node_modules-\@docusaurus-theme-classic-lib-theme-AnnouncementBar-styles-module { background-color: transparent !important; - background-image: radial-gradient(circle, rgb(253, 126, 20) 0%, rgb(250, 82, 82) 100%) !important; + background-image: radial-gradient(circle, rgb(253, 126, 20) 0%, rgb(250, 82, 82) 100%) !important; font-weight: 600; } @@ -135,7 +134,7 @@ html[data-theme="dark"] div#__docusaurus div[role="banner"] button svg { color: var(--ifm-color-primary); } -:is(p, h3, h4, h5, h6):has(+ :is(ul, ol)){ +:is(p, h3, h4, h5, h6):has(+ :is(ul, ol)) { margin-bottom: 4px !important; } @@ -164,7 +163,6 @@ html[data-theme="dark"] div#__docusaurus div[role="banner"] button svg { padding: 6px 12px; } - .hero-cards { transform: rotate(20deg) scale(0.8) skew(21deg); -webkit-transform: rotate(20deg) scale(0.8) skew(21deg); @@ -180,7 +178,7 @@ html[data-theme="dark"] div#__docusaurus div[role="banner"] button svg { } .app-card img { - transition: transform 0.1s ease-in-out; + transition: transform 0.1s ease-in-out; } .app-card:hover img { @@ -188,7 +186,7 @@ html[data-theme="dark"] div#__docusaurus div[role="banner"] button svg { } .hover-animation { - animation: hover-animation 5s ease-in-out forwards; + animation: hover-animation 5s ease-in-out forwards; animation-iteration-count: infinite; } diff --git a/apps/docs/src/pages/index.module.css b/apps/docs/src/pages/index.module.css index baeb80f6d..726246ae2 100644 --- a/apps/docs/src/pages/index.module.css +++ b/apps/docs/src/pages/index.module.css @@ -27,7 +27,6 @@ section { max-width: min(100%, 500px); } - .heroBanner { padding: 4rem; position: relative; diff --git a/apps/docs/static/api/open-api-schema.json b/apps/docs/static/api/open-api-schema.json index ca2f93d64..4805d35d5 100644 --- a/apps/docs/static/api/open-api-schema.json +++ b/apps/docs/static/api/open-api-schema.json @@ -1 +1,2265 @@ -{"openapi":"3.1.0","info":{"title":"Homarr API documentation","version":"1.1.0"},"servers":[{"url":"http://localhost:3000"}],"externalDocs":{"url":"https://homarr.dev"},"paths":{"/api/apps/paginated":{"get":{"operationId":"appRouter-getPaginated","tags":["apps"],"security":[{"apikey":[]}],"parameters":[{"in":"query","name":"search","schema":{"type":"string"}},{"in":"query","name":"pageSize","schema":{"default":10,"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},{"in":"query","name":"page","schema":{"default":1,"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"iconUrl":{"type":"string"},"href":{"anyOf":[{"type":"string"},{"type":"null"}]},"pingUrl":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","description","iconUrl","href","pingUrl"],"additionalProperties":false}},"totalCount":{"type":"number"}},"required":["items","totalCount"],"additionalProperties":false}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/apps":{"get":{"operationId":"appRouter-all","tags":["apps"],"security":[{"apikey":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"iconUrl":{"type":"string"},"href":{"anyOf":[{"type":"string"},{"type":"null"}]},"pingUrl":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","description","iconUrl","href","pingUrl"],"additionalProperties":false}}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}},"post":{"operationId":"appRouter-create","tags":["apps"],"security":[{"apikey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":64},"description":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}]},"iconUrl":{"type":"string","minLength":1},"href":{"anyOf":[{"anyOf":[{"type":"string","pattern":"^(?!javascript)[a-zA-Z]*:\\/\\/"},{"type":"string","const":""}]},{"type":"null"}]},"pingUrl":{"anyOf":[{"anyOf":[{"type":"string","pattern":"^https?:\\/\\/"},{"type":"string","const":""}]},{"type":"null"}]}},"required":["name","description","iconUrl","href","pingUrl"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"appId":{"type":"string"}},"required":["appId"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"iconUrl":{"type":"string"},"href":{"anyOf":[{"type":"string"},{"type":"null"}]},"pingUrl":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","description","iconUrl","href","pingUrl"],"additionalProperties":false}]}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/apps/search":{"get":{"operationId":"appRouter-search","tags":["apps"],"security":[{"apikey":[]}],"parameters":[{"in":"query","name":"query","schema":{"type":"string"},"required":true},{"in":"query","name":"limit","schema":{"default":10,"type":"number","minimum":1,"maximum":100}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"iconUrl":{"type":"string"},"href":{"anyOf":[{"type":"string"},{"type":"null"}]},"pingUrl":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","description","iconUrl","href","pingUrl"],"additionalProperties":false}}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/apps/selectable":{"get":{"operationId":"appRouter-selectable","tags":["apps"],"security":[{"apikey":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"iconUrl":{"type":"string"},"href":{"anyOf":[{"type":"string"},{"type":"null"}]},"pingUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","iconUrl","href","pingUrl","description"],"additionalProperties":false}}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/apps/{id}":{"get":{"operationId":"appRouter-byId","tags":["apps"],"security":[{"apikey":[]}],"parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"iconUrl":{"type":"string"},"href":{"anyOf":[{"type":"string"},{"type":"null"}]},"pingUrl":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","description","iconUrl","href","pingUrl"],"additionalProperties":false}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}},"patch":{"operationId":"appRouter-update","tags":["apps"],"security":[{"apikey":[]}],"parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":64},"description":{"anyOf":[{"type":"string","maxLength":512},{"type":"null"}]},"iconUrl":{"type":"string","minLength":1},"href":{"anyOf":[{"anyOf":[{"type":"string","pattern":"^(?!javascript)[a-zA-Z]*:\\/\\/"},{"type":"string","const":""}]},{"type":"null"}]},"pingUrl":{"anyOf":[{"anyOf":[{"type":"string","pattern":"^https?:\\/\\/"},{"type":"string","const":""}]},{"type":"null"}]}},"required":["name","description","iconUrl","href","pingUrl"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}},"delete":{"operationId":"appRouter-delete","tags":["apps"],"security":[{"apikey":[]}],"parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/boards":{"get":{"operationId":"boardRouter-getAllBoards","tags":["boards"],"security":[{"apikey":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"logoImageUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"isPublic":{"type":"boolean"},"creator":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"image":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","image","email"],"additionalProperties":false},{"type":"null"}]},"isHome":{"type":"boolean"},"isMobileHome":{"type":"boolean"},"userPermissions":{"type":"array","items":{"type":"object","properties":{"permission":{"type":"string","enum":["view","modify","full"]}},"required":["permission"],"additionalProperties":false}},"groupPermissions":{"type":"array","items":{"type":"object","properties":{"permission":{"type":"string","enum":["view","modify","full"]}},"required":["permission"],"additionalProperties":false}}},"required":["id","name","logoImageUrl","isPublic","creator","isHome","isMobileHome","userPermissions","groupPermissions"],"additionalProperties":false}}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}},"post":{"operationId":"boardRouter-createBoard","tags":["boards"],"security":[{"apikey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[A-Za-z0-9-_]*$"},"columnCount":{"type":"number","minimum":1,"maximum":24},"isPublic":{"type":"boolean"}},"required":["name","columnCount","isPublic"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"boardId":{"type":"string"}},"required":["boardId"],"additionalProperties":false}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/boards/{id}/duplicate":{"post":{"operationId":"boardRouter-duplicateBoard","tags":["boards"],"security":[{"apikey":[]}],"parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[A-Za-z0-9-_]*$"}},"required":["name"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"boardId":{"type":"string"}},"required":["boardId"],"additionalProperties":false}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/boards/{id}/name":{"patch":{"operationId":"boardRouter-renameBoard","tags":["boards"],"security":[{"apikey":[]}],"parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[A-Za-z0-9-_]*$"}},"required":["name"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/boards/{id}/visibility":{"patch":{"operationId":"boardRouter-changeBoardVisibility","tags":["boards"],"security":[{"apikey":[]}],"parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"visibility":{"type":"string","enum":["public","private"]}},"required":["visibility"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/boards/{id}":{"delete":{"operationId":"boardRouter-deleteBoard","tags":["boards"],"security":[{"apikey":[]}],"parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/boards/{id}/home":{"patch":{"operationId":"boardRouter-setHomeBoard","tags":["boards"],"security":[{"apikey":[]}],"parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/boards/{id}/mobile-home":{"patch":{"operationId":"boardRouter-setMobileHomeBoard","tags":["boards"],"security":[{"apikey":[]}],"parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/boards/{id}/settings":{"patch":{"operationId":"boardRouter-savePartialBoardSettings","tags":["boards"],"security":[{"apikey":[]}],"parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"pageTitle":{"anyOf":[{"type":"string"},{"type":"null"}]},"metaTitle":{"anyOf":[{"type":"string"},{"type":"null"}]},"logoImageUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"faviconImageUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"backgroundImageUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"backgroundImageAttachment":{"type":"string","enum":["fixed","scroll"]},"backgroundImageRepeat":{"type":"string","enum":["repeat","repeat-x","repeat-y","no-repeat"]},"backgroundImageSize":{"type":"string","enum":["cover","contain"]},"primaryColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"secondaryColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},"opacity":{"type":"number","minimum":0,"maximum":100},"customCss":{"type":"string","maxLength":16384},"iconColor":{"anyOf":[{"anyOf":[{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$"},{"type":"string","const":""}]},{"type":"null"}]},"itemRadius":{"anyOf":[{"type":"string","const":"xs"},{"type":"string","const":"sm"},{"type":"string","const":"md"},{"type":"string","const":"lg"},{"type":"string","const":"xl"}]},"disableStatus":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/boards/items":{"post":{"operationId":"boardRouter-addItem","tags":["boards"],"security":[{"apikey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"boardId":{"type":"string"},"kind":{"type":"string","enum":["clock","weather","app","iframe","video","notebook","anchorNote","dnsHoleSummary","dnsHoleControls","smartHome-entityState","smartHome-executeAutomation","stockPrice","mediaServer","calendar","downloads","mediaRequests-requestList","mediaRequests-requestStats","mediaTranscoding","minecraftServerStatus","networkControllerSummary","networkControllerStatus","rssFeed","bookmarks","indexerManager","healthMonitoring","releases","mediaReleases","dockerContainers","firewall","notifications","systemResources","coolify","systemDisks","timetable","immich-serverStats","immich-albumCarousel","paperlessNgx","tracearr","speedtestTracker","uptimeKuma","audioStats","umami","vpn","archiveTeamWarrior","ups","beszelSystemTable","beszelSystemGrid","beszelAlerts","beszelSystemStats","customApi"]},"options":{"default":{},"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"integrationIds":{"default":[],"type":"array","items":{"type":"string"}}},"required":["boardId","kind"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"itemId":{"type":"string"}},"required":["itemId"],"additionalProperties":false}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/info":{"get":{"operationId":"infoRouter-getInfo","tags":["info"],"security":[{"apikey":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"version":{"type":"string"}},"required":["version"],"additionalProperties":false}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/invites":{"get":{"operationId":"inviteRouter-getAll","tags":["invites"],"security":[{"apikey":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"expirationDate":{"type":"string"},"creator":{"type":"object","properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"id":{"type":"string"}},"required":["name","id"],"additionalProperties":false}},"required":["id","expirationDate","creator"],"additionalProperties":false}}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}},"post":{"operationId":"inviteRouter-createInvite","tags":["invites"],"security":[{"apikey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"expirationDate":{"type":"string"}},"required":["expirationDate"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"token":{"type":"string"}},"required":["id","token"],"additionalProperties":false}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/invites/{id}":{"delete":{"operationId":"inviteRouter-deleteInvite","tags":["invites"],"security":[{"apikey":[]}],"parameters":[{"in":"path","name":"id","schema":{"type":"string"},"required":true}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"not":{}}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/settings/board":{"get":{"operationId":"serverSettingsRouter-getBoardSettings","tags":["settings"],"security":[{"apikey":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"homeBoardId":{"anyOf":[{"type":"string"},{"type":"null"}]},"mobileHomeBoardId":{"anyOf":[{"type":"string"},{"type":"null"}]},"enableStatusByDefault":{"type":"boolean"},"forceDisableStatus":{"type":"boolean"}},"required":["homeBoardId","mobileHomeBoardId","enableStatusByDefault","forceDisableStatus"],"additionalProperties":false}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}},"patch":{"operationId":"serverSettingsRouter-updateBoardSettings","tags":["settings"],"security":[{"apikey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"homeBoardId":{"anyOf":[{"type":"string"},{"type":"null"}]},"mobileHomeBoardId":{"anyOf":[{"type":"string"},{"type":"null"}]},"enableStatusByDefault":{"type":"boolean"},"forceDisableStatus":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"homeBoardId":{"anyOf":[{"type":"string"},{"type":"null"}]},"mobileHomeBoardId":{"anyOf":[{"type":"string"},{"type":"null"}]},"enableStatusByDefault":{"type":"boolean"},"forceDisableStatus":{"type":"boolean"}},"required":["homeBoardId","mobileHomeBoardId","enableStatusByDefault","forceDisableStatus"],"additionalProperties":false}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/users":{"post":{"operationId":"userRouter-create","tags":["users"],"security":[{"apikey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string","minLength":3,"maxLength":255},"password":{"type":"string","minLength":8,"maxLength":255},"confirmPassword":{"type":"string"},"email":{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"string","minLength":0,"maxLength":0}]},"groupIds":{"type":"array","items":{"type":"string"}}},"required":["username","password","confirmPassword","groupIds"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}},"get":{"operationId":"userRouter-getAll","tags":["users"],"security":[{"apikey":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"emailVerified":{"anyOf":[{"type":"string"},{"type":"null"}]},"image":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","email","emailVerified","image"],"additionalProperties":false}}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/users/profileImage":{"put":{"operationId":"userRouter-setProfileImage","tags":["users"],"security":[{"apikey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userId":{"type":"string"},"image":{"anyOf":[{"type":"string","maxLength":350000,"pattern":"^data:image\\/(png|jpeg|gif|webp);base64,[A-Za-z0-9/+]+=*$"},{"type":"null"}]}},"required":["userId","image"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/users/selectable":{"get":{"operationId":"userRouter-selectable","tags":["users"],"security":[{"apikey":[]}],"parameters":[{"in":"query","name":"providers","schema":{"type":"array","items":{"type":"string","enum":["credentials","oidc","ldap"]}}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"image":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","image","email"],"additionalProperties":false}}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/users/search":{"post":{"operationId":"userRouter-search","tags":["users"],"security":[{"apikey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string"},"limit":{"default":10,"type":"number","minimum":1,"maximum":100}},"required":["query"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"image":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["id","name","image","email"],"additionalProperties":false}}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/users/{userId}":{"get":{"operationId":"userRouter-getById","tags":["users"],"security":[{"apikey":[]}],"parameters":[{"in":"path","name":"userId","schema":{"type":"string"},"required":true}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"emailVerified":{"anyOf":[{"type":"string"},{"type":"null"}]},"image":{"anyOf":[{"type":"string"},{"type":"null"}]},"provider":{"type":"string"},"homeBoardId":{"anyOf":[{"type":"string"},{"type":"null"}]},"mobileHomeBoardId":{"anyOf":[{"type":"string"},{"type":"null"}]},"firstDayOfWeek":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"pingIconsEnabled":{"type":"boolean"},"defaultSearchEngineId":{"anyOf":[{"type":"string"},{"type":"null"}]},"openSearchInNewTab":{"type":"boolean"},"ddgBangs":{"type":"boolean"},"completedManageTour":{"type":"boolean"},"completedBoardTour":{"type":"boolean"}},"required":["id","name","email","emailVerified","image","provider","homeBoardId","mobileHomeBoardId","firstDayOfWeek","pingIconsEnabled","defaultSearchEngineId","openSearchInNewTab","ddgBangs","completedManageTour","completedBoardTour"],"additionalProperties":false}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}},"delete":{"operationId":"userRouter-delete","tags":["users"],"security":[{"apikey":[]}],"parameters":[{"in":"path","name":"userId","schema":{"type":"string"},"required":true}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/users/profile":{"put":{"operationId":"userRouter-editProfile","tags":["users"],"security":[{"apikey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","minLength":3,"maxLength":255},"email":{"anyOf":[{"anyOf":[{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},{"type":"string","const":""}]},{"type":"null"}]}},"required":["id","name"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/users/{userId}/changePassword":{"patch":{"operationId":"userRouter-changePassword","tags":["users"],"security":[{"apikey":[]}],"parameters":[{"in":"path","name":"userId","schema":{"type":"string"},"required":true}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"previousPassword":{"type":"string","minLength":1},"password":{"type":"string","minLength":8,"maxLength":255},"confirmPassword":{"type":"string"}},"required":["previousPassword","password","confirmPassword"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/users/changeHome":{"patch":{"operationId":"userRouter-changeHomeBoards","tags":["users"],"security":[{"apikey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"homeBoardId":{"anyOf":[{"type":"string"},{"type":"null"}]},"mobileHomeBoardId":{"anyOf":[{"type":"string"},{"type":"null"}]},"userId":{"type":"string"}},"required":["homeBoardId","mobileHomeBoardId","userId"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/users/changeSearchEngine":{"patch":{"operationId":"userRouter-changeDefaultSearchEngine","tags":["users"],"security":[{"apikey":[]}],"deprecated":true,"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"defaultSearchEngineId":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}]},"ddgBangsEnabled":{"type":"boolean"},"userId":{"type":"string"}},"required":["defaultSearchEngineId","ddgBangsEnabled","userId"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/users/search-preferences":{"patch":{"operationId":"userRouter-changeSearchPreferences","tags":["users"],"security":[{"apikey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"defaultSearchEngineId":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}]},"openInNewTab":{"type":"boolean"},"ddgBangsEnabled":{"type":"boolean"},"userId":{"type":"string"}},"required":["defaultSearchEngineId","openInNewTab","ddgBangsEnabled","userId"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/users/changeScheme":{"patch":{"operationId":"userRouter-changeColorScheme","tags":["users"],"security":[{"apikey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"colorScheme":{"type":"string","enum":["auto","light","dark"]}},"required":["colorScheme"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/users/ddg-bangs":{"patch":{"operationId":"userRouter-changeDdgBangs","tags":["users"],"security":[{"apikey":[]}],"deprecated":true,"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ddgBangs":{"type":"boolean"},"id":{"type":"string"}},"required":["ddgBangs","id"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}},"/api/users/firstDayOfWeek":{"patch":{"operationId":"userRouter-changeFirstDayOfWeek","tags":["users"],"security":[{"apikey":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"firstDayOfWeek":{"type":"number","minimum":0,"maximum":6},"id":{"type":"string"}},"required":["firstDayOfWeek","id"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}},"400":{"description":"Invalid input data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.BAD_REQUEST"}}}},"401":{"description":"Authorization not provided","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.UNAUTHORIZED"}}}},"403":{"description":"Insufficient access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.FORBIDDEN"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.NOT_FOUND"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/error.INTERNAL_SERVER_ERROR"}}}}}}}},"components":{"schemas":{"error.BAD_REQUEST":{"type":"object","properties":{"message":{"type":"string","description":"The error message","example":"Invalid input data"},"code":{"type":"string","description":"The error code","example":"BAD_REQUEST"},"issues":{"description":"An array of issues that were responsible for the error","example":[],"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["message","code"],"additionalProperties":false,"title":"Invalid input data error (400)","description":"The error information","example":{"code":"BAD_REQUEST","message":"Invalid input data","issues":[]}},"error.UNAUTHORIZED":{"type":"object","properties":{"message":{"type":"string","description":"The error message","example":"Authorization not provided"},"code":{"type":"string","description":"The error code","example":"UNAUTHORIZED"},"issues":{"description":"An array of issues that were responsible for the error","example":[],"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["message","code"],"additionalProperties":false,"title":"Authorization not provided error (401)","description":"The error information","example":{"code":"UNAUTHORIZED","message":"Authorization not provided","issues":[]}},"error.FORBIDDEN":{"type":"object","properties":{"message":{"type":"string","description":"The error message","example":"Insufficient access"},"code":{"type":"string","description":"The error code","example":"FORBIDDEN"},"issues":{"description":"An array of issues that were responsible for the error","example":[],"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["message","code"],"additionalProperties":false,"title":"Insufficient access error (403)","description":"The error information","example":{"code":"FORBIDDEN","message":"Insufficient access","issues":[]}},"error.NOT_FOUND":{"type":"object","properties":{"message":{"type":"string","description":"The error message","example":"Not found"},"code":{"type":"string","description":"The error code","example":"NOT_FOUND"},"issues":{"description":"An array of issues that were responsible for the error","example":[],"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["message","code"],"additionalProperties":false,"title":"Not found error (404)","description":"The error information","example":{"code":"NOT_FOUND","message":"Not found","issues":[]}},"error.INTERNAL_SERVER_ERROR":{"type":"object","properties":{"message":{"type":"string","description":"The error message","example":"Internal server error"},"code":{"type":"string","description":"The error code","example":"INTERNAL_SERVER_ERROR"},"issues":{"description":"An array of issues that were responsible for the error","example":[],"type":"array","items":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}}},"required":["message","code"],"additionalProperties":false,"title":"Internal server error error (500)","description":"The error information","example":{"code":"INTERNAL_SERVER_ERROR","message":"Internal server error","issues":[]}}},"securitySchemes":{"apikey":{"type":"apiKey","name":"ApiKey","description":"API key which can be obtained in the Homarr administration dashboard","in":"header"}}}} \ No newline at end of file +{ + "openapi": "3.1.0", + "info": { "title": "Homarr API documentation", "version": "1.1.0" }, + "servers": [{ "url": "http://localhost:3000" }], + "externalDocs": { "url": "https://homarr.dev" }, + "paths": { + "/api/apps/paginated": { + "get": { + "operationId": "appRouter-getPaginated", + "tags": ["apps"], + "security": [{ "apikey": [] }], + "parameters": [ + { "in": "query", "name": "search", "schema": { "type": "string" } }, + { + "in": "query", + "name": "pageSize", + "schema": { "default": 10, "type": "integer", "exclusiveMinimum": 0, "maximum": 9007199254740991 } + }, + { + "in": "query", + "name": "page", + "schema": { "default": 1, "type": "integer", "exclusiveMinimum": 0, "maximum": 9007199254740991 } + } + ], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "name": { "type": "string" }, + "description": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "iconUrl": { "type": "string" }, + "href": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "pingUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] } + }, + "required": ["id", "name", "description", "iconUrl", "href", "pingUrl"], + "additionalProperties": false + } + }, + "totalCount": { "type": "number" } + }, + "required": ["items", "totalCount"], + "additionalProperties": false + } + } + } + }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "404": { + "description": "Not found", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.NOT_FOUND" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/apps": { + "get": { + "operationId": "appRouter-all", + "tags": ["apps"], + "security": [{ "apikey": [] }], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "name": { "type": "string" }, + "description": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "iconUrl": { "type": "string" }, + "href": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "pingUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] } + }, + "required": ["id", "name", "description", "iconUrl", "href", "pingUrl"], + "additionalProperties": false + } + } + } + } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + }, + "post": { + "operationId": "appRouter-create", + "tags": ["apps"], + "security": [{ "apikey": [] }], + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { "type": "string", "minLength": 1, "maxLength": 64 }, + "description": { "anyOf": [{ "type": "string", "maxLength": 512 }, { "type": "null" }] }, + "iconUrl": { "type": "string", "minLength": 1 }, + "href": { + "anyOf": [ + { + "anyOf": [ + { "type": "string", "pattern": "^(?!javascript)[a-zA-Z]*:\\/\\/" }, + { "type": "string", "const": "" } + ] + }, + { "type": "null" } + ] + }, + "pingUrl": { + "anyOf": [ + { + "anyOf": [ + { "type": "string", "pattern": "^https?:\\/\\/" }, + { "type": "string", "const": "" } + ] + }, + { "type": "null" } + ] + } + }, + "required": ["name", "description", "iconUrl", "href", "pingUrl"] + } + } + } + }, + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { "appId": { "type": "string" } }, + "required": ["appId"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "name": { "type": "string" }, + "description": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "iconUrl": { "type": "string" }, + "href": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "pingUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] } + }, + "required": ["id", "name", "description", "iconUrl", "href", "pingUrl"], + "additionalProperties": false + } + ] + } + } + } + }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/apps/search": { + "get": { + "operationId": "appRouter-search", + "tags": ["apps"], + "security": [{ "apikey": [] }], + "parameters": [ + { "in": "query", "name": "query", "schema": { "type": "string" }, "required": true }, + { + "in": "query", + "name": "limit", + "schema": { "default": 10, "type": "number", "minimum": 1, "maximum": 100 } + } + ], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "name": { "type": "string" }, + "description": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "iconUrl": { "type": "string" }, + "href": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "pingUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] } + }, + "required": ["id", "name", "description", "iconUrl", "href", "pingUrl"], + "additionalProperties": false + } + } + } + } + }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "404": { + "description": "Not found", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.NOT_FOUND" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/apps/selectable": { + "get": { + "operationId": "appRouter-selectable", + "tags": ["apps"], + "security": [{ "apikey": [] }], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "name": { "type": "string" }, + "iconUrl": { "type": "string" }, + "href": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "pingUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "description": { "anyOf": [{ "type": "string" }, { "type": "null" }] } + }, + "required": ["id", "name", "iconUrl", "href", "pingUrl", "description"], + "additionalProperties": false + } + } + } + } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/apps/{id}": { + "get": { + "operationId": "appRouter-byId", + "tags": ["apps"], + "security": [{ "apikey": [] }], + "parameters": [{ "in": "path", "name": "id", "schema": { "type": "string" }, "required": true }], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "name": { "type": "string" }, + "description": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "iconUrl": { "type": "string" }, + "href": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "pingUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] } + }, + "required": ["id", "name", "description", "iconUrl", "href", "pingUrl"], + "additionalProperties": false + } + } + } + }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "404": { + "description": "Not found", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.NOT_FOUND" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + }, + "patch": { + "operationId": "appRouter-update", + "tags": ["apps"], + "security": [{ "apikey": [] }], + "parameters": [{ "in": "path", "name": "id", "schema": { "type": "string" }, "required": true }], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { "type": "string", "minLength": 1, "maxLength": 64 }, + "description": { "anyOf": [{ "type": "string", "maxLength": 512 }, { "type": "null" }] }, + "iconUrl": { "type": "string", "minLength": 1 }, + "href": { + "anyOf": [ + { + "anyOf": [ + { "type": "string", "pattern": "^(?!javascript)[a-zA-Z]*:\\/\\/" }, + { "type": "string", "const": "" } + ] + }, + { "type": "null" } + ] + }, + "pingUrl": { + "anyOf": [ + { + "anyOf": [ + { "type": "string", "pattern": "^https?:\\/\\/" }, + { "type": "string", "const": "" } + ] + }, + { "type": "null" } + ] + } + }, + "required": ["name", "description", "iconUrl", "href", "pingUrl"] + } + } + } + }, + "responses": { + "200": { "description": "Successful response", "content": { "application/json": { "schema": {} } } }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "404": { + "description": "Not found", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.NOT_FOUND" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + }, + "delete": { + "operationId": "appRouter-delete", + "tags": ["apps"], + "security": [{ "apikey": [] }], + "parameters": [{ "in": "path", "name": "id", "schema": { "type": "string" }, "required": true }], + "responses": { + "200": { "description": "Successful response", "content": { "application/json": { "schema": {} } } }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "404": { + "description": "Not found", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.NOT_FOUND" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/boards": { + "get": { + "operationId": "boardRouter-getAllBoards", + "tags": ["boards"], + "security": [{ "apikey": [] }], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "name": { "type": "string" }, + "logoImageUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "isPublic": { "type": "boolean" }, + "creator": { + "anyOf": [ + { + "type": "object", + "properties": { + "id": { "type": "string" }, + "name": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "image": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "email": { "anyOf": [{ "type": "string" }, { "type": "null" }] } + }, + "required": ["id", "name", "image", "email"], + "additionalProperties": false + }, + { "type": "null" } + ] + }, + "isHome": { "type": "boolean" }, + "isMobileHome": { "type": "boolean" }, + "userPermissions": { + "type": "array", + "items": { + "type": "object", + "properties": { "permission": { "type": "string", "enum": ["view", "modify", "full"] } }, + "required": ["permission"], + "additionalProperties": false + } + }, + "groupPermissions": { + "type": "array", + "items": { + "type": "object", + "properties": { "permission": { "type": "string", "enum": ["view", "modify", "full"] } }, + "required": ["permission"], + "additionalProperties": false + } + } + }, + "required": [ + "id", + "name", + "logoImageUrl", + "isPublic", + "creator", + "isHome", + "isMobileHome", + "userPermissions", + "groupPermissions" + ], + "additionalProperties": false + } + } + } + } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + }, + "post": { + "operationId": "boardRouter-createBoard", + "tags": ["boards"], + "security": [{ "apikey": [] }], + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9-_]*$" }, + "columnCount": { "type": "number", "minimum": 1, "maximum": 24 }, + "isPublic": { "type": "boolean" } + }, + "required": ["name", "columnCount", "isPublic"] + } + } + } + }, + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { "boardId": { "type": "string" } }, + "required": ["boardId"], + "additionalProperties": false + } + } + } + }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/boards/{id}/duplicate": { + "post": { + "operationId": "boardRouter-duplicateBoard", + "tags": ["boards"], + "security": [{ "apikey": [] }], + "parameters": [{ "in": "path", "name": "id", "schema": { "type": "string" }, "required": true }], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9-_]*$" } + }, + "required": ["name"] + } + } + } + }, + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { "boardId": { "type": "string" } }, + "required": ["boardId"], + "additionalProperties": false + } + } + } + }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/boards/{id}/name": { + "patch": { + "operationId": "boardRouter-renameBoard", + "tags": ["boards"], + "security": [{ "apikey": [] }], + "parameters": [{ "in": "path", "name": "id", "schema": { "type": "string" }, "required": true }], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { "type": "string", "minLength": 1, "maxLength": 255, "pattern": "^[A-Za-z0-9-_]*$" } + }, + "required": ["name"] + } + } + } + }, + "responses": { + "200": { "description": "Successful response", "content": { "application/json": { "schema": {} } } }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "404": { + "description": "Not found", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.NOT_FOUND" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/boards/{id}/visibility": { + "patch": { + "operationId": "boardRouter-changeBoardVisibility", + "tags": ["boards"], + "security": [{ "apikey": [] }], + "parameters": [{ "in": "path", "name": "id", "schema": { "type": "string" }, "required": true }], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { "visibility": { "type": "string", "enum": ["public", "private"] } }, + "required": ["visibility"] + } + } + } + }, + "responses": { + "200": { "description": "Successful response", "content": { "application/json": { "schema": {} } } }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "404": { + "description": "Not found", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.NOT_FOUND" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/boards/{id}": { + "delete": { + "operationId": "boardRouter-deleteBoard", + "tags": ["boards"], + "security": [{ "apikey": [] }], + "parameters": [{ "in": "path", "name": "id", "schema": { "type": "string" }, "required": true }], + "responses": { + "200": { "description": "Successful response", "content": { "application/json": { "schema": {} } } }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "404": { + "description": "Not found", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.NOT_FOUND" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/boards/{id}/home": { + "patch": { + "operationId": "boardRouter-setHomeBoard", + "tags": ["boards"], + "security": [{ "apikey": [] }], + "parameters": [{ "in": "path", "name": "id", "schema": { "type": "string" }, "required": true }], + "responses": { + "200": { "description": "Successful response", "content": { "application/json": { "schema": {} } } }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "404": { + "description": "Not found", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.NOT_FOUND" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/boards/{id}/mobile-home": { + "patch": { + "operationId": "boardRouter-setMobileHomeBoard", + "tags": ["boards"], + "security": [{ "apikey": [] }], + "parameters": [{ "in": "path", "name": "id", "schema": { "type": "string" }, "required": true }], + "responses": { + "200": { "description": "Successful response", "content": { "application/json": { "schema": {} } } }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "404": { + "description": "Not found", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.NOT_FOUND" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/boards/{id}/settings": { + "patch": { + "operationId": "boardRouter-savePartialBoardSettings", + "tags": ["boards"], + "security": [{ "apikey": [] }], + "parameters": [{ "in": "path", "name": "id", "schema": { "type": "string" }, "required": true }], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "pageTitle": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "metaTitle": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "logoImageUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "faviconImageUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "backgroundImageUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "backgroundImageAttachment": { "type": "string", "enum": ["fixed", "scroll"] }, + "backgroundImageRepeat": { + "type": "string", + "enum": ["repeat", "repeat-x", "repeat-y", "no-repeat"] + }, + "backgroundImageSize": { "type": "string", "enum": ["cover", "contain"] }, + "primaryColor": { "type": "string", "pattern": "^#[0-9A-Fa-f]{6}$" }, + "secondaryColor": { "type": "string", "pattern": "^#[0-9A-Fa-f]{6}$" }, + "opacity": { "type": "number", "minimum": 0, "maximum": 100 }, + "customCss": { "type": "string", "maxLength": 16384 }, + "iconColor": { + "anyOf": [ + { + "anyOf": [ + { "type": "string", "pattern": "^#[0-9A-Fa-f]{6}$" }, + { "type": "string", "const": "" } + ] + }, + { "type": "null" } + ] + }, + "itemRadius": { + "anyOf": [ + { "type": "string", "const": "xs" }, + { "type": "string", "const": "sm" }, + { "type": "string", "const": "md" }, + { "type": "string", "const": "lg" }, + { "type": "string", "const": "xl" } + ] + }, + "disableStatus": { "type": "boolean" } + } + } + } + } + }, + "responses": { + "200": { "description": "Successful response", "content": { "application/json": { "schema": {} } } }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "404": { + "description": "Not found", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.NOT_FOUND" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/boards/items": { + "post": { + "operationId": "boardRouter-addItem", + "tags": ["boards"], + "security": [{ "apikey": [] }], + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "boardId": { "type": "string" }, + "kind": { + "type": "string", + "enum": [ + "clock", + "weather", + "app", + "iframe", + "video", + "notebook", + "anchorNote", + "dnsHoleSummary", + "dnsHoleControls", + "smartHome-entityState", + "smartHome-executeAutomation", + "stockPrice", + "mediaServer", + "calendar", + "downloads", + "mediaRequests-requestList", + "mediaRequests-requestStats", + "mediaTranscoding", + "minecraftServerStatus", + "networkControllerSummary", + "networkControllerStatus", + "rssFeed", + "bookmarks", + "indexerManager", + "healthMonitoring", + "releases", + "mediaReleases", + "dockerContainers", + "firewall", + "notifications", + "systemResources", + "coolify", + "systemDisks", + "timetable", + "immich-serverStats", + "immich-albumCarousel", + "paperlessNgx", + "tracearr", + "speedtestTracker", + "uptimeKuma", + "audioStats", + "umami", + "vpn", + "archiveTeamWarrior", + "ups", + "beszelSystemTable", + "beszelSystemGrid", + "beszelAlerts", + "beszelSystemStats", + "customApi" + ] + }, + "options": { + "default": {}, + "type": "object", + "propertyNames": { "type": "string" }, + "additionalProperties": {} + }, + "integrationIds": { "default": [], "type": "array", "items": { "type": "string" } } + }, + "required": ["boardId", "kind"] + } + } + } + }, + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { "itemId": { "type": "string" } }, + "required": ["itemId"], + "additionalProperties": false + } + } + } + }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/info": { + "get": { + "operationId": "infoRouter-getInfo", + "tags": ["info"], + "security": [{ "apikey": [] }], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { "version": { "type": "string" } }, + "required": ["version"], + "additionalProperties": false + } + } + } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/invites": { + "get": { + "operationId": "inviteRouter-getAll", + "tags": ["invites"], + "security": [{ "apikey": [] }], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "expirationDate": { "type": "string" }, + "creator": { + "type": "object", + "properties": { + "name": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "id": { "type": "string" } + }, + "required": ["name", "id"], + "additionalProperties": false + } + }, + "required": ["id", "expirationDate", "creator"], + "additionalProperties": false + } + } + } + } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + }, + "post": { + "operationId": "inviteRouter-createInvite", + "tags": ["invites"], + "security": [{ "apikey": [] }], + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { "expirationDate": { "type": "string" } }, + "required": ["expirationDate"] + } + } + } + }, + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { "id": { "type": "string" }, "token": { "type": "string" } }, + "required": ["id", "token"], + "additionalProperties": false + } + } + } + }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/invites/{id}": { + "delete": { + "operationId": "inviteRouter-deleteInvite", + "tags": ["invites"], + "security": [{ "apikey": [] }], + "parameters": [{ "in": "path", "name": "id", "schema": { "type": "string" }, "required": true }], + "responses": { + "200": { + "description": "Successful response", + "content": { "application/json": { "schema": { "not": {} } } } + }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "404": { + "description": "Not found", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.NOT_FOUND" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/settings/board": { + "get": { + "operationId": "serverSettingsRouter-getBoardSettings", + "tags": ["settings"], + "security": [{ "apikey": [] }], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "homeBoardId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "mobileHomeBoardId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "enableStatusByDefault": { "type": "boolean" }, + "forceDisableStatus": { "type": "boolean" } + }, + "required": ["homeBoardId", "mobileHomeBoardId", "enableStatusByDefault", "forceDisableStatus"], + "additionalProperties": false + } + } + } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + }, + "patch": { + "operationId": "serverSettingsRouter-updateBoardSettings", + "tags": ["settings"], + "security": [{ "apikey": [] }], + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "homeBoardId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "mobileHomeBoardId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "enableStatusByDefault": { "type": "boolean" }, + "forceDisableStatus": { "type": "boolean" } + } + } + } + } + }, + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "homeBoardId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "mobileHomeBoardId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "enableStatusByDefault": { "type": "boolean" }, + "forceDisableStatus": { "type": "boolean" } + }, + "required": ["homeBoardId", "mobileHomeBoardId", "enableStatusByDefault", "forceDisableStatus"], + "additionalProperties": false + } + } + } + }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "404": { + "description": "Not found", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.NOT_FOUND" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/users": { + "post": { + "operationId": "userRouter-create", + "tags": ["users"], + "security": [{ "apikey": [] }], + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "username": { "type": "string", "minLength": 3, "maxLength": 255 }, + "password": { "type": "string", "minLength": 8, "maxLength": 255 }, + "confirmPassword": { "type": "string" }, + "email": { + "anyOf": [ + { + "type": "string", + "format": "email", + "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" + }, + { "type": "string", "minLength": 0, "maxLength": 0 } + ] + }, + "groupIds": { "type": "array", "items": { "type": "string" } } + }, + "required": ["username", "password", "confirmPassword", "groupIds"] + } + } + } + }, + "responses": { + "200": { "description": "Successful response", "content": { "application/json": { "schema": {} } } }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + }, + "get": { + "operationId": "userRouter-getAll", + "tags": ["users"], + "security": [{ "apikey": [] }], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "name": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "email": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "emailVerified": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "image": { "anyOf": [{ "type": "string" }, { "type": "null" }] } + }, + "required": ["id", "name", "email", "emailVerified", "image"], + "additionalProperties": false + } + } + } + } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/users/profileImage": { + "put": { + "operationId": "userRouter-setProfileImage", + "tags": ["users"], + "security": [{ "apikey": [] }], + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "userId": { "type": "string" }, + "image": { + "anyOf": [ + { + "type": "string", + "maxLength": 350000, + "pattern": "^data:image\\/(png|jpeg|gif|webp);base64,[A-Za-z0-9/+]+=*$" + }, + { "type": "null" } + ] + } + }, + "required": ["userId", "image"] + } + } + } + }, + "responses": { + "200": { "description": "Successful response", "content": { "application/json": { "schema": {} } } }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "404": { + "description": "Not found", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.NOT_FOUND" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/users/selectable": { + "get": { + "operationId": "userRouter-selectable", + "tags": ["users"], + "security": [{ "apikey": [] }], + "parameters": [ + { + "in": "query", + "name": "providers", + "schema": { "type": "array", "items": { "type": "string", "enum": ["credentials", "oidc", "ldap"] } } + } + ], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "name": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "image": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "email": { "anyOf": [{ "type": "string" }, { "type": "null" }] } + }, + "required": ["id", "name", "image", "email"], + "additionalProperties": false + } + } + } + } + }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "404": { + "description": "Not found", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.NOT_FOUND" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/users/search": { + "post": { + "operationId": "userRouter-search", + "tags": ["users"], + "security": [{ "apikey": [] }], + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "query": { "type": "string" }, + "limit": { "default": 10, "type": "number", "minimum": 1, "maximum": 100 } + }, + "required": ["query"] + } + } + } + }, + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "name": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "image": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "email": { "anyOf": [{ "type": "string" }, { "type": "null" }] } + }, + "required": ["id", "name", "image", "email"], + "additionalProperties": false + } + } + } + } + }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/users/{userId}": { + "get": { + "operationId": "userRouter-getById", + "tags": ["users"], + "security": [{ "apikey": [] }], + "parameters": [{ "in": "path", "name": "userId", "schema": { "type": "string" }, "required": true }], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "name": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "email": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "emailVerified": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "image": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "provider": { "type": "string" }, + "homeBoardId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "mobileHomeBoardId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "firstDayOfWeek": { "type": "integer", "minimum": -9007199254740991, "maximum": 9007199254740991 }, + "pingIconsEnabled": { "type": "boolean" }, + "defaultSearchEngineId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "openSearchInNewTab": { "type": "boolean" }, + "ddgBangs": { "type": "boolean" }, + "completedManageTour": { "type": "boolean" }, + "completedBoardTour": { "type": "boolean" } + }, + "required": [ + "id", + "name", + "email", + "emailVerified", + "image", + "provider", + "homeBoardId", + "mobileHomeBoardId", + "firstDayOfWeek", + "pingIconsEnabled", + "defaultSearchEngineId", + "openSearchInNewTab", + "ddgBangs", + "completedManageTour", + "completedBoardTour" + ], + "additionalProperties": false + } + } + } + }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "404": { + "description": "Not found", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.NOT_FOUND" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + }, + "delete": { + "operationId": "userRouter-delete", + "tags": ["users"], + "security": [{ "apikey": [] }], + "parameters": [{ "in": "path", "name": "userId", "schema": { "type": "string" }, "required": true }], + "responses": { + "200": { "description": "Successful response", "content": { "application/json": { "schema": {} } } }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "404": { + "description": "Not found", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.NOT_FOUND" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/users/profile": { + "put": { + "operationId": "userRouter-editProfile", + "tags": ["users"], + "security": [{ "apikey": [] }], + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "name": { "type": "string", "minLength": 3, "maxLength": 255 }, + "email": { + "anyOf": [ + { + "anyOf": [ + { + "type": "string", + "format": "email", + "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" + }, + { "type": "string", "const": "" } + ] + }, + { "type": "null" } + ] + } + }, + "required": ["id", "name"] + } + } + } + }, + "responses": { + "200": { "description": "Successful response", "content": { "application/json": { "schema": {} } } }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "404": { + "description": "Not found", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.NOT_FOUND" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/users/{userId}/changePassword": { + "patch": { + "operationId": "userRouter-changePassword", + "tags": ["users"], + "security": [{ "apikey": [] }], + "parameters": [{ "in": "path", "name": "userId", "schema": { "type": "string" }, "required": true }], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "previousPassword": { "type": "string", "minLength": 1 }, + "password": { "type": "string", "minLength": 8, "maxLength": 255 }, + "confirmPassword": { "type": "string" } + }, + "required": ["previousPassword", "password", "confirmPassword"] + } + } + } + }, + "responses": { + "200": { "description": "Successful response", "content": { "application/json": { "schema": {} } } }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "404": { + "description": "Not found", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.NOT_FOUND" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/users/changeHome": { + "patch": { + "operationId": "userRouter-changeHomeBoards", + "tags": ["users"], + "security": [{ "apikey": [] }], + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "homeBoardId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "mobileHomeBoardId": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, + "userId": { "type": "string" } + }, + "required": ["homeBoardId", "mobileHomeBoardId", "userId"] + } + } + } + }, + "responses": { + "200": { "description": "Successful response", "content": { "application/json": { "schema": {} } } }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "404": { + "description": "Not found", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.NOT_FOUND" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/users/changeSearchEngine": { + "patch": { + "operationId": "userRouter-changeDefaultSearchEngine", + "tags": ["users"], + "security": [{ "apikey": [] }], + "deprecated": true, + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "defaultSearchEngineId": { "anyOf": [{ "type": "string", "minLength": 1 }, { "type": "null" }] }, + "ddgBangsEnabled": { "type": "boolean" }, + "userId": { "type": "string" } + }, + "required": ["defaultSearchEngineId", "ddgBangsEnabled", "userId"] + } + } + } + }, + "responses": { + "200": { "description": "Successful response", "content": { "application/json": { "schema": {} } } }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "404": { + "description": "Not found", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.NOT_FOUND" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/users/search-preferences": { + "patch": { + "operationId": "userRouter-changeSearchPreferences", + "tags": ["users"], + "security": [{ "apikey": [] }], + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "defaultSearchEngineId": { "anyOf": [{ "type": "string", "minLength": 1 }, { "type": "null" }] }, + "openInNewTab": { "type": "boolean" }, + "ddgBangsEnabled": { "type": "boolean" }, + "userId": { "type": "string" } + }, + "required": ["defaultSearchEngineId", "openInNewTab", "ddgBangsEnabled", "userId"] + } + } + } + }, + "responses": { + "200": { "description": "Successful response", "content": { "application/json": { "schema": {} } } }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "404": { + "description": "Not found", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.NOT_FOUND" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/users/changeScheme": { + "patch": { + "operationId": "userRouter-changeColorScheme", + "tags": ["users"], + "security": [{ "apikey": [] }], + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { "colorScheme": { "type": "string", "enum": ["auto", "light", "dark"] } }, + "required": ["colorScheme"] + } + } + } + }, + "responses": { + "200": { "description": "Successful response", "content": { "application/json": { "schema": {} } } }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "404": { + "description": "Not found", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.NOT_FOUND" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/users/ddg-bangs": { + "patch": { + "operationId": "userRouter-changeDdgBangs", + "tags": ["users"], + "security": [{ "apikey": [] }], + "deprecated": true, + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { "ddgBangs": { "type": "boolean" }, "id": { "type": "string" } }, + "required": ["ddgBangs", "id"] + } + } + } + }, + "responses": { + "200": { "description": "Successful response", "content": { "application/json": { "schema": {} } } }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "404": { + "description": "Not found", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.NOT_FOUND" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + }, + "/api/users/firstDayOfWeek": { + "patch": { + "operationId": "userRouter-changeFirstDayOfWeek", + "tags": ["users"], + "security": [{ "apikey": [] }], + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "firstDayOfWeek": { "type": "number", "minimum": 0, "maximum": 6 }, + "id": { "type": "string" } + }, + "required": ["firstDayOfWeek", "id"] + } + } + } + }, + "responses": { + "200": { "description": "Successful response", "content": { "application/json": { "schema": {} } } }, + "400": { + "description": "Invalid input data", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.BAD_REQUEST" } } } + }, + "401": { + "description": "Authorization not provided", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.UNAUTHORIZED" } } } + }, + "403": { + "description": "Insufficient access", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.FORBIDDEN" } } } + }, + "404": { + "description": "Not found", + "content": { "application/json": { "schema": { "$ref": "#/components/schemas/error.NOT_FOUND" } } } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { "schema": { "$ref": "#/components/schemas/error.INTERNAL_SERVER_ERROR" } } + } + } + } + } + } + }, + "components": { + "schemas": { + "error.BAD_REQUEST": { + "type": "object", + "properties": { + "message": { "type": "string", "description": "The error message", "example": "Invalid input data" }, + "code": { "type": "string", "description": "The error code", "example": "BAD_REQUEST" }, + "issues": { + "description": "An array of issues that were responsible for the error", + "example": [], + "type": "array", + "items": { + "type": "object", + "properties": { "message": { "type": "string" } }, + "required": ["message"], + "additionalProperties": false + } + } + }, + "required": ["message", "code"], + "additionalProperties": false, + "title": "Invalid input data error (400)", + "description": "The error information", + "example": { "code": "BAD_REQUEST", "message": "Invalid input data", "issues": [] } + }, + "error.UNAUTHORIZED": { + "type": "object", + "properties": { + "message": { "type": "string", "description": "The error message", "example": "Authorization not provided" }, + "code": { "type": "string", "description": "The error code", "example": "UNAUTHORIZED" }, + "issues": { + "description": "An array of issues that were responsible for the error", + "example": [], + "type": "array", + "items": { + "type": "object", + "properties": { "message": { "type": "string" } }, + "required": ["message"], + "additionalProperties": false + } + } + }, + "required": ["message", "code"], + "additionalProperties": false, + "title": "Authorization not provided error (401)", + "description": "The error information", + "example": { "code": "UNAUTHORIZED", "message": "Authorization not provided", "issues": [] } + }, + "error.FORBIDDEN": { + "type": "object", + "properties": { + "message": { "type": "string", "description": "The error message", "example": "Insufficient access" }, + "code": { "type": "string", "description": "The error code", "example": "FORBIDDEN" }, + "issues": { + "description": "An array of issues that were responsible for the error", + "example": [], + "type": "array", + "items": { + "type": "object", + "properties": { "message": { "type": "string" } }, + "required": ["message"], + "additionalProperties": false + } + } + }, + "required": ["message", "code"], + "additionalProperties": false, + "title": "Insufficient access error (403)", + "description": "The error information", + "example": { "code": "FORBIDDEN", "message": "Insufficient access", "issues": [] } + }, + "error.NOT_FOUND": { + "type": "object", + "properties": { + "message": { "type": "string", "description": "The error message", "example": "Not found" }, + "code": { "type": "string", "description": "The error code", "example": "NOT_FOUND" }, + "issues": { + "description": "An array of issues that were responsible for the error", + "example": [], + "type": "array", + "items": { + "type": "object", + "properties": { "message": { "type": "string" } }, + "required": ["message"], + "additionalProperties": false + } + } + }, + "required": ["message", "code"], + "additionalProperties": false, + "title": "Not found error (404)", + "description": "The error information", + "example": { "code": "NOT_FOUND", "message": "Not found", "issues": [] } + }, + "error.INTERNAL_SERVER_ERROR": { + "type": "object", + "properties": { + "message": { "type": "string", "description": "The error message", "example": "Internal server error" }, + "code": { "type": "string", "description": "The error code", "example": "INTERNAL_SERVER_ERROR" }, + "issues": { + "description": "An array of issues that were responsible for the error", + "example": [], + "type": "array", + "items": { + "type": "object", + "properties": { "message": { "type": "string" } }, + "required": ["message"], + "additionalProperties": false + } + } + }, + "required": ["message", "code"], + "additionalProperties": false, + "title": "Internal server error error (500)", + "description": "The error information", + "example": { "code": "INTERNAL_SERVER_ERROR", "message": "Internal server error", "issues": [] } + } + }, + "securitySchemes": { + "apikey": { + "type": "apiKey", + "name": "ApiKey", + "description": "API key which can be obtained in the Homarr administration dashboard", + "in": "header" + } + } + } +} diff --git a/apps/docs/static/data/contributions.json b/apps/docs/static/data/contributions.json index fbc3a2a80..18dd6bc05 100644 --- a/apps/docs/static/data/contributions.json +++ b/apps/docs/static/data/contributions.json @@ -1 +1,127 @@ -[{"login":"ajnart","avatar_url":"https://avatars.githubusercontent.com/u/49837342?v=4"},{"login":"manuel-rw","avatar_url":"https://avatars.githubusercontent.com/u/30572287?v=4"},{"login":"Meierschlumpf","avatar_url":"https://avatars.githubusercontent.com/u/63781622?v=4"},{"login":"SeDemal","avatar_url":"https://avatars.githubusercontent.com/u/26098587?v=4"},{"login":"lammersbjorn","avatar_url":"https://avatars.githubusercontent.com/u/71191962?v=4"},{"login":"LarveyOfficial","avatar_url":"https://avatars.githubusercontent.com/u/39219859?v=4"},{"login":"c00ldude1oo","avatar_url":"https://avatars.githubusercontent.com/u/15677803?v=4"},{"login":"InterN0te","avatar_url":"https://avatars.githubusercontent.com/u/10882916?v=4"},{"login":"Aandree5","avatar_url":"https://avatars.githubusercontent.com/u/32734153?v=4"},{"login":"Aimsucks","avatar_url":"https://avatars.githubusercontent.com/u/1828486?v=4"},{"login":"JannesV","avatar_url":"https://avatars.githubusercontent.com/u/5984244?v=4"},{"login":"MauriceNino","avatar_url":"https://avatars.githubusercontent.com/u/18658092?v=4"},{"login":"hillaliy","avatar_url":"https://avatars.githubusercontent.com/u/950010?v=4"},{"login":"Skeeww","avatar_url":"https://avatars.githubusercontent.com/u/9639992?v=4"},{"login":"jackwellerreal","avatar_url":"https://avatars.githubusercontent.com/u/97435840?v=4"},{"login":"RichyHBM","avatar_url":"https://avatars.githubusercontent.com/u/5472275?v=4"},{"login":"Bonfire","avatar_url":"https://avatars.githubusercontent.com/u/5704760?v=4"},{"login":"wieli99","avatar_url":"https://avatars.githubusercontent.com/u/46794825?v=4"},{"login":"ishaanparlikar","avatar_url":"https://avatars.githubusercontent.com/u/43013132?v=4"},{"login":"Zareix","avatar_url":"https://avatars.githubusercontent.com/u/29818713?v=4"},{"login":"tuggan","avatar_url":"https://avatars.githubusercontent.com/u/4325608?v=4"},{"login":"mvanhorn","avatar_url":"https://avatars.githubusercontent.com/u/455140?v=4"},{"login":"SergioChan","avatar_url":"https://avatars.githubusercontent.com/u/10103766?v=4"},{"login":"toineenzo","avatar_url":"https://avatars.githubusercontent.com/u/4921397?v=4"},{"login":"oben01","avatar_url":"https://avatars.githubusercontent.com/u/22369027?v=4"},{"login":"rezstje","avatar_url":"https://avatars.githubusercontent.com/u/45420315?v=4"},{"login":"Spillebulle","avatar_url":"https://avatars.githubusercontent.com/u/46653946?v=4"},{"login":"marektancak0106","avatar_url":"https://avatars.githubusercontent.com/u/25422667?v=4"},{"login":"spkesDE","avatar_url":"https://avatars.githubusercontent.com/u/1682314?v=4"},{"login":"j3lte","avatar_url":"https://avatars.githubusercontent.com/u/2557568?v=4"},{"login":"dslatt","avatar_url":"https://avatars.githubusercontent.com/u/5211001?v=4"},{"login":"Malong11-007","avatar_url":"https://avatars.githubusercontent.com/u/40298510?v=4"},{"login":"castielwaverly","avatar_url":"https://avatars.githubusercontent.com/u/137005689?v=4"},{"login":"xoxyuxu","avatar_url":"https://avatars.githubusercontent.com/u/3543416?v=4"},{"login":"StrandedTurtle","avatar_url":"https://avatars.githubusercontent.com/u/132835255?v=4"},{"login":"MaienM","avatar_url":"https://avatars.githubusercontent.com/u/583129?v=4"},{"login":"kylegrieder","avatar_url":"https://avatars.githubusercontent.com/u/25424229?v=4"},{"login":"HeapReaper","avatar_url":"https://avatars.githubusercontent.com/u/31496522?v=4"},{"login":"Copilot","avatar_url":"https://avatars.githubusercontent.com/in/1143301?v=4"},{"login":"Gilmoursa","avatar_url":"https://avatars.githubusercontent.com/u/10321421?v=4"},{"login":"StefanB7","avatar_url":"https://avatars.githubusercontent.com/u/22056509?v=4"},{"login":"souravghosh01","avatar_url":"https://avatars.githubusercontent.com/u/37548139?v=4"},{"login":"SR3u","avatar_url":"https://avatars.githubusercontent.com/u/2380522?v=4"},{"login":"Rikpat","avatar_url":"https://avatars.githubusercontent.com/u/33869814?v=4"},{"login":"NormanJS","avatar_url":"https://avatars.githubusercontent.com/u/83409549?v=4"},{"login":"No-Maines-Land","avatar_url":"https://avatars.githubusercontent.com/u/20687725?v=4"},{"login":"stark1tty","avatar_url":"https://avatars.githubusercontent.com/u/69326376?v=4"},{"login":"Momcilo42","avatar_url":"https://avatars.githubusercontent.com/u/10118137?v=4"},{"login":"marius-arch","avatar_url":"https://avatars.githubusercontent.com/u/72494359?v=4"},{"login":"Lumilias","avatar_url":"https://avatars.githubusercontent.com/u/10852161?v=4"},{"login":"Havock94","avatar_url":"https://avatars.githubusercontent.com/u/7635248?v=4"},{"login":"Lollyde","avatar_url":"https://avatars.githubusercontent.com/u/11347524?v=4"},{"login":"krishnamuppaneni","avatar_url":"https://avatars.githubusercontent.com/u/4703366?v=4"},{"login":"devtobi","avatar_url":"https://avatars.githubusercontent.com/u/28538704?v=4"},{"login":"TyxTang","avatar_url":"https://avatars.githubusercontent.com/u/90897955?v=4"},{"login":"alotlikebeans","avatar_url":"https://avatars.githubusercontent.com/u/19630511?v=4"},{"login":"WillyJL","avatar_url":"https://avatars.githubusercontent.com/u/49810075?v=4"},{"login":"anonysoul","avatar_url":"https://avatars.githubusercontent.com/u/105715150?v=4"},{"login":"cospeedster","avatar_url":"https://avatars.githubusercontent.com/u/52749645?v=4"},{"login":"diederbert","avatar_url":"https://avatars.githubusercontent.com/u/162878798?v=4"},{"login":"digdilem","avatar_url":"https://avatars.githubusercontent.com/u/4052275?v=4"},{"login":"dinghino","avatar_url":"https://avatars.githubusercontent.com/u/14729459?v=4"},{"login":"gfomichev","avatar_url":"https://avatars.githubusercontent.com/u/1596146?v=4"},{"login":"gnattu","avatar_url":"https://avatars.githubusercontent.com/u/12995396?v=4"},{"login":"tuxpizza","avatar_url":"https://avatars.githubusercontent.com/u/84710786?v=4"},{"login":"xmarkurion","avatar_url":"https://avatars.githubusercontent.com/u/46654687?v=4"},{"login":"huanga","avatar_url":"https://avatars.githubusercontent.com/u/732970?v=4"},{"login":"taos15","avatar_url":"https://avatars.githubusercontent.com/u/122130728?v=4"},{"login":"arghyadipchak","avatar_url":"https://avatars.githubusercontent.com/u/32430374?v=4"},{"login":"AuthorShin","avatar_url":"https://avatars.githubusercontent.com/u/4959043?v=4"},{"login":"benniblot","avatar_url":"https://avatars.githubusercontent.com/u/47495914?v=4"},{"login":"bebsworthy","avatar_url":"https://avatars.githubusercontent.com/u/5266759?v=4"},{"login":"catrielmuller","avatar_url":"https://avatars.githubusercontent.com/u/2272323?v=4"},{"login":"Vysp3r","avatar_url":"https://avatars.githubusercontent.com/u/62019735?v=4"},{"login":"DR-Blogs","avatar_url":"https://avatars.githubusercontent.com/u/96393186?v=4"},{"login":"singular0","avatar_url":"https://avatars.githubusercontent.com/u/1925883?v=4"},{"login":"diogovalentte","avatar_url":"https://avatars.githubusercontent.com/u/49578155?v=4"},{"login":"codezninja","avatar_url":"https://avatars.githubusercontent.com/u/4400773?v=4"},{"login":"fabricionaweb","avatar_url":"https://avatars.githubusercontent.com/u/15933?v=4"},{"login":"nyok1912","avatar_url":"https://avatars.githubusercontent.com/u/32163949?v=4"},{"login":"bo3bdo","avatar_url":"https://avatars.githubusercontent.com/u/5271380?v=4"},{"login":"hskrtich","avatar_url":"https://avatars.githubusercontent.com/u/1214484?v=4"},{"login":"ishults","avatar_url":"https://avatars.githubusercontent.com/u/7275442?v=4"},{"login":"jelliuk","avatar_url":"https://avatars.githubusercontent.com/u/4790959?v=4"},{"login":"Moohan","avatar_url":"https://avatars.githubusercontent.com/u/5982260?v=4"},{"login":"tesar-tech","avatar_url":"https://avatars.githubusercontent.com/u/33880579?v=4"},{"login":"jbruell","avatar_url":"https://avatars.githubusercontent.com/u/31685172?v=4"},{"login":"JasonLeeB06","avatar_url":"https://avatars.githubusercontent.com/u/82266978?v=4"},{"login":"jeffersonraimon","avatar_url":"https://avatars.githubusercontent.com/u/80064475?v=4"},{"login":"jo-chemla","avatar_url":"https://avatars.githubusercontent.com/u/16822841?v=4"},{"login":"joser93","avatar_url":"https://avatars.githubusercontent.com/u/6912089?v=4"},{"login":"justijndepover","avatar_url":"https://avatars.githubusercontent.com/u/9008623?v=4"},{"login":"leandroscardua","avatar_url":"https://avatars.githubusercontent.com/u/24698541?v=4"},{"login":"mairas","avatar_url":"https://avatars.githubusercontent.com/u/407010?v=4"},{"login":"itzTheMeow","avatar_url":"https://avatars.githubusercontent.com/u/50887230?v=4"},{"login":"NicolasNewman","avatar_url":"https://avatars.githubusercontent.com/u/16135852?v=4"},{"login":"NikeLaosClericus","avatar_url":"https://avatars.githubusercontent.com/u/39810627?v=4"},{"login":"noahcroghan","avatar_url":"https://avatars.githubusercontent.com/u/27422774?v=4"},{"login":"ohmzi","avatar_url":"https://avatars.githubusercontent.com/u/6551272?v=4"},{"login":"Rhiz3K","avatar_url":"https://avatars.githubusercontent.com/u/33246262?v=4"},{"login":"saschabuehrle","avatar_url":"https://avatars.githubusercontent.com/u/47737812?v=4"},{"login":"CrazyWolf13","avatar_url":"https://avatars.githubusercontent.com/u/96661824?v=4"},{"login":"VIVAAN-DHAWAN","avatar_url":"https://avatars.githubusercontent.com/u/150339722?v=4"},{"login":"generalmat82","avatar_url":"https://avatars.githubusercontent.com/u/110256073?v=4"},{"login":"lthomsen","avatar_url":"https://avatars.githubusercontent.com/u/28560325?v=4"},{"login":"pitschi","avatar_url":"https://avatars.githubusercontent.com/u/6841565?v=4"},{"login":"sharpsalat","avatar_url":"https://avatars.githubusercontent.com/u/15666932?v=4"},{"login":"tech62","avatar_url":"https://avatars.githubusercontent.com/u/16237642?v=4"},{"login":"AartSchinkel","avatar_url":"https://avatars.githubusercontent.com/u/189675191?v=4"},{"login":"afonsojramos","avatar_url":"https://avatars.githubusercontent.com/u/19473034?v=4"},{"login":"m0s4ik","avatar_url":"https://avatars.githubusercontent.com/u/26578395?v=4"},{"login":"ashtonbatty","avatar_url":"https://avatars.githubusercontent.com/u/230635?v=4"},{"login":"Oupsman","avatar_url":"https://avatars.githubusercontent.com/u/11260343?v=4"},{"login":"cethien","avatar_url":"https://avatars.githubusercontent.com/u/60463918?v=4"},{"login":"DZ945brH","avatar_url":"https://avatars.githubusercontent.com/u/42635243?v=4"},{"login":"dgshue","avatar_url":"https://avatars.githubusercontent.com/u/12952156?v=4"},{"login":"d-lindahl","avatar_url":"https://avatars.githubusercontent.com/u/690410?v=4"},{"login":"KartulUdus","avatar_url":"https://avatars.githubusercontent.com/u/23346150?v=4"},{"login":"ieugen","avatar_url":"https://avatars.githubusercontent.com/u/1050920?v=4"},{"login":"faugusto-oliveira","avatar_url":"https://avatars.githubusercontent.com/u/37384074?v=4"},{"login":"frankvHoof93","avatar_url":"https://avatars.githubusercontent.com/u/7346516?v=4"},{"login":"febrile42","avatar_url":"https://avatars.githubusercontent.com/u/14597122?v=4"},{"login":"Kaotic3","avatar_url":"https://avatars.githubusercontent.com/u/80522225?v=4"},{"login":"KelianB","avatar_url":"https://avatars.githubusercontent.com/u/11216155?v=4"},{"login":"hotrungnhan","avatar_url":"https://avatars.githubusercontent.com/u/40029631?v=4"}] \ No newline at end of file +[ + { "login": "ajnart", "avatar_url": "https://avatars.githubusercontent.com/u/49837342?v=4" }, + { "login": "manuel-rw", "avatar_url": "https://avatars.githubusercontent.com/u/30572287?v=4" }, + { "login": "Meierschlumpf", "avatar_url": "https://avatars.githubusercontent.com/u/63781622?v=4" }, + { "login": "SeDemal", "avatar_url": "https://avatars.githubusercontent.com/u/26098587?v=4" }, + { "login": "lammersbjorn", "avatar_url": "https://avatars.githubusercontent.com/u/71191962?v=4" }, + { "login": "LarveyOfficial", "avatar_url": "https://avatars.githubusercontent.com/u/39219859?v=4" }, + { "login": "c00ldude1oo", "avatar_url": "https://avatars.githubusercontent.com/u/15677803?v=4" }, + { "login": "InterN0te", "avatar_url": "https://avatars.githubusercontent.com/u/10882916?v=4" }, + { "login": "Aandree5", "avatar_url": "https://avatars.githubusercontent.com/u/32734153?v=4" }, + { "login": "Aimsucks", "avatar_url": "https://avatars.githubusercontent.com/u/1828486?v=4" }, + { "login": "JannesV", "avatar_url": "https://avatars.githubusercontent.com/u/5984244?v=4" }, + { "login": "MauriceNino", "avatar_url": "https://avatars.githubusercontent.com/u/18658092?v=4" }, + { "login": "hillaliy", "avatar_url": "https://avatars.githubusercontent.com/u/950010?v=4" }, + { "login": "Skeeww", "avatar_url": "https://avatars.githubusercontent.com/u/9639992?v=4" }, + { "login": "jackwellerreal", "avatar_url": "https://avatars.githubusercontent.com/u/97435840?v=4" }, + { "login": "RichyHBM", "avatar_url": "https://avatars.githubusercontent.com/u/5472275?v=4" }, + { "login": "Bonfire", "avatar_url": "https://avatars.githubusercontent.com/u/5704760?v=4" }, + { "login": "wieli99", "avatar_url": "https://avatars.githubusercontent.com/u/46794825?v=4" }, + { "login": "ishaanparlikar", "avatar_url": "https://avatars.githubusercontent.com/u/43013132?v=4" }, + { "login": "Zareix", "avatar_url": "https://avatars.githubusercontent.com/u/29818713?v=4" }, + { "login": "tuggan", "avatar_url": "https://avatars.githubusercontent.com/u/4325608?v=4" }, + { "login": "mvanhorn", "avatar_url": "https://avatars.githubusercontent.com/u/455140?v=4" }, + { "login": "SergioChan", "avatar_url": "https://avatars.githubusercontent.com/u/10103766?v=4" }, + { "login": "toineenzo", "avatar_url": "https://avatars.githubusercontent.com/u/4921397?v=4" }, + { "login": "oben01", "avatar_url": "https://avatars.githubusercontent.com/u/22369027?v=4" }, + { "login": "rezstje", "avatar_url": "https://avatars.githubusercontent.com/u/45420315?v=4" }, + { "login": "Spillebulle", "avatar_url": "https://avatars.githubusercontent.com/u/46653946?v=4" }, + { "login": "marektancak0106", "avatar_url": "https://avatars.githubusercontent.com/u/25422667?v=4" }, + { "login": "spkesDE", "avatar_url": "https://avatars.githubusercontent.com/u/1682314?v=4" }, + { "login": "j3lte", "avatar_url": "https://avatars.githubusercontent.com/u/2557568?v=4" }, + { "login": "dslatt", "avatar_url": "https://avatars.githubusercontent.com/u/5211001?v=4" }, + { "login": "Malong11-007", "avatar_url": "https://avatars.githubusercontent.com/u/40298510?v=4" }, + { "login": "castielwaverly", "avatar_url": "https://avatars.githubusercontent.com/u/137005689?v=4" }, + { "login": "xoxyuxu", "avatar_url": "https://avatars.githubusercontent.com/u/3543416?v=4" }, + { "login": "StrandedTurtle", "avatar_url": "https://avatars.githubusercontent.com/u/132835255?v=4" }, + { "login": "MaienM", "avatar_url": "https://avatars.githubusercontent.com/u/583129?v=4" }, + { "login": "kylegrieder", "avatar_url": "https://avatars.githubusercontent.com/u/25424229?v=4" }, + { "login": "HeapReaper", "avatar_url": "https://avatars.githubusercontent.com/u/31496522?v=4" }, + { "login": "Copilot", "avatar_url": "https://avatars.githubusercontent.com/in/1143301?v=4" }, + { "login": "Gilmoursa", "avatar_url": "https://avatars.githubusercontent.com/u/10321421?v=4" }, + { "login": "StefanB7", "avatar_url": "https://avatars.githubusercontent.com/u/22056509?v=4" }, + { "login": "souravghosh01", "avatar_url": "https://avatars.githubusercontent.com/u/37548139?v=4" }, + { "login": "SR3u", "avatar_url": "https://avatars.githubusercontent.com/u/2380522?v=4" }, + { "login": "Rikpat", "avatar_url": "https://avatars.githubusercontent.com/u/33869814?v=4" }, + { "login": "NormanJS", "avatar_url": "https://avatars.githubusercontent.com/u/83409549?v=4" }, + { "login": "No-Maines-Land", "avatar_url": "https://avatars.githubusercontent.com/u/20687725?v=4" }, + { "login": "stark1tty", "avatar_url": "https://avatars.githubusercontent.com/u/69326376?v=4" }, + { "login": "Momcilo42", "avatar_url": "https://avatars.githubusercontent.com/u/10118137?v=4" }, + { "login": "marius-arch", "avatar_url": "https://avatars.githubusercontent.com/u/72494359?v=4" }, + { "login": "Lumilias", "avatar_url": "https://avatars.githubusercontent.com/u/10852161?v=4" }, + { "login": "Havock94", "avatar_url": "https://avatars.githubusercontent.com/u/7635248?v=4" }, + { "login": "Lollyde", "avatar_url": "https://avatars.githubusercontent.com/u/11347524?v=4" }, + { "login": "krishnamuppaneni", "avatar_url": "https://avatars.githubusercontent.com/u/4703366?v=4" }, + { "login": "devtobi", "avatar_url": "https://avatars.githubusercontent.com/u/28538704?v=4" }, + { "login": "TyxTang", "avatar_url": "https://avatars.githubusercontent.com/u/90897955?v=4" }, + { "login": "alotlikebeans", "avatar_url": "https://avatars.githubusercontent.com/u/19630511?v=4" }, + { "login": "WillyJL", "avatar_url": "https://avatars.githubusercontent.com/u/49810075?v=4" }, + { "login": "anonysoul", "avatar_url": "https://avatars.githubusercontent.com/u/105715150?v=4" }, + { "login": "cospeedster", "avatar_url": "https://avatars.githubusercontent.com/u/52749645?v=4" }, + { "login": "diederbert", "avatar_url": "https://avatars.githubusercontent.com/u/162878798?v=4" }, + { "login": "digdilem", "avatar_url": "https://avatars.githubusercontent.com/u/4052275?v=4" }, + { "login": "dinghino", "avatar_url": "https://avatars.githubusercontent.com/u/14729459?v=4" }, + { "login": "gfomichev", "avatar_url": "https://avatars.githubusercontent.com/u/1596146?v=4" }, + { "login": "gnattu", "avatar_url": "https://avatars.githubusercontent.com/u/12995396?v=4" }, + { "login": "tuxpizza", "avatar_url": "https://avatars.githubusercontent.com/u/84710786?v=4" }, + { "login": "xmarkurion", "avatar_url": "https://avatars.githubusercontent.com/u/46654687?v=4" }, + { "login": "huanga", "avatar_url": "https://avatars.githubusercontent.com/u/732970?v=4" }, + { "login": "taos15", "avatar_url": "https://avatars.githubusercontent.com/u/122130728?v=4" }, + { "login": "arghyadipchak", "avatar_url": "https://avatars.githubusercontent.com/u/32430374?v=4" }, + { "login": "AuthorShin", "avatar_url": "https://avatars.githubusercontent.com/u/4959043?v=4" }, + { "login": "benniblot", "avatar_url": "https://avatars.githubusercontent.com/u/47495914?v=4" }, + { "login": "bebsworthy", "avatar_url": "https://avatars.githubusercontent.com/u/5266759?v=4" }, + { "login": "catrielmuller", "avatar_url": "https://avatars.githubusercontent.com/u/2272323?v=4" }, + { "login": "Vysp3r", "avatar_url": "https://avatars.githubusercontent.com/u/62019735?v=4" }, + { "login": "DR-Blogs", "avatar_url": "https://avatars.githubusercontent.com/u/96393186?v=4" }, + { "login": "singular0", "avatar_url": "https://avatars.githubusercontent.com/u/1925883?v=4" }, + { "login": "diogovalentte", "avatar_url": "https://avatars.githubusercontent.com/u/49578155?v=4" }, + { "login": "codezninja", "avatar_url": "https://avatars.githubusercontent.com/u/4400773?v=4" }, + { "login": "fabricionaweb", "avatar_url": "https://avatars.githubusercontent.com/u/15933?v=4" }, + { "login": "nyok1912", "avatar_url": "https://avatars.githubusercontent.com/u/32163949?v=4" }, + { "login": "bo3bdo", "avatar_url": "https://avatars.githubusercontent.com/u/5271380?v=4" }, + { "login": "hskrtich", "avatar_url": "https://avatars.githubusercontent.com/u/1214484?v=4" }, + { "login": "ishults", "avatar_url": "https://avatars.githubusercontent.com/u/7275442?v=4" }, + { "login": "jelliuk", "avatar_url": "https://avatars.githubusercontent.com/u/4790959?v=4" }, + { "login": "Moohan", "avatar_url": "https://avatars.githubusercontent.com/u/5982260?v=4" }, + { "login": "tesar-tech", "avatar_url": "https://avatars.githubusercontent.com/u/33880579?v=4" }, + { "login": "jbruell", "avatar_url": "https://avatars.githubusercontent.com/u/31685172?v=4" }, + { "login": "JasonLeeB06", "avatar_url": "https://avatars.githubusercontent.com/u/82266978?v=4" }, + { "login": "jeffersonraimon", "avatar_url": "https://avatars.githubusercontent.com/u/80064475?v=4" }, + { "login": "jo-chemla", "avatar_url": "https://avatars.githubusercontent.com/u/16822841?v=4" }, + { "login": "joser93", "avatar_url": "https://avatars.githubusercontent.com/u/6912089?v=4" }, + { "login": "justijndepover", "avatar_url": "https://avatars.githubusercontent.com/u/9008623?v=4" }, + { "login": "leandroscardua", "avatar_url": "https://avatars.githubusercontent.com/u/24698541?v=4" }, + { "login": "mairas", "avatar_url": "https://avatars.githubusercontent.com/u/407010?v=4" }, + { "login": "itzTheMeow", "avatar_url": "https://avatars.githubusercontent.com/u/50887230?v=4" }, + { "login": "NicolasNewman", "avatar_url": "https://avatars.githubusercontent.com/u/16135852?v=4" }, + { "login": "NikeLaosClericus", "avatar_url": "https://avatars.githubusercontent.com/u/39810627?v=4" }, + { "login": "noahcroghan", "avatar_url": "https://avatars.githubusercontent.com/u/27422774?v=4" }, + { "login": "ohmzi", "avatar_url": "https://avatars.githubusercontent.com/u/6551272?v=4" }, + { "login": "Rhiz3K", "avatar_url": "https://avatars.githubusercontent.com/u/33246262?v=4" }, + { "login": "saschabuehrle", "avatar_url": "https://avatars.githubusercontent.com/u/47737812?v=4" }, + { "login": "CrazyWolf13", "avatar_url": "https://avatars.githubusercontent.com/u/96661824?v=4" }, + { "login": "VIVAAN-DHAWAN", "avatar_url": "https://avatars.githubusercontent.com/u/150339722?v=4" }, + { "login": "generalmat82", "avatar_url": "https://avatars.githubusercontent.com/u/110256073?v=4" }, + { "login": "lthomsen", "avatar_url": "https://avatars.githubusercontent.com/u/28560325?v=4" }, + { "login": "pitschi", "avatar_url": "https://avatars.githubusercontent.com/u/6841565?v=4" }, + { "login": "sharpsalat", "avatar_url": "https://avatars.githubusercontent.com/u/15666932?v=4" }, + { "login": "tech62", "avatar_url": "https://avatars.githubusercontent.com/u/16237642?v=4" }, + { "login": "AartSchinkel", "avatar_url": "https://avatars.githubusercontent.com/u/189675191?v=4" }, + { "login": "afonsojramos", "avatar_url": "https://avatars.githubusercontent.com/u/19473034?v=4" }, + { "login": "m0s4ik", "avatar_url": "https://avatars.githubusercontent.com/u/26578395?v=4" }, + { "login": "ashtonbatty", "avatar_url": "https://avatars.githubusercontent.com/u/230635?v=4" }, + { "login": "Oupsman", "avatar_url": "https://avatars.githubusercontent.com/u/11260343?v=4" }, + { "login": "cethien", "avatar_url": "https://avatars.githubusercontent.com/u/60463918?v=4" }, + { "login": "DZ945brH", "avatar_url": "https://avatars.githubusercontent.com/u/42635243?v=4" }, + { "login": "dgshue", "avatar_url": "https://avatars.githubusercontent.com/u/12952156?v=4" }, + { "login": "d-lindahl", "avatar_url": "https://avatars.githubusercontent.com/u/690410?v=4" }, + { "login": "KartulUdus", "avatar_url": "https://avatars.githubusercontent.com/u/23346150?v=4" }, + { "login": "ieugen", "avatar_url": "https://avatars.githubusercontent.com/u/1050920?v=4" }, + { "login": "faugusto-oliveira", "avatar_url": "https://avatars.githubusercontent.com/u/37384074?v=4" }, + { "login": "frankvHoof93", "avatar_url": "https://avatars.githubusercontent.com/u/7346516?v=4" }, + { "login": "febrile42", "avatar_url": "https://avatars.githubusercontent.com/u/14597122?v=4" }, + { "login": "Kaotic3", "avatar_url": "https://avatars.githubusercontent.com/u/80522225?v=4" }, + { "login": "KelianB", "avatar_url": "https://avatars.githubusercontent.com/u/11216155?v=4" }, + { "login": "hotrungnhan", "avatar_url": "https://avatars.githubusercontent.com/u/40029631?v=4" } +] diff --git a/apps/docs/static/data/translation-contributions.json b/apps/docs/static/data/translation-contributions.json index 5818e6339..1c89663dd 100644 --- a/apps/docs/static/data/translation-contributions.json +++ b/apps/docs/static/data/translation-contributions.json @@ -1 +1,966 @@ -[{"username":"carlchina","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/6697/medium/d22bbe7797bbeb30dbdc73a5648d329a_default.png"},{"username":"zielmann","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/7795/medium/ad22b8b8d5eb33e4154d53a454c862fd_default.png"},{"username":"Thalyn","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12494028/medium/5faf5acc945a874ed116c4567edaa09f_default.png"},{"username":"magnushj","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12503488/medium/68f32e33ea7b891960055c9f831f7344_default.png"},{"username":"almontegil","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12580457/medium/f4136cacbdfdb4c28ae7f85dc5f840db_default.png"},{"username":"andibing","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12664938/medium/b8be63e4dcb2e791ced1ffc9e3a049a5.jpg"},{"username":"gronare","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12680911/medium/c6eb14d1504156f34a158e507f73aa3d_default.png"},{"username":"SmartPhoneLover","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12701640/medium/ec95486662ec875cda080e778c3ff702.jpg"},{"username":"marcelotk_15","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12773227/medium/ecf6bea16ab0c873c131df2154ee9718_default.png"},{"username":"S3OD177","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13051544/medium/11dd990837f61f7e8f7d36b041a7fddb_default.png"},{"username":"marcg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13153301/medium/ebcf60fbf27deb148ec40a659566c6ff_default.png"},{"username":"BeersTeddy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13185230/medium/2f1f4e1effe74a23422b195cbefb2a95_default.png"},{"username":"jamesmcmahon0","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13245578/medium/586aa873b4abddbd9abc6f3de99ab70e.jpeg"},{"username":"b1nar10","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13286752/medium/249b02e3368752cb175446082015737c_default.png"},{"username":"vannCN","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13330448/medium/9b8a9ee3611e51e951e22d5fd4eb7d8d.jpg"},{"username":"binswm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13343482/medium/45dde0e6097b9b72705d2eba9dbbc276_default.png"},{"username":"SkewRam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13496556/medium/188f5c2deb7938eda51eb786cc4539ca.jpeg"},{"username":"raphcatarino","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13547726/medium/b003511e67df13a4b4b5689488fa8099.jpg"},{"username":"shillos5","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13600557/medium/b17650b2b84f829d54fa548c44c1ab27.jpeg"},{"username":"wolong98","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13641407/medium/f4634edc58c7857a357e5293543c15cf.jpg"},{"username":"spair0039","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14012333/medium/72430e96027c09c19141cac38eae4617.png"},{"username":"MajorMarcin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14072183/medium/0a197e64bb92b6ea94cecbb607512c45.jpg"},{"username":"KosmoMoustache","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14103535/medium/51c438cdd9f86e8811c75f4869de479c.png"},{"username":"Soochaehwa","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14118689/medium/496a1ce63111547bf455a1e0a7ac75f1_default.png"},{"username":"garryfield","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14187035/medium/520c964706676045f6eeec1b08edc880.jpg"},{"username":"droidenko","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14444264/medium/4aa3a8e824f72bc9e5ec0d8de307095e.jpeg"},{"username":"maathis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14489950/medium/6eeddf13a757ee35f78f1763f94d95e1.jpeg"},{"username":"bukvam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14546502/medium/a819dc40a13c57395a17dc46e847d3ce.jpg"},{"username":"gm.cinalli","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14670666/medium/2d466a0fdbda40764526be86c97c0ab4.jpeg"},{"username":"antoine2tt","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14722148/medium/f88d926900862dd59007ea4b3419cb9d.png"},{"username":"cretzen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14799754/medium/3ba5c1805ec20c000d5810c07985afe9.jpg"},{"username":"ktKongTong","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14817246/medium/97cfc3c028dbdaf85ebd1102da71e58c.jpeg"},{"username":"marinkaberg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14861042/medium/2d5c4e62613f03082f3e645fa92efd59.jpeg"},{"username":"djismgaming","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14934947/medium/f5a8570713c34ab0f7d5405d105e2a9a.jpeg"},{"username":"f1refa11","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14949159/medium/fd2ae63b8eb4462200ba96abf943c1b9.png"},{"username":"jeffersonraimon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15057621/medium/6dff469563860e2618bc9d45646d0ab4.png"},{"username":"giop98","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15057987/medium/b8a4825d3fc39fc662f35ee258db4b2d.jpeg"},{"username":"tomislav.kraljevic","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15118857/medium/e133f1061cc92850b854d05d8faaeafd.png"},{"username":"Walkx","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15202182/medium/5c37361ae45aeed487b34582c1f7ca37.png"},{"username":"andrea.rosso","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15246318/medium/11f3f5ef44ec7f55b6f143090e208704_default.png"},{"username":"ajnart","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15270132/medium/a0f107a463c8910ee96bc2fa843a17e3.jpeg"},{"username":"Witchling","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15282238/medium/9e196b6783415b10ca571b7673c2ef33.jpg"},{"username":"guineuu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15292058/medium/22fbb758bda3b7805d50bf21d38f2c20.jpeg"},{"username":"Bulgus","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15304568/medium/0e8787e5ceb02ed5c96a514d0068ae87.jpg"},{"username":"Narno","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15314996/medium/a6ba093f24884250a1bf6c6f2ca50f1b_default.png"},{"username":"BySempron","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15315986/medium/e3d22d7b1423c6823a9f36d595ed4bdb.png"},{"username":"jonathan.berglin.work","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15359236/medium/95930b2093db13b76179782f7322c5d5.png"},{"username":"icdmkg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15405504/medium/f334d16cde1ac4ffb935b440d03465af.gif"},{"username":"irithys","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15405614/medium/3086461c47cce0a0c031925e5f943412.png"},{"username":"JannesV","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419912/medium/a7809eb4b817d7c49b62cf10ae86b950.png"},{"username":"benniblot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419914/medium/8086b1573d31f152ba41949b3a172445.jpeg"},{"username":"pacjo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419916/medium/3cbeddbd7bc01faafb5a3bf47bba915b_default.png"},{"username":"Payou6994","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419934/medium/37c9b9b17dfb578404c1c1ddb73ba7a8.png"},{"username":"fzibi21","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15419976/medium/0da688450358e0290a7b7359cc1f7328.png"},{"username":"WowMurdock","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420118/medium/de19576fccb495b6dfe4c4c04a56b834.png"},{"username":"hbooo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420120/medium/6c7c7f8db785061356ebb03d044d3329.jpeg"},{"username":"Manicraft1001","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420178/medium/50ec94563a06a9f74f33bd09f01eed4d.jpg"},{"username":"Void123","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15420354/medium/86929d44df92a00f9fe900a985c196df_default.png"},{"username":"R4cc","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15422606/medium/a390979662b84694f59de30bdb732141.jpeg"},{"username":"fabricionaweb","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15425808/medium/a9354142e7ae5152c144409d55fda551_default.png"},{"username":"JokeOfDead","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15426890/medium/a383eac9365e9de64fd4ab1d6fd0cb95.jpeg"},{"username":"hkz","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15427174/medium/c88acefb0d7306e1f7470e872029fb39_default.png"},{"username":"Steken","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15428516/medium/d5aea5653c769c3a523182bdb60d1664.png"},{"username":"flar.anton","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15428592/medium/b01fdb365d892e9f811f77fcb50a80a2.jpeg"},{"username":"Bon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15433542/medium/5397da4dfc821f20b6ac14fe0c514e9a.jpeg"},{"username":"bfkadan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15434162/medium/4f9a0b43cfe3acaea60124c14ba7f44a.png"},{"username":"BunnySweety","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15434662/medium/f0ef200a6a0dcf0e1d0e9ecd4148f560_default.png"},{"username":"HRKings","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15436168/medium/69a31e461d38549f01864e7ef10d642e.png"},{"username":"wiston81","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15439078/medium/10f292c8d12a7c21a44b54495fa4a3d8.jpeg"},{"username":"qaz0911","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15440860/medium/3d3e50ee388c72dc4bf7a771761f2d89_default.png"},{"username":"qqyule","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15441462/medium/7a3cdf82710ffb5d8f388bc0bd010665.png"},{"username":"Bims0n","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15445560/medium/603220b603eeb3367e0f0d3fa675247c.jpg"},{"username":"TariqDaCoder","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15446228/medium/50b0f4040112bbd67690b769477398e5_default.png"},{"username":"Anarchon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15449644/medium/e925e1f3e3ffbf0f982391ce263a1a28.jpeg"},{"username":"Ashun","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15453020/medium/ccdcf51c73d6aae40751bb30beee1915_default.png"},{"username":"sebekmartin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15454038/medium/bcfb44598cdfd1d7cd4eb35812538962.jpeg"},{"username":"RagnarGraves","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15459882/medium/143d5af850c1154070a218bea124e9cb_default.png"},{"username":"PrtmPhlp","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15462414/medium/b80db55e9de301432dcd1f8c8b24fd49_default.png"},{"username":"DooYoo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15470768/medium/2a18cf4be67094724b508c9e1e698a21_default.png"},{"username":"espentruls","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15486092/medium/8e38afc3a4ff669226a0cfd3e420ff3a.jpeg"},{"username":"frisco82","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15486922/medium/4e1c5d4189b42508e660daa3c1c25b2a.jpeg"},{"username":"lupineDK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15491798/medium/461bd501e8371c062bf29ea171aedd36_default.png"},{"username":"hillaliy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15492732/medium/0bae17b421604892d888e3fc70cf0587.jpeg"},{"username":"MarcOrfilaCarreras","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15501072/medium/ea52b26c3c6f21e4931e38e3ce3f3d6e.png"},{"username":"robertbridda","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15507822/medium/a368c2e30411bb2da9b49290084191f3.png"},{"username":"MKoniuszko","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15518090/medium/87605434fcc839f6763ab07c50f6d232.jpeg"},{"username":"HeroSizy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15518710/medium/4e79c0e98cbeb536dd961e656331b509.png"},{"username":"dwt136","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15520022/medium/554422503f2baea43ace85facb4546fb_default.png"},{"username":"asifthewebguy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15526719/medium/b18931dd0c800d725048bd440646198b_default.png"},{"username":"eiloogs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15545537/medium/f290a2f1190983530a9b76b2e858a609.gif"},{"username":"_vytdv","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15547289/medium/60d8644cc8ad6f11a92ccea4a14cd098_default.png"},{"username":"crendasien","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15554645/medium/598ab1d4aaf6b8dccd5ba16be92da7b9.jpeg"},{"username":"edxo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15573823/medium/8a565b732a75a77f840dd123cdb30bf4.png"},{"username":"somerlev","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15617065/medium/f4b13513e311ec902d90b2f718412c55.jpg"},{"username":"kid1412621","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15643771/medium/dd455e32de652fa88e6fd97598bdffa7.png"},{"username":"suming","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15644717/medium/244159dfe10fa03436205506f80c9e25.png"},{"username":"nick.gher","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15647517/medium/5374a2c6fef60a3fbf0edf86b997c351_default.png"},{"username":"DataCat","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15650315/medium/ce7c1365adf35c5d490d77500a4607fb_default.png"},{"username":"dizo89","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15658375/medium/0ca745e5017d491fe1b22b0239904de8.jpeg"},{"username":"tee_noodle","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15674577/medium/804d9cf06f5196026acb6436b809d0da_default.png"},{"username":"Marty88","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15674593/medium/492b1509d52bd2809dea768121217125.jpeg"},{"username":"Spillebulle","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15677023/medium/20b98bb85062e07afe0e63618f8a5feb.PNG"},{"username":"petitmewen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15685239/medium/15de9b62d2e0bc25013435f1784bbcc1.jpeg"},{"username":"NoProsNoNoobs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15687709/medium/ae8f65fafeb8bcf74dcb8871bbe46461.png"},{"username":"y.gybson","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15690777/medium/b5cb5d2d5768904ff6586c727e3a6c77.jpeg"},{"username":"inside90","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15704947/medium/c1355fcb30dd76f8e39d98d1d49f1c52.png"},{"username":"RJSkudra","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15709853/medium/c3abf2774913dc4e81fb261d36d7668c.png"},{"username":"binge203","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15713937/medium/77c1cfa4314673db80e6881fd9f64668.gif"},{"username":"Mailootje","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15714337/medium/743c3bc4ab1989966a375eeeec83d8b8.jpeg"},{"username":"tim-wiegers","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15719805/medium/08a96f064813350661cd6b20bf3d7d99.png"},{"username":"GkhnG","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15722911/medium/71a027caec489ef6ce82bcf1888329d0_default.png"},{"username":"Zoen-Millo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15760967/medium/9e956f11adc5b34f5636268b5c485dbf.jpg"},{"username":"HooinKyoma","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15792897/medium/9489f0a9b368e0e827ae758b740a2eed.jpeg"},{"username":"wathergeen","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15794495/medium/a83b7fc80d180669ebfd6deb3544cfd0.png"},{"username":"MoeToo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15818233/medium/d35cd6953717706eaf20f6c143c62947.png"},{"username":"itodouble","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15836233/medium/e984caea18fb0673bf319fcf28cef649.png"},{"username":"loslocitos","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15847901/medium/fe30d12fd2cf38212f929e13b169f9ec.jpeg"},{"username":"Oversleep","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15849065/medium/06141f13a6d541d753f3c2f2947b8068_default.png"},{"username":"Beardy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15865139/medium/fca6b9d2b3f52e286d1568f52b83b6a0_default.png"},{"username":"raelyan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15875457/medium/2f4fda1d1aaa5dcc79b328baf3f03151.jpeg"},{"username":"dolphin738","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15913763/medium/ee6fede7b8528ca642329ada80d1cc18.png"},{"username":"brunotco","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15916719/medium/09db45880fc05abc18adb8d932a5ecf9_default.png"},{"username":"LukeIsHereToDevelop","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15924739/medium/3e6cd3940297bb4ba7bb039c93e6f918.png"},{"username":"kennit","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15925879/medium/6b0733ad3c5949b91c55e4d8b03db8a5_default.png"},{"username":"kuunpire","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15950309/medium/8192a4f08f07086828ac9f74ed29a169.jpeg"},{"username":"Sandor-dev","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15951759/medium/0216c2da4eb028164ebbecf1c72f6271_default.png"},{"username":"Meierschlumpf","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15953187/medium/23c744faef1ab84fbdc9351a7850aab6.jpeg"},{"username":"harmlesscat","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15970733/medium/dd8d0214a0250c932bb518b1b55e45a2_default.png"},{"username":"OrzWTF","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15976121/medium/4c4557cbff7ff7b0503455bc59c020e0.jpeg"},{"username":"tagaishi","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15977271/medium/eade504c83a5a1ff831c80a538fbdb44_default.png"},{"username":"azurite928","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15981895/medium/547ccc459ee123e78b5401c499f1022d.png"},{"username":"Ronner231","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16021342/medium/7734d550df2de5a2fec2ffff33e7024c.jpeg"},{"username":"ugyes","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16034148/medium/ed001e3f470a2dea9a8ce955b18e7bd5.png"},{"username":"rpieja","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16045554/medium/bd55baca2ef8b92502a760cc9ee7c505_default.png"},{"username":"flambyisyou","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16051620/medium/3a3bc0c90f6b95ab4ef74396a0a17beb.png"},{"username":"Topbcy","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16077170/medium/d3aed33ea56330338756cfcd89477cfe.jpeg"},{"username":"ai5d02sb","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16084674/medium/7c8119fe2a5ca71bb15f636916a42b95_default.png"},{"username":"explosiveparrot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16097722/medium/7762f80fc1da63f5b2eb87de9d640324_default.png"},{"username":"DestroyCom","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16111544/medium/83e3d3ac5c8bfed634cd1a074854db67.png"},{"username":"neotraxo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16116966/medium/b30df957873329019a8a90a69f6efe3a.png"},{"username":"gzxpa","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16123314/medium/487b05577310a946b0b98bc72c11213b_default.png"},{"username":"TORIK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16124732/medium/de770890e6411860ac06e8cc2dc0abd0_default.png"},{"username":"sergio.pibot","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16138114/medium/80db802b2fcd6bbf19ea4c7413367dca.jpeg"},{"username":"karam-ajaj","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16139838/medium/7539ab958d3c85d5f67e7849483ea8f7.jpeg"},{"username":"SimonHenz97","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16151520/medium/9b94a85b536688e2d94538c384fd0a76.png"},{"username":"olsson82","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16198988/medium/eeaab4cba210c537424d4204754b604e.png"},{"username":"bo3bdo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16222806/medium/8652f3beacb6098dde5a4cd0a29fe80d.jpeg"},{"username":"AngryPlayer04","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16245192/medium/342715274f4dc31fd4132cdae9126188.jpeg"},{"username":"ehatamm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16245884/medium/979d5e5526fe545be9bf46db481f7182.jpeg"},{"username":"Balionelis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16246058/medium/986d62ba363594c517d966fe9178dcbb.png"},{"username":"kwargs","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16248816/medium/19ce11f04bf1ae2637e0483399c675f9_default.png"},{"username":"lucicu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16273892/medium/3b09e8f3bead221ef98d6a45a16851dc_default.png"},{"username":"Michael5564445","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16357688/medium/9d9026a8bf3eaccb0417da240932ebf7.png"},{"username":"Netscream","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16359198/medium/694e0c8572dc8a47e6d63da31ec5b992.png"},{"username":"belicstefan04","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16368142/medium/4742dcfd7bf7ad7e33e37ac44fba7e0f.png"},{"username":"Hamad2066","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16371478/medium/f37bbc7685b6757defdbd1494236af61.jpeg"},{"username":"3ct0pl4sm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16399616/medium/ce796d1c40163975624c0a483e56374f.png"},{"username":"sanchez.marcell626","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16433865/medium/3ddde1314764cc2205ffdcd1ae719a91.png"},{"username":"Minoctis","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16490079/medium/91fd0849303a4eca033d660d0a7b6854.jpeg"},{"username":"homarr","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16657003/medium/3afabfd3de949a54ff5d40ad04552aba.png"},{"username":"mwgg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16658379/medium/763dd09f5c238cc5324d4d5357985292.png"},{"username":"kiwinho","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16671855/medium/bfe3a2d497dc4748a04d02e4ae2139cb.jpeg"},{"username":"tjvg4m34r13","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16679135/medium/7a483b9b0abe0d925e54808e1cb38fa0.jpeg"},{"username":"Diegoem","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16705921/medium/29ce68ebc191fc3f65499511b12de98f_default.png"},{"username":"bouks69","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16746091/medium/b58b1fc08520de416198be9df5d093eb.jpeg"},{"username":"futhgar","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16748067/medium/b8c526b097f9aa9d687250cac3df16dc.jpeg"},{"username":"GrimSQL","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16764343/medium/fff729a76d1f8fbcdaee9bb0c0f5f3fd.png"},{"username":"chnikel","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16767047/medium/3dda2a37e03049dafefe6697bb00f75c.png"},{"username":"yuki19870616","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16767951/medium/f59c848e38382cda6c8464b0a7b9e642_default.png"},{"username":"noamdal","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16782245/medium/b4a72a61f9caf138f0322c0cb987e6d0.png"},{"username":"MalithRukshan","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16809057/medium/084d6a5b35fbbeacc70e7021197d222f.png"},{"username":"minirope19","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16930929/medium/e8cbbc26747e31c5a8959215e1dd067b.jpeg"},{"username":"prubin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17503492/medium/96ac87644691e49c1f983f2f094e541c_default.png"},{"username":"sam-tam-sam","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17578052/medium/1628dc2954ce3ae95e0caaa2bd60ab0c.png"},{"username":"toineenzo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12371852/medium/9f1b2bedb4794c59479cd289bdba9fab.png"},{"username":"ArcaneWater","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12421105/medium/1ac82517a6c658f6b62c48aebcb17e86_default.png"},{"username":"Ebedami","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/12974801/medium/b596dea5c09454c4c828eac558389755.jpg"},{"username":"perrygamerptyt","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13117177/medium/1406c949507ecd438480473c8a1f6124.jpg"},{"username":"SergiSvK","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13320543/medium/3df3c79cc5f0c53716c559cd3fd2fc20.png"},{"username":"jeongeon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13362856/medium/eb572f72cde5e5526c517ca3a6489850_default.png"},{"username":"MrTranCFCVN","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13439475/medium/a1789d69c85d90c667194b5d6a518c08_default.png"},{"username":"Tobost06","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13467449/medium/9227dc07f6366bc060d28304f5cb8ce7.jpeg"},{"username":"Kf637","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13530622/medium/118b00bb72d01d3229c97409637e25d1_default.png"},{"username":"Cruellest","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/13610615/medium/2a74faa0947ee08d18f7946fb8602c1e.jpg"},{"username":"olavinto","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14424644/medium/37c01732bd2b7a272b421807a05ccfeb.png"},{"username":"Thario","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14491372/medium/dd5e142070802a672900121aa3f332a6_default.png"},{"username":"Wjouter","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14585620/medium/b91a51513332bdc0a0a9ecbed99ecbc3.png"},{"username":"albanobattistella","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14686194/medium/564afcfd76f5cd24751bd669cf4943aa.jpg"},{"username":"Kachelkaiser","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14763406/medium/203a781797da4a18fe0f4e7db8fd547c.png"},{"username":"regi4","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14842936/medium/f7e1d672f562a7db61ba6b4b8f4de41d.png"},{"username":"baton5129","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/14891064/medium/8d438f557b82977dd02f0ead3187265f.PNG"},{"username":"meviper","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/15958903/medium/209f521ce33a05831fa8d7d1b7babc20_default.png"},{"username":"GerOriki","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16268376/medium/da00e54b08cd40348231d92873a0cd0a_default.png"},{"username":"TheRedCyclops","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16486399/medium/7f39226180120d5a9efcb8e13d8aec8e_default.png"},{"username":"dymek37","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16659221/medium/d1dc6d11d7e7fc370efc5070e837ae03.png"},{"username":"B3CKDOOR","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16744975/medium/e6c7b2d45e76465d54e6efb67c83da7d.png"},{"username":"Larsluph","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16779933/medium/ed7d36f8b44013bad3a16ac0491bd0f7.png"},{"username":"FOEDI","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16781001/medium/6b4552fb72e359aa016f7a054078fac8.png"},{"username":"xmarkurion","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16805443/medium/34a20428427de5aaef99c7d140646803.png"},{"username":"gregid","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16806705/medium/f3c8f4a20436e8538929130142bbc104.png"},{"username":"Flameberg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16820453/medium/d47be866148474c9d05fec6fbe406d88.png"},{"username":"Playfust","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16872865/medium/5f4609cc711e5fb9fa8a0b178635769c.jpeg"},{"username":"Cotignac","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16879297/medium/81ff353edf030699a159bb79cda26e84.jpg"},{"username":"LeaHun","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16916375/medium/618520f0543b1e212ebc83d66b683d4b_default.png"},{"username":"jackwellerreal","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16919717/medium/37bbfdc03893f141133ccc619593266d.png"},{"username":"renan.costaalencar","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16938427/medium/6d25b25320c5bde734118dec4af9cd5b.png"},{"username":"andrius.cim","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/16967845/medium/46028fc1a0ddfaaeebcb37b39739625d_default.png"},{"username":"xjxexrxrxyx","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17041412/medium/d34d664166db6fb25579bca9ff3b50b4.jpeg"},{"username":"bilhal.fellah","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17044572/medium/d1ec6f17e4aa013e9eededc83778d2c6.png"},{"username":"the_octo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17058060/medium/7423ab3a4cabb67f5decb2e2dfa2b675_default.png"},{"username":"BamesJond","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17075846/medium/128d7ffd40254c8e376f45678e2fc620_default.png"},{"username":"Kornikus","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17134240/medium/d7a42b2c30db46ff152699ca01f9e11a_default.png"},{"username":"xoxyuxu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17176526/medium/108055aa24343043de852e412bec74be.png"},{"username":"cryptodntsleep","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17249408/medium/b9e15aa2b24a0dbc1e4f194aa8ed5109.png"},{"username":"yaniorg","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17261842/medium/7dbfc77f21c826845961243c44540d26.jpg"},{"username":"Vidariondr","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17262438/medium/45fbc71be02ef27296b6f423e97b6a03_default.png"},{"username":"Fastery","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17263066/medium/701b0edc59676174863ad651528bbb37.jpeg"},{"username":"stratself","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17290388/medium/57d9d8161b3fd0abf4dc5558b4a1fa05_default.png"},{"username":"wuzeqin","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17292606/medium/b9e0308410b31337e2d7aa6ed346d718_default.png"},{"username":"ChristopherBull","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17304338/medium/21a175ce596bfae81430767467908b90.jpeg"},{"username":"darkbcnlord","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17311436/medium/b271bc0b419ec3a26ddb7b63ff8ffc4b.png"},{"username":"zhoran1997","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17344028/medium/c8f450b5a8f1e9494a45dc60af7ce63e.png"},{"username":"gilalves1703","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17447768/medium/3f1de562a5c2391c88bbf8d5cf40a266.png"},{"username":"iServeCloud","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17470960/medium/11649b99d609438d66455a4d2fdc70f7.png"},{"username":"guibolzantvbox","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17474136/medium/59a576e6da538664ceb972253916fa02.jpeg"},{"username":"ivann136","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17506062/medium/67d09ada36fac5f444a1f7517e3a97bd_default.png"},{"username":"Maheshivara","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17516082/medium/576e1e6581cf969615b265de6aeff8b7.jpeg"},{"username":"brunogui81","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17517542/medium/7c0d174e810435af518fe8e0c05e151f.jpeg"},{"username":"michelwilhelm","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17542190/medium/4c6b33fd8993ff565fa75add2ce8355e.jpeg"},{"username":"dias-gxstavo","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17547376/medium/8c6b109aae8aeb651192346a39ae9e5b.jpeg"},{"username":"ToxykAuBleu","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17614030/medium/8d21e0608560172b121bd46126d827c7.jpeg"},{"username":"e.erdemir","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17617994/medium/7259a29db9941c6171a8cbbd643b92bd.png"},{"username":"sjonkreutz","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17618306/medium/7601c45d015189a863656e21348d223b.png"},{"username":"volovich0377","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17620388/medium/c929a8fbd24f96d17620fa497ade7309.png"},{"username":"Hamstio1","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17624898/medium/406e0bf40094c24a01c3064f8f5b2a82.png"},{"username":"i3laa","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17627462/medium/613a9d283ed8b69819ee181903851660.jpeg"},{"username":"bastiengrignon","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17629884/medium/ddfc3339285bd65195fcd834e512e9b7.jpeg"},{"username":"kauhee","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17644600/medium/def1b9066cf9275b4273a5a5dca7f325.png"},{"username":"hongminzheng","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17683860/medium/a764f4963912777d27a7cd98e136a2b2.png"},{"username":"d-lindahl","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17726729/medium/cbde348582fbabcfadd89a56cd5a0b40.png"},{"username":"Enoal-Fauchille-Bolle","avatarUrl":"https://crowdin-static.cf-downloads.crowdin.com/avatar/17734649/medium/6e6fb29198782dc7856ea21811db669c.jpeg"}] \ No newline at end of file +[ + { + "username": "carlchina", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/6697/medium/d22bbe7797bbeb30dbdc73a5648d329a_default.png" + }, + { + "username": "zielmann", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/7795/medium/ad22b8b8d5eb33e4154d53a454c862fd_default.png" + }, + { + "username": "Thalyn", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/12494028/medium/5faf5acc945a874ed116c4567edaa09f_default.png" + }, + { + "username": "magnushj", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/12503488/medium/68f32e33ea7b891960055c9f831f7344_default.png" + }, + { + "username": "almontegil", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/12580457/medium/f4136cacbdfdb4c28ae7f85dc5f840db_default.png" + }, + { + "username": "andibing", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/12664938/medium/b8be63e4dcb2e791ced1ffc9e3a049a5.jpg" + }, + { + "username": "gronare", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/12680911/medium/c6eb14d1504156f34a158e507f73aa3d_default.png" + }, + { + "username": "SmartPhoneLover", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/12701640/medium/ec95486662ec875cda080e778c3ff702.jpg" + }, + { + "username": "marcelotk_15", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/12773227/medium/ecf6bea16ab0c873c131df2154ee9718_default.png" + }, + { + "username": "S3OD177", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/13051544/medium/11dd990837f61f7e8f7d36b041a7fddb_default.png" + }, + { + "username": "marcg", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/13153301/medium/ebcf60fbf27deb148ec40a659566c6ff_default.png" + }, + { + "username": "BeersTeddy", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/13185230/medium/2f1f4e1effe74a23422b195cbefb2a95_default.png" + }, + { + "username": "jamesmcmahon0", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/13245578/medium/586aa873b4abddbd9abc6f3de99ab70e.jpeg" + }, + { + "username": "b1nar10", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/13286752/medium/249b02e3368752cb175446082015737c_default.png" + }, + { + "username": "vannCN", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/13330448/medium/9b8a9ee3611e51e951e22d5fd4eb7d8d.jpg" + }, + { + "username": "binswm", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/13343482/medium/45dde0e6097b9b72705d2eba9dbbc276_default.png" + }, + { + "username": "SkewRam", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/13496556/medium/188f5c2deb7938eda51eb786cc4539ca.jpeg" + }, + { + "username": "raphcatarino", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/13547726/medium/b003511e67df13a4b4b5689488fa8099.jpg" + }, + { + "username": "shillos5", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/13600557/medium/b17650b2b84f829d54fa548c44c1ab27.jpeg" + }, + { + "username": "wolong98", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/13641407/medium/f4634edc58c7857a357e5293543c15cf.jpg" + }, + { + "username": "spair0039", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/14012333/medium/72430e96027c09c19141cac38eae4617.png" + }, + { + "username": "MajorMarcin", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/14072183/medium/0a197e64bb92b6ea94cecbb607512c45.jpg" + }, + { + "username": "KosmoMoustache", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/14103535/medium/51c438cdd9f86e8811c75f4869de479c.png" + }, + { + "username": "Soochaehwa", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/14118689/medium/496a1ce63111547bf455a1e0a7ac75f1_default.png" + }, + { + "username": "garryfield", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/14187035/medium/520c964706676045f6eeec1b08edc880.jpg" + }, + { + "username": "droidenko", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/14444264/medium/4aa3a8e824f72bc9e5ec0d8de307095e.jpeg" + }, + { + "username": "maathis", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/14489950/medium/6eeddf13a757ee35f78f1763f94d95e1.jpeg" + }, + { + "username": "bukvam", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/14546502/medium/a819dc40a13c57395a17dc46e847d3ce.jpg" + }, + { + "username": "gm.cinalli", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/14670666/medium/2d466a0fdbda40764526be86c97c0ab4.jpeg" + }, + { + "username": "antoine2tt", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/14722148/medium/f88d926900862dd59007ea4b3419cb9d.png" + }, + { + "username": "cretzen", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/14799754/medium/3ba5c1805ec20c000d5810c07985afe9.jpg" + }, + { + "username": "ktKongTong", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/14817246/medium/97cfc3c028dbdaf85ebd1102da71e58c.jpeg" + }, + { + "username": "marinkaberg", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/14861042/medium/2d5c4e62613f03082f3e645fa92efd59.jpeg" + }, + { + "username": "djismgaming", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/14934947/medium/f5a8570713c34ab0f7d5405d105e2a9a.jpeg" + }, + { + "username": "f1refa11", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/14949159/medium/fd2ae63b8eb4462200ba96abf943c1b9.png" + }, + { + "username": "jeffersonraimon", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15057621/medium/6dff469563860e2618bc9d45646d0ab4.png" + }, + { + "username": "giop98", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15057987/medium/b8a4825d3fc39fc662f35ee258db4b2d.jpeg" + }, + { + "username": "tomislav.kraljevic", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15118857/medium/e133f1061cc92850b854d05d8faaeafd.png" + }, + { + "username": "Walkx", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15202182/medium/5c37361ae45aeed487b34582c1f7ca37.png" + }, + { + "username": "andrea.rosso", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15246318/medium/11f3f5ef44ec7f55b6f143090e208704_default.png" + }, + { + "username": "ajnart", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15270132/medium/a0f107a463c8910ee96bc2fa843a17e3.jpeg" + }, + { + "username": "Witchling", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15282238/medium/9e196b6783415b10ca571b7673c2ef33.jpg" + }, + { + "username": "guineuu", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15292058/medium/22fbb758bda3b7805d50bf21d38f2c20.jpeg" + }, + { + "username": "Bulgus", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15304568/medium/0e8787e5ceb02ed5c96a514d0068ae87.jpg" + }, + { + "username": "Narno", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15314996/medium/a6ba093f24884250a1bf6c6f2ca50f1b_default.png" + }, + { + "username": "BySempron", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15315986/medium/e3d22d7b1423c6823a9f36d595ed4bdb.png" + }, + { + "username": "jonathan.berglin.work", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15359236/medium/95930b2093db13b76179782f7322c5d5.png" + }, + { + "username": "icdmkg", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15405504/medium/f334d16cde1ac4ffb935b440d03465af.gif" + }, + { + "username": "irithys", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15405614/medium/3086461c47cce0a0c031925e5f943412.png" + }, + { + "username": "JannesV", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15419912/medium/a7809eb4b817d7c49b62cf10ae86b950.png" + }, + { + "username": "benniblot", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15419914/medium/8086b1573d31f152ba41949b3a172445.jpeg" + }, + { + "username": "pacjo", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15419916/medium/3cbeddbd7bc01faafb5a3bf47bba915b_default.png" + }, + { + "username": "Payou6994", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15419934/medium/37c9b9b17dfb578404c1c1ddb73ba7a8.png" + }, + { + "username": "fzibi21", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15419976/medium/0da688450358e0290a7b7359cc1f7328.png" + }, + { + "username": "WowMurdock", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15420118/medium/de19576fccb495b6dfe4c4c04a56b834.png" + }, + { + "username": "hbooo", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15420120/medium/6c7c7f8db785061356ebb03d044d3329.jpeg" + }, + { + "username": "Manicraft1001", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15420178/medium/50ec94563a06a9f74f33bd09f01eed4d.jpg" + }, + { + "username": "Void123", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15420354/medium/86929d44df92a00f9fe900a985c196df_default.png" + }, + { + "username": "R4cc", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15422606/medium/a390979662b84694f59de30bdb732141.jpeg" + }, + { + "username": "fabricionaweb", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15425808/medium/a9354142e7ae5152c144409d55fda551_default.png" + }, + { + "username": "JokeOfDead", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15426890/medium/a383eac9365e9de64fd4ab1d6fd0cb95.jpeg" + }, + { + "username": "hkz", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15427174/medium/c88acefb0d7306e1f7470e872029fb39_default.png" + }, + { + "username": "Steken", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15428516/medium/d5aea5653c769c3a523182bdb60d1664.png" + }, + { + "username": "flar.anton", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15428592/medium/b01fdb365d892e9f811f77fcb50a80a2.jpeg" + }, + { + "username": "Bon", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15433542/medium/5397da4dfc821f20b6ac14fe0c514e9a.jpeg" + }, + { + "username": "bfkadan", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15434162/medium/4f9a0b43cfe3acaea60124c14ba7f44a.png" + }, + { + "username": "BunnySweety", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15434662/medium/f0ef200a6a0dcf0e1d0e9ecd4148f560_default.png" + }, + { + "username": "HRKings", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15436168/medium/69a31e461d38549f01864e7ef10d642e.png" + }, + { + "username": "wiston81", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15439078/medium/10f292c8d12a7c21a44b54495fa4a3d8.jpeg" + }, + { + "username": "qaz0911", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15440860/medium/3d3e50ee388c72dc4bf7a771761f2d89_default.png" + }, + { + "username": "qqyule", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15441462/medium/7a3cdf82710ffb5d8f388bc0bd010665.png" + }, + { + "username": "Bims0n", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15445560/medium/603220b603eeb3367e0f0d3fa675247c.jpg" + }, + { + "username": "TariqDaCoder", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15446228/medium/50b0f4040112bbd67690b769477398e5_default.png" + }, + { + "username": "Anarchon", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15449644/medium/e925e1f3e3ffbf0f982391ce263a1a28.jpeg" + }, + { + "username": "Ashun", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15453020/medium/ccdcf51c73d6aae40751bb30beee1915_default.png" + }, + { + "username": "sebekmartin", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15454038/medium/bcfb44598cdfd1d7cd4eb35812538962.jpeg" + }, + { + "username": "RagnarGraves", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15459882/medium/143d5af850c1154070a218bea124e9cb_default.png" + }, + { + "username": "PrtmPhlp", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15462414/medium/b80db55e9de301432dcd1f8c8b24fd49_default.png" + }, + { + "username": "DooYoo", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15470768/medium/2a18cf4be67094724b508c9e1e698a21_default.png" + }, + { + "username": "espentruls", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15486092/medium/8e38afc3a4ff669226a0cfd3e420ff3a.jpeg" + }, + { + "username": "frisco82", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15486922/medium/4e1c5d4189b42508e660daa3c1c25b2a.jpeg" + }, + { + "username": "lupineDK", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15491798/medium/461bd501e8371c062bf29ea171aedd36_default.png" + }, + { + "username": "hillaliy", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15492732/medium/0bae17b421604892d888e3fc70cf0587.jpeg" + }, + { + "username": "MarcOrfilaCarreras", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15501072/medium/ea52b26c3c6f21e4931e38e3ce3f3d6e.png" + }, + { + "username": "robertbridda", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15507822/medium/a368c2e30411bb2da9b49290084191f3.png" + }, + { + "username": "MKoniuszko", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15518090/medium/87605434fcc839f6763ab07c50f6d232.jpeg" + }, + { + "username": "HeroSizy", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15518710/medium/4e79c0e98cbeb536dd961e656331b509.png" + }, + { + "username": "dwt136", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15520022/medium/554422503f2baea43ace85facb4546fb_default.png" + }, + { + "username": "asifthewebguy", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15526719/medium/b18931dd0c800d725048bd440646198b_default.png" + }, + { + "username": "eiloogs", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15545537/medium/f290a2f1190983530a9b76b2e858a609.gif" + }, + { + "username": "_vytdv", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15547289/medium/60d8644cc8ad6f11a92ccea4a14cd098_default.png" + }, + { + "username": "crendasien", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15554645/medium/598ab1d4aaf6b8dccd5ba16be92da7b9.jpeg" + }, + { + "username": "edxo", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15573823/medium/8a565b732a75a77f840dd123cdb30bf4.png" + }, + { + "username": "somerlev", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15617065/medium/f4b13513e311ec902d90b2f718412c55.jpg" + }, + { + "username": "kid1412621", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15643771/medium/dd455e32de652fa88e6fd97598bdffa7.png" + }, + { + "username": "suming", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15644717/medium/244159dfe10fa03436205506f80c9e25.png" + }, + { + "username": "nick.gher", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15647517/medium/5374a2c6fef60a3fbf0edf86b997c351_default.png" + }, + { + "username": "DataCat", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15650315/medium/ce7c1365adf35c5d490d77500a4607fb_default.png" + }, + { + "username": "dizo89", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15658375/medium/0ca745e5017d491fe1b22b0239904de8.jpeg" + }, + { + "username": "tee_noodle", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15674577/medium/804d9cf06f5196026acb6436b809d0da_default.png" + }, + { + "username": "Marty88", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15674593/medium/492b1509d52bd2809dea768121217125.jpeg" + }, + { + "username": "Spillebulle", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15677023/medium/20b98bb85062e07afe0e63618f8a5feb.PNG" + }, + { + "username": "petitmewen", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15685239/medium/15de9b62d2e0bc25013435f1784bbcc1.jpeg" + }, + { + "username": "NoProsNoNoobs", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15687709/medium/ae8f65fafeb8bcf74dcb8871bbe46461.png" + }, + { + "username": "y.gybson", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15690777/medium/b5cb5d2d5768904ff6586c727e3a6c77.jpeg" + }, + { + "username": "inside90", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15704947/medium/c1355fcb30dd76f8e39d98d1d49f1c52.png" + }, + { + "username": "RJSkudra", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15709853/medium/c3abf2774913dc4e81fb261d36d7668c.png" + }, + { + "username": "binge203", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15713937/medium/77c1cfa4314673db80e6881fd9f64668.gif" + }, + { + "username": "Mailootje", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15714337/medium/743c3bc4ab1989966a375eeeec83d8b8.jpeg" + }, + { + "username": "tim-wiegers", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15719805/medium/08a96f064813350661cd6b20bf3d7d99.png" + }, + { + "username": "GkhnG", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15722911/medium/71a027caec489ef6ce82bcf1888329d0_default.png" + }, + { + "username": "Zoen-Millo", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15760967/medium/9e956f11adc5b34f5636268b5c485dbf.jpg" + }, + { + "username": "HooinKyoma", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15792897/medium/9489f0a9b368e0e827ae758b740a2eed.jpeg" + }, + { + "username": "wathergeen", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15794495/medium/a83b7fc80d180669ebfd6deb3544cfd0.png" + }, + { + "username": "MoeToo", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15818233/medium/d35cd6953717706eaf20f6c143c62947.png" + }, + { + "username": "itodouble", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15836233/medium/e984caea18fb0673bf319fcf28cef649.png" + }, + { + "username": "loslocitos", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15847901/medium/fe30d12fd2cf38212f929e13b169f9ec.jpeg" + }, + { + "username": "Oversleep", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15849065/medium/06141f13a6d541d753f3c2f2947b8068_default.png" + }, + { + "username": "Beardy", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15865139/medium/fca6b9d2b3f52e286d1568f52b83b6a0_default.png" + }, + { + "username": "raelyan", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15875457/medium/2f4fda1d1aaa5dcc79b328baf3f03151.jpeg" + }, + { + "username": "dolphin738", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15913763/medium/ee6fede7b8528ca642329ada80d1cc18.png" + }, + { + "username": "brunotco", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15916719/medium/09db45880fc05abc18adb8d932a5ecf9_default.png" + }, + { + "username": "LukeIsHereToDevelop", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15924739/medium/3e6cd3940297bb4ba7bb039c93e6f918.png" + }, + { + "username": "kennit", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15925879/medium/6b0733ad3c5949b91c55e4d8b03db8a5_default.png" + }, + { + "username": "kuunpire", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15950309/medium/8192a4f08f07086828ac9f74ed29a169.jpeg" + }, + { + "username": "Sandor-dev", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15951759/medium/0216c2da4eb028164ebbecf1c72f6271_default.png" + }, + { + "username": "Meierschlumpf", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15953187/medium/23c744faef1ab84fbdc9351a7850aab6.jpeg" + }, + { + "username": "harmlesscat", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15970733/medium/dd8d0214a0250c932bb518b1b55e45a2_default.png" + }, + { + "username": "OrzWTF", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15976121/medium/4c4557cbff7ff7b0503455bc59c020e0.jpeg" + }, + { + "username": "tagaishi", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15977271/medium/eade504c83a5a1ff831c80a538fbdb44_default.png" + }, + { + "username": "azurite928", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15981895/medium/547ccc459ee123e78b5401c499f1022d.png" + }, + { + "username": "Ronner231", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16021342/medium/7734d550df2de5a2fec2ffff33e7024c.jpeg" + }, + { + "username": "ugyes", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16034148/medium/ed001e3f470a2dea9a8ce955b18e7bd5.png" + }, + { + "username": "rpieja", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16045554/medium/bd55baca2ef8b92502a760cc9ee7c505_default.png" + }, + { + "username": "flambyisyou", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16051620/medium/3a3bc0c90f6b95ab4ef74396a0a17beb.png" + }, + { + "username": "Topbcy", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16077170/medium/d3aed33ea56330338756cfcd89477cfe.jpeg" + }, + { + "username": "ai5d02sb", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16084674/medium/7c8119fe2a5ca71bb15f636916a42b95_default.png" + }, + { + "username": "explosiveparrot", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16097722/medium/7762f80fc1da63f5b2eb87de9d640324_default.png" + }, + { + "username": "DestroyCom", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16111544/medium/83e3d3ac5c8bfed634cd1a074854db67.png" + }, + { + "username": "neotraxo", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16116966/medium/b30df957873329019a8a90a69f6efe3a.png" + }, + { + "username": "gzxpa", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16123314/medium/487b05577310a946b0b98bc72c11213b_default.png" + }, + { + "username": "TORIK", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16124732/medium/de770890e6411860ac06e8cc2dc0abd0_default.png" + }, + { + "username": "sergio.pibot", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16138114/medium/80db802b2fcd6bbf19ea4c7413367dca.jpeg" + }, + { + "username": "karam-ajaj", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16139838/medium/7539ab958d3c85d5f67e7849483ea8f7.jpeg" + }, + { + "username": "SimonHenz97", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16151520/medium/9b94a85b536688e2d94538c384fd0a76.png" + }, + { + "username": "olsson82", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16198988/medium/eeaab4cba210c537424d4204754b604e.png" + }, + { + "username": "bo3bdo", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16222806/medium/8652f3beacb6098dde5a4cd0a29fe80d.jpeg" + }, + { + "username": "AngryPlayer04", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16245192/medium/342715274f4dc31fd4132cdae9126188.jpeg" + }, + { + "username": "ehatamm", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16245884/medium/979d5e5526fe545be9bf46db481f7182.jpeg" + }, + { + "username": "Balionelis", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16246058/medium/986d62ba363594c517d966fe9178dcbb.png" + }, + { + "username": "kwargs", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16248816/medium/19ce11f04bf1ae2637e0483399c675f9_default.png" + }, + { + "username": "lucicu", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16273892/medium/3b09e8f3bead221ef98d6a45a16851dc_default.png" + }, + { + "username": "Michael5564445", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16357688/medium/9d9026a8bf3eaccb0417da240932ebf7.png" + }, + { + "username": "Netscream", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16359198/medium/694e0c8572dc8a47e6d63da31ec5b992.png" + }, + { + "username": "belicstefan04", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16368142/medium/4742dcfd7bf7ad7e33e37ac44fba7e0f.png" + }, + { + "username": "Hamad2066", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16371478/medium/f37bbc7685b6757defdbd1494236af61.jpeg" + }, + { + "username": "3ct0pl4sm", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16399616/medium/ce796d1c40163975624c0a483e56374f.png" + }, + { + "username": "sanchez.marcell626", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16433865/medium/3ddde1314764cc2205ffdcd1ae719a91.png" + }, + { + "username": "Minoctis", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16490079/medium/91fd0849303a4eca033d660d0a7b6854.jpeg" + }, + { + "username": "homarr", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16657003/medium/3afabfd3de949a54ff5d40ad04552aba.png" + }, + { + "username": "mwgg", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16658379/medium/763dd09f5c238cc5324d4d5357985292.png" + }, + { + "username": "kiwinho", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16671855/medium/bfe3a2d497dc4748a04d02e4ae2139cb.jpeg" + }, + { + "username": "tjvg4m34r13", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16679135/medium/7a483b9b0abe0d925e54808e1cb38fa0.jpeg" + }, + { + "username": "Diegoem", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16705921/medium/29ce68ebc191fc3f65499511b12de98f_default.png" + }, + { + "username": "bouks69", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16746091/medium/b58b1fc08520de416198be9df5d093eb.jpeg" + }, + { + "username": "futhgar", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16748067/medium/b8c526b097f9aa9d687250cac3df16dc.jpeg" + }, + { + "username": "GrimSQL", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16764343/medium/fff729a76d1f8fbcdaee9bb0c0f5f3fd.png" + }, + { + "username": "chnikel", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16767047/medium/3dda2a37e03049dafefe6697bb00f75c.png" + }, + { + "username": "yuki19870616", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16767951/medium/f59c848e38382cda6c8464b0a7b9e642_default.png" + }, + { + "username": "noamdal", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16782245/medium/b4a72a61f9caf138f0322c0cb987e6d0.png" + }, + { + "username": "MalithRukshan", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16809057/medium/084d6a5b35fbbeacc70e7021197d222f.png" + }, + { + "username": "minirope19", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16930929/medium/e8cbbc26747e31c5a8959215e1dd067b.jpeg" + }, + { + "username": "prubin", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17503492/medium/96ac87644691e49c1f983f2f094e541c_default.png" + }, + { + "username": "sam-tam-sam", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17578052/medium/1628dc2954ce3ae95e0caaa2bd60ab0c.png" + }, + { + "username": "toineenzo", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/12371852/medium/9f1b2bedb4794c59479cd289bdba9fab.png" + }, + { + "username": "ArcaneWater", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/12421105/medium/1ac82517a6c658f6b62c48aebcb17e86_default.png" + }, + { + "username": "Ebedami", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/12974801/medium/b596dea5c09454c4c828eac558389755.jpg" + }, + { + "username": "perrygamerptyt", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/13117177/medium/1406c949507ecd438480473c8a1f6124.jpg" + }, + { + "username": "SergiSvK", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/13320543/medium/3df3c79cc5f0c53716c559cd3fd2fc20.png" + }, + { + "username": "jeongeon", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/13362856/medium/eb572f72cde5e5526c517ca3a6489850_default.png" + }, + { + "username": "MrTranCFCVN", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/13439475/medium/a1789d69c85d90c667194b5d6a518c08_default.png" + }, + { + "username": "Tobost06", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/13467449/medium/9227dc07f6366bc060d28304f5cb8ce7.jpeg" + }, + { + "username": "Kf637", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/13530622/medium/118b00bb72d01d3229c97409637e25d1_default.png" + }, + { + "username": "Cruellest", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/13610615/medium/2a74faa0947ee08d18f7946fb8602c1e.jpg" + }, + { + "username": "olavinto", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/14424644/medium/37c01732bd2b7a272b421807a05ccfeb.png" + }, + { + "username": "Thario", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/14491372/medium/dd5e142070802a672900121aa3f332a6_default.png" + }, + { + "username": "Wjouter", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/14585620/medium/b91a51513332bdc0a0a9ecbed99ecbc3.png" + }, + { + "username": "albanobattistella", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/14686194/medium/564afcfd76f5cd24751bd669cf4943aa.jpg" + }, + { + "username": "Kachelkaiser", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/14763406/medium/203a781797da4a18fe0f4e7db8fd547c.png" + }, + { + "username": "regi4", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/14842936/medium/f7e1d672f562a7db61ba6b4b8f4de41d.png" + }, + { + "username": "baton5129", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/14891064/medium/8d438f557b82977dd02f0ead3187265f.PNG" + }, + { + "username": "meviper", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15958903/medium/209f521ce33a05831fa8d7d1b7babc20_default.png" + }, + { + "username": "GerOriki", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16268376/medium/da00e54b08cd40348231d92873a0cd0a_default.png" + }, + { + "username": "TheRedCyclops", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16486399/medium/7f39226180120d5a9efcb8e13d8aec8e_default.png" + }, + { + "username": "dymek37", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16659221/medium/d1dc6d11d7e7fc370efc5070e837ae03.png" + }, + { + "username": "B3CKDOOR", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16744975/medium/e6c7b2d45e76465d54e6efb67c83da7d.png" + }, + { + "username": "Larsluph", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16779933/medium/ed7d36f8b44013bad3a16ac0491bd0f7.png" + }, + { + "username": "FOEDI", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16781001/medium/6b4552fb72e359aa016f7a054078fac8.png" + }, + { + "username": "xmarkurion", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16805443/medium/34a20428427de5aaef99c7d140646803.png" + }, + { + "username": "gregid", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16806705/medium/f3c8f4a20436e8538929130142bbc104.png" + }, + { + "username": "Flameberg", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16820453/medium/d47be866148474c9d05fec6fbe406d88.png" + }, + { + "username": "Playfust", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16872865/medium/5f4609cc711e5fb9fa8a0b178635769c.jpeg" + }, + { + "username": "Cotignac", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16879297/medium/81ff353edf030699a159bb79cda26e84.jpg" + }, + { + "username": "LeaHun", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16916375/medium/618520f0543b1e212ebc83d66b683d4b_default.png" + }, + { + "username": "jackwellerreal", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16919717/medium/37bbfdc03893f141133ccc619593266d.png" + }, + { + "username": "renan.costaalencar", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16938427/medium/6d25b25320c5bde734118dec4af9cd5b.png" + }, + { + "username": "andrius.cim", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16967845/medium/46028fc1a0ddfaaeebcb37b39739625d_default.png" + }, + { + "username": "xjxexrxrxyx", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17041412/medium/d34d664166db6fb25579bca9ff3b50b4.jpeg" + }, + { + "username": "bilhal.fellah", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17044572/medium/d1ec6f17e4aa013e9eededc83778d2c6.png" + }, + { + "username": "the_octo", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17058060/medium/7423ab3a4cabb67f5decb2e2dfa2b675_default.png" + }, + { + "username": "BamesJond", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17075846/medium/128d7ffd40254c8e376f45678e2fc620_default.png" + }, + { + "username": "Kornikus", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17134240/medium/d7a42b2c30db46ff152699ca01f9e11a_default.png" + }, + { + "username": "xoxyuxu", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17176526/medium/108055aa24343043de852e412bec74be.png" + }, + { + "username": "cryptodntsleep", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17249408/medium/b9e15aa2b24a0dbc1e4f194aa8ed5109.png" + }, + { + "username": "yaniorg", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17261842/medium/7dbfc77f21c826845961243c44540d26.jpg" + }, + { + "username": "Vidariondr", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17262438/medium/45fbc71be02ef27296b6f423e97b6a03_default.png" + }, + { + "username": "Fastery", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17263066/medium/701b0edc59676174863ad651528bbb37.jpeg" + }, + { + "username": "stratself", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17290388/medium/57d9d8161b3fd0abf4dc5558b4a1fa05_default.png" + }, + { + "username": "wuzeqin", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17292606/medium/b9e0308410b31337e2d7aa6ed346d718_default.png" + }, + { + "username": "ChristopherBull", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17304338/medium/21a175ce596bfae81430767467908b90.jpeg" + }, + { + "username": "darkbcnlord", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17311436/medium/b271bc0b419ec3a26ddb7b63ff8ffc4b.png" + }, + { + "username": "zhoran1997", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17344028/medium/c8f450b5a8f1e9494a45dc60af7ce63e.png" + }, + { + "username": "gilalves1703", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17447768/medium/3f1de562a5c2391c88bbf8d5cf40a266.png" + }, + { + "username": "iServeCloud", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17470960/medium/11649b99d609438d66455a4d2fdc70f7.png" + }, + { + "username": "guibolzantvbox", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17474136/medium/59a576e6da538664ceb972253916fa02.jpeg" + }, + { + "username": "ivann136", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17506062/medium/67d09ada36fac5f444a1f7517e3a97bd_default.png" + }, + { + "username": "Maheshivara", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17516082/medium/576e1e6581cf969615b265de6aeff8b7.jpeg" + }, + { + "username": "brunogui81", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17517542/medium/7c0d174e810435af518fe8e0c05e151f.jpeg" + }, + { + "username": "michelwilhelm", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17542190/medium/4c6b33fd8993ff565fa75add2ce8355e.jpeg" + }, + { + "username": "dias-gxstavo", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17547376/medium/8c6b109aae8aeb651192346a39ae9e5b.jpeg" + }, + { + "username": "ToxykAuBleu", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17614030/medium/8d21e0608560172b121bd46126d827c7.jpeg" + }, + { + "username": "e.erdemir", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17617994/medium/7259a29db9941c6171a8cbbd643b92bd.png" + }, + { + "username": "sjonkreutz", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17618306/medium/7601c45d015189a863656e21348d223b.png" + }, + { + "username": "volovich0377", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17620388/medium/c929a8fbd24f96d17620fa497ade7309.png" + }, + { + "username": "Hamstio1", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17624898/medium/406e0bf40094c24a01c3064f8f5b2a82.png" + }, + { + "username": "i3laa", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17627462/medium/613a9d283ed8b69819ee181903851660.jpeg" + }, + { + "username": "bastiengrignon", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17629884/medium/ddfc3339285bd65195fcd834e512e9b7.jpeg" + }, + { + "username": "kauhee", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17644600/medium/def1b9066cf9275b4273a5a5dca7f325.png" + }, + { + "username": "hongminzheng", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17683860/medium/a764f4963912777d27a7cd98e136a2b2.png" + }, + { + "username": "d-lindahl", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17726729/medium/cbde348582fbabcfadd89a56cd5a0b40.png" + }, + { + "username": "Enoal-Fauchille-Bolle", + "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17734649/medium/6e6fb29198782dc7856ea21811db669c.jpeg" + } +] diff --git a/apps/docs/tsconfig.json b/apps/docs/tsconfig.json index 1142ed3fb..883379f29 100644 --- a/apps/docs/tsconfig.json +++ b/apps/docs/tsconfig.json @@ -16,15 +16,8 @@ "incremental": true, "paths": { "@site/*": ["./*"] - }, + } }, - "include": [ - "**/*.ts", - "**/*.jsx", - "**/*.js", - "**/*.tsx", - "**/*.md", - "**/*.mdx", - ], - "exclude": ["node_modules"], + "include": ["**/*.ts", "**/*.jsx", "**/*.js", "**/*.tsx", "**/*.md", "**/*.mdx"], + "exclude": ["node_modules"] } diff --git a/apps/nextjs/src/components/board/items/widget-hover-overlay.module.css b/apps/nextjs/src/components/board/items/widget-hover-overlay.module.css index 89b3ba93e..f6ec2600f 100644 --- a/apps/nextjs/src/components/board/items/widget-hover-overlay.module.css +++ b/apps/nextjs/src/components/board/items/widget-hover-overlay.module.css @@ -13,10 +13,8 @@ transform 150ms ease; } -:global(.grid-stack-item[data-type="item"]:not([data-kind="app"]):hover) - .wrapper, -:global(.grid-stack-item[data-type="item"]:not([data-kind="app"]):focus-within) - .wrapper { +:global(.grid-stack-item[data-type="item"]:not([data-kind="app"]):hover) .wrapper, +:global(.grid-stack-item[data-type="item"]:not([data-kind="app"]):focus-within) .wrapper { opacity: 1; transform: translateY(0); } diff --git a/packages/api/src/router/test/widgets/patchmon.spec.ts b/packages/api/src/router/test/widgets/patchmon.spec.ts index df37b5647..27f5cfe40 100644 --- a/packages/api/src/router/test/widgets/patchmon.spec.ts +++ b/packages/api/src/router/test/widgets/patchmon.spec.ts @@ -101,9 +101,7 @@ describe("patchmonRouter.getStats access control", () => { }); const caller = createCaller(db, null); - await expect(caller.getStats({ integrationId })).rejects.toThrow( - new TRPCError({ code: "UNAUTHORIZED" }), - ); + await expect(caller.getStats({ integrationId })).rejects.toThrow(new TRPCError({ code: "UNAUTHORIZED" })); }); test("should throw FORBIDDEN for authenticated users without board or integration access", async () => { diff --git a/packages/db/migrations/mysql/meta/0038_snapshot.json b/packages/db/migrations/mysql/meta/0038_snapshot.json index 7f82bd39b..0840b2436 100644 --- a/packages/db/migrations/mysql/meta/0038_snapshot.json +++ b/packages/db/migrations/mysql/meta/0038_snapshot.json @@ -88,9 +88,7 @@ "indexes": { "userId_idx": { "name": "userId_idx", - "columns": [ - "user_id" - ], + "columns": ["user_id"], "isUnique": false } }, @@ -99,12 +97,8 @@ "name": "account_user_id_user_id_fk", "tableFrom": "account", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -112,10 +106,7 @@ "compositePrimaryKeys": { "account_provider_provider_account_id_pk": { "name": "account_provider_provider_account_id_pk", - "columns": [ - "provider", - "provider_account_id" - ] + "columns": ["provider", "provider_account_id"] } }, "uniqueConstraints": {}, @@ -152,12 +143,8 @@ "name": "apiKey_user_id_user_id_fk", "tableFrom": "apiKey", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -165,9 +152,7 @@ "compositePrimaryKeys": { "apiKey_id": { "name": "apiKey_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -224,9 +209,7 @@ "compositePrimaryKeys": { "app_id": { "name": "app_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -263,12 +246,8 @@ "name": "boardGroupPermission_board_id_board_id_fk", "tableFrom": "boardGroupPermission", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -276,12 +255,8 @@ "name": "boardGroupPermission_group_id_group_id_fk", "tableFrom": "boardGroupPermission", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -289,11 +264,7 @@ "compositePrimaryKeys": { "boardGroupPermission_board_id_group_id_permission_pk": { "name": "boardGroupPermission_board_id_group_id_permission_pk", - "columns": [ - "board_id", - "group_id", - "permission" - ] + "columns": ["board_id", "group_id", "permission"] } }, "uniqueConstraints": {}, @@ -330,12 +301,8 @@ "name": "boardUserPermission_board_id_board_id_fk", "tableFrom": "boardUserPermission", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -343,12 +310,8 @@ "name": "boardUserPermission_user_id_user_id_fk", "tableFrom": "boardUserPermission", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -356,11 +319,7 @@ "compositePrimaryKeys": { "boardUserPermission_board_id_user_id_permission_pk": { "name": "boardUserPermission_board_id_user_id_permission_pk", - "columns": [ - "board_id", - "user_id", - "permission" - ] + "columns": ["board_id", "user_id", "permission"] } }, "uniqueConstraints": {}, @@ -518,12 +477,8 @@ "name": "board_creator_id_user_id_fk", "tableFrom": "board", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -531,17 +486,13 @@ "compositePrimaryKeys": { "board_id": { "name": "board_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": { "board_name_unique": { "name": "board_name_unique", - "columns": [ - "name" - ] + "columns": ["name"] } }, "checkConstraint": {} @@ -577,9 +528,7 @@ "compositePrimaryKeys": { "cron_job_configuration_name": { "name": "cron_job_configuration_name", - "columns": [ - "name" - ] + "columns": ["name"] } }, "uniqueConstraints": {}, @@ -609,12 +558,8 @@ "name": "groupMember_group_id_group_id_fk", "tableFrom": "groupMember", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -622,12 +567,8 @@ "name": "groupMember_user_id_user_id_fk", "tableFrom": "groupMember", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -635,10 +576,7 @@ "compositePrimaryKeys": { "groupMember_group_id_user_id_pk": { "name": "groupMember_group_id_user_id_pk", - "columns": [ - "group_id", - "user_id" - ] + "columns": ["group_id", "user_id"] } }, "uniqueConstraints": {}, @@ -668,12 +606,8 @@ "name": "groupPermission_group_id_group_id_fk", "tableFrom": "groupPermission", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -734,12 +668,8 @@ "name": "group_owner_id_user_id_fk", "tableFrom": "group", "tableTo": "user", - "columnsFrom": [ - "owner_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["owner_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -747,12 +677,8 @@ "name": "group_home_board_id_board_id_fk", "tableFrom": "group", "tableTo": "board", - "columnsFrom": [ - "home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -760,12 +686,8 @@ "name": "group_mobile_home_board_id_board_id_fk", "tableFrom": "group", "tableTo": "board", - "columnsFrom": [ - "mobile_home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["mobile_home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -773,17 +695,13 @@ "compositePrimaryKeys": { "group_id": { "name": "group_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": { "group_name_unique": { "name": "group_name_unique", - "columns": [ - "name" - ] + "columns": ["name"] } }, "checkConstraint": {} @@ -811,9 +729,7 @@ "compositePrimaryKeys": { "iconRepository_id": { "name": "iconRepository_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -864,12 +780,8 @@ "name": "icon_icon_repository_id_iconRepository_id_fk", "tableFrom": "icon", "tableTo": "iconRepository", - "columnsFrom": [ - "icon_repository_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["icon_repository_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -877,9 +789,7 @@ "compositePrimaryKeys": { "icon_id": { "name": "icon_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -916,12 +826,8 @@ "name": "integrationGroupPermissions_integration_id_integration_id_fk", "tableFrom": "integrationGroupPermissions", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -929,12 +835,8 @@ "name": "integrationGroupPermissions_group_id_group_id_fk", "tableFrom": "integrationGroupPermissions", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -942,11 +844,7 @@ "compositePrimaryKeys": { "integration_group_permission__pk": { "name": "integration_group_permission__pk", - "columns": [ - "integration_id", - "group_id", - "permission" - ] + "columns": ["integration_id", "group_id", "permission"] } }, "uniqueConstraints": {}, @@ -976,12 +874,8 @@ "name": "integration_item_item_id_item_id_fk", "tableFrom": "integration_item", "tableTo": "item", - "columnsFrom": [ - "item_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["item_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -989,12 +883,8 @@ "name": "integration_item_integration_id_integration_id_fk", "tableFrom": "integration_item", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1002,10 +892,7 @@ "compositePrimaryKeys": { "integration_item_item_id_integration_id_pk": { "name": "integration_item_item_id_integration_id_pk", - "columns": [ - "item_id", - "integration_id" - ] + "columns": ["item_id", "integration_id"] } }, "uniqueConstraints": {}, @@ -1046,16 +933,12 @@ "indexes": { "integration_secret__kind_idx": { "name": "integration_secret__kind_idx", - "columns": [ - "kind" - ], + "columns": ["kind"], "isUnique": false }, "integration_secret__updated_at_idx": { "name": "integration_secret__updated_at_idx", - "columns": [ - "updated_at" - ], + "columns": ["updated_at"], "isUnique": false } }, @@ -1064,12 +947,8 @@ "name": "integrationSecret_integration_id_integration_id_fk", "tableFrom": "integrationSecret", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1077,10 +956,7 @@ "compositePrimaryKeys": { "integrationSecret_integration_id_kind_pk": { "name": "integrationSecret_integration_id_kind_pk", - "columns": [ - "integration_id", - "kind" - ] + "columns": ["integration_id", "kind"] } }, "uniqueConstraints": {}, @@ -1117,12 +993,8 @@ "name": "integrationUserPermission_integration_id_integration_id_fk", "tableFrom": "integrationUserPermission", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1130,12 +1002,8 @@ "name": "integrationUserPermission_user_id_user_id_fk", "tableFrom": "integrationUserPermission", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1143,11 +1011,7 @@ "compositePrimaryKeys": { "integrationUserPermission_integration_id_user_id_permission_pk": { "name": "integrationUserPermission_integration_id_user_id_permission_pk", - "columns": [ - "integration_id", - "user_id", - "permission" - ] + "columns": ["integration_id", "user_id", "permission"] } }, "uniqueConstraints": {}, @@ -1195,9 +1059,7 @@ "indexes": { "integration__kind_idx": { "name": "integration__kind_idx", - "columns": [ - "kind" - ], + "columns": ["kind"], "isUnique": false } }, @@ -1206,12 +1068,8 @@ "name": "integration_app_id_app_id_fk", "tableFrom": "integration", "tableTo": "app", - "columnsFrom": [ - "app_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["app_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -1219,9 +1077,7 @@ "compositePrimaryKeys": { "integration_id": { "name": "integration_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -1265,12 +1121,8 @@ "name": "invite_creator_id_user_id_fk", "tableFrom": "invite", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1278,17 +1130,13 @@ "compositePrimaryKeys": { "invite_id": { "name": "invite_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": { "invite_token_unique": { "name": "invite_token_unique", - "columns": [ - "token" - ] + "columns": ["token"] } }, "checkConstraint": {} @@ -1352,12 +1200,8 @@ "name": "item_layout_item_id_item_id_fk", "tableFrom": "item_layout", "tableTo": "item", - "columnsFrom": [ - "item_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["item_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1365,12 +1209,8 @@ "name": "item_layout_section_id_section_id_fk", "tableFrom": "item_layout", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1378,12 +1218,8 @@ "name": "item_layout_layout_id_layout_id_fk", "tableFrom": "item_layout", "tableTo": "layout", - "columnsFrom": [ - "layout_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["layout_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1391,11 +1227,7 @@ "compositePrimaryKeys": { "item_layout_item_id_section_id_layout_id_pk": { "name": "item_layout_item_id_section_id_layout_id_pk", - "columns": [ - "item_id", - "section_id", - "layout_id" - ] + "columns": ["item_id", "section_id", "layout_id"] } }, "uniqueConstraints": {}, @@ -1448,12 +1280,8 @@ "name": "item_board_id_board_id_fk", "tableFrom": "item", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1461,9 +1289,7 @@ "compositePrimaryKeys": { "item_id": { "name": "item_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -1515,12 +1341,8 @@ "name": "layout_board_id_board_id_fk", "tableFrom": "layout", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1528,9 +1350,7 @@ "compositePrimaryKeys": { "layout_id": { "name": "layout_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -1596,12 +1416,8 @@ "name": "media_creator_id_user_id_fk", "tableFrom": "media", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -1609,9 +1425,7 @@ "compositePrimaryKeys": { "media_id": { "name": "media_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -1647,9 +1461,7 @@ "compositePrimaryKeys": { "onboarding_id": { "name": "onboarding_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -1722,12 +1534,8 @@ "name": "search_engine_integration_id_integration_id_fk", "tableFrom": "search_engine", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1735,17 +1543,13 @@ "compositePrimaryKeys": { "search_engine_id": { "name": "search_engine_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": { "search_engine_short_unique": { "name": "search_engine_short_unique", - "columns": [ - "short" - ] + "columns": ["short"] } }, "checkConstraint": {} @@ -1782,12 +1586,8 @@ "name": "section_collapse_state_user_id_user_id_fk", "tableFrom": "section_collapse_state", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1795,12 +1595,8 @@ "name": "section_collapse_state_section_id_section_id_fk", "tableFrom": "section_collapse_state", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1808,10 +1604,7 @@ "compositePrimaryKeys": { "section_collapse_state_user_id_section_id_pk": { "name": "section_collapse_state_user_id_section_id_pk", - "columns": [ - "user_id", - "section_id" - ] + "columns": ["user_id", "section_id"] } }, "uniqueConstraints": {}, @@ -1876,12 +1669,8 @@ "name": "section_layout_section_id_section_id_fk", "tableFrom": "section_layout", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1889,12 +1678,8 @@ "name": "section_layout_layout_id_layout_id_fk", "tableFrom": "section_layout", "tableTo": "layout", - "columnsFrom": [ - "layout_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["layout_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1902,12 +1687,8 @@ "name": "section_layout_parent_section_id_section_id_fk", "tableFrom": "section_layout", "tableTo": "section", - "columnsFrom": [ - "parent_section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["parent_section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1915,10 +1696,7 @@ "compositePrimaryKeys": { "section_layout_section_id_layout_id_pk": { "name": "section_layout_section_id_layout_id_pk", - "columns": [ - "section_id", - "layout_id" - ] + "columns": ["section_id", "layout_id"] } }, "uniqueConstraints": {}, @@ -1984,12 +1762,8 @@ "name": "section_board_id_board_id_fk", "tableFrom": "section", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1997,9 +1771,7 @@ "compositePrimaryKeys": { "section_id": { "name": "section_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -2029,17 +1801,13 @@ "compositePrimaryKeys": { "serverSetting_setting_key": { "name": "serverSetting_setting_key", - "columns": [ - "setting_key" - ] + "columns": ["setting_key"] } }, "uniqueConstraints": { "serverSetting_settingKey_unique": { "name": "serverSetting_settingKey_unique", - "columns": [ - "setting_key" - ] + "columns": ["setting_key"] } }, "checkConstraint": {} @@ -2072,9 +1840,7 @@ "indexes": { "user_id_idx": { "name": "user_id_idx", - "columns": [ - "user_id" - ], + "columns": ["user_id"], "isUnique": false } }, @@ -2083,12 +1849,8 @@ "name": "session_user_id_user_id_fk", "tableFrom": "session", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -2096,9 +1858,7 @@ "compositePrimaryKeys": { "session_session_token": { "name": "session_session_token", - "columns": [ - "session_token" - ] + "columns": ["session_token"] } }, "uniqueConstraints": {}, @@ -2225,12 +1985,8 @@ "name": "user_home_board_id_board_id_fk", "tableFrom": "user", "tableTo": "board", - "columnsFrom": [ - "home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -2238,12 +1994,8 @@ "name": "user_mobile_home_board_id_board_id_fk", "tableFrom": "user", "tableTo": "board", - "columnsFrom": [ - "mobile_home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["mobile_home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -2251,12 +2003,8 @@ "name": "user_default_search_engine_id_search_engine_id_fk", "tableFrom": "user", "tableTo": "search_engine", - "columnsFrom": [ - "default_search_engine_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["default_search_engine_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -2264,9 +2012,7 @@ "compositePrimaryKeys": { "user_id": { "name": "user_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -2302,10 +2048,7 @@ "compositePrimaryKeys": { "verificationToken_identifier_token_pk": { "name": "verificationToken_identifier_token_pk", - "columns": [ - "identifier", - "token" - ] + "columns": ["identifier", "token"] } }, "uniqueConstraints": {}, @@ -2341,10 +2084,7 @@ "compositePrimaryKeys": { "trusted_certificate_hostname_hostname_thumbprint_pk": { "name": "trusted_certificate_hostname_hostname_thumbprint_pk", - "columns": [ - "hostname", - "thumbprint" - ] + "columns": ["hostname", "thumbprint"] } }, "uniqueConstraints": {}, @@ -2361,4 +2101,4 @@ "tables": {}, "indexes": {} } -} \ No newline at end of file +} diff --git a/packages/db/migrations/mysql/meta/0040_snapshot.json b/packages/db/migrations/mysql/meta/0040_snapshot.json index 63c597c46..a6b956765 100644 --- a/packages/db/migrations/mysql/meta/0040_snapshot.json +++ b/packages/db/migrations/mysql/meta/0040_snapshot.json @@ -88,9 +88,7 @@ "indexes": { "userId_idx": { "name": "userId_idx", - "columns": [ - "user_id" - ], + "columns": ["user_id"], "isUnique": false } }, @@ -99,12 +97,8 @@ "name": "account_user_id_user_id_fk", "tableFrom": "account", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -112,10 +106,7 @@ "compositePrimaryKeys": { "account_provider_provider_account_id_pk": { "name": "account_provider_provider_account_id_pk", - "columns": [ - "provider", - "provider_account_id" - ] + "columns": ["provider", "provider_account_id"] } }, "uniqueConstraints": {}, @@ -152,12 +143,8 @@ "name": "apiKey_user_id_user_id_fk", "tableFrom": "apiKey", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -165,9 +152,7 @@ "compositePrimaryKeys": { "apiKey_id": { "name": "apiKey_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -224,9 +209,7 @@ "compositePrimaryKeys": { "app_id": { "name": "app_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -263,12 +246,8 @@ "name": "boardGroupPermission_board_id_board_id_fk", "tableFrom": "boardGroupPermission", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -276,12 +255,8 @@ "name": "boardGroupPermission_group_id_group_id_fk", "tableFrom": "boardGroupPermission", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -289,11 +264,7 @@ "compositePrimaryKeys": { "boardGroupPermission_board_id_group_id_permission_pk": { "name": "boardGroupPermission_board_id_group_id_permission_pk", - "columns": [ - "board_id", - "group_id", - "permission" - ] + "columns": ["board_id", "group_id", "permission"] } }, "uniqueConstraints": {}, @@ -330,12 +301,8 @@ "name": "boardUserPermission_board_id_board_id_fk", "tableFrom": "boardUserPermission", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -343,12 +310,8 @@ "name": "boardUserPermission_user_id_user_id_fk", "tableFrom": "boardUserPermission", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -356,11 +319,7 @@ "compositePrimaryKeys": { "boardUserPermission_board_id_user_id_permission_pk": { "name": "boardUserPermission_board_id_user_id_permission_pk", - "columns": [ - "board_id", - "user_id", - "permission" - ] + "columns": ["board_id", "user_id", "permission"] } }, "uniqueConstraints": {}, @@ -518,12 +477,8 @@ "name": "board_creator_id_user_id_fk", "tableFrom": "board", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -531,17 +486,13 @@ "compositePrimaryKeys": { "board_id": { "name": "board_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": { "board_name_unique": { "name": "board_name_unique", - "columns": [ - "name" - ] + "columns": ["name"] } }, "checkConstraint": {} @@ -577,9 +528,7 @@ "compositePrimaryKeys": { "cron_job_configuration_name": { "name": "cron_job_configuration_name", - "columns": [ - "name" - ] + "columns": ["name"] } }, "uniqueConstraints": {}, @@ -706,12 +655,8 @@ "name": "custom_widget_definition_creator_id_user_id_fk", "tableFrom": "custom_widget_definition", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -719,9 +664,7 @@ "compositePrimaryKeys": { "custom_widget_definition_id": { "name": "custom_widget_definition_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -765,12 +708,8 @@ "name": "cw_secret_definition_id_cw_definition_id_fk", "tableFrom": "custom_widget_secret", "tableTo": "custom_widget_definition", - "columnsFrom": [ - "definition_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["definition_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -778,10 +717,7 @@ "compositePrimaryKeys": { "custom_widget_secret_definition_id_kind_pk": { "name": "custom_widget_secret_definition_id_kind_pk", - "columns": [ - "definition_id", - "kind" - ] + "columns": ["definition_id", "kind"] } }, "uniqueConstraints": {}, @@ -811,12 +747,8 @@ "name": "groupMember_group_id_group_id_fk", "tableFrom": "groupMember", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -824,12 +756,8 @@ "name": "groupMember_user_id_user_id_fk", "tableFrom": "groupMember", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -837,10 +765,7 @@ "compositePrimaryKeys": { "groupMember_group_id_user_id_pk": { "name": "groupMember_group_id_user_id_pk", - "columns": [ - "group_id", - "user_id" - ] + "columns": ["group_id", "user_id"] } }, "uniqueConstraints": {}, @@ -870,12 +795,8 @@ "name": "groupPermission_group_id_group_id_fk", "tableFrom": "groupPermission", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -936,12 +857,8 @@ "name": "group_owner_id_user_id_fk", "tableFrom": "group", "tableTo": "user", - "columnsFrom": [ - "owner_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["owner_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -949,12 +866,8 @@ "name": "group_home_board_id_board_id_fk", "tableFrom": "group", "tableTo": "board", - "columnsFrom": [ - "home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -962,12 +875,8 @@ "name": "group_mobile_home_board_id_board_id_fk", "tableFrom": "group", "tableTo": "board", - "columnsFrom": [ - "mobile_home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["mobile_home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -975,17 +884,13 @@ "compositePrimaryKeys": { "group_id": { "name": "group_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": { "group_name_unique": { "name": "group_name_unique", - "columns": [ - "name" - ] + "columns": ["name"] } }, "checkConstraint": {} @@ -1013,9 +918,7 @@ "compositePrimaryKeys": { "iconRepository_id": { "name": "iconRepository_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -1066,12 +969,8 @@ "name": "icon_icon_repository_id_iconRepository_id_fk", "tableFrom": "icon", "tableTo": "iconRepository", - "columnsFrom": [ - "icon_repository_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["icon_repository_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1079,9 +978,7 @@ "compositePrimaryKeys": { "icon_id": { "name": "icon_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -1118,12 +1015,8 @@ "name": "integrationGroupPermissions_integration_id_integration_id_fk", "tableFrom": "integrationGroupPermissions", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1131,12 +1024,8 @@ "name": "integrationGroupPermissions_group_id_group_id_fk", "tableFrom": "integrationGroupPermissions", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1144,11 +1033,7 @@ "compositePrimaryKeys": { "integration_group_permission__pk": { "name": "integration_group_permission__pk", - "columns": [ - "integration_id", - "group_id", - "permission" - ] + "columns": ["integration_id", "group_id", "permission"] } }, "uniqueConstraints": {}, @@ -1178,12 +1063,8 @@ "name": "integration_item_item_id_item_id_fk", "tableFrom": "integration_item", "tableTo": "item", - "columnsFrom": [ - "item_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["item_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1191,12 +1072,8 @@ "name": "integration_item_integration_id_integration_id_fk", "tableFrom": "integration_item", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1204,10 +1081,7 @@ "compositePrimaryKeys": { "integration_item_item_id_integration_id_pk": { "name": "integration_item_item_id_integration_id_pk", - "columns": [ - "item_id", - "integration_id" - ] + "columns": ["item_id", "integration_id"] } }, "uniqueConstraints": {}, @@ -1248,16 +1122,12 @@ "indexes": { "integration_secret__kind_idx": { "name": "integration_secret__kind_idx", - "columns": [ - "kind" - ], + "columns": ["kind"], "isUnique": false }, "integration_secret__updated_at_idx": { "name": "integration_secret__updated_at_idx", - "columns": [ - "updated_at" - ], + "columns": ["updated_at"], "isUnique": false } }, @@ -1266,12 +1136,8 @@ "name": "integrationSecret_integration_id_integration_id_fk", "tableFrom": "integrationSecret", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1279,10 +1145,7 @@ "compositePrimaryKeys": { "integrationSecret_integration_id_kind_pk": { "name": "integrationSecret_integration_id_kind_pk", - "columns": [ - "integration_id", - "kind" - ] + "columns": ["integration_id", "kind"] } }, "uniqueConstraints": {}, @@ -1319,12 +1182,8 @@ "name": "integrationUserPermission_integration_id_integration_id_fk", "tableFrom": "integrationUserPermission", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1332,12 +1191,8 @@ "name": "integrationUserPermission_user_id_user_id_fk", "tableFrom": "integrationUserPermission", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1345,11 +1200,7 @@ "compositePrimaryKeys": { "integrationUserPermission_integration_id_user_id_permission_pk": { "name": "integrationUserPermission_integration_id_user_id_permission_pk", - "columns": [ - "integration_id", - "user_id", - "permission" - ] + "columns": ["integration_id", "user_id", "permission"] } }, "uniqueConstraints": {}, @@ -1397,9 +1248,7 @@ "indexes": { "integration__kind_idx": { "name": "integration__kind_idx", - "columns": [ - "kind" - ], + "columns": ["kind"], "isUnique": false } }, @@ -1408,12 +1257,8 @@ "name": "integration_app_id_app_id_fk", "tableFrom": "integration", "tableTo": "app", - "columnsFrom": [ - "app_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["app_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -1421,9 +1266,7 @@ "compositePrimaryKeys": { "integration_id": { "name": "integration_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -1467,12 +1310,8 @@ "name": "invite_creator_id_user_id_fk", "tableFrom": "invite", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1480,17 +1319,13 @@ "compositePrimaryKeys": { "invite_id": { "name": "invite_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": { "invite_token_unique": { "name": "invite_token_unique", - "columns": [ - "token" - ] + "columns": ["token"] } }, "checkConstraint": {} @@ -1554,12 +1389,8 @@ "name": "item_layout_item_id_item_id_fk", "tableFrom": "item_layout", "tableTo": "item", - "columnsFrom": [ - "item_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["item_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1567,12 +1398,8 @@ "name": "item_layout_section_id_section_id_fk", "tableFrom": "item_layout", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1580,12 +1407,8 @@ "name": "item_layout_layout_id_layout_id_fk", "tableFrom": "item_layout", "tableTo": "layout", - "columnsFrom": [ - "layout_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["layout_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1593,11 +1416,7 @@ "compositePrimaryKeys": { "item_layout_item_id_section_id_layout_id_pk": { "name": "item_layout_item_id_section_id_layout_id_pk", - "columns": [ - "item_id", - "section_id", - "layout_id" - ] + "columns": ["item_id", "section_id", "layout_id"] } }, "uniqueConstraints": {}, @@ -1650,12 +1469,8 @@ "name": "item_board_id_board_id_fk", "tableFrom": "item", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1663,9 +1478,7 @@ "compositePrimaryKeys": { "item_id": { "name": "item_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -1717,12 +1530,8 @@ "name": "layout_board_id_board_id_fk", "tableFrom": "layout", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1730,9 +1539,7 @@ "compositePrimaryKeys": { "layout_id": { "name": "layout_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -1798,12 +1605,8 @@ "name": "media_creator_id_user_id_fk", "tableFrom": "media", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -1811,9 +1614,7 @@ "compositePrimaryKeys": { "media_id": { "name": "media_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -1849,9 +1650,7 @@ "compositePrimaryKeys": { "onboarding_id": { "name": "onboarding_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -1924,12 +1723,8 @@ "name": "search_engine_integration_id_integration_id_fk", "tableFrom": "search_engine", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1937,17 +1732,13 @@ "compositePrimaryKeys": { "search_engine_id": { "name": "search_engine_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": { "search_engine_short_unique": { "name": "search_engine_short_unique", - "columns": [ - "short" - ] + "columns": ["short"] } }, "checkConstraint": {} @@ -1984,12 +1775,8 @@ "name": "section_collapse_state_user_id_user_id_fk", "tableFrom": "section_collapse_state", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1997,12 +1784,8 @@ "name": "section_collapse_state_section_id_section_id_fk", "tableFrom": "section_collapse_state", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -2010,10 +1793,7 @@ "compositePrimaryKeys": { "section_collapse_state_user_id_section_id_pk": { "name": "section_collapse_state_user_id_section_id_pk", - "columns": [ - "user_id", - "section_id" - ] + "columns": ["user_id", "section_id"] } }, "uniqueConstraints": {}, @@ -2078,12 +1858,8 @@ "name": "section_layout_section_id_section_id_fk", "tableFrom": "section_layout", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -2091,12 +1867,8 @@ "name": "section_layout_layout_id_layout_id_fk", "tableFrom": "section_layout", "tableTo": "layout", - "columnsFrom": [ - "layout_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["layout_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -2104,12 +1876,8 @@ "name": "section_layout_parent_section_id_section_id_fk", "tableFrom": "section_layout", "tableTo": "section", - "columnsFrom": [ - "parent_section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["parent_section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -2117,10 +1885,7 @@ "compositePrimaryKeys": { "section_layout_section_id_layout_id_pk": { "name": "section_layout_section_id_layout_id_pk", - "columns": [ - "section_id", - "layout_id" - ] + "columns": ["section_id", "layout_id"] } }, "uniqueConstraints": {}, @@ -2186,12 +1951,8 @@ "name": "section_board_id_board_id_fk", "tableFrom": "section", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -2199,9 +1960,7 @@ "compositePrimaryKeys": { "section_id": { "name": "section_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -2231,17 +1990,13 @@ "compositePrimaryKeys": { "serverSetting_setting_key": { "name": "serverSetting_setting_key", - "columns": [ - "setting_key" - ] + "columns": ["setting_key"] } }, "uniqueConstraints": { "serverSetting_settingKey_unique": { "name": "serverSetting_settingKey_unique", - "columns": [ - "setting_key" - ] + "columns": ["setting_key"] } }, "checkConstraint": {} @@ -2274,9 +2029,7 @@ "indexes": { "user_id_idx": { "name": "user_id_idx", - "columns": [ - "user_id" - ], + "columns": ["user_id"], "isUnique": false } }, @@ -2285,12 +2038,8 @@ "name": "session_user_id_user_id_fk", "tableFrom": "session", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -2298,9 +2047,7 @@ "compositePrimaryKeys": { "session_session_token": { "name": "session_session_token", - "columns": [ - "session_token" - ] + "columns": ["session_token"] } }, "uniqueConstraints": {}, @@ -2443,12 +2190,8 @@ "name": "user_home_board_id_board_id_fk", "tableFrom": "user", "tableTo": "board", - "columnsFrom": [ - "home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -2456,12 +2199,8 @@ "name": "user_mobile_home_board_id_board_id_fk", "tableFrom": "user", "tableTo": "board", - "columnsFrom": [ - "mobile_home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["mobile_home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -2469,12 +2208,8 @@ "name": "user_default_search_engine_id_search_engine_id_fk", "tableFrom": "user", "tableTo": "search_engine", - "columnsFrom": [ - "default_search_engine_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["default_search_engine_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -2482,9 +2217,7 @@ "compositePrimaryKeys": { "user_id": { "name": "user_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -2520,10 +2253,7 @@ "compositePrimaryKeys": { "verificationToken_identifier_token_pk": { "name": "verificationToken_identifier_token_pk", - "columns": [ - "identifier", - "token" - ] + "columns": ["identifier", "token"] } }, "uniqueConstraints": {}, @@ -2559,10 +2289,7 @@ "compositePrimaryKeys": { "trusted_certificate_hostname_hostname_thumbprint_pk": { "name": "trusted_certificate_hostname_hostname_thumbprint_pk", - "columns": [ - "hostname", - "thumbprint" - ] + "columns": ["hostname", "thumbprint"] } }, "uniqueConstraints": {}, @@ -2579,4 +2306,4 @@ "tables": {}, "indexes": {} } -} \ No newline at end of file +} diff --git a/packages/db/migrations/mysql/meta/0041_snapshot.json b/packages/db/migrations/mysql/meta/0041_snapshot.json index 1cbe65bde..75b97db84 100644 --- a/packages/db/migrations/mysql/meta/0041_snapshot.json +++ b/packages/db/migrations/mysql/meta/0041_snapshot.json @@ -88,9 +88,7 @@ "indexes": { "userId_idx": { "name": "userId_idx", - "columns": [ - "user_id" - ], + "columns": ["user_id"], "isUnique": false } }, @@ -99,12 +97,8 @@ "name": "account_user_id_user_id_fk", "tableFrom": "account", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -112,10 +106,7 @@ "compositePrimaryKeys": { "account_provider_provider_account_id_pk": { "name": "account_provider_provider_account_id_pk", - "columns": [ - "provider", - "provider_account_id" - ] + "columns": ["provider", "provider_account_id"] } }, "uniqueConstraints": {}, @@ -152,12 +143,8 @@ "name": "apiKey_user_id_user_id_fk", "tableFrom": "apiKey", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -165,9 +152,7 @@ "compositePrimaryKeys": { "apiKey_id": { "name": "apiKey_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -224,9 +209,7 @@ "compositePrimaryKeys": { "app_id": { "name": "app_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -263,12 +246,8 @@ "name": "boardGroupPermission_board_id_board_id_fk", "tableFrom": "boardGroupPermission", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -276,12 +255,8 @@ "name": "boardGroupPermission_group_id_group_id_fk", "tableFrom": "boardGroupPermission", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -289,11 +264,7 @@ "compositePrimaryKeys": { "boardGroupPermission_board_id_group_id_permission_pk": { "name": "boardGroupPermission_board_id_group_id_permission_pk", - "columns": [ - "board_id", - "group_id", - "permission" - ] + "columns": ["board_id", "group_id", "permission"] } }, "uniqueConstraints": {}, @@ -330,12 +301,8 @@ "name": "boardUserPermission_board_id_board_id_fk", "tableFrom": "boardUserPermission", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -343,12 +310,8 @@ "name": "boardUserPermission_user_id_user_id_fk", "tableFrom": "boardUserPermission", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -356,11 +319,7 @@ "compositePrimaryKeys": { "boardUserPermission_board_id_user_id_permission_pk": { "name": "boardUserPermission_board_id_user_id_permission_pk", - "columns": [ - "board_id", - "user_id", - "permission" - ] + "columns": ["board_id", "user_id", "permission"] } }, "uniqueConstraints": {}, @@ -518,12 +477,8 @@ "name": "board_creator_id_user_id_fk", "tableFrom": "board", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -531,17 +486,13 @@ "compositePrimaryKeys": { "board_id": { "name": "board_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": { "board_name_unique": { "name": "board_name_unique", - "columns": [ - "name" - ] + "columns": ["name"] } }, "checkConstraint": {} @@ -577,9 +528,7 @@ "compositePrimaryKeys": { "cron_job_configuration_name": { "name": "cron_job_configuration_name", - "columns": [ - "name" - ] + "columns": ["name"] } }, "uniqueConstraints": {}, @@ -707,12 +656,8 @@ "name": "custom_widget_definition_creator_id_user_id_fk", "tableFrom": "custom_widget_definition", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -720,9 +665,7 @@ "compositePrimaryKeys": { "custom_widget_definition_id": { "name": "custom_widget_definition_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -766,12 +709,8 @@ "name": "cw_secret_definition_id_cw_definition_id_fk", "tableFrom": "custom_widget_secret", "tableTo": "custom_widget_definition", - "columnsFrom": [ - "definition_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["definition_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -779,10 +718,7 @@ "compositePrimaryKeys": { "custom_widget_secret_definition_id_kind_pk": { "name": "custom_widget_secret_definition_id_kind_pk", - "columns": [ - "definition_id", - "kind" - ] + "columns": ["definition_id", "kind"] } }, "uniqueConstraints": {}, @@ -812,12 +748,8 @@ "name": "groupMember_group_id_group_id_fk", "tableFrom": "groupMember", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -825,12 +757,8 @@ "name": "groupMember_user_id_user_id_fk", "tableFrom": "groupMember", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -838,10 +766,7 @@ "compositePrimaryKeys": { "groupMember_group_id_user_id_pk": { "name": "groupMember_group_id_user_id_pk", - "columns": [ - "group_id", - "user_id" - ] + "columns": ["group_id", "user_id"] } }, "uniqueConstraints": {}, @@ -871,12 +796,8 @@ "name": "groupPermission_group_id_group_id_fk", "tableFrom": "groupPermission", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -937,12 +858,8 @@ "name": "group_owner_id_user_id_fk", "tableFrom": "group", "tableTo": "user", - "columnsFrom": [ - "owner_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["owner_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -950,12 +867,8 @@ "name": "group_home_board_id_board_id_fk", "tableFrom": "group", "tableTo": "board", - "columnsFrom": [ - "home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -963,12 +876,8 @@ "name": "group_mobile_home_board_id_board_id_fk", "tableFrom": "group", "tableTo": "board", - "columnsFrom": [ - "mobile_home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["mobile_home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -976,17 +885,13 @@ "compositePrimaryKeys": { "group_id": { "name": "group_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": { "group_name_unique": { "name": "group_name_unique", - "columns": [ - "name" - ] + "columns": ["name"] } }, "checkConstraint": {} @@ -1014,9 +919,7 @@ "compositePrimaryKeys": { "iconRepository_id": { "name": "iconRepository_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -1067,12 +970,8 @@ "name": "icon_icon_repository_id_iconRepository_id_fk", "tableFrom": "icon", "tableTo": "iconRepository", - "columnsFrom": [ - "icon_repository_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["icon_repository_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1080,9 +979,7 @@ "compositePrimaryKeys": { "icon_id": { "name": "icon_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -1119,12 +1016,8 @@ "name": "integrationGroupPermissions_integration_id_integration_id_fk", "tableFrom": "integrationGroupPermissions", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1132,12 +1025,8 @@ "name": "integrationGroupPermissions_group_id_group_id_fk", "tableFrom": "integrationGroupPermissions", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1145,11 +1034,7 @@ "compositePrimaryKeys": { "integration_group_permission__pk": { "name": "integration_group_permission__pk", - "columns": [ - "integration_id", - "group_id", - "permission" - ] + "columns": ["integration_id", "group_id", "permission"] } }, "uniqueConstraints": {}, @@ -1179,12 +1064,8 @@ "name": "integration_item_item_id_item_id_fk", "tableFrom": "integration_item", "tableTo": "item", - "columnsFrom": [ - "item_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["item_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1192,12 +1073,8 @@ "name": "integration_item_integration_id_integration_id_fk", "tableFrom": "integration_item", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1205,10 +1082,7 @@ "compositePrimaryKeys": { "integration_item_item_id_integration_id_pk": { "name": "integration_item_item_id_integration_id_pk", - "columns": [ - "item_id", - "integration_id" - ] + "columns": ["item_id", "integration_id"] } }, "uniqueConstraints": {}, @@ -1249,16 +1123,12 @@ "indexes": { "integration_secret__kind_idx": { "name": "integration_secret__kind_idx", - "columns": [ - "kind" - ], + "columns": ["kind"], "isUnique": false }, "integration_secret__updated_at_idx": { "name": "integration_secret__updated_at_idx", - "columns": [ - "updated_at" - ], + "columns": ["updated_at"], "isUnique": false } }, @@ -1267,12 +1137,8 @@ "name": "integrationSecret_integration_id_integration_id_fk", "tableFrom": "integrationSecret", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1280,10 +1146,7 @@ "compositePrimaryKeys": { "integrationSecret_integration_id_kind_pk": { "name": "integrationSecret_integration_id_kind_pk", - "columns": [ - "integration_id", - "kind" - ] + "columns": ["integration_id", "kind"] } }, "uniqueConstraints": {}, @@ -1320,12 +1183,8 @@ "name": "integrationUserPermission_integration_id_integration_id_fk", "tableFrom": "integrationUserPermission", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1333,12 +1192,8 @@ "name": "integrationUserPermission_user_id_user_id_fk", "tableFrom": "integrationUserPermission", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1346,11 +1201,7 @@ "compositePrimaryKeys": { "integrationUserPermission_integration_id_user_id_permission_pk": { "name": "integrationUserPermission_integration_id_user_id_permission_pk", - "columns": [ - "integration_id", - "user_id", - "permission" - ] + "columns": ["integration_id", "user_id", "permission"] } }, "uniqueConstraints": {}, @@ -1398,9 +1249,7 @@ "indexes": { "integration__kind_idx": { "name": "integration__kind_idx", - "columns": [ - "kind" - ], + "columns": ["kind"], "isUnique": false } }, @@ -1409,12 +1258,8 @@ "name": "integration_app_id_app_id_fk", "tableFrom": "integration", "tableTo": "app", - "columnsFrom": [ - "app_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["app_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -1422,9 +1267,7 @@ "compositePrimaryKeys": { "integration_id": { "name": "integration_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -1468,12 +1311,8 @@ "name": "invite_creator_id_user_id_fk", "tableFrom": "invite", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1481,17 +1320,13 @@ "compositePrimaryKeys": { "invite_id": { "name": "invite_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": { "invite_token_unique": { "name": "invite_token_unique", - "columns": [ - "token" - ] + "columns": ["token"] } }, "checkConstraint": {} @@ -1555,12 +1390,8 @@ "name": "item_layout_item_id_item_id_fk", "tableFrom": "item_layout", "tableTo": "item", - "columnsFrom": [ - "item_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["item_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1568,12 +1399,8 @@ "name": "item_layout_section_id_section_id_fk", "tableFrom": "item_layout", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1581,12 +1408,8 @@ "name": "item_layout_layout_id_layout_id_fk", "tableFrom": "item_layout", "tableTo": "layout", - "columnsFrom": [ - "layout_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["layout_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1594,11 +1417,7 @@ "compositePrimaryKeys": { "item_layout_item_id_section_id_layout_id_pk": { "name": "item_layout_item_id_section_id_layout_id_pk", - "columns": [ - "item_id", - "section_id", - "layout_id" - ] + "columns": ["item_id", "section_id", "layout_id"] } }, "uniqueConstraints": {}, @@ -1651,12 +1470,8 @@ "name": "item_board_id_board_id_fk", "tableFrom": "item", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1664,9 +1479,7 @@ "compositePrimaryKeys": { "item_id": { "name": "item_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -1718,12 +1531,8 @@ "name": "layout_board_id_board_id_fk", "tableFrom": "layout", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1731,9 +1540,7 @@ "compositePrimaryKeys": { "layout_id": { "name": "layout_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -1799,12 +1606,8 @@ "name": "media_creator_id_user_id_fk", "tableFrom": "media", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -1812,9 +1615,7 @@ "compositePrimaryKeys": { "media_id": { "name": "media_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -1850,9 +1651,7 @@ "compositePrimaryKeys": { "onboarding_id": { "name": "onboarding_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -1925,12 +1724,8 @@ "name": "search_engine_integration_id_integration_id_fk", "tableFrom": "search_engine", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1938,17 +1733,13 @@ "compositePrimaryKeys": { "search_engine_id": { "name": "search_engine_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": { "search_engine_short_unique": { "name": "search_engine_short_unique", - "columns": [ - "short" - ] + "columns": ["short"] } }, "checkConstraint": {} @@ -1985,12 +1776,8 @@ "name": "section_collapse_state_user_id_user_id_fk", "tableFrom": "section_collapse_state", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1998,12 +1785,8 @@ "name": "section_collapse_state_section_id_section_id_fk", "tableFrom": "section_collapse_state", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -2011,10 +1794,7 @@ "compositePrimaryKeys": { "section_collapse_state_user_id_section_id_pk": { "name": "section_collapse_state_user_id_section_id_pk", - "columns": [ - "user_id", - "section_id" - ] + "columns": ["user_id", "section_id"] } }, "uniqueConstraints": {}, @@ -2079,12 +1859,8 @@ "name": "section_layout_section_id_section_id_fk", "tableFrom": "section_layout", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -2092,12 +1868,8 @@ "name": "section_layout_layout_id_layout_id_fk", "tableFrom": "section_layout", "tableTo": "layout", - "columnsFrom": [ - "layout_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["layout_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -2105,12 +1877,8 @@ "name": "section_layout_parent_section_id_section_id_fk", "tableFrom": "section_layout", "tableTo": "section", - "columnsFrom": [ - "parent_section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["parent_section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -2118,10 +1886,7 @@ "compositePrimaryKeys": { "section_layout_section_id_layout_id_pk": { "name": "section_layout_section_id_layout_id_pk", - "columns": [ - "section_id", - "layout_id" - ] + "columns": ["section_id", "layout_id"] } }, "uniqueConstraints": {}, @@ -2187,12 +1952,8 @@ "name": "section_board_id_board_id_fk", "tableFrom": "section", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -2200,9 +1961,7 @@ "compositePrimaryKeys": { "section_id": { "name": "section_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -2232,17 +1991,13 @@ "compositePrimaryKeys": { "serverSetting_setting_key": { "name": "serverSetting_setting_key", - "columns": [ - "setting_key" - ] + "columns": ["setting_key"] } }, "uniqueConstraints": { "serverSetting_settingKey_unique": { "name": "serverSetting_settingKey_unique", - "columns": [ - "setting_key" - ] + "columns": ["setting_key"] } }, "checkConstraint": {} @@ -2275,9 +2030,7 @@ "indexes": { "user_id_idx": { "name": "user_id_idx", - "columns": [ - "user_id" - ], + "columns": ["user_id"], "isUnique": false } }, @@ -2286,12 +2039,8 @@ "name": "session_user_id_user_id_fk", "tableFrom": "session", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -2299,9 +2048,7 @@ "compositePrimaryKeys": { "session_session_token": { "name": "session_session_token", - "columns": [ - "session_token" - ] + "columns": ["session_token"] } }, "uniqueConstraints": {}, @@ -2444,12 +2191,8 @@ "name": "user_home_board_id_board_id_fk", "tableFrom": "user", "tableTo": "board", - "columnsFrom": [ - "home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -2457,12 +2200,8 @@ "name": "user_mobile_home_board_id_board_id_fk", "tableFrom": "user", "tableTo": "board", - "columnsFrom": [ - "mobile_home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["mobile_home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -2470,12 +2209,8 @@ "name": "user_default_search_engine_id_search_engine_id_fk", "tableFrom": "user", "tableTo": "search_engine", - "columnsFrom": [ - "default_search_engine_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["default_search_engine_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -2483,9 +2218,7 @@ "compositePrimaryKeys": { "user_id": { "name": "user_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -2521,10 +2254,7 @@ "compositePrimaryKeys": { "verificationToken_identifier_token_pk": { "name": "verificationToken_identifier_token_pk", - "columns": [ - "identifier", - "token" - ] + "columns": ["identifier", "token"] } }, "uniqueConstraints": {}, @@ -2560,10 +2290,7 @@ "compositePrimaryKeys": { "trusted_certificate_hostname_hostname_thumbprint_pk": { "name": "trusted_certificate_hostname_hostname_thumbprint_pk", - "columns": [ - "hostname", - "thumbprint" - ] + "columns": ["hostname", "thumbprint"] } }, "uniqueConstraints": {}, diff --git a/packages/db/migrations/mysql/meta/0042_snapshot.json b/packages/db/migrations/mysql/meta/0042_snapshot.json index 945d949c5..dd26483d7 100644 --- a/packages/db/migrations/mysql/meta/0042_snapshot.json +++ b/packages/db/migrations/mysql/meta/0042_snapshot.json @@ -88,9 +88,7 @@ "indexes": { "userId_idx": { "name": "userId_idx", - "columns": [ - "user_id" - ], + "columns": ["user_id"], "isUnique": false } }, @@ -99,12 +97,8 @@ "name": "account_user_id_user_id_fk", "tableFrom": "account", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -112,10 +106,7 @@ "compositePrimaryKeys": { "account_provider_provider_account_id_pk": { "name": "account_provider_provider_account_id_pk", - "columns": [ - "provider", - "provider_account_id" - ] + "columns": ["provider", "provider_account_id"] } }, "uniqueConstraints": {}, @@ -152,12 +143,8 @@ "name": "apiKey_user_id_user_id_fk", "tableFrom": "apiKey", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -165,9 +152,7 @@ "compositePrimaryKeys": { "apiKey_id": { "name": "apiKey_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -224,9 +209,7 @@ "compositePrimaryKeys": { "app_id": { "name": "app_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -263,12 +246,8 @@ "name": "boardGroupPermission_board_id_board_id_fk", "tableFrom": "boardGroupPermission", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -276,12 +255,8 @@ "name": "boardGroupPermission_group_id_group_id_fk", "tableFrom": "boardGroupPermission", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -289,11 +264,7 @@ "compositePrimaryKeys": { "boardGroupPermission_board_id_group_id_permission_pk": { "name": "boardGroupPermission_board_id_group_id_permission_pk", - "columns": [ - "board_id", - "group_id", - "permission" - ] + "columns": ["board_id", "group_id", "permission"] } }, "uniqueConstraints": {}, @@ -330,12 +301,8 @@ "name": "boardUserPermission_board_id_board_id_fk", "tableFrom": "boardUserPermission", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -343,12 +310,8 @@ "name": "boardUserPermission_user_id_user_id_fk", "tableFrom": "boardUserPermission", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -356,11 +319,7 @@ "compositePrimaryKeys": { "boardUserPermission_board_id_user_id_permission_pk": { "name": "boardUserPermission_board_id_user_id_permission_pk", - "columns": [ - "board_id", - "user_id", - "permission" - ] + "columns": ["board_id", "user_id", "permission"] } }, "uniqueConstraints": {}, @@ -518,12 +477,8 @@ "name": "board_creator_id_user_id_fk", "tableFrom": "board", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -531,17 +486,13 @@ "compositePrimaryKeys": { "board_id": { "name": "board_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": { "board_name_unique": { "name": "board_name_unique", - "columns": [ - "name" - ] + "columns": ["name"] } }, "checkConstraint": {} @@ -577,9 +528,7 @@ "compositePrimaryKeys": { "cron_job_configuration_name": { "name": "cron_job_configuration_name", - "columns": [ - "name" - ] + "columns": ["name"] } }, "uniqueConstraints": {}, @@ -707,12 +656,8 @@ "name": "custom_widget_definition_creator_id_user_id_fk", "tableFrom": "custom_widget_definition", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -720,9 +665,7 @@ "compositePrimaryKeys": { "custom_widget_definition_id": { "name": "custom_widget_definition_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -766,12 +709,8 @@ "name": "cw_secret_definition_id_cw_definition_id_fk", "tableFrom": "custom_widget_secret", "tableTo": "custom_widget_definition", - "columnsFrom": [ - "definition_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["definition_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -779,10 +718,7 @@ "compositePrimaryKeys": { "custom_widget_secret_definition_id_kind_pk": { "name": "custom_widget_secret_definition_id_kind_pk", - "columns": [ - "definition_id", - "kind" - ] + "columns": ["definition_id", "kind"] } }, "uniqueConstraints": {}, @@ -812,12 +748,8 @@ "name": "groupMember_group_id_group_id_fk", "tableFrom": "groupMember", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -825,12 +757,8 @@ "name": "groupMember_user_id_user_id_fk", "tableFrom": "groupMember", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -838,10 +766,7 @@ "compositePrimaryKeys": { "groupMember_group_id_user_id_pk": { "name": "groupMember_group_id_user_id_pk", - "columns": [ - "group_id", - "user_id" - ] + "columns": ["group_id", "user_id"] } }, "uniqueConstraints": {}, @@ -871,12 +796,8 @@ "name": "groupPermission_group_id_group_id_fk", "tableFrom": "groupPermission", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -937,12 +858,8 @@ "name": "group_owner_id_user_id_fk", "tableFrom": "group", "tableTo": "user", - "columnsFrom": [ - "owner_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["owner_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -950,12 +867,8 @@ "name": "group_home_board_id_board_id_fk", "tableFrom": "group", "tableTo": "board", - "columnsFrom": [ - "home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -963,12 +876,8 @@ "name": "group_mobile_home_board_id_board_id_fk", "tableFrom": "group", "tableTo": "board", - "columnsFrom": [ - "mobile_home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["mobile_home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -976,17 +885,13 @@ "compositePrimaryKeys": { "group_id": { "name": "group_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": { "group_name_unique": { "name": "group_name_unique", - "columns": [ - "name" - ] + "columns": ["name"] } }, "checkConstraint": {} @@ -1014,9 +919,7 @@ "compositePrimaryKeys": { "iconRepository_id": { "name": "iconRepository_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -1067,12 +970,8 @@ "name": "icon_icon_repository_id_iconRepository_id_fk", "tableFrom": "icon", "tableTo": "iconRepository", - "columnsFrom": [ - "icon_repository_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["icon_repository_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1080,9 +979,7 @@ "compositePrimaryKeys": { "icon_id": { "name": "icon_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -1119,12 +1016,8 @@ "name": "integrationGroupPermissions_integration_id_integration_id_fk", "tableFrom": "integrationGroupPermissions", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1132,12 +1025,8 @@ "name": "integrationGroupPermissions_group_id_group_id_fk", "tableFrom": "integrationGroupPermissions", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1145,11 +1034,7 @@ "compositePrimaryKeys": { "integration_group_permission__pk": { "name": "integration_group_permission__pk", - "columns": [ - "integration_id", - "group_id", - "permission" - ] + "columns": ["integration_id", "group_id", "permission"] } }, "uniqueConstraints": {}, @@ -1179,12 +1064,8 @@ "name": "integration_item_item_id_item_id_fk", "tableFrom": "integration_item", "tableTo": "item", - "columnsFrom": [ - "item_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["item_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1192,12 +1073,8 @@ "name": "integration_item_integration_id_integration_id_fk", "tableFrom": "integration_item", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1205,10 +1082,7 @@ "compositePrimaryKeys": { "integration_item_item_id_integration_id_pk": { "name": "integration_item_item_id_integration_id_pk", - "columns": [ - "item_id", - "integration_id" - ] + "columns": ["item_id", "integration_id"] } }, "uniqueConstraints": {}, @@ -1249,16 +1123,12 @@ "indexes": { "integration_secret__kind_idx": { "name": "integration_secret__kind_idx", - "columns": [ - "kind" - ], + "columns": ["kind"], "isUnique": false }, "integration_secret__updated_at_idx": { "name": "integration_secret__updated_at_idx", - "columns": [ - "updated_at" - ], + "columns": ["updated_at"], "isUnique": false } }, @@ -1267,12 +1137,8 @@ "name": "integrationSecret_integration_id_integration_id_fk", "tableFrom": "integrationSecret", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1280,10 +1146,7 @@ "compositePrimaryKeys": { "integrationSecret_integration_id_kind_pk": { "name": "integrationSecret_integration_id_kind_pk", - "columns": [ - "integration_id", - "kind" - ] + "columns": ["integration_id", "kind"] } }, "uniqueConstraints": {}, @@ -1320,12 +1183,8 @@ "name": "integrationUserPermission_integration_id_integration_id_fk", "tableFrom": "integrationUserPermission", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1333,12 +1192,8 @@ "name": "integrationUserPermission_user_id_user_id_fk", "tableFrom": "integrationUserPermission", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1346,11 +1201,7 @@ "compositePrimaryKeys": { "integrationUserPermission_integration_id_user_id_permission_pk": { "name": "integrationUserPermission_integration_id_user_id_permission_pk", - "columns": [ - "integration_id", - "user_id", - "permission" - ] + "columns": ["integration_id", "user_id", "permission"] } }, "uniqueConstraints": {}, @@ -1398,9 +1249,7 @@ "indexes": { "integration__kind_idx": { "name": "integration__kind_idx", - "columns": [ - "kind" - ], + "columns": ["kind"], "isUnique": false } }, @@ -1409,12 +1258,8 @@ "name": "integration_app_id_app_id_fk", "tableFrom": "integration", "tableTo": "app", - "columnsFrom": [ - "app_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["app_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -1422,9 +1267,7 @@ "compositePrimaryKeys": { "integration_id": { "name": "integration_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -1468,12 +1311,8 @@ "name": "invite_creator_id_user_id_fk", "tableFrom": "invite", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1481,17 +1320,13 @@ "compositePrimaryKeys": { "invite_id": { "name": "invite_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": { "invite_token_unique": { "name": "invite_token_unique", - "columns": [ - "token" - ] + "columns": ["token"] } }, "checkConstraint": {} @@ -1555,12 +1390,8 @@ "name": "item_layout_item_id_item_id_fk", "tableFrom": "item_layout", "tableTo": "item", - "columnsFrom": [ - "item_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["item_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1568,12 +1399,8 @@ "name": "item_layout_section_id_section_id_fk", "tableFrom": "item_layout", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1581,12 +1408,8 @@ "name": "item_layout_layout_id_layout_id_fk", "tableFrom": "item_layout", "tableTo": "layout", - "columnsFrom": [ - "layout_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["layout_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1594,11 +1417,7 @@ "compositePrimaryKeys": { "item_layout_item_id_section_id_layout_id_pk": { "name": "item_layout_item_id_section_id_layout_id_pk", - "columns": [ - "item_id", - "section_id", - "layout_id" - ] + "columns": ["item_id", "section_id", "layout_id"] } }, "uniqueConstraints": {}, @@ -1651,12 +1470,8 @@ "name": "item_board_id_board_id_fk", "tableFrom": "item", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1664,9 +1479,7 @@ "compositePrimaryKeys": { "item_id": { "name": "item_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -1718,12 +1531,8 @@ "name": "layout_board_id_board_id_fk", "tableFrom": "layout", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1731,9 +1540,7 @@ "compositePrimaryKeys": { "layout_id": { "name": "layout_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -1799,12 +1606,8 @@ "name": "media_creator_id_user_id_fk", "tableFrom": "media", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -1812,9 +1615,7 @@ "compositePrimaryKeys": { "media_id": { "name": "media_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -1850,9 +1651,7 @@ "compositePrimaryKeys": { "onboarding_id": { "name": "onboarding_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -1925,12 +1724,8 @@ "name": "search_engine_integration_id_integration_id_fk", "tableFrom": "search_engine", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1938,17 +1733,13 @@ "compositePrimaryKeys": { "search_engine_id": { "name": "search_engine_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": { "search_engine_short_unique": { "name": "search_engine_short_unique", - "columns": [ - "short" - ] + "columns": ["short"] } }, "checkConstraint": {} @@ -1985,12 +1776,8 @@ "name": "section_collapse_state_user_id_user_id_fk", "tableFrom": "section_collapse_state", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1998,12 +1785,8 @@ "name": "section_collapse_state_section_id_section_id_fk", "tableFrom": "section_collapse_state", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -2011,10 +1794,7 @@ "compositePrimaryKeys": { "section_collapse_state_user_id_section_id_pk": { "name": "section_collapse_state_user_id_section_id_pk", - "columns": [ - "user_id", - "section_id" - ] + "columns": ["user_id", "section_id"] } }, "uniqueConstraints": {}, @@ -2079,12 +1859,8 @@ "name": "section_layout_section_id_section_id_fk", "tableFrom": "section_layout", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -2092,12 +1868,8 @@ "name": "section_layout_layout_id_layout_id_fk", "tableFrom": "section_layout", "tableTo": "layout", - "columnsFrom": [ - "layout_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["layout_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -2105,12 +1877,8 @@ "name": "section_layout_parent_section_id_section_id_fk", "tableFrom": "section_layout", "tableTo": "section", - "columnsFrom": [ - "parent_section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["parent_section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -2118,10 +1886,7 @@ "compositePrimaryKeys": { "section_layout_section_id_layout_id_pk": { "name": "section_layout_section_id_layout_id_pk", - "columns": [ - "section_id", - "layout_id" - ] + "columns": ["section_id", "layout_id"] } }, "uniqueConstraints": {}, @@ -2187,12 +1952,8 @@ "name": "section_board_id_board_id_fk", "tableFrom": "section", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -2200,9 +1961,7 @@ "compositePrimaryKeys": { "section_id": { "name": "section_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -2232,17 +1991,13 @@ "compositePrimaryKeys": { "serverSetting_setting_key": { "name": "serverSetting_setting_key", - "columns": [ - "setting_key" - ] + "columns": ["setting_key"] } }, "uniqueConstraints": { "serverSetting_settingKey_unique": { "name": "serverSetting_settingKey_unique", - "columns": [ - "setting_key" - ] + "columns": ["setting_key"] } }, "checkConstraint": {} @@ -2275,9 +2030,7 @@ "indexes": { "user_id_idx": { "name": "user_id_idx", - "columns": [ - "user_id" - ], + "columns": ["user_id"], "isUnique": false } }, @@ -2286,12 +2039,8 @@ "name": "session_user_id_user_id_fk", "tableFrom": "session", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -2299,9 +2048,7 @@ "compositePrimaryKeys": { "session_session_token": { "name": "session_session_token", - "columns": [ - "session_token" - ] + "columns": ["session_token"] } }, "uniqueConstraints": {}, @@ -2444,12 +2191,8 @@ "name": "user_home_board_id_board_id_fk", "tableFrom": "user", "tableTo": "board", - "columnsFrom": [ - "home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -2457,12 +2200,8 @@ "name": "user_mobile_home_board_id_board_id_fk", "tableFrom": "user", "tableTo": "board", - "columnsFrom": [ - "mobile_home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["mobile_home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -2470,12 +2209,8 @@ "name": "user_default_search_engine_id_search_engine_id_fk", "tableFrom": "user", "tableTo": "search_engine", - "columnsFrom": [ - "default_search_engine_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["default_search_engine_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -2483,9 +2218,7 @@ "compositePrimaryKeys": { "user_id": { "name": "user_id", - "columns": [ - "id" - ] + "columns": ["id"] } }, "uniqueConstraints": {}, @@ -2521,10 +2254,7 @@ "compositePrimaryKeys": { "verificationToken_identifier_token_pk": { "name": "verificationToken_identifier_token_pk", - "columns": [ - "identifier", - "token" - ] + "columns": ["identifier", "token"] } }, "uniqueConstraints": {}, @@ -2560,10 +2290,7 @@ "compositePrimaryKeys": { "trusted_certificate_hostname_hostname_thumbprint_pk": { "name": "trusted_certificate_hostname_hostname_thumbprint_pk", - "columns": [ - "hostname", - "thumbprint" - ] + "columns": ["hostname", "thumbprint"] } }, "uniqueConstraints": {}, @@ -2607,22 +2334,15 @@ "name": "widget_secret_item_id_item_id_fk", "tableFrom": "widget_secret", "tableTo": "item", - "columnsFrom": [ - "item_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["item_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "widget_secret_item_id_kind_pk": { - "columns": [ - "item_id", - "kind" - ], + "columns": ["item_id", "kind"], "name": "widget_secret_item_id_kind_pk" } }, diff --git a/packages/db/migrations/mysql/meta/_journal.json b/packages/db/migrations/mysql/meta/_journal.json index 4ce2bf038..ca0badae9 100644 --- a/packages/db/migrations/mysql/meta/_journal.json +++ b/packages/db/migrations/mysql/meta/_journal.json @@ -304,4 +304,4 @@ "breakpoints": true } ] -} \ No newline at end of file +} diff --git a/packages/db/migrations/postgresql/meta/0006_snapshot.json b/packages/db/migrations/postgresql/meta/0006_snapshot.json index ee39b4f11..d5576746b 100644 --- a/packages/db/migrations/postgresql/meta/0006_snapshot.json +++ b/packages/db/migrations/postgresql/meta/0006_snapshot.json @@ -97,12 +97,8 @@ "name": "account_user_id_user_id_fk", "tableFrom": "account", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -110,10 +106,7 @@ "compositePrimaryKeys": { "account_provider_provider_account_id_pk": { "name": "account_provider_provider_account_id_pk", - "columns": [ - "provider", - "provider_account_id" - ] + "columns": ["provider", "provider_account_id"] } }, "uniqueConstraints": {}, @@ -150,12 +143,8 @@ "name": "apiKey_user_id_user_id_fk", "tableFrom": "apiKey", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -244,12 +233,8 @@ "name": "boardGroupPermission_board_id_board_id_fk", "tableFrom": "boardGroupPermission", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -257,12 +242,8 @@ "name": "boardGroupPermission_group_id_group_id_fk", "tableFrom": "boardGroupPermission", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -270,11 +251,7 @@ "compositePrimaryKeys": { "boardGroupPermission_board_id_group_id_permission_pk": { "name": "boardGroupPermission_board_id_group_id_permission_pk", - "columns": [ - "board_id", - "group_id", - "permission" - ] + "columns": ["board_id", "group_id", "permission"] } }, "uniqueConstraints": {}, @@ -311,12 +288,8 @@ "name": "boardUserPermission_board_id_board_id_fk", "tableFrom": "boardUserPermission", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -324,12 +297,8 @@ "name": "boardUserPermission_user_id_user_id_fk", "tableFrom": "boardUserPermission", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -337,11 +306,7 @@ "compositePrimaryKeys": { "boardUserPermission_board_id_user_id_permission_pk": { "name": "boardUserPermission_board_id_user_id_permission_pk", - "columns": [ - "board_id", - "user_id", - "permission" - ] + "columns": ["board_id", "user_id", "permission"] } }, "uniqueConstraints": {}, @@ -483,12 +448,8 @@ "name": "board_creator_id_user_id_fk", "tableFrom": "board", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -498,9 +459,7 @@ "board_name_unique": { "name": "board_name_unique", "nullsNotDistinct": false, - "columns": [ - "name" - ] + "columns": ["name"] } }, "policies": {}, @@ -646,12 +605,8 @@ "name": "custom_widget_definition_creator_id_user_id_fk", "tableFrom": "custom_widget_definition", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -697,12 +652,8 @@ "name": "custom_widget_secret_definition_id_custom_widget_definition_id_fk", "tableFrom": "custom_widget_secret", "tableTo": "custom_widget_definition", - "columnsFrom": [ - "definition_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["definition_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -710,10 +661,7 @@ "compositePrimaryKeys": { "custom_widget_secret_definition_id_kind_pk": { "name": "custom_widget_secret_definition_id_kind_pk", - "columns": [ - "definition_id", - "kind" - ] + "columns": ["definition_id", "kind"] } }, "uniqueConstraints": {}, @@ -744,12 +692,8 @@ "name": "groupMember_group_id_group_id_fk", "tableFrom": "groupMember", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -757,12 +701,8 @@ "name": "groupMember_user_id_user_id_fk", "tableFrom": "groupMember", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -770,10 +710,7 @@ "compositePrimaryKeys": { "groupMember_group_id_user_id_pk": { "name": "groupMember_group_id_user_id_pk", - "columns": [ - "group_id", - "user_id" - ] + "columns": ["group_id", "user_id"] } }, "uniqueConstraints": {}, @@ -804,12 +741,8 @@ "name": "groupPermission_group_id_group_id_fk", "tableFrom": "groupPermission", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -867,12 +800,8 @@ "name": "group_owner_id_user_id_fk", "tableFrom": "group", "tableTo": "user", - "columnsFrom": [ - "owner_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["owner_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -880,12 +809,8 @@ "name": "group_home_board_id_board_id_fk", "tableFrom": "group", "tableTo": "board", - "columnsFrom": [ - "home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -893,12 +818,8 @@ "name": "group_mobile_home_board_id_board_id_fk", "tableFrom": "group", "tableTo": "board", - "columnsFrom": [ - "mobile_home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["mobile_home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -908,9 +829,7 @@ "group_name_unique": { "name": "group_name_unique", "nullsNotDistinct": false, - "columns": [ - "name" - ] + "columns": ["name"] } }, "policies": {}, @@ -983,12 +902,8 @@ "name": "icon_icon_repository_id_iconRepository_id_fk", "tableFrom": "icon", "tableTo": "iconRepository", - "columnsFrom": [ - "icon_repository_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["icon_repository_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1028,12 +943,8 @@ "name": "integrationGroupPermissions_integration_id_integration_id_fk", "tableFrom": "integrationGroupPermissions", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1041,12 +952,8 @@ "name": "integrationGroupPermissions_group_id_group_id_fk", "tableFrom": "integrationGroupPermissions", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1054,11 +961,7 @@ "compositePrimaryKeys": { "integration_group_permission__pk": { "name": "integration_group_permission__pk", - "columns": [ - "integration_id", - "group_id", - "permission" - ] + "columns": ["integration_id", "group_id", "permission"] } }, "uniqueConstraints": {}, @@ -1089,12 +992,8 @@ "name": "integration_item_item_id_item_id_fk", "tableFrom": "integration_item", "tableTo": "item", - "columnsFrom": [ - "item_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["item_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1102,12 +1001,8 @@ "name": "integration_item_integration_id_integration_id_fk", "tableFrom": "integration_item", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1115,10 +1010,7 @@ "compositePrimaryKeys": { "integration_item_item_id_integration_id_pk": { "name": "integration_item_item_id_integration_id_pk", - "columns": [ - "item_id", - "integration_id" - ] + "columns": ["item_id", "integration_id"] } }, "uniqueConstraints": {}, @@ -1192,12 +1084,8 @@ "name": "integrationSecret_integration_id_integration_id_fk", "tableFrom": "integrationSecret", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1205,10 +1093,7 @@ "compositePrimaryKeys": { "integrationSecret_integration_id_kind_pk": { "name": "integrationSecret_integration_id_kind_pk", - "columns": [ - "integration_id", - "kind" - ] + "columns": ["integration_id", "kind"] } }, "uniqueConstraints": {}, @@ -1245,12 +1130,8 @@ "name": "integrationUserPermission_integration_id_integration_id_fk", "tableFrom": "integrationUserPermission", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1258,12 +1139,8 @@ "name": "integrationUserPermission_user_id_user_id_fk", "tableFrom": "integrationUserPermission", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1271,11 +1148,7 @@ "compositePrimaryKeys": { "integrationUserPermission_integration_id_user_id_permission_pk": { "name": "integrationUserPermission_integration_id_user_id_permission_pk", - "columns": [ - "integration_id", - "user_id", - "permission" - ] + "columns": ["integration_id", "user_id", "permission"] } }, "uniqueConstraints": {}, @@ -1340,12 +1213,8 @@ "name": "integration_app_id_app_id_fk", "tableFrom": "integration", "tableTo": "app", - "columnsFrom": [ - "app_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["app_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -1391,12 +1260,8 @@ "name": "invite_creator_id_user_id_fk", "tableFrom": "invite", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1406,9 +1271,7 @@ "invite_token_unique": { "name": "invite_token_unique", "nullsNotDistinct": false, - "columns": [ - "token" - ] + "columns": ["token"] } }, "policies": {}, @@ -1468,12 +1331,8 @@ "name": "item_layout_item_id_item_id_fk", "tableFrom": "item_layout", "tableTo": "item", - "columnsFrom": [ - "item_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["item_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1481,12 +1340,8 @@ "name": "item_layout_section_id_section_id_fk", "tableFrom": "item_layout", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1494,12 +1349,8 @@ "name": "item_layout_layout_id_layout_id_fk", "tableFrom": "item_layout", "tableTo": "layout", - "columnsFrom": [ - "layout_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["layout_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1507,11 +1358,7 @@ "compositePrimaryKeys": { "item_layout_item_id_section_id_layout_id_pk": { "name": "item_layout_item_id_section_id_layout_id_pk", - "columns": [ - "item_id", - "section_id", - "layout_id" - ] + "columns": ["item_id", "section_id", "layout_id"] } }, "uniqueConstraints": {}, @@ -1562,12 +1409,8 @@ "name": "item_board_id_board_id_fk", "tableFrom": "item", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1620,12 +1463,8 @@ "name": "layout_board_id_board_id_fk", "tableFrom": "layout", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1690,12 +1529,8 @@ "name": "media_creator_id_user_id_fk", "tableFrom": "media", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -1797,12 +1632,8 @@ "name": "search_engine_integration_id_integration_id_fk", "tableFrom": "search_engine", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1812,9 +1643,7 @@ "search_engine_short_unique": { "name": "search_engine_short_unique", "nullsNotDistinct": false, - "columns": [ - "short" - ] + "columns": ["short"] } }, "policies": {}, @@ -1851,12 +1680,8 @@ "name": "section_collapse_state_user_id_user_id_fk", "tableFrom": "section_collapse_state", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1864,12 +1689,8 @@ "name": "section_collapse_state_section_id_section_id_fk", "tableFrom": "section_collapse_state", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1877,10 +1698,7 @@ "compositePrimaryKeys": { "section_collapse_state_user_id_section_id_pk": { "name": "section_collapse_state_user_id_section_id_pk", - "columns": [ - "user_id", - "section_id" - ] + "columns": ["user_id", "section_id"] } }, "uniqueConstraints": {}, @@ -1941,12 +1759,8 @@ "name": "section_layout_section_id_section_id_fk", "tableFrom": "section_layout", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1954,12 +1768,8 @@ "name": "section_layout_layout_id_layout_id_fk", "tableFrom": "section_layout", "tableTo": "layout", - "columnsFrom": [ - "layout_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["layout_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1967,12 +1777,8 @@ "name": "section_layout_parent_section_id_section_id_fk", "tableFrom": "section_layout", "tableTo": "section", - "columnsFrom": [ - "parent_section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["parent_section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1980,10 +1786,7 @@ "compositePrimaryKeys": { "section_layout_section_id_layout_id_pk": { "name": "section_layout_section_id_layout_id_pk", - "columns": [ - "section_id", - "layout_id" - ] + "columns": ["section_id", "layout_id"] } }, "uniqueConstraints": {}, @@ -2045,12 +1848,8 @@ "name": "section_board_id_board_id_fk", "tableFrom": "section", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -2086,9 +1885,7 @@ "serverSetting_settingKey_unique": { "name": "serverSetting_settingKey_unique", "nullsNotDistinct": false, - "columns": [ - "setting_key" - ] + "columns": ["setting_key"] } }, "policies": {}, @@ -2140,12 +1937,8 @@ "name": "session_user_id_user_id_fk", "tableFrom": "session", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -2277,12 +2070,8 @@ "name": "user_home_board_id_board_id_fk", "tableFrom": "user", "tableTo": "board", - "columnsFrom": [ - "home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -2290,12 +2079,8 @@ "name": "user_mobile_home_board_id_board_id_fk", "tableFrom": "user", "tableTo": "board", - "columnsFrom": [ - "mobile_home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["mobile_home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -2303,12 +2088,8 @@ "name": "user_default_search_engine_id_search_engine_id_fk", "tableFrom": "user", "tableTo": "search_engine", - "columnsFrom": [ - "default_search_engine_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["default_search_engine_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -2347,10 +2128,7 @@ "compositePrimaryKeys": { "verificationToken_identifier_token_pk": { "name": "verificationToken_identifier_token_pk", - "columns": [ - "identifier", - "token" - ] + "columns": ["identifier", "token"] } }, "uniqueConstraints": {}, @@ -2386,10 +2164,7 @@ "compositePrimaryKeys": { "trusted_certificate_hostname_hostname_thumbprint_pk": { "name": "trusted_certificate_hostname_hostname_thumbprint_pk", - "columns": [ - "hostname", - "thumbprint" - ] + "columns": ["hostname", "thumbprint"] } }, "uniqueConstraints": {}, @@ -2409,4 +2184,4 @@ "schemas": {}, "tables": {} } -} \ No newline at end of file +} diff --git a/packages/db/migrations/postgresql/meta/0007_snapshot.json b/packages/db/migrations/postgresql/meta/0007_snapshot.json index 4c4f167d7..de8042930 100644 --- a/packages/db/migrations/postgresql/meta/0007_snapshot.json +++ b/packages/db/migrations/postgresql/meta/0007_snapshot.json @@ -97,12 +97,8 @@ "name": "account_user_id_user_id_fk", "tableFrom": "account", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -110,10 +106,7 @@ "compositePrimaryKeys": { "account_provider_provider_account_id_pk": { "name": "account_provider_provider_account_id_pk", - "columns": [ - "provider", - "provider_account_id" - ] + "columns": ["provider", "provider_account_id"] } }, "uniqueConstraints": {}, @@ -150,12 +143,8 @@ "name": "apiKey_user_id_user_id_fk", "tableFrom": "apiKey", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -244,12 +233,8 @@ "name": "boardGroupPermission_board_id_board_id_fk", "tableFrom": "boardGroupPermission", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -257,12 +242,8 @@ "name": "boardGroupPermission_group_id_group_id_fk", "tableFrom": "boardGroupPermission", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -270,11 +251,7 @@ "compositePrimaryKeys": { "boardGroupPermission_board_id_group_id_permission_pk": { "name": "boardGroupPermission_board_id_group_id_permission_pk", - "columns": [ - "board_id", - "group_id", - "permission" - ] + "columns": ["board_id", "group_id", "permission"] } }, "uniqueConstraints": {}, @@ -311,12 +288,8 @@ "name": "boardUserPermission_board_id_board_id_fk", "tableFrom": "boardUserPermission", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -324,12 +297,8 @@ "name": "boardUserPermission_user_id_user_id_fk", "tableFrom": "boardUserPermission", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -337,11 +306,7 @@ "compositePrimaryKeys": { "boardUserPermission_board_id_user_id_permission_pk": { "name": "boardUserPermission_board_id_user_id_permission_pk", - "columns": [ - "board_id", - "user_id", - "permission" - ] + "columns": ["board_id", "user_id", "permission"] } }, "uniqueConstraints": {}, @@ -483,12 +448,8 @@ "name": "board_creator_id_user_id_fk", "tableFrom": "board", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -498,9 +459,7 @@ "board_name_unique": { "name": "board_name_unique", "nullsNotDistinct": false, - "columns": [ - "name" - ] + "columns": ["name"] } }, "policies": {}, @@ -647,12 +606,8 @@ "name": "custom_widget_definition_creator_id_user_id_fk", "tableFrom": "custom_widget_definition", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -698,12 +653,8 @@ "name": "custom_widget_secret_definition_id_custom_widget_definition_id_fk", "tableFrom": "custom_widget_secret", "tableTo": "custom_widget_definition", - "columnsFrom": [ - "definition_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["definition_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -711,10 +662,7 @@ "compositePrimaryKeys": { "custom_widget_secret_definition_id_kind_pk": { "name": "custom_widget_secret_definition_id_kind_pk", - "columns": [ - "definition_id", - "kind" - ] + "columns": ["definition_id", "kind"] } }, "uniqueConstraints": {}, @@ -745,12 +693,8 @@ "name": "groupMember_group_id_group_id_fk", "tableFrom": "groupMember", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -758,12 +702,8 @@ "name": "groupMember_user_id_user_id_fk", "tableFrom": "groupMember", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -771,10 +711,7 @@ "compositePrimaryKeys": { "groupMember_group_id_user_id_pk": { "name": "groupMember_group_id_user_id_pk", - "columns": [ - "group_id", - "user_id" - ] + "columns": ["group_id", "user_id"] } }, "uniqueConstraints": {}, @@ -805,12 +742,8 @@ "name": "groupPermission_group_id_group_id_fk", "tableFrom": "groupPermission", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -868,12 +801,8 @@ "name": "group_owner_id_user_id_fk", "tableFrom": "group", "tableTo": "user", - "columnsFrom": [ - "owner_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["owner_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -881,12 +810,8 @@ "name": "group_home_board_id_board_id_fk", "tableFrom": "group", "tableTo": "board", - "columnsFrom": [ - "home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -894,12 +819,8 @@ "name": "group_mobile_home_board_id_board_id_fk", "tableFrom": "group", "tableTo": "board", - "columnsFrom": [ - "mobile_home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["mobile_home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -909,9 +830,7 @@ "group_name_unique": { "name": "group_name_unique", "nullsNotDistinct": false, - "columns": [ - "name" - ] + "columns": ["name"] } }, "policies": {}, @@ -984,12 +903,8 @@ "name": "icon_icon_repository_id_iconRepository_id_fk", "tableFrom": "icon", "tableTo": "iconRepository", - "columnsFrom": [ - "icon_repository_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["icon_repository_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1029,12 +944,8 @@ "name": "integrationGroupPermissions_integration_id_integration_id_fk", "tableFrom": "integrationGroupPermissions", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1042,12 +953,8 @@ "name": "integrationGroupPermissions_group_id_group_id_fk", "tableFrom": "integrationGroupPermissions", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1055,11 +962,7 @@ "compositePrimaryKeys": { "integration_group_permission__pk": { "name": "integration_group_permission__pk", - "columns": [ - "integration_id", - "group_id", - "permission" - ] + "columns": ["integration_id", "group_id", "permission"] } }, "uniqueConstraints": {}, @@ -1090,12 +993,8 @@ "name": "integration_item_item_id_item_id_fk", "tableFrom": "integration_item", "tableTo": "item", - "columnsFrom": [ - "item_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["item_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1103,12 +1002,8 @@ "name": "integration_item_integration_id_integration_id_fk", "tableFrom": "integration_item", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1116,10 +1011,7 @@ "compositePrimaryKeys": { "integration_item_item_id_integration_id_pk": { "name": "integration_item_item_id_integration_id_pk", - "columns": [ - "item_id", - "integration_id" - ] + "columns": ["item_id", "integration_id"] } }, "uniqueConstraints": {}, @@ -1193,12 +1085,8 @@ "name": "integrationSecret_integration_id_integration_id_fk", "tableFrom": "integrationSecret", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1206,10 +1094,7 @@ "compositePrimaryKeys": { "integrationSecret_integration_id_kind_pk": { "name": "integrationSecret_integration_id_kind_pk", - "columns": [ - "integration_id", - "kind" - ] + "columns": ["integration_id", "kind"] } }, "uniqueConstraints": {}, @@ -1246,12 +1131,8 @@ "name": "integrationUserPermission_integration_id_integration_id_fk", "tableFrom": "integrationUserPermission", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1259,12 +1140,8 @@ "name": "integrationUserPermission_user_id_user_id_fk", "tableFrom": "integrationUserPermission", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1272,11 +1149,7 @@ "compositePrimaryKeys": { "integrationUserPermission_integration_id_user_id_permission_pk": { "name": "integrationUserPermission_integration_id_user_id_permission_pk", - "columns": [ - "integration_id", - "user_id", - "permission" - ] + "columns": ["integration_id", "user_id", "permission"] } }, "uniqueConstraints": {}, @@ -1341,12 +1214,8 @@ "name": "integration_app_id_app_id_fk", "tableFrom": "integration", "tableTo": "app", - "columnsFrom": [ - "app_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["app_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -1392,12 +1261,8 @@ "name": "invite_creator_id_user_id_fk", "tableFrom": "invite", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1407,9 +1272,7 @@ "invite_token_unique": { "name": "invite_token_unique", "nullsNotDistinct": false, - "columns": [ - "token" - ] + "columns": ["token"] } }, "policies": {}, @@ -1469,12 +1332,8 @@ "name": "item_layout_item_id_item_id_fk", "tableFrom": "item_layout", "tableTo": "item", - "columnsFrom": [ - "item_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["item_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1482,12 +1341,8 @@ "name": "item_layout_section_id_section_id_fk", "tableFrom": "item_layout", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1495,12 +1350,8 @@ "name": "item_layout_layout_id_layout_id_fk", "tableFrom": "item_layout", "tableTo": "layout", - "columnsFrom": [ - "layout_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["layout_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1508,11 +1359,7 @@ "compositePrimaryKeys": { "item_layout_item_id_section_id_layout_id_pk": { "name": "item_layout_item_id_section_id_layout_id_pk", - "columns": [ - "item_id", - "section_id", - "layout_id" - ] + "columns": ["item_id", "section_id", "layout_id"] } }, "uniqueConstraints": {}, @@ -1563,12 +1410,8 @@ "name": "item_board_id_board_id_fk", "tableFrom": "item", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1621,12 +1464,8 @@ "name": "layout_board_id_board_id_fk", "tableFrom": "layout", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1691,12 +1530,8 @@ "name": "media_creator_id_user_id_fk", "tableFrom": "media", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -1798,12 +1633,8 @@ "name": "search_engine_integration_id_integration_id_fk", "tableFrom": "search_engine", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1813,9 +1644,7 @@ "search_engine_short_unique": { "name": "search_engine_short_unique", "nullsNotDistinct": false, - "columns": [ - "short" - ] + "columns": ["short"] } }, "policies": {}, @@ -1852,12 +1681,8 @@ "name": "section_collapse_state_user_id_user_id_fk", "tableFrom": "section_collapse_state", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1865,12 +1690,8 @@ "name": "section_collapse_state_section_id_section_id_fk", "tableFrom": "section_collapse_state", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1878,10 +1699,7 @@ "compositePrimaryKeys": { "section_collapse_state_user_id_section_id_pk": { "name": "section_collapse_state_user_id_section_id_pk", - "columns": [ - "user_id", - "section_id" - ] + "columns": ["user_id", "section_id"] } }, "uniqueConstraints": {}, @@ -1942,12 +1760,8 @@ "name": "section_layout_section_id_section_id_fk", "tableFrom": "section_layout", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1955,12 +1769,8 @@ "name": "section_layout_layout_id_layout_id_fk", "tableFrom": "section_layout", "tableTo": "layout", - "columnsFrom": [ - "layout_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["layout_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1968,12 +1778,8 @@ "name": "section_layout_parent_section_id_section_id_fk", "tableFrom": "section_layout", "tableTo": "section", - "columnsFrom": [ - "parent_section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["parent_section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1981,10 +1787,7 @@ "compositePrimaryKeys": { "section_layout_section_id_layout_id_pk": { "name": "section_layout_section_id_layout_id_pk", - "columns": [ - "section_id", - "layout_id" - ] + "columns": ["section_id", "layout_id"] } }, "uniqueConstraints": {}, @@ -2046,12 +1849,8 @@ "name": "section_board_id_board_id_fk", "tableFrom": "section", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -2087,9 +1886,7 @@ "serverSetting_settingKey_unique": { "name": "serverSetting_settingKey_unique", "nullsNotDistinct": false, - "columns": [ - "setting_key" - ] + "columns": ["setting_key"] } }, "policies": {}, @@ -2141,12 +1938,8 @@ "name": "session_user_id_user_id_fk", "tableFrom": "session", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -2278,12 +2071,8 @@ "name": "user_home_board_id_board_id_fk", "tableFrom": "user", "tableTo": "board", - "columnsFrom": [ - "home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -2291,12 +2080,8 @@ "name": "user_mobile_home_board_id_board_id_fk", "tableFrom": "user", "tableTo": "board", - "columnsFrom": [ - "mobile_home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["mobile_home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -2304,12 +2089,8 @@ "name": "user_default_search_engine_id_search_engine_id_fk", "tableFrom": "user", "tableTo": "search_engine", - "columnsFrom": [ - "default_search_engine_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["default_search_engine_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -2348,10 +2129,7 @@ "compositePrimaryKeys": { "verificationToken_identifier_token_pk": { "name": "verificationToken_identifier_token_pk", - "columns": [ - "identifier", - "token" - ] + "columns": ["identifier", "token"] } }, "uniqueConstraints": {}, @@ -2387,10 +2165,7 @@ "compositePrimaryKeys": { "trusted_certificate_hostname_hostname_thumbprint_pk": { "name": "trusted_certificate_hostname_hostname_thumbprint_pk", - "columns": [ - "hostname", - "thumbprint" - ] + "columns": ["hostname", "thumbprint"] } }, "uniqueConstraints": {}, diff --git a/packages/db/migrations/postgresql/meta/0008_snapshot.json b/packages/db/migrations/postgresql/meta/0008_snapshot.json index ab3303ac9..4ab88d535 100644 --- a/packages/db/migrations/postgresql/meta/0008_snapshot.json +++ b/packages/db/migrations/postgresql/meta/0008_snapshot.json @@ -97,12 +97,8 @@ "name": "account_user_id_user_id_fk", "tableFrom": "account", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -110,10 +106,7 @@ "compositePrimaryKeys": { "account_provider_provider_account_id_pk": { "name": "account_provider_provider_account_id_pk", - "columns": [ - "provider", - "provider_account_id" - ] + "columns": ["provider", "provider_account_id"] } }, "uniqueConstraints": {}, @@ -150,12 +143,8 @@ "name": "apiKey_user_id_user_id_fk", "tableFrom": "apiKey", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -244,12 +233,8 @@ "name": "boardGroupPermission_board_id_board_id_fk", "tableFrom": "boardGroupPermission", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -257,12 +242,8 @@ "name": "boardGroupPermission_group_id_group_id_fk", "tableFrom": "boardGroupPermission", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -270,11 +251,7 @@ "compositePrimaryKeys": { "boardGroupPermission_board_id_group_id_permission_pk": { "name": "boardGroupPermission_board_id_group_id_permission_pk", - "columns": [ - "board_id", - "group_id", - "permission" - ] + "columns": ["board_id", "group_id", "permission"] } }, "uniqueConstraints": {}, @@ -311,12 +288,8 @@ "name": "boardUserPermission_board_id_board_id_fk", "tableFrom": "boardUserPermission", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -324,12 +297,8 @@ "name": "boardUserPermission_user_id_user_id_fk", "tableFrom": "boardUserPermission", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -337,11 +306,7 @@ "compositePrimaryKeys": { "boardUserPermission_board_id_user_id_permission_pk": { "name": "boardUserPermission_board_id_user_id_permission_pk", - "columns": [ - "board_id", - "user_id", - "permission" - ] + "columns": ["board_id", "user_id", "permission"] } }, "uniqueConstraints": {}, @@ -483,12 +448,8 @@ "name": "board_creator_id_user_id_fk", "tableFrom": "board", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -498,9 +459,7 @@ "board_name_unique": { "name": "board_name_unique", "nullsNotDistinct": false, - "columns": [ - "name" - ] + "columns": ["name"] } }, "policies": {}, @@ -647,12 +606,8 @@ "name": "custom_widget_definition_creator_id_user_id_fk", "tableFrom": "custom_widget_definition", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -698,12 +653,8 @@ "name": "custom_widget_secret_definition_id_custom_widget_definition_id_fk", "tableFrom": "custom_widget_secret", "tableTo": "custom_widget_definition", - "columnsFrom": [ - "definition_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["definition_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -711,10 +662,7 @@ "compositePrimaryKeys": { "custom_widget_secret_definition_id_kind_pk": { "name": "custom_widget_secret_definition_id_kind_pk", - "columns": [ - "definition_id", - "kind" - ] + "columns": ["definition_id", "kind"] } }, "uniqueConstraints": {}, @@ -745,12 +693,8 @@ "name": "groupMember_group_id_group_id_fk", "tableFrom": "groupMember", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -758,12 +702,8 @@ "name": "groupMember_user_id_user_id_fk", "tableFrom": "groupMember", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -771,10 +711,7 @@ "compositePrimaryKeys": { "groupMember_group_id_user_id_pk": { "name": "groupMember_group_id_user_id_pk", - "columns": [ - "group_id", - "user_id" - ] + "columns": ["group_id", "user_id"] } }, "uniqueConstraints": {}, @@ -805,12 +742,8 @@ "name": "groupPermission_group_id_group_id_fk", "tableFrom": "groupPermission", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -868,12 +801,8 @@ "name": "group_owner_id_user_id_fk", "tableFrom": "group", "tableTo": "user", - "columnsFrom": [ - "owner_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["owner_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -881,12 +810,8 @@ "name": "group_home_board_id_board_id_fk", "tableFrom": "group", "tableTo": "board", - "columnsFrom": [ - "home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -894,12 +819,8 @@ "name": "group_mobile_home_board_id_board_id_fk", "tableFrom": "group", "tableTo": "board", - "columnsFrom": [ - "mobile_home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["mobile_home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -909,9 +830,7 @@ "group_name_unique": { "name": "group_name_unique", "nullsNotDistinct": false, - "columns": [ - "name" - ] + "columns": ["name"] } }, "policies": {}, @@ -984,12 +903,8 @@ "name": "icon_icon_repository_id_iconRepository_id_fk", "tableFrom": "icon", "tableTo": "iconRepository", - "columnsFrom": [ - "icon_repository_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["icon_repository_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1029,12 +944,8 @@ "name": "integrationGroupPermissions_integration_id_integration_id_fk", "tableFrom": "integrationGroupPermissions", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1042,12 +953,8 @@ "name": "integrationGroupPermissions_group_id_group_id_fk", "tableFrom": "integrationGroupPermissions", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1055,11 +962,7 @@ "compositePrimaryKeys": { "integration_group_permission__pk": { "name": "integration_group_permission__pk", - "columns": [ - "integration_id", - "group_id", - "permission" - ] + "columns": ["integration_id", "group_id", "permission"] } }, "uniqueConstraints": {}, @@ -1090,12 +993,8 @@ "name": "integration_item_item_id_item_id_fk", "tableFrom": "integration_item", "tableTo": "item", - "columnsFrom": [ - "item_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["item_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1103,12 +1002,8 @@ "name": "integration_item_integration_id_integration_id_fk", "tableFrom": "integration_item", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1116,10 +1011,7 @@ "compositePrimaryKeys": { "integration_item_item_id_integration_id_pk": { "name": "integration_item_item_id_integration_id_pk", - "columns": [ - "item_id", - "integration_id" - ] + "columns": ["item_id", "integration_id"] } }, "uniqueConstraints": {}, @@ -1193,12 +1085,8 @@ "name": "integrationSecret_integration_id_integration_id_fk", "tableFrom": "integrationSecret", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1206,10 +1094,7 @@ "compositePrimaryKeys": { "integrationSecret_integration_id_kind_pk": { "name": "integrationSecret_integration_id_kind_pk", - "columns": [ - "integration_id", - "kind" - ] + "columns": ["integration_id", "kind"] } }, "uniqueConstraints": {}, @@ -1246,12 +1131,8 @@ "name": "integrationUserPermission_integration_id_integration_id_fk", "tableFrom": "integrationUserPermission", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1259,12 +1140,8 @@ "name": "integrationUserPermission_user_id_user_id_fk", "tableFrom": "integrationUserPermission", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1272,11 +1149,7 @@ "compositePrimaryKeys": { "integrationUserPermission_integration_id_user_id_permission_pk": { "name": "integrationUserPermission_integration_id_user_id_permission_pk", - "columns": [ - "integration_id", - "user_id", - "permission" - ] + "columns": ["integration_id", "user_id", "permission"] } }, "uniqueConstraints": {}, @@ -1341,12 +1214,8 @@ "name": "integration_app_id_app_id_fk", "tableFrom": "integration", "tableTo": "app", - "columnsFrom": [ - "app_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["app_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -1392,12 +1261,8 @@ "name": "invite_creator_id_user_id_fk", "tableFrom": "invite", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1407,9 +1272,7 @@ "invite_token_unique": { "name": "invite_token_unique", "nullsNotDistinct": false, - "columns": [ - "token" - ] + "columns": ["token"] } }, "policies": {}, @@ -1469,12 +1332,8 @@ "name": "item_layout_item_id_item_id_fk", "tableFrom": "item_layout", "tableTo": "item", - "columnsFrom": [ - "item_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["item_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1482,12 +1341,8 @@ "name": "item_layout_section_id_section_id_fk", "tableFrom": "item_layout", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1495,12 +1350,8 @@ "name": "item_layout_layout_id_layout_id_fk", "tableFrom": "item_layout", "tableTo": "layout", - "columnsFrom": [ - "layout_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["layout_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1508,11 +1359,7 @@ "compositePrimaryKeys": { "item_layout_item_id_section_id_layout_id_pk": { "name": "item_layout_item_id_section_id_layout_id_pk", - "columns": [ - "item_id", - "section_id", - "layout_id" - ] + "columns": ["item_id", "section_id", "layout_id"] } }, "uniqueConstraints": {}, @@ -1563,12 +1410,8 @@ "name": "item_board_id_board_id_fk", "tableFrom": "item", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1621,12 +1464,8 @@ "name": "layout_board_id_board_id_fk", "tableFrom": "layout", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1691,12 +1530,8 @@ "name": "media_creator_id_user_id_fk", "tableFrom": "media", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -1798,12 +1633,8 @@ "name": "search_engine_integration_id_integration_id_fk", "tableFrom": "search_engine", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1813,9 +1644,7 @@ "search_engine_short_unique": { "name": "search_engine_short_unique", "nullsNotDistinct": false, - "columns": [ - "short" - ] + "columns": ["short"] } }, "policies": {}, @@ -1852,12 +1681,8 @@ "name": "section_collapse_state_user_id_user_id_fk", "tableFrom": "section_collapse_state", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1865,12 +1690,8 @@ "name": "section_collapse_state_section_id_section_id_fk", "tableFrom": "section_collapse_state", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1878,10 +1699,7 @@ "compositePrimaryKeys": { "section_collapse_state_user_id_section_id_pk": { "name": "section_collapse_state_user_id_section_id_pk", - "columns": [ - "user_id", - "section_id" - ] + "columns": ["user_id", "section_id"] } }, "uniqueConstraints": {}, @@ -1942,12 +1760,8 @@ "name": "section_layout_section_id_section_id_fk", "tableFrom": "section_layout", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1955,12 +1769,8 @@ "name": "section_layout_layout_id_layout_id_fk", "tableFrom": "section_layout", "tableTo": "layout", - "columnsFrom": [ - "layout_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["layout_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1968,12 +1778,8 @@ "name": "section_layout_parent_section_id_section_id_fk", "tableFrom": "section_layout", "tableTo": "section", - "columnsFrom": [ - "parent_section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["parent_section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1981,10 +1787,7 @@ "compositePrimaryKeys": { "section_layout_section_id_layout_id_pk": { "name": "section_layout_section_id_layout_id_pk", - "columns": [ - "section_id", - "layout_id" - ] + "columns": ["section_id", "layout_id"] } }, "uniqueConstraints": {}, @@ -2046,12 +1849,8 @@ "name": "section_board_id_board_id_fk", "tableFrom": "section", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -2087,9 +1886,7 @@ "serverSetting_settingKey_unique": { "name": "serverSetting_settingKey_unique", "nullsNotDistinct": false, - "columns": [ - "setting_key" - ] + "columns": ["setting_key"] } }, "policies": {}, @@ -2141,12 +1938,8 @@ "name": "session_user_id_user_id_fk", "tableFrom": "session", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -2278,12 +2071,8 @@ "name": "user_home_board_id_board_id_fk", "tableFrom": "user", "tableTo": "board", - "columnsFrom": [ - "home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -2291,12 +2080,8 @@ "name": "user_mobile_home_board_id_board_id_fk", "tableFrom": "user", "tableTo": "board", - "columnsFrom": [ - "mobile_home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["mobile_home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -2304,12 +2089,8 @@ "name": "user_default_search_engine_id_search_engine_id_fk", "tableFrom": "user", "tableTo": "search_engine", - "columnsFrom": [ - "default_search_engine_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["default_search_engine_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -2348,10 +2129,7 @@ "compositePrimaryKeys": { "verificationToken_identifier_token_pk": { "name": "verificationToken_identifier_token_pk", - "columns": [ - "identifier", - "token" - ] + "columns": ["identifier", "token"] } }, "uniqueConstraints": {}, @@ -2387,10 +2165,7 @@ "compositePrimaryKeys": { "trusted_certificate_hostname_hostname_thumbprint_pk": { "name": "trusted_certificate_hostname_hostname_thumbprint_pk", - "columns": [ - "hostname", - "thumbprint" - ] + "columns": ["hostname", "thumbprint"] } }, "uniqueConstraints": {}, @@ -2434,22 +2209,15 @@ "tableFrom": "widget_secret", "tableTo": "item", "schemaTo": "public", - "columnsFrom": [ - "item_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["item_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "widget_secret_item_id_kind_pk": { - "columns": [ - "item_id", - "kind" - ], + "columns": ["item_id", "kind"], "name": "widget_secret_item_id_kind_pk" } }, diff --git a/packages/db/migrations/postgresql/meta/_journal.json b/packages/db/migrations/postgresql/meta/_journal.json index 829168b9e..8c8d06fac 100644 --- a/packages/db/migrations/postgresql/meta/_journal.json +++ b/packages/db/migrations/postgresql/meta/_journal.json @@ -66,4 +66,4 @@ "breakpoints": true } ] -} \ No newline at end of file +} diff --git a/packages/db/migrations/sqlite/meta/0038_snapshot.json b/packages/db/migrations/sqlite/meta/0038_snapshot.json index a000c93d9..0535c6bc5 100644 --- a/packages/db/migrations/sqlite/meta/0038_snapshot.json +++ b/packages/db/migrations/sqlite/meta/0038_snapshot.json @@ -88,9 +88,7 @@ "indexes": { "userId_idx": { "name": "userId_idx", - "columns": [ - "user_id" - ], + "columns": ["user_id"], "isUnique": false } }, @@ -99,22 +97,15 @@ "name": "account_user_id_user_id_fk", "tableFrom": "account", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "account_provider_provider_account_id_pk": { - "columns": [ - "provider", - "provider_account_id" - ], + "columns": ["provider", "provider_account_id"], "name": "account_provider_provider_account_id_pk" } }, @@ -152,12 +143,8 @@ "name": "apiKey_user_id_user_id_fk", "tableFrom": "apiKey", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -249,12 +236,8 @@ "name": "boardGroupPermission_board_id_board_id_fk", "tableFrom": "boardGroupPermission", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -262,23 +245,15 @@ "name": "boardGroupPermission_group_id_group_id_fk", "tableFrom": "boardGroupPermission", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "boardGroupPermission_board_id_group_id_permission_pk": { - "columns": [ - "board_id", - "group_id", - "permission" - ], + "columns": ["board_id", "group_id", "permission"], "name": "boardGroupPermission_board_id_group_id_permission_pk" } }, @@ -316,12 +291,8 @@ "name": "boardUserPermission_board_id_board_id_fk", "tableFrom": "boardUserPermission", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -329,23 +300,15 @@ "name": "boardUserPermission_user_id_user_id_fk", "tableFrom": "boardUserPermission", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "boardUserPermission_board_id_user_id_permission_pk": { - "columns": [ - "board_id", - "user_id", - "permission" - ], + "columns": ["board_id", "user_id", "permission"], "name": "boardUserPermission_board_id_user_id_permission_pk" } }, @@ -501,9 +464,7 @@ "indexes": { "board_name_unique": { "name": "board_name_unique", - "columns": [ - "name" - ], + "columns": ["name"], "isUnique": true } }, @@ -512,12 +473,8 @@ "name": "board_creator_id_user_id_fk", "tableFrom": "board", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -679,12 +636,8 @@ "name": "custom_widget_definition_creator_id_user_id_fk", "tableFrom": "custom_widget_definition", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -731,22 +684,15 @@ "name": "custom_widget_secret_definition_id_custom_widget_definition_id_fk", "tableFrom": "custom_widget_secret", "tableTo": "custom_widget_definition", - "columnsFrom": [ - "definition_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["definition_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "custom_widget_secret_definition_id_kind_pk": { - "columns": [ - "definition_id", - "kind" - ], + "columns": ["definition_id", "kind"], "name": "custom_widget_secret_definition_id_kind_pk" } }, @@ -777,12 +723,8 @@ "name": "groupMember_group_id_group_id_fk", "tableFrom": "groupMember", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -790,22 +732,15 @@ "name": "groupMember_user_id_user_id_fk", "tableFrom": "groupMember", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "groupMember_group_id_user_id_pk": { - "columns": [ - "group_id", - "user_id" - ], + "columns": ["group_id", "user_id"], "name": "groupMember_group_id_user_id_pk" } }, @@ -836,12 +771,8 @@ "name": "groupPermission_group_id_group_id_fk", "tableFrom": "groupPermission", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -899,9 +830,7 @@ "indexes": { "group_name_unique": { "name": "group_name_unique", - "columns": [ - "name" - ], + "columns": ["name"], "isUnique": true } }, @@ -910,12 +839,8 @@ "name": "group_owner_id_user_id_fk", "tableFrom": "group", "tableTo": "user", - "columnsFrom": [ - "owner_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["owner_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -923,12 +848,8 @@ "name": "group_home_board_id_board_id_fk", "tableFrom": "group", "tableTo": "board", - "columnsFrom": [ - "home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -936,12 +857,8 @@ "name": "group_mobile_home_board_id_board_id_fk", "tableFrom": "group", "tableTo": "board", - "columnsFrom": [ - "mobile_home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["mobile_home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -1019,12 +936,8 @@ "name": "icon_icon_repository_id_iconRepository_id_fk", "tableFrom": "icon", "tableTo": "iconRepository", - "columnsFrom": [ - "icon_repository_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["icon_repository_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1064,12 +977,8 @@ "name": "integrationGroupPermissions_integration_id_integration_id_fk", "tableFrom": "integrationGroupPermissions", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1077,23 +986,15 @@ "name": "integrationGroupPermissions_group_id_group_id_fk", "tableFrom": "integrationGroupPermissions", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "integrationGroupPermissions_integration_id_group_id_permission_pk": { - "columns": [ - "integration_id", - "group_id", - "permission" - ], + "columns": ["integration_id", "group_id", "permission"], "name": "integrationGroupPermissions_integration_id_group_id_permission_pk" } }, @@ -1124,12 +1025,8 @@ "name": "integration_item_item_id_item_id_fk", "tableFrom": "integration_item", "tableTo": "item", - "columnsFrom": [ - "item_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["item_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1137,22 +1034,15 @@ "name": "integration_item_integration_id_integration_id_fk", "tableFrom": "integration_item", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "integration_item_item_id_integration_id_pk": { - "columns": [ - "item_id", - "integration_id" - ], + "columns": ["item_id", "integration_id"], "name": "integration_item_item_id_integration_id_pk" } }, @@ -1194,16 +1084,12 @@ "indexes": { "integration_secret__kind_idx": { "name": "integration_secret__kind_idx", - "columns": [ - "kind" - ], + "columns": ["kind"], "isUnique": false }, "integration_secret__updated_at_idx": { "name": "integration_secret__updated_at_idx", - "columns": [ - "updated_at" - ], + "columns": ["updated_at"], "isUnique": false } }, @@ -1212,22 +1098,15 @@ "name": "integrationSecret_integration_id_integration_id_fk", "tableFrom": "integrationSecret", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "integrationSecret_integration_id_kind_pk": { - "columns": [ - "integration_id", - "kind" - ], + "columns": ["integration_id", "kind"], "name": "integrationSecret_integration_id_kind_pk" } }, @@ -1265,12 +1144,8 @@ "name": "integrationUserPermission_integration_id_integration_id_fk", "tableFrom": "integrationUserPermission", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1278,23 +1153,15 @@ "name": "integrationUserPermission_user_id_user_id_fk", "tableFrom": "integrationUserPermission", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "integrationUserPermission_integration_id_user_id_permission_pk": { - "columns": [ - "integration_id", - "user_id", - "permission" - ], + "columns": ["integration_id", "user_id", "permission"], "name": "integrationUserPermission_integration_id_user_id_permission_pk" } }, @@ -1343,9 +1210,7 @@ "indexes": { "integration__kind_idx": { "name": "integration__kind_idx", - "columns": [ - "kind" - ], + "columns": ["kind"], "isUnique": false } }, @@ -1354,12 +1219,8 @@ "name": "integration_app_id_app_id_fk", "tableFrom": "integration", "tableTo": "app", - "columnsFrom": [ - "app_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["app_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -1403,9 +1264,7 @@ "indexes": { "invite_token_unique": { "name": "invite_token_unique", - "columns": [ - "token" - ], + "columns": ["token"], "isUnique": true } }, @@ -1414,12 +1273,8 @@ "name": "invite_creator_id_user_id_fk", "tableFrom": "invite", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1487,12 +1342,8 @@ "name": "item_layout_item_id_item_id_fk", "tableFrom": "item_layout", "tableTo": "item", - "columnsFrom": [ - "item_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["item_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1500,12 +1351,8 @@ "name": "item_layout_section_id_section_id_fk", "tableFrom": "item_layout", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1513,23 +1360,15 @@ "name": "item_layout_layout_id_layout_id_fk", "tableFrom": "item_layout", "tableTo": "layout", - "columnsFrom": [ - "layout_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["layout_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "item_layout_item_id_section_id_layout_id_pk": { - "columns": [ - "item_id", - "section_id", - "layout_id" - ], + "columns": ["item_id", "section_id", "layout_id"], "name": "item_layout_item_id_section_id_layout_id_pk" } }, @@ -1583,12 +1422,8 @@ "name": "item_board_id_board_id_fk", "tableFrom": "item", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1643,12 +1478,8 @@ "name": "layout_board_id_board_id_fk", "tableFrom": "layout", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1717,12 +1548,8 @@ "name": "media_creator_id_user_id_fk", "tableFrom": "media", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -1826,9 +1653,7 @@ "indexes": { "search_engine_short_unique": { "name": "search_engine_short_unique", - "columns": [ - "short" - ], + "columns": ["short"], "isUnique": true } }, @@ -1837,12 +1662,8 @@ "name": "search_engine_integration_id_integration_id_fk", "tableFrom": "search_engine", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1883,12 +1704,8 @@ "name": "section_collapse_state_user_id_user_id_fk", "tableFrom": "section_collapse_state", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1896,22 +1713,15 @@ "name": "section_collapse_state_section_id_section_id_fk", "tableFrom": "section_collapse_state", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "section_collapse_state_user_id_section_id_pk": { - "columns": [ - "user_id", - "section_id" - ], + "columns": ["user_id", "section_id"], "name": "section_collapse_state_user_id_section_id_pk" } }, @@ -1977,12 +1787,8 @@ "name": "section_layout_section_id_section_id_fk", "tableFrom": "section_layout", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1990,12 +1796,8 @@ "name": "section_layout_layout_id_layout_id_fk", "tableFrom": "section_layout", "tableTo": "layout", - "columnsFrom": [ - "layout_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["layout_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -2003,22 +1805,15 @@ "name": "section_layout_parent_section_id_section_id_fk", "tableFrom": "section_layout", "tableTo": "section", - "columnsFrom": [ - "parent_section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["parent_section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "section_layout_section_id_layout_id_pk": { - "columns": [ - "section_id", - "layout_id" - ], + "columns": ["section_id", "layout_id"], "name": "section_layout_section_id_layout_id_pk" } }, @@ -2085,12 +1880,8 @@ "name": "section_board_id_board_id_fk", "tableFrom": "section", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -2121,9 +1912,7 @@ "indexes": { "serverSetting_settingKey_unique": { "name": "serverSetting_settingKey_unique", - "columns": [ - "setting_key" - ], + "columns": ["setting_key"], "isUnique": true } }, @@ -2160,9 +1949,7 @@ "indexes": { "user_id_idx": { "name": "user_id_idx", - "columns": [ - "user_id" - ], + "columns": ["user_id"], "isUnique": false } }, @@ -2171,12 +1958,8 @@ "name": "session_user_id_user_id_fk", "tableFrom": "session", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -2214,10 +1997,7 @@ "foreignKeys": {}, "compositePrimaryKeys": { "trusted_certificate_hostname_hostname_thumbprint_pk": { - "columns": [ - "hostname", - "thumbprint" - ], + "columns": ["hostname", "thumbprint"], "name": "trusted_certificate_hostname_hostname_thumbprint_pk" } }, @@ -2361,12 +2141,8 @@ "name": "user_home_board_id_board_id_fk", "tableFrom": "user", "tableTo": "board", - "columnsFrom": [ - "home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -2374,12 +2150,8 @@ "name": "user_mobile_home_board_id_board_id_fk", "tableFrom": "user", "tableTo": "board", - "columnsFrom": [ - "mobile_home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["mobile_home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -2387,12 +2159,8 @@ "name": "user_default_search_engine_id_search_engine_id_fk", "tableFrom": "user", "tableTo": "search_engine", - "columnsFrom": [ - "default_search_engine_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["default_search_engine_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -2430,10 +2198,7 @@ "foreignKeys": {}, "compositePrimaryKeys": { "verificationToken_identifier_token_pk": { - "columns": [ - "identifier", - "token" - ], + "columns": ["identifier", "token"], "name": "verificationToken_identifier_token_pk" } }, @@ -2451,4 +2216,4 @@ "internal": { "indexes": {} } -} \ No newline at end of file +} diff --git a/packages/db/migrations/sqlite/meta/0039_snapshot.json b/packages/db/migrations/sqlite/meta/0039_snapshot.json index 2b5d2cf26..cc4de72de 100644 --- a/packages/db/migrations/sqlite/meta/0039_snapshot.json +++ b/packages/db/migrations/sqlite/meta/0039_snapshot.json @@ -88,9 +88,7 @@ "indexes": { "userId_idx": { "name": "userId_idx", - "columns": [ - "user_id" - ], + "columns": ["user_id"], "isUnique": false } }, @@ -99,22 +97,15 @@ "name": "account_user_id_user_id_fk", "tableFrom": "account", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "account_provider_provider_account_id_pk": { - "columns": [ - "provider", - "provider_account_id" - ], + "columns": ["provider", "provider_account_id"], "name": "account_provider_provider_account_id_pk" } }, @@ -152,12 +143,8 @@ "name": "apiKey_user_id_user_id_fk", "tableFrom": "apiKey", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -249,12 +236,8 @@ "name": "boardGroupPermission_board_id_board_id_fk", "tableFrom": "boardGroupPermission", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -262,23 +245,15 @@ "name": "boardGroupPermission_group_id_group_id_fk", "tableFrom": "boardGroupPermission", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "boardGroupPermission_board_id_group_id_permission_pk": { - "columns": [ - "board_id", - "group_id", - "permission" - ], + "columns": ["board_id", "group_id", "permission"], "name": "boardGroupPermission_board_id_group_id_permission_pk" } }, @@ -316,12 +291,8 @@ "name": "boardUserPermission_board_id_board_id_fk", "tableFrom": "boardUserPermission", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -329,23 +300,15 @@ "name": "boardUserPermission_user_id_user_id_fk", "tableFrom": "boardUserPermission", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "boardUserPermission_board_id_user_id_permission_pk": { - "columns": [ - "board_id", - "user_id", - "permission" - ], + "columns": ["board_id", "user_id", "permission"], "name": "boardUserPermission_board_id_user_id_permission_pk" } }, @@ -501,9 +464,7 @@ "indexes": { "board_name_unique": { "name": "board_name_unique", - "columns": [ - "name" - ], + "columns": ["name"], "isUnique": true } }, @@ -512,12 +473,8 @@ "name": "board_creator_id_user_id_fk", "tableFrom": "board", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -680,12 +637,8 @@ "name": "custom_widget_definition_creator_id_user_id_fk", "tableFrom": "custom_widget_definition", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -732,22 +685,15 @@ "name": "custom_widget_secret_definition_id_custom_widget_definition_id_fk", "tableFrom": "custom_widget_secret", "tableTo": "custom_widget_definition", - "columnsFrom": [ - "definition_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["definition_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "custom_widget_secret_definition_id_kind_pk": { - "columns": [ - "definition_id", - "kind" - ], + "columns": ["definition_id", "kind"], "name": "custom_widget_secret_definition_id_kind_pk" } }, @@ -778,12 +724,8 @@ "name": "groupMember_group_id_group_id_fk", "tableFrom": "groupMember", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -791,22 +733,15 @@ "name": "groupMember_user_id_user_id_fk", "tableFrom": "groupMember", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "groupMember_group_id_user_id_pk": { - "columns": [ - "group_id", - "user_id" - ], + "columns": ["group_id", "user_id"], "name": "groupMember_group_id_user_id_pk" } }, @@ -837,12 +772,8 @@ "name": "groupPermission_group_id_group_id_fk", "tableFrom": "groupPermission", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -900,9 +831,7 @@ "indexes": { "group_name_unique": { "name": "group_name_unique", - "columns": [ - "name" - ], + "columns": ["name"], "isUnique": true } }, @@ -911,12 +840,8 @@ "name": "group_owner_id_user_id_fk", "tableFrom": "group", "tableTo": "user", - "columnsFrom": [ - "owner_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["owner_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -924,12 +849,8 @@ "name": "group_home_board_id_board_id_fk", "tableFrom": "group", "tableTo": "board", - "columnsFrom": [ - "home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -937,12 +858,8 @@ "name": "group_mobile_home_board_id_board_id_fk", "tableFrom": "group", "tableTo": "board", - "columnsFrom": [ - "mobile_home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["mobile_home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -1020,12 +937,8 @@ "name": "icon_icon_repository_id_iconRepository_id_fk", "tableFrom": "icon", "tableTo": "iconRepository", - "columnsFrom": [ - "icon_repository_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["icon_repository_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1065,12 +978,8 @@ "name": "integrationGroupPermissions_integration_id_integration_id_fk", "tableFrom": "integrationGroupPermissions", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1078,23 +987,15 @@ "name": "integrationGroupPermissions_group_id_group_id_fk", "tableFrom": "integrationGroupPermissions", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "integrationGroupPermissions_integration_id_group_id_permission_pk": { - "columns": [ - "integration_id", - "group_id", - "permission" - ], + "columns": ["integration_id", "group_id", "permission"], "name": "integrationGroupPermissions_integration_id_group_id_permission_pk" } }, @@ -1125,12 +1026,8 @@ "name": "integration_item_item_id_item_id_fk", "tableFrom": "integration_item", "tableTo": "item", - "columnsFrom": [ - "item_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["item_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1138,22 +1035,15 @@ "name": "integration_item_integration_id_integration_id_fk", "tableFrom": "integration_item", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "integration_item_item_id_integration_id_pk": { - "columns": [ - "item_id", - "integration_id" - ], + "columns": ["item_id", "integration_id"], "name": "integration_item_item_id_integration_id_pk" } }, @@ -1195,16 +1085,12 @@ "indexes": { "integration_secret__kind_idx": { "name": "integration_secret__kind_idx", - "columns": [ - "kind" - ], + "columns": ["kind"], "isUnique": false }, "integration_secret__updated_at_idx": { "name": "integration_secret__updated_at_idx", - "columns": [ - "updated_at" - ], + "columns": ["updated_at"], "isUnique": false } }, @@ -1213,22 +1099,15 @@ "name": "integrationSecret_integration_id_integration_id_fk", "tableFrom": "integrationSecret", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "integrationSecret_integration_id_kind_pk": { - "columns": [ - "integration_id", - "kind" - ], + "columns": ["integration_id", "kind"], "name": "integrationSecret_integration_id_kind_pk" } }, @@ -1266,12 +1145,8 @@ "name": "integrationUserPermission_integration_id_integration_id_fk", "tableFrom": "integrationUserPermission", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1279,23 +1154,15 @@ "name": "integrationUserPermission_user_id_user_id_fk", "tableFrom": "integrationUserPermission", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "integrationUserPermission_integration_id_user_id_permission_pk": { - "columns": [ - "integration_id", - "user_id", - "permission" - ], + "columns": ["integration_id", "user_id", "permission"], "name": "integrationUserPermission_integration_id_user_id_permission_pk" } }, @@ -1344,9 +1211,7 @@ "indexes": { "integration__kind_idx": { "name": "integration__kind_idx", - "columns": [ - "kind" - ], + "columns": ["kind"], "isUnique": false } }, @@ -1355,12 +1220,8 @@ "name": "integration_app_id_app_id_fk", "tableFrom": "integration", "tableTo": "app", - "columnsFrom": [ - "app_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["app_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -1404,9 +1265,7 @@ "indexes": { "invite_token_unique": { "name": "invite_token_unique", - "columns": [ - "token" - ], + "columns": ["token"], "isUnique": true } }, @@ -1415,12 +1274,8 @@ "name": "invite_creator_id_user_id_fk", "tableFrom": "invite", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1488,12 +1343,8 @@ "name": "item_layout_item_id_item_id_fk", "tableFrom": "item_layout", "tableTo": "item", - "columnsFrom": [ - "item_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["item_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1501,12 +1352,8 @@ "name": "item_layout_section_id_section_id_fk", "tableFrom": "item_layout", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1514,23 +1361,15 @@ "name": "item_layout_layout_id_layout_id_fk", "tableFrom": "item_layout", "tableTo": "layout", - "columnsFrom": [ - "layout_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["layout_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "item_layout_item_id_section_id_layout_id_pk": { - "columns": [ - "item_id", - "section_id", - "layout_id" - ], + "columns": ["item_id", "section_id", "layout_id"], "name": "item_layout_item_id_section_id_layout_id_pk" } }, @@ -1584,12 +1423,8 @@ "name": "item_board_id_board_id_fk", "tableFrom": "item", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1644,12 +1479,8 @@ "name": "layout_board_id_board_id_fk", "tableFrom": "layout", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1718,12 +1549,8 @@ "name": "media_creator_id_user_id_fk", "tableFrom": "media", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -1827,9 +1654,7 @@ "indexes": { "search_engine_short_unique": { "name": "search_engine_short_unique", - "columns": [ - "short" - ], + "columns": ["short"], "isUnique": true } }, @@ -1838,12 +1663,8 @@ "name": "search_engine_integration_id_integration_id_fk", "tableFrom": "search_engine", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1884,12 +1705,8 @@ "name": "section_collapse_state_user_id_user_id_fk", "tableFrom": "section_collapse_state", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1897,22 +1714,15 @@ "name": "section_collapse_state_section_id_section_id_fk", "tableFrom": "section_collapse_state", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "section_collapse_state_user_id_section_id_pk": { - "columns": [ - "user_id", - "section_id" - ], + "columns": ["user_id", "section_id"], "name": "section_collapse_state_user_id_section_id_pk" } }, @@ -1978,12 +1788,8 @@ "name": "section_layout_section_id_section_id_fk", "tableFrom": "section_layout", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1991,12 +1797,8 @@ "name": "section_layout_layout_id_layout_id_fk", "tableFrom": "section_layout", "tableTo": "layout", - "columnsFrom": [ - "layout_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["layout_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -2004,22 +1806,15 @@ "name": "section_layout_parent_section_id_section_id_fk", "tableFrom": "section_layout", "tableTo": "section", - "columnsFrom": [ - "parent_section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["parent_section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "section_layout_section_id_layout_id_pk": { - "columns": [ - "section_id", - "layout_id" - ], + "columns": ["section_id", "layout_id"], "name": "section_layout_section_id_layout_id_pk" } }, @@ -2086,12 +1881,8 @@ "name": "section_board_id_board_id_fk", "tableFrom": "section", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -2122,9 +1913,7 @@ "indexes": { "serverSetting_settingKey_unique": { "name": "serverSetting_settingKey_unique", - "columns": [ - "setting_key" - ], + "columns": ["setting_key"], "isUnique": true } }, @@ -2161,9 +1950,7 @@ "indexes": { "user_id_idx": { "name": "user_id_idx", - "columns": [ - "user_id" - ], + "columns": ["user_id"], "isUnique": false } }, @@ -2172,12 +1959,8 @@ "name": "session_user_id_user_id_fk", "tableFrom": "session", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -2215,10 +1998,7 @@ "foreignKeys": {}, "compositePrimaryKeys": { "trusted_certificate_hostname_hostname_thumbprint_pk": { - "columns": [ - "hostname", - "thumbprint" - ], + "columns": ["hostname", "thumbprint"], "name": "trusted_certificate_hostname_hostname_thumbprint_pk" } }, @@ -2362,12 +2142,8 @@ "name": "user_home_board_id_board_id_fk", "tableFrom": "user", "tableTo": "board", - "columnsFrom": [ - "home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -2375,12 +2151,8 @@ "name": "user_mobile_home_board_id_board_id_fk", "tableFrom": "user", "tableTo": "board", - "columnsFrom": [ - "mobile_home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["mobile_home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -2388,12 +2160,8 @@ "name": "user_default_search_engine_id_search_engine_id_fk", "tableFrom": "user", "tableTo": "search_engine", - "columnsFrom": [ - "default_search_engine_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["default_search_engine_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -2431,10 +2199,7 @@ "foreignKeys": {}, "compositePrimaryKeys": { "verificationToken_identifier_token_pk": { - "columns": [ - "identifier", - "token" - ], + "columns": ["identifier", "token"], "name": "verificationToken_identifier_token_pk" } }, diff --git a/packages/db/migrations/sqlite/meta/0040_snapshot.json b/packages/db/migrations/sqlite/meta/0040_snapshot.json index 9f0bc677e..b7da34135 100644 --- a/packages/db/migrations/sqlite/meta/0040_snapshot.json +++ b/packages/db/migrations/sqlite/meta/0040_snapshot.json @@ -88,9 +88,7 @@ "indexes": { "userId_idx": { "name": "userId_idx", - "columns": [ - "user_id" - ], + "columns": ["user_id"], "isUnique": false } }, @@ -99,22 +97,15 @@ "name": "account_user_id_user_id_fk", "tableFrom": "account", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "account_provider_provider_account_id_pk": { - "columns": [ - "provider", - "provider_account_id" - ], + "columns": ["provider", "provider_account_id"], "name": "account_provider_provider_account_id_pk" } }, @@ -152,12 +143,8 @@ "name": "apiKey_user_id_user_id_fk", "tableFrom": "apiKey", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -249,12 +236,8 @@ "name": "boardGroupPermission_board_id_board_id_fk", "tableFrom": "boardGroupPermission", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -262,23 +245,15 @@ "name": "boardGroupPermission_group_id_group_id_fk", "tableFrom": "boardGroupPermission", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "boardGroupPermission_board_id_group_id_permission_pk": { - "columns": [ - "board_id", - "group_id", - "permission" - ], + "columns": ["board_id", "group_id", "permission"], "name": "boardGroupPermission_board_id_group_id_permission_pk" } }, @@ -316,12 +291,8 @@ "name": "boardUserPermission_board_id_board_id_fk", "tableFrom": "boardUserPermission", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -329,23 +300,15 @@ "name": "boardUserPermission_user_id_user_id_fk", "tableFrom": "boardUserPermission", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "boardUserPermission_board_id_user_id_permission_pk": { - "columns": [ - "board_id", - "user_id", - "permission" - ], + "columns": ["board_id", "user_id", "permission"], "name": "boardUserPermission_board_id_user_id_permission_pk" } }, @@ -501,9 +464,7 @@ "indexes": { "board_name_unique": { "name": "board_name_unique", - "columns": [ - "name" - ], + "columns": ["name"], "isUnique": true } }, @@ -512,12 +473,8 @@ "name": "board_creator_id_user_id_fk", "tableFrom": "board", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -680,12 +637,8 @@ "name": "custom_widget_definition_creator_id_user_id_fk", "tableFrom": "custom_widget_definition", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -732,22 +685,15 @@ "name": "custom_widget_secret_definition_id_custom_widget_definition_id_fk", "tableFrom": "custom_widget_secret", "tableTo": "custom_widget_definition", - "columnsFrom": [ - "definition_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["definition_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "custom_widget_secret_definition_id_kind_pk": { - "columns": [ - "definition_id", - "kind" - ], + "columns": ["definition_id", "kind"], "name": "custom_widget_secret_definition_id_kind_pk" } }, @@ -778,12 +724,8 @@ "name": "groupMember_group_id_group_id_fk", "tableFrom": "groupMember", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -791,22 +733,15 @@ "name": "groupMember_user_id_user_id_fk", "tableFrom": "groupMember", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "groupMember_group_id_user_id_pk": { - "columns": [ - "group_id", - "user_id" - ], + "columns": ["group_id", "user_id"], "name": "groupMember_group_id_user_id_pk" } }, @@ -837,12 +772,8 @@ "name": "groupPermission_group_id_group_id_fk", "tableFrom": "groupPermission", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -900,9 +831,7 @@ "indexes": { "group_name_unique": { "name": "group_name_unique", - "columns": [ - "name" - ], + "columns": ["name"], "isUnique": true } }, @@ -911,12 +840,8 @@ "name": "group_owner_id_user_id_fk", "tableFrom": "group", "tableTo": "user", - "columnsFrom": [ - "owner_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["owner_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -924,12 +849,8 @@ "name": "group_home_board_id_board_id_fk", "tableFrom": "group", "tableTo": "board", - "columnsFrom": [ - "home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -937,12 +858,8 @@ "name": "group_mobile_home_board_id_board_id_fk", "tableFrom": "group", "tableTo": "board", - "columnsFrom": [ - "mobile_home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["mobile_home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -1020,12 +937,8 @@ "name": "icon_icon_repository_id_iconRepository_id_fk", "tableFrom": "icon", "tableTo": "iconRepository", - "columnsFrom": [ - "icon_repository_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["icon_repository_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1065,12 +978,8 @@ "name": "integrationGroupPermissions_integration_id_integration_id_fk", "tableFrom": "integrationGroupPermissions", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1078,23 +987,15 @@ "name": "integrationGroupPermissions_group_id_group_id_fk", "tableFrom": "integrationGroupPermissions", "tableTo": "group", - "columnsFrom": [ - "group_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["group_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "integrationGroupPermissions_integration_id_group_id_permission_pk": { - "columns": [ - "integration_id", - "group_id", - "permission" - ], + "columns": ["integration_id", "group_id", "permission"], "name": "integrationGroupPermissions_integration_id_group_id_permission_pk" } }, @@ -1125,12 +1026,8 @@ "name": "integration_item_item_id_item_id_fk", "tableFrom": "integration_item", "tableTo": "item", - "columnsFrom": [ - "item_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["item_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1138,22 +1035,15 @@ "name": "integration_item_integration_id_integration_id_fk", "tableFrom": "integration_item", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "integration_item_item_id_integration_id_pk": { - "columns": [ - "item_id", - "integration_id" - ], + "columns": ["item_id", "integration_id"], "name": "integration_item_item_id_integration_id_pk" } }, @@ -1195,16 +1085,12 @@ "indexes": { "integration_secret__kind_idx": { "name": "integration_secret__kind_idx", - "columns": [ - "kind" - ], + "columns": ["kind"], "isUnique": false }, "integration_secret__updated_at_idx": { "name": "integration_secret__updated_at_idx", - "columns": [ - "updated_at" - ], + "columns": ["updated_at"], "isUnique": false } }, @@ -1213,22 +1099,15 @@ "name": "integrationSecret_integration_id_integration_id_fk", "tableFrom": "integrationSecret", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "integrationSecret_integration_id_kind_pk": { - "columns": [ - "integration_id", - "kind" - ], + "columns": ["integration_id", "kind"], "name": "integrationSecret_integration_id_kind_pk" } }, @@ -1266,12 +1145,8 @@ "name": "integrationUserPermission_integration_id_integration_id_fk", "tableFrom": "integrationUserPermission", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1279,23 +1154,15 @@ "name": "integrationUserPermission_user_id_user_id_fk", "tableFrom": "integrationUserPermission", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "integrationUserPermission_integration_id_user_id_permission_pk": { - "columns": [ - "integration_id", - "user_id", - "permission" - ], + "columns": ["integration_id", "user_id", "permission"], "name": "integrationUserPermission_integration_id_user_id_permission_pk" } }, @@ -1344,9 +1211,7 @@ "indexes": { "integration__kind_idx": { "name": "integration__kind_idx", - "columns": [ - "kind" - ], + "columns": ["kind"], "isUnique": false } }, @@ -1355,12 +1220,8 @@ "name": "integration_app_id_app_id_fk", "tableFrom": "integration", "tableTo": "app", - "columnsFrom": [ - "app_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["app_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -1404,9 +1265,7 @@ "indexes": { "invite_token_unique": { "name": "invite_token_unique", - "columns": [ - "token" - ], + "columns": ["token"], "isUnique": true } }, @@ -1415,12 +1274,8 @@ "name": "invite_creator_id_user_id_fk", "tableFrom": "invite", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1488,12 +1343,8 @@ "name": "item_layout_item_id_item_id_fk", "tableFrom": "item_layout", "tableTo": "item", - "columnsFrom": [ - "item_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["item_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1501,12 +1352,8 @@ "name": "item_layout_section_id_section_id_fk", "tableFrom": "item_layout", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1514,23 +1361,15 @@ "name": "item_layout_layout_id_layout_id_fk", "tableFrom": "item_layout", "tableTo": "layout", - "columnsFrom": [ - "layout_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["layout_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "item_layout_item_id_section_id_layout_id_pk": { - "columns": [ - "item_id", - "section_id", - "layout_id" - ], + "columns": ["item_id", "section_id", "layout_id"], "name": "item_layout_item_id_section_id_layout_id_pk" } }, @@ -1584,12 +1423,8 @@ "name": "item_board_id_board_id_fk", "tableFrom": "item", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1644,12 +1479,8 @@ "name": "layout_board_id_board_id_fk", "tableFrom": "layout", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1718,12 +1549,8 @@ "name": "media_creator_id_user_id_fk", "tableFrom": "media", "tableTo": "user", - "columnsFrom": [ - "creator_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["creator_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -1827,9 +1654,7 @@ "indexes": { "search_engine_short_unique": { "name": "search_engine_short_unique", - "columns": [ - "short" - ], + "columns": ["short"], "isUnique": true } }, @@ -1838,12 +1663,8 @@ "name": "search_engine_integration_id_integration_id_fk", "tableFrom": "search_engine", "tableTo": "integration", - "columnsFrom": [ - "integration_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["integration_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -1884,12 +1705,8 @@ "name": "section_collapse_state_user_id_user_id_fk", "tableFrom": "section_collapse_state", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1897,22 +1714,15 @@ "name": "section_collapse_state_section_id_section_id_fk", "tableFrom": "section_collapse_state", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "section_collapse_state_user_id_section_id_pk": { - "columns": [ - "user_id", - "section_id" - ], + "columns": ["user_id", "section_id"], "name": "section_collapse_state_user_id_section_id_pk" } }, @@ -1978,12 +1788,8 @@ "name": "section_layout_section_id_section_id_fk", "tableFrom": "section_layout", "tableTo": "section", - "columnsFrom": [ - "section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -1991,12 +1797,8 @@ "name": "section_layout_layout_id_layout_id_fk", "tableFrom": "section_layout", "tableTo": "layout", - "columnsFrom": [ - "layout_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["layout_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" }, @@ -2004,22 +1806,15 @@ "name": "section_layout_parent_section_id_section_id_fk", "tableFrom": "section_layout", "tableTo": "section", - "columnsFrom": [ - "parent_section_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["parent_section_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "section_layout_section_id_layout_id_pk": { - "columns": [ - "section_id", - "layout_id" - ], + "columns": ["section_id", "layout_id"], "name": "section_layout_section_id_layout_id_pk" } }, @@ -2086,12 +1881,8 @@ "name": "section_board_id_board_id_fk", "tableFrom": "section", "tableTo": "board", - "columnsFrom": [ - "board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["board_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -2122,9 +1913,7 @@ "indexes": { "serverSetting_settingKey_unique": { "name": "serverSetting_settingKey_unique", - "columns": [ - "setting_key" - ], + "columns": ["setting_key"], "isUnique": true } }, @@ -2161,9 +1950,7 @@ "indexes": { "user_id_idx": { "name": "user_id_idx", - "columns": [ - "user_id" - ], + "columns": ["user_id"], "isUnique": false } }, @@ -2172,12 +1959,8 @@ "name": "session_user_id_user_id_fk", "tableFrom": "session", "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -2215,10 +1998,7 @@ "foreignKeys": {}, "compositePrimaryKeys": { "trusted_certificate_hostname_hostname_thumbprint_pk": { - "columns": [ - "hostname", - "thumbprint" - ], + "columns": ["hostname", "thumbprint"], "name": "trusted_certificate_hostname_hostname_thumbprint_pk" } }, @@ -2362,12 +2142,8 @@ "name": "user_home_board_id_board_id_fk", "tableFrom": "user", "tableTo": "board", - "columnsFrom": [ - "home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -2375,12 +2151,8 @@ "name": "user_mobile_home_board_id_board_id_fk", "tableFrom": "user", "tableTo": "board", - "columnsFrom": [ - "mobile_home_board_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["mobile_home_board_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" }, @@ -2388,12 +2160,8 @@ "name": "user_default_search_engine_id_search_engine_id_fk", "tableFrom": "user", "tableTo": "search_engine", - "columnsFrom": [ - "default_search_engine_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["default_search_engine_id"], + "columnsTo": ["id"], "onDelete": "set null", "onUpdate": "no action" } @@ -2431,10 +2199,7 @@ "foreignKeys": {}, "compositePrimaryKeys": { "verificationToken_identifier_token_pk": { - "columns": [ - "identifier", - "token" - ], + "columns": ["identifier", "token"], "name": "verificationToken_identifier_token_pk" } }, @@ -2479,22 +2244,15 @@ "name": "widget_secret_item_id_item_id_fk", "tableFrom": "widget_secret", "tableTo": "item", - "columnsFrom": [ - "item_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["item_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } }, "compositePrimaryKeys": { "widget_secret_item_id_kind_pk": { - "columns": [ - "item_id", - "kind" - ], + "columns": ["item_id", "kind"], "name": "widget_secret_item_id_kind_pk" } }, diff --git a/packages/db/migrations/sqlite/meta/_journal.json b/packages/db/migrations/sqlite/meta/_journal.json index a99a995ce..c77064e6e 100644 --- a/packages/db/migrations/sqlite/meta/_journal.json +++ b/packages/db/migrations/sqlite/meta/_journal.json @@ -290,4 +290,4 @@ "breakpoints": true } ] -} \ No newline at end of file +} diff --git a/packages/widgets/src/filter-storage-volumes.spec.ts b/packages/widgets/src/filter-storage-volumes.spec.ts index 51d84169a..25a459c06 100644 --- a/packages/widgets/src/filter-storage-volumes.spec.ts +++ b/packages/widgets/src/filter-storage-volumes.spec.ts @@ -1,10 +1,6 @@ import { describe, expect, test } from "vitest"; -import { - filterStorageVolumes, - normalizeStorageDeviceName, - toScopedStorageVolumeValue, -} from "./filter-storage-volumes"; +import { filterStorageVolumes, normalizeStorageDeviceName, toScopedStorageVolumeValue } from "./filter-storage-volumes"; import { matchFileSystemAndSmart } from "./health-monitoring/system-health"; describe("normalizeStorageDeviceName", () => { diff --git a/packages/widgets/src/filter-storage-volumes.ts b/packages/widgets/src/filter-storage-volumes.ts index 5e88584be..9c406c65e 100644 --- a/packages/widgets/src/filter-storage-volumes.ts +++ b/packages/widgets/src/filter-storage-volumes.ts @@ -35,11 +35,7 @@ const storageDeviceNamesMatch = (leftDeviceName: string, rightDeviceName: string ); }; -const matchesVisibleStorageVolume = ( - visibleVolume: string, - integrationId: string, - deviceName: string, -): boolean => { +const matchesVisibleStorageVolume = (visibleVolume: string, integrationId: string, deviceName: string): boolean => { const separatorIndex = visibleVolume.indexOf(":"); if (separatorIndex === -1) { return storageDeviceNamesMatch(visibleVolume, deviceName); diff --git a/packages/widgets/src/media-missing/component.tsx b/packages/widgets/src/media-missing/component.tsx index 69c1edf21..f952d057f 100644 --- a/packages/widgets/src/media-missing/component.tsx +++ b/packages/widgets/src/media-missing/component.tsx @@ -1,7 +1,21 @@ "use client"; import type { ReactNode } from "react"; -import { Badge, Box, Center, Group, Image, Paper, RingProgress, ScrollArea, SimpleGrid, Stack, Tabs, Text, ThemeIcon } from "@mantine/core"; +import { + Badge, + Box, + Center, + Group, + Image, + Paper, + RingProgress, + ScrollArea, + SimpleGrid, + Stack, + Tabs, + Text, + ThemeIcon, +} from "@mantine/core"; import { IconDownload, IconMovie, IconQuestionMark, IconVideo } from "@tabler/icons-react"; import { clientApi } from "@homarr/api/client"; @@ -13,7 +27,12 @@ import type { WidgetComponentProps } from "../definition"; import { NoIntegrationDataError } from "../errors/no-data-integration"; import classes from "./component.module.css"; -export default function MediaMissingWidget({ integrationIds, options, width, height }: WidgetComponentProps<"mediaMissing">) { +export default function MediaMissingWidget({ + integrationIds, + options, + width, + height, +}: WidgetComponentProps<"mediaMissing">) { const t = useScopedI18n("widget.mediaMissing"); const pageSize = Number(options.pageSize); const { data } = clientApi.widget.mediaOrganizer.getData.useQuery( @@ -32,12 +51,8 @@ export default function MediaMissingWidget({ integrationIds, options, width, hei ); - const missing = data.flatMap((entry) => - entry.missing.map((item) => ({ item, integrationId: entry.integrationId })), - ); - const queued = data.flatMap((entry) => - entry.queued.map((item) => ({ item, integrationId: entry.integrationId })), - ); + const missing = data.flatMap((entry) => entry.missing.map((item) => ({ item, integrationId: entry.integrationId }))); + const queued = data.flatMap((entry) => entry.queued.map((item) => ({ item, integrationId: entry.integrationId }))); const missingCount = data.reduce((sum, entry) => sum + entry.missingCount, 0); const queuedCount = data.reduce((sum, entry) => sum + entry.queuedCount, 0); @@ -47,10 +62,12 @@ export default function MediaMissingWidget({ integrationIds, options, width, hei const columns = width > 0 ? Math.max(1, Math.min(Math.floor(width / targetCardWidth), 4)) : 1; const density: Density = isThin ? "thin" : width > 0 && width / columns < 180 ? "compact" : "comfortable"; - const tabLabel = (label: string, shown: number, total: number) => - isThin ? total : `${label} (${shown}/${total})`; + const tabLabel = (label: string, shown: number, total: number) => (isThin ? total : `${label} (${shown}/${total})`); - const renderPanel = (entries: { item: MissingMediaItem | QueuedMediaItem; integrationId: string }[], emptyLabel: string) => ( + const renderPanel = ( + entries: { item: MissingMediaItem | QueuedMediaItem; integrationId: string }[], + emptyLabel: string, + ) => ( {entries.length === 0 ? ( @@ -116,7 +133,14 @@ const Poster = ({ src, type, density }: { src?: string | null; type: "movie" | " } return ( - + {type === "movie" ? : } ); @@ -183,8 +207,25 @@ const ProgressRing = ({ percent, density }: { percent: number; density: Density ); }; -const CardShell = ({ item, density, children }: { item: MissingMediaItem | QueuedMediaItem; density: Density; children: ReactNode }) => ( - +const CardShell = ({ + item, + density, + children, +}: { + item: MissingMediaItem | QueuedMediaItem; + density: Density; + children: ReactNode; +}) => ( + {item.imageUrl && ( )} diff --git a/packages/widgets/src/patchmon/index.ts b/packages/widgets/src/patchmon/index.ts index 6f97be83f..884a1f46f 100644 --- a/packages/widgets/src/patchmon/index.ts +++ b/packages/widgets/src/patchmon/index.ts @@ -188,18 +188,42 @@ export const { definition, componentLoader } = createWidgetDefinition("patchmon" useCustomThresholds: { shouldHide: (options) => !options.enableThresholdColors, }, - hostsNeedingUpdatesThresholdMode: { shouldHide: (options) => !options.enableThresholdColors || !options.useCustomThresholds }, - hostsNeedingUpdatesWarningAt: { shouldHide: (options) => !options.enableThresholdColors || !options.useCustomThresholds }, - hostsNeedingUpdatesCriticalAt: { shouldHide: (options) => !options.enableThresholdColors || !options.useCustomThresholds }, - securityUpdatesThresholdMode: { shouldHide: (options) => !options.enableThresholdColors || !options.useCustomThresholds }, - securityUpdatesWarningAt: { shouldHide: (options) => !options.enableThresholdColors || !options.useCustomThresholds }, - securityUpdatesCriticalAt: { shouldHide: (options) => !options.enableThresholdColors || !options.useCustomThresholds }, - hostsWithSecurityUpdatesThresholdMode: { shouldHide: (options) => !options.enableThresholdColors || !options.useCustomThresholds }, - hostsWithSecurityUpdatesWarningAt: { shouldHide: (options) => !options.enableThresholdColors || !options.useCustomThresholds }, - hostsWithSecurityUpdatesCriticalAt: { shouldHide: (options) => !options.enableThresholdColors || !options.useCustomThresholds }, - upToDateHostsThresholdMode: { shouldHide: (options) => !options.enableThresholdColors || !options.useCustomThresholds }, - upToDateHostsWarningAt: { shouldHide: (options) => !options.enableThresholdColors || !options.useCustomThresholds }, - upToDateHostsCriticalAt: { shouldHide: (options) => !options.enableThresholdColors || !options.useCustomThresholds }, + hostsNeedingUpdatesThresholdMode: { + shouldHide: (options) => !options.enableThresholdColors || !options.useCustomThresholds, + }, + hostsNeedingUpdatesWarningAt: { + shouldHide: (options) => !options.enableThresholdColors || !options.useCustomThresholds, + }, + hostsNeedingUpdatesCriticalAt: { + shouldHide: (options) => !options.enableThresholdColors || !options.useCustomThresholds, + }, + securityUpdatesThresholdMode: { + shouldHide: (options) => !options.enableThresholdColors || !options.useCustomThresholds, + }, + securityUpdatesWarningAt: { + shouldHide: (options) => !options.enableThresholdColors || !options.useCustomThresholds, + }, + securityUpdatesCriticalAt: { + shouldHide: (options) => !options.enableThresholdColors || !options.useCustomThresholds, + }, + hostsWithSecurityUpdatesThresholdMode: { + shouldHide: (options) => !options.enableThresholdColors || !options.useCustomThresholds, + }, + hostsWithSecurityUpdatesWarningAt: { + shouldHide: (options) => !options.enableThresholdColors || !options.useCustomThresholds, + }, + hostsWithSecurityUpdatesCriticalAt: { + shouldHide: (options) => !options.enableThresholdColors || !options.useCustomThresholds, + }, + upToDateHostsThresholdMode: { + shouldHide: (options) => !options.enableThresholdColors || !options.useCustomThresholds, + }, + upToDateHostsWarningAt: { + shouldHide: (options) => !options.enableThresholdColors || !options.useCustomThresholds, + }, + upToDateHostsCriticalAt: { + shouldHide: (options) => !options.enableThresholdColors || !options.useCustomThresholds, + }, totalOutdatedPackagesThresholdMode: { shouldHide: (options) => !options.enableThresholdColors || !options.useCustomThresholds || !options.showTotalOutdatedPackages, diff --git a/packages/widgets/src/patchmon/os-distribution-section.tsx b/packages/widgets/src/patchmon/os-distribution-section.tsx index cb21cb203..4cb03447c 100644 --- a/packages/widgets/src/patchmon/os-distribution-section.tsx +++ b/packages/widgets/src/patchmon/os-distribution-section.tsx @@ -9,16 +9,7 @@ import { useScopedI18n } from "@homarr/translation/client"; import classes from "./component.module.css"; -const OS_COLORS = [ - "blue.6", - "orange.6", - "green.6", - "grape.6", - "cyan.6", - "pink.6", - "yellow.6", - "teal.6", -] as const; +const OS_COLORS = ["blue.6", "orange.6", "green.6", "grape.6", "cyan.6", "pink.6", "yellow.6", "teal.6"] as const; interface OsDistributionSectionProps { entries: PatchMonOsDistributionEntry[]; @@ -73,13 +64,7 @@ export function OsDistributionSection({ )}
    - +
    {showLegend && (
    @@ -115,7 +100,12 @@ export function OsDistributionSection({
    {compactEntries.map((entry, i) => (
    - + {formatOsLabel(entry, showOsVersion)} diff --git a/packages/widgets/src/patchmon/stat-colors.ts b/packages/widgets/src/patchmon/stat-colors.ts index 7ecd035ac..1974f73a2 100644 --- a/packages/widgets/src/patchmon/stat-colors.ts +++ b/packages/widgets/src/patchmon/stat-colors.ts @@ -13,11 +13,7 @@ export type PatchMonStatKey = export type ColorablePatchMonStatKey = Extract< PatchMonStatKey, - | "hostsNeedingUpdates" - | "securityUpdates" - | "hostsWithSecurityUpdates" - | "upToDateHosts" - | "totalOutdatedPackages" + "hostsNeedingUpdates" | "securityUpdates" | "hostsWithSecurityUpdates" | "upToDateHosts" | "totalOutdatedPackages" >; export type StatSeverity = "green" | "yellow" | "red" | "neutral"; diff --git a/packages/widgets/src/patchmon/test/stat-colors.spec.ts b/packages/widgets/src/patchmon/test/stat-colors.spec.ts index 12596f499..22d296829 100644 --- a/packages/widgets/src/patchmon/test/stat-colors.spec.ts +++ b/packages/widgets/src/patchmon/test/stat-colors.spec.ts @@ -117,11 +117,16 @@ describe("resolveStatColor options", () => { test("handles zero total hosts for percent-based stats", () => { expect(resolveStatColor("upToDateHosts", 0, { totalHosts: 0 }, defaultOptions)).toBe("green"); expect( - resolveStatColor("hostsNeedingUpdates", 1, { totalHosts: 0 }, { - ...defaultOptions, - useCustomThresholds: true, - hostsNeedingUpdatesThresholdMode: "percent", - }), + resolveStatColor( + "hostsNeedingUpdates", + 1, + { totalHosts: 0 }, + { + ...defaultOptions, + useCustomThresholds: true, + hostsNeedingUpdatesThresholdMode: "percent", + }, + ), ).toBe("red"); }); diff --git a/packages/widgets/src/patchmon/test/threshold-validation.spec.ts b/packages/widgets/src/patchmon/test/threshold-validation.spec.ts index 00dafba3b..008d9746d 100644 --- a/packages/widgets/src/patchmon/test/threshold-validation.spec.ts +++ b/packages/widgets/src/patchmon/test/threshold-validation.spec.ts @@ -23,25 +23,27 @@ const baseOptions = { totalOutdatedPackagesCriticalAt: 50, }; -const optionsSchema = z.object({ - hostsNeedingUpdatesWarningAt: z.number().int().min(0), - hostsNeedingUpdatesCriticalAt: z.number().int().min(0), - securityUpdatesWarningAt: z.number().int().min(0), - securityUpdatesCriticalAt: z.number().int().min(0), - hostsWithSecurityUpdatesWarningAt: z.number().int().min(0), - hostsWithSecurityUpdatesCriticalAt: z.number().int().min(0), - upToDateHostsWarningAt: z.number().int().min(0), - upToDateHostsCriticalAt: z.number().int().min(0), - totalOutdatedPackagesWarningAt: z.number().int().min(0), - totalOutdatedPackagesCriticalAt: z.number().int().min(0), - enableThresholdColors: z.boolean(), - useCustomThresholds: z.boolean(), - hostsNeedingUpdatesThresholdMode: z.enum(["absolute", "percent"]), - securityUpdatesThresholdMode: z.enum(["absolute", "percent"]), - hostsWithSecurityUpdatesThresholdMode: z.enum(["absolute", "percent"]), - upToDateHostsThresholdMode: z.enum(["absolute", "percent"]), - totalOutdatedPackagesThresholdMode: z.enum(["absolute", "percent"]), -}).superRefine(patchmonOptionsSuperRefine); +const optionsSchema = z + .object({ + hostsNeedingUpdatesWarningAt: z.number().int().min(0), + hostsNeedingUpdatesCriticalAt: z.number().int().min(0), + securityUpdatesWarningAt: z.number().int().min(0), + securityUpdatesCriticalAt: z.number().int().min(0), + hostsWithSecurityUpdatesWarningAt: z.number().int().min(0), + hostsWithSecurityUpdatesCriticalAt: z.number().int().min(0), + upToDateHostsWarningAt: z.number().int().min(0), + upToDateHostsCriticalAt: z.number().int().min(0), + totalOutdatedPackagesWarningAt: z.number().int().min(0), + totalOutdatedPackagesCriticalAt: z.number().int().min(0), + enableThresholdColors: z.boolean(), + useCustomThresholds: z.boolean(), + hostsNeedingUpdatesThresholdMode: z.enum(["absolute", "percent"]), + securityUpdatesThresholdMode: z.enum(["absolute", "percent"]), + hostsWithSecurityUpdatesThresholdMode: z.enum(["absolute", "percent"]), + upToDateHostsThresholdMode: z.enum(["absolute", "percent"]), + totalOutdatedPackagesThresholdMode: z.enum(["absolute", "percent"]), + }) + .superRefine(patchmonOptionsSuperRefine); describe("patchmonOptionsSuperRefine", () => { test("accepts percent thresholds within 0-100", () => {