diff --git a/.github/workflows/update-integration-list.yml b/.github/workflows/update-integration-list.yml new file mode 100644 index 000000000..beedfd390 --- /dev/null +++ b/.github/workflows/update-integration-list.yml @@ -0,0 +1,62 @@ +name: Update integration list + +on: + workflow_dispatch: { } + push: + paths: + - packages/definitions/src/integration.ts + branches: + - dev + +permissions: + pull-requests: write + +jobs: + update-readme: + concurrency: + group: update-integration + cancel-in-progress: false + runs-on: ubuntu-latest + steps: + - name: Obtain token + id: obtainToken + uses: tibdex/github-app-token@v2 + with: + private_key: ${{ secrets.HOMARR_UPDATE_CONTRIBUTORS_PRIVATE_KEY }} + app_id: ${{ vars.HOMARR_UPDATE_CONTRIBUTORS_APP_ID }} + - name: Checkout code + uses: actions/checkout@v4 + env: + GITHUB_TOKEN: ${{ steps.obtainToken.outputs.token }} + - name: Setup + uses: ./tooling/github/setup + - run: pnpm run scripts:update-readme-integrations + - name: Commit changes + env: + GITHUB_TOKEN: ${{ steps.obtainToken.outputs.token }} + run: | + git config --global user.email "210161987+homarr-update-contributors[bot]@users.noreply.github.com" + git config --global user.name "Homarr Update Contributors" + git add . + git commit -m "chore: update integrations list readme" + + - name: Create Pull Request + id: create-pull-request + uses: peter-evans/create-pull-request@v7 + with: + token: ${{ steps.obtainToken.outputs.token }} + branch: update-integrations-readme + base: dev + title: "chore: update integrations list readme" + delete-branch: true + body: | + This PR automatically updates the list of integrations of Homarr in the README.md + + - name: Install GitHub CLI + run: sudo apt-get install -y gh + + - name: Enable auto-merge + env: + GITHUB_TOKEN: ${{ steps.obtainToken.outputs.token }} + run: | + gh pr merge ${{steps.create-pull-request.outputs.pull-request-number}} --auto --squash \ No newline at end of file diff --git a/docs/README.md b/docs/README.md index 00dc4fd81..215fa5f9f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,5 +1,4 @@ - -[![Banner](./banner.png)](https://homarr.dev/) +![](img/logo/2340450-2-title.png)

@@ -20,10 +19,6 @@

- - Demo ✨ - - • Install 💻 • @@ -35,8 +30,7 @@

- -[![Features Section](./section-features.png)](https://homarr.dev/) +![](img/headers/features.png) - 🖌️ Highly customizable with an extensive drag and drop grid system - ✨ Integrates seamlessly with your favorite self-hosted applications @@ -53,44 +47,268 @@

-[![Widgets & Integrations Section](./section-widgets-and-integrations.png)](https://homarr.dev/docs/category/widgets) +![](img/headers/integrations.png) -Homarr has a [built-in collection of widgets and integrations](https://homarr.dev/docs/category/integrations), that connect to your applications and enable you to control them directly from the dashboard. + -- 📥 **Torrent clients** - - [Deluge](https://homarr.dev/docs/integrations/torrent#deluge) - - [Transmission](https://homarr.dev/docs/integrations/torrent#transmission) - - [qBittorent](https://homarr.dev/docs/integrations/torrent#qbittorrent-integration) -- 📥 **Usenet clients** - - [SABnzbd](https://homarr.dev/docs/integrations/usenet#sabnzbd) - - [NZBGet](https://homarr.dev/docs/integrations/usenet#nzbget) -- 📺 **Media servers** - - [Plex](https://homarr.dev/docs/integrations/media-server/#plex) - - [Jellyfin](https://homarr.dev/docs/integrations/media-server#jellyfin-and-emby) -- 📚 **Media collection managers** - - [Sonarr](https://homarr.dev/docs/integrations/servarr#sonarr) - - [Radarr](https://homarr.dev/docs/integrations/servarr#radarr) - - [Lidarr](https://homarr.dev/docs/integrations/servarr#lidarr) - - [Readarr](https://homarr.dev/docs/integrations/servarr#readarr) -- 🎞️ **Media request managers** - - [Overseerr](https://homarr.dev/docs/integrations/media-requester) - - [Jellyseerr](https://homarr.dev/docs/integrations/media-requester) -- 🚫 **DNS ad-blockers** - - [Pihole](https://homarr.dev/docs/integrations/dns#pihole) - - [AdGuard Home](https://homarr.dev/docs/integrations/dns#adguard-home) -- 🖥️ **Monitoring** - - [Dash.](https://homarr.dev/docs/integrations/hardware) - - [OpenMediaVault.](https://homarr.dev/docs/integrations/hardware/#openmediavault) - - [Proxmox.](https://homarr.dev/docs/integrations/hardware/#proxmox) -- 🐳 **Container management**: - - [Docker](https://homarr.dev/docs/integrations/containers) +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + AdGuard Home +
+

AdGuard
Home

+
+
+ + Aria2 +
+

Aria2

+
+
+ + Codeberg +
+

Codeberg

+
+
+ + Dash. +
+

Dash.

+
+
+ + Deluge +
+

Deluge

+
+
+ + Docker Hub +
+

Docker
Hub

+
+
+ + Emby +
+

Emby

+
+
+ + Github +
+

Github

+
+
+ + GitHub Container Registry +
+

GitHub
Container
Registry

+
+
+ + Gitlab +
+

Gitlab

+
+
+ + Home Assistant +
+

Home
Assistant

+
+
+ + Jellyfin +
+

Jellyfin

+
+
+ + Jellyseerr +
+

Jellyseerr

+
+
+ + Lidarr +
+

Lidarr

+
+
+ + LinuxServer.io +
+

LinuxServer.io

+
+
+ + Nextcloud +
+

Nextcloud

+
+
+ + NPM +
+

NPM

+
+
+ + ntfy +
+

ntfy

+
+
+ + NZBGet +
+

NZBGet

+
+
+ + OpenMediaVault +
+

OpenMediaVault

+
+
+ + OPNsense +
+

OPNsense

+
+
+ + Overseerr +
+

Overseerr

+
+
+ + Pi-hole +
+

Pi-hole

+
+
+ + Plex +
+

Plex

+
+
+ + Prowlarr +
+

Prowlarr

+
+
+ + Proxmox +
+

Proxmox

+
+
+ + qBittorrent +
+

qBittorrent

+
+
+ + Quay +
+

Quay

+
+
+ + Radarr +
+

Radarr

+
+
+ + Readarr +
+

Readarr

+
+
+ + SABnzbd +
+

SABnzbd

+
+
+ + Sonarr +
+

Sonarr

+
+
+ + Tdarr +
+

Tdarr

+
+
+ + Transmission +
+

Transmission

+
+
+ + Unifi Controller +
+

Unifi
Controller

+
+
+
+ +

-[![Installation Section](./section-installation.png)](https://homarr.dev/docs/category/installation-1) - -Since we are updating Homarr very frequently, we recommend reading our official installation guides: +![](img/headers/installation.png)

@@ -101,12 +319,15 @@ Since we are updating Homarr very frequently, we recommend reading our official

-[![Contribute Section](./section-contribute.png)](https://opencollective.com/homarr) +![](img/headers/contribute.png)
-Homarr is a free to use open source project that is maintained by volunteers and developers from all over the world. We publish under the ``Apache License 2.0`` license which allows commercial usage. We invest multiple hours daily in to providing support, developing Homarr, integrating to third party software and more. We also pay for licensing and server hosting fees. -Please consider to help us cover these costs to enable the future development of Homarr. Thank you! +Homarr is a free-to-use open source project maintained by volunteers and developers from all over the world. +We publish under the `Apache License 2.0` license which allows commercial usage. +We invest multiple hours daily in providing support, developing Homarr, integrating to third party software and more. +We also pay for licensing and server hosting fees. +Please consider helping us cover these costs to enable the future development of Homarr. Thank you!

@@ -117,9 +338,9 @@ Please consider to help us cover these costs to enable the future development of You can also support us by helping with [translating the entire project](https://homarr.dev/docs/community/translations) to as many languages as possible or contributing directly to the code or documentation. Please read our [Contribution Guidelines](/CONTRIBUTING.md). All contributions, regardless of their size or scope, are welcome and highly appreciated! Thank you ❤️ ## Sponsors -Thanks to your generous sponsors we can continue to build Homarr. Check them out for high quality and easy to use development tools. + +Thanks to your generous sponsors, we can continue to build Homarr. Check them out for high-quality and easy-to-use development tools. Feel free to contact us at homarr-labs@proton.me if you wish to become a sponsor. [![Covered by Argos Visual Testing](https://argos-ci.com/badge-large.svg)](https://argos-ci.com?utm_source=%5Bhomarr%5D&utm_campaign=oss) \ [![Supported by PikaPods](https://www.pikapods.com/static/run-button.svg)](https://www.pikapods.com/pods?run=homarr-v1) - diff --git a/docs/banner.png b/docs/banner.png deleted file mode 100644 index 823bb50b1..000000000 Binary files a/docs/banner.png and /dev/null differ diff --git a/docs/img/headers/contribute.png b/docs/img/headers/contribute.png new file mode 100644 index 000000000..aedb22540 Binary files /dev/null and b/docs/img/headers/contribute.png differ diff --git a/docs/img/headers/features.png b/docs/img/headers/features.png new file mode 100644 index 000000000..a275ce946 Binary files /dev/null and b/docs/img/headers/features.png differ diff --git a/docs/img/headers/header.xcf b/docs/img/headers/header.xcf new file mode 100644 index 000000000..22a96ee2e Binary files /dev/null and b/docs/img/headers/header.xcf differ diff --git a/docs/img/headers/installation.png b/docs/img/headers/installation.png new file mode 100644 index 000000000..359cc3bca Binary files /dev/null and b/docs/img/headers/installation.png differ diff --git a/docs/img/headers/integrations.png b/docs/img/headers/integrations.png new file mode 100644 index 000000000..41f0173b2 Binary files /dev/null and b/docs/img/headers/integrations.png differ diff --git a/docs/img/logo/2340450-2-title.png b/docs/img/logo/2340450-2-title.png new file mode 100644 index 000000000..b53b409f4 Binary files /dev/null and b/docs/img/logo/2340450-2-title.png differ diff --git a/docs/img/logo/2340450-2-title.xcf b/docs/img/logo/2340450-2-title.xcf new file mode 100644 index 000000000..e2a413f13 Binary files /dev/null and b/docs/img/logo/2340450-2-title.xcf differ diff --git a/docs/installation-button.png b/docs/installation-button.png deleted file mode 100644 index 991cb9b27..000000000 Binary files a/docs/installation-button.png and /dev/null differ diff --git a/docs/section-contribute.png b/docs/section-contribute.png deleted file mode 100644 index 3700fee95..000000000 Binary files a/docs/section-contribute.png and /dev/null differ diff --git a/docs/section-features.png b/docs/section-features.png deleted file mode 100644 index b1854bf3a..000000000 Binary files a/docs/section-features.png and /dev/null differ diff --git a/docs/section-installation.png b/docs/section-installation.png deleted file mode 100644 index 92fa4474f..000000000 Binary files a/docs/section-installation.png and /dev/null differ diff --git a/docs/section-preview.png b/docs/section-preview.png deleted file mode 100644 index 6e43e043d..000000000 Binary files a/docs/section-preview.png and /dev/null differ diff --git a/docs/section-widgets-and-integrations.png b/docs/section-widgets-and-integrations.png deleted file mode 100644 index 67fcbc9ea..000000000 Binary files a/docs/section-widgets-and-integrations.png and /dev/null differ diff --git a/package.json b/package.json index 21afba2ec..7e78c48cc 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,8 @@ "test:e2e": "cross-env NODE_ENV=development CI=true vitest e2e", "test:ui": "cross-env NODE_ENV=development CI=true vitest --exclude e2e --ui --coverage.enabled", "typecheck": "turbo typecheck", - "with-env": "dotenv -e .env --" + "with-env": "dotenv -e .env --", + "scripts:update-readme-integrations": "tsx ./scripts/update-integration-list.mts" }, "prettier": "@homarr/prettier-config", "devDependencies": { diff --git a/packages/definitions/src/docs/homarr-docs-sitemap.ts b/packages/definitions/src/docs/homarr-docs-sitemap.ts index dcf04306d..7a544dcaf 100644 --- a/packages/definitions/src/docs/homarr-docs-sitemap.ts +++ b/packages/definitions/src/docs/homarr-docs-sitemap.ts @@ -169,6 +169,7 @@ export type HomarrDocumentationPath = | "/docs/integrations/ntfy" | "/docs/integrations/nzbget" | "/docs/integrations/open-media-vault" + | "/docs/integrations/opnsense" | "/docs/integrations/overseerr" | "/docs/integrations/pi-hole" | "/docs/integrations/plex" @@ -201,6 +202,7 @@ export type HomarrDocumentationPath = | "/docs/widgets/dns-hole-summary" | "/docs/widgets/docker-containers" | "/docs/widgets/downloads" + | "/docs/widgets/firewall" | "/docs/widgets/health-monitoring" | "/docs/widgets/iframe" | "/docs/widgets/indexer-manager" diff --git a/packages/definitions/src/integration.ts b/packages/definitions/src/integration.ts index 27480b4ac..bf01de432 100644 --- a/packages/definitions/src/integration.ts +++ b/packages/definitions/src/integration.ts @@ -1,6 +1,8 @@ import { objectKeys } from "@homarr/common"; import type { AtLeastOneOf } from "@homarr/common/types"; +import { createDocumentationLink } from "./docs"; + export const integrationSecretKindObject = { apiKey: { isPublic: false }, username: { isPublic: true }, @@ -20,6 +22,7 @@ interface integrationDefinition { iconUrl: string; secretKinds: AtLeastOneOf; // at least one secret kind set is required category: AtLeastOneOf; + documentationUrl: string | null; defaultUrl?: string; // optional default URL for the integration } @@ -29,156 +32,182 @@ export const integrationDefs = { secretKinds: [["apiKey"]], iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/sabnzbd.svg", category: ["downloadClient", "usenet"], + documentationUrl: createDocumentationLink("/docs/integrations/sabnzbd"), }, nzbGet: { name: "NZBGet", secretKinds: [["username", "password"]], iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/nzbget.svg", category: ["downloadClient", "usenet"], + documentationUrl: createDocumentationLink("/docs/integrations/nzbget"), }, deluge: { name: "Deluge", secretKinds: [["password"]], iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/deluge.svg", category: ["downloadClient", "torrent"], + documentationUrl: createDocumentationLink("/docs/integrations/deluge"), }, transmission: { name: "Transmission", secretKinds: [["username", "password"]], iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/transmission.svg", category: ["downloadClient", "torrent"], + documentationUrl: createDocumentationLink("/docs/integrations/transmission"), }, qBittorrent: { name: "qBittorrent", secretKinds: [["username", "password"]], iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/qbittorrent.svg", category: ["downloadClient", "torrent"], + documentationUrl: createDocumentationLink("/docs/integrations/q-bittorent"), }, aria2: { name: "Aria2", secretKinds: [[], ["apiKey"]], iconUrl: "https://cdn.jsdelivr.net/gh/PapirusDevelopmentTeam/papirus_icons@latest/src/system_downloads_3.svg", category: ["downloadClient", "torrent", "miscellaneous"], + documentationUrl: createDocumentationLink("/docs/integrations/aria2"), }, sonarr: { name: "Sonarr", secretKinds: [["apiKey"]], iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/sonarr.svg", category: ["calendar"], + documentationUrl: createDocumentationLink("/docs/integrations/sonarr"), }, radarr: { name: "Radarr", secretKinds: [["apiKey"]], iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/radarr.svg", category: ["calendar"], + documentationUrl: createDocumentationLink("/docs/integrations/radarr"), }, lidarr: { name: "Lidarr", secretKinds: [["apiKey"]], iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/lidarr.svg", category: ["calendar"], + documentationUrl: createDocumentationLink("/docs/integrations/lidarr"), }, readarr: { name: "Readarr", secretKinds: [["apiKey"]], iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/readarr.svg", category: ["calendar"], + documentationUrl: createDocumentationLink("/docs/integrations/readarr"), }, prowlarr: { name: "Prowlarr", secretKinds: [["apiKey"]], iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/prowlarr.svg", category: ["indexerManager"], + documentationUrl: createDocumentationLink("/docs/integrations/prowlarr"), }, jellyfin: { name: "Jellyfin", secretKinds: [["username", "password"], ["apiKey"]], iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/jellyfin.svg", category: ["mediaService", "mediaRelease"], + documentationUrl: createDocumentationLink("/docs/integrations/jellyfin"), }, emby: { name: "Emby", secretKinds: [["apiKey"]], iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/emby.svg", category: ["mediaService", "mediaRelease"], + documentationUrl: createDocumentationLink("/docs/integrations/emby"), }, plex: { name: "Plex", secretKinds: [["apiKey"]], iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/plex.svg", category: ["mediaService", "mediaRelease"], + documentationUrl: createDocumentationLink("/docs/integrations/plex"), }, jellyseerr: { name: "Jellyseerr", secretKinds: [["apiKey"]], iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/jellyseerr.svg", category: ["mediaSearch", "mediaRequest", "search"], + documentationUrl: createDocumentationLink("/docs/integrations/jellyseerr"), }, overseerr: { name: "Overseerr", secretKinds: [["apiKey"]], iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/overseerr.svg", category: ["mediaSearch", "mediaRequest", "search"], + documentationUrl: createDocumentationLink("/docs/integrations/overseerr"), }, piHole: { name: "Pi-hole", secretKinds: [["apiKey"]], iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/pi-hole.svg", category: ["dnsHole"], + documentationUrl: createDocumentationLink("/docs/integrations/pi-hole"), }, adGuardHome: { name: "AdGuard Home", secretKinds: [["username", "password"]], iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/adguard-home.svg", category: ["dnsHole"], + documentationUrl: createDocumentationLink("/docs/integrations/adguard-home"), }, homeAssistant: { name: "Home Assistant", secretKinds: [["apiKey"]], iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/home-assistant.svg", category: ["smartHomeServer"], + documentationUrl: createDocumentationLink("/docs/integrations/home-assistant"), }, openmediavault: { name: "OpenMediaVault", secretKinds: [["username", "password"]], iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/openmediavault.svg", category: ["healthMonitoring"], + documentationUrl: createDocumentationLink("/docs/integrations/open-media-vault"), }, dashDot: { name: "Dash.", secretKinds: [[]], iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/dashdot.png", category: ["healthMonitoring"], + documentationUrl: createDocumentationLink("/docs/integrations/dash-dot"), }, tdarr: { name: "Tdarr", secretKinds: [[], ["apiKey"]], iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/tdarr.png", category: ["mediaTranscoding"], + documentationUrl: createDocumentationLink("/docs/integrations/tdarr"), }, proxmox: { name: "Proxmox", secretKinds: [["username", "tokenId", "apiKey", "realm"]], iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/proxmox.svg", category: ["healthMonitoring"], + documentationUrl: createDocumentationLink("/docs/integrations/proxmox"), }, nextcloud: { name: "Nextcloud", secretKinds: [["username", "password"]], iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/nextcloud.svg", category: ["calendar"], + documentationUrl: createDocumentationLink("/docs/integrations/nextcloud"), }, unifiController: { name: "Unifi Controller", secretKinds: [["username", "password"]], iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/unifi.png", category: ["networkController"], + documentationUrl: createDocumentationLink("/docs/integrations/unifi-controller"), }, opnsense: { name: "OPNsense", secretKinds: [["opnsenseApiKey", "opnsenseApiSecret"]], iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/opnsense.svg", category: ["firewall"], + documentationUrl: createDocumentationLink("/docs/integrations/opnsense"), }, github: { name: "Github", @@ -186,6 +215,7 @@ export const integrationDefs = { iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/github.svg", category: ["releasesProvider"], defaultUrl: "https://api.github.com", + documentationUrl: createDocumentationLink("/docs/integrations/github"), }, dockerHub: { name: "Docker Hub", @@ -193,6 +223,7 @@ export const integrationDefs = { iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/docker.svg", category: ["releasesProvider"], defaultUrl: "https://hub.docker.com", + documentationUrl: createDocumentationLink("/docs/integrations/docker-hub"), }, gitlab: { name: "Gitlab", @@ -200,6 +231,7 @@ export const integrationDefs = { iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/gitlab.svg", category: ["releasesProvider"], defaultUrl: "https://gitlab.com", + documentationUrl: createDocumentationLink("/docs/integrations/gitlab"), }, npm: { name: "NPM", @@ -207,6 +239,7 @@ export const integrationDefs = { iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/npm.svg", category: ["releasesProvider"], defaultUrl: "https://registry.npmjs.org", + documentationUrl: createDocumentationLink("/docs/integrations/npm"), }, codeberg: { name: "Codeberg", @@ -214,6 +247,7 @@ export const integrationDefs = { iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/codeberg.svg", category: ["releasesProvider"], defaultUrl: "https://codeberg.org", + documentationUrl: createDocumentationLink("/docs/integrations/codeberg"), }, linuxServerIO: { name: "LinuxServer.io", @@ -221,6 +255,7 @@ export const integrationDefs = { iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/linuxserver-io.svg", category: ["releasesProvider"], defaultUrl: "https://api.linuxserver.io", + documentationUrl: createDocumentationLink("/docs/integrations/linux-server-io"), }, gitHubContainerRegistry: { name: "GitHub Container Registry", @@ -228,6 +263,7 @@ export const integrationDefs = { iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/github.svg", category: ["releasesProvider"], defaultUrl: "https://api.github.com", + documentationUrl: createDocumentationLink("/docs/integrations/github"), }, quay: { name: "Quay", @@ -235,12 +271,14 @@ export const integrationDefs = { iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/png/quay.png", category: ["releasesProvider"], defaultUrl: "https://quay.io", + documentationUrl: createDocumentationLink("/docs/integrations/quay"), }, ntfy: { name: "ntfy", secretKinds: [["topic"], ["topic", "apiKey"]], iconUrl: "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons@master/svg/ntfy.svg", category: ["notifications"], + documentationUrl: createDocumentationLink("/docs/integrations/ntfy"), }, // This integration only returns mock data, it is used during development (but can also be used in production by directly going to the create page) mock: { @@ -261,6 +299,7 @@ export const integrationDefs = { "notifications", "smartHomeServer", ], + documentationUrl: null, }, } as const satisfies Record; diff --git a/scripts/update-integration-list.mts b/scripts/update-integration-list.mts new file mode 100644 index 000000000..84aaebad5 --- /dev/null +++ b/scripts/update-integration-list.mts @@ -0,0 +1,70 @@ +import {readFile, writeFile} from 'fs/promises'; +import {integrationDefs} from '../packages/definitions/src/integration'; + +const FILE = 'docs/README.md'; +const MAX_COLUMNS_PER_ROW = 7; + +async function updateIntegrationList() { + // Read current README content + const content = await readFile(FILE, 'utf8'); + + // Define markers + const startMarker = ''; + const endMarker = ''; + + // Find the section to replace + const startIndex = content.indexOf(startMarker); + const endIndex = content.indexOf(endMarker); + + if (startIndex === -1 || endIndex === -1) { + throw new Error('Could not find markers in README.md'); + } + + // Generate the new integration list + const integrations = Object.values(integrationDefs) + .filter(def => def.name !== 'Mock') + .sort((a, b) => a.name.localeCompare(b.name)); + const tableRows: string[] = []; + let currentRow: string[] = []; + + integrations.forEach((integration) => { + currentRow.push(` + + ${integration.name} +
+

${integration.name.replaceAll(' ', '
')}

+
+`); + + if (currentRow.length === MAX_COLUMNS_PER_ROW) { + tableRows.push(`${currentRow.join('\n')}`); + currentRow = []; + } + }); + + // Add remaining items if any + if (currentRow.length > 0) { + tableRows.push(`${currentRow.join('\n')}`); + } + + // Create the new content + const newSection = `${startMarker} + +
+ + +${tableRows.join('\n')} + +
+
+ +${endMarker}`; + + // Replace the old section with the new one + const newContent = content.slice(0, startIndex) + newSection + content.slice(endIndex + endMarker.length); + + // Write the updated content back to the file + await writeFile(FILE, newContent, 'utf8'); +} + +updateIntegrationList().catch(console.error); \ No newline at end of file diff --git a/tooling/github/setup/action.yml b/tooling/github/setup/action.yml index f6b65c552..04c4d30b8 100644 --- a/tooling/github/setup/action.yml +++ b/tooling/github/setup/action.yml @@ -14,4 +14,4 @@ runs: run: pnpm add -g turbo - shell: bash - run: pnpm install + run: pnpm install --frozen-lockfile diff --git a/tsconfig.scripts.json b/tsconfig.scripts.json new file mode 100644 index 000000000..31524ab81 --- /dev/null +++ b/tsconfig.scripts.json @@ -0,0 +1,8 @@ +{ + "extends": "@homarr/tsconfig/base.json", + "compilerOptions": { + "tsBuildInfoFile": "node_modules/.cache/tsbuildinfo.json" + }, + "include": ["scripts"], + "exclude": ["node_modules"] +}