From 95adc9efc464519bbf4190e32cdb931d9f772f78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Ramos?= <47223013+jramsgz@users.noreply.github.com> Date: Thu, 16 May 2024 10:43:36 +0000 Subject: [PATCH] resolve conflicts --- .devcontainer/Dockerfile | 6 + .devcontainer/devcontainer.json | 49 +- .devcontainer/setup.sh | 2 + .github/DISCUSSION_TEMPLATE/support.yml | 49 + .github/FUNDING.yml | 5 +- .github/ISSUE_TEMPLATE/bug_report.yml | 110 +- .github/ISSUE_TEMPLATE/config.yml | 2 +- .github/PULL_REQUEST_TEMPLATE.md | 4 +- .github/dependabot.yml | 6 +- .github/workflows/docs-publish.yml | 6 +- .github/workflows/repo-maintenance.yml | 280 + CONTRIBUTING.md | 22 +- README.md | 4 +- docs/configs/bookmarks.md | 7 +- docs/configs/docker.md | 10 +- docs/configs/services.md | 2 +- docs/configs/settings.md | 32 +- docs/installation/k8s.md | 30 + docs/more/development.md | 13 +- docs/more/troubleshooting.md | 2 +- docs/overrides/main.html | 47 + docs/stylesheets/extra.css | 12 + docs/widgets/info/glances.md | 2 + docs/widgets/info/openmeteo.md | 2 + docs/widgets/info/openweathermap.md | 2 + docs/widgets/info/resources.md | 3 + docs/widgets/info/search.md | 26 +- docs/widgets/info/weather.md | 2 + docs/widgets/services/adguard-home.md | 2 + docs/widgets/services/atsumeru.md | 2 + docs/widgets/services/audiobookshelf.md | 2 + docs/widgets/services/authentik.md | 15 +- docs/widgets/services/autobrr.md | 2 + docs/widgets/services/azuredevops.md | 6 +- docs/widgets/services/bazarr.md | 2 + docs/widgets/services/caddy.md | 2 + docs/widgets/services/calendar.md | 1 + docs/widgets/services/calibre-web.md | 2 + docs/widgets/services/changedetectionio.md | 2 + docs/widgets/services/channelsdvrserver.md | 4 +- docs/widgets/services/cloudflared.md | 2 + docs/widgets/services/coin-market-cap.md | 4 +- docs/widgets/services/crowdsec.md | 19 + docs/widgets/services/customapi.md | 74 +- docs/widgets/services/deluge.md | 2 + docs/widgets/services/diskstation.md | 15 +- docs/widgets/services/downloadstation.md | 2 + docs/widgets/services/emby.md | 5 + docs/widgets/services/esphome.md | 19 + docs/widgets/services/evcc.md | 2 + docs/widgets/services/fileflows.md | 2 + docs/widgets/services/flood.md | 2 + docs/widgets/services/freshrss.md | 2 + docs/widgets/services/gamedig.md | 2 + docs/widgets/services/gatus.md | 12 + docs/widgets/services/ghostfolio.md | 2 + docs/widgets/services/gitea.md | 17 + docs/widgets/services/glances.md | 6 + docs/widgets/services/gluetun.md | 2 + docs/widgets/services/gotify.md | 2 + docs/widgets/services/grafana.md | 2 + docs/widgets/services/hdhomerun.md | 8 +- docs/widgets/services/healthchecks.md | 13 +- docs/widgets/services/homeassistant.md | 4 +- docs/widgets/services/homebox.md | 23 + docs/widgets/services/homebridge.md | 2 + docs/widgets/services/immich.md | 4 + docs/widgets/services/jackett.md | 5 +- docs/widgets/services/jdownloader.md | 2 + docs/widgets/services/jellyfin.md | 5 + docs/widgets/services/jellyseerr.md | 2 + docs/widgets/services/kavita.md | 4 +- docs/widgets/services/komga.md | 2 + docs/widgets/services/kopia.md | 2 + docs/widgets/services/lidarr.md | 2 + docs/widgets/services/mastodon.md | 2 + docs/widgets/services/mealie.md | 2 + docs/widgets/services/medusa.md | 2 + docs/widgets/services/miniflux.md | 2 + docs/widgets/services/moonraker.md | 11 + docs/widgets/services/mylar.md | 2 + docs/widgets/services/navidrome.md | 2 + docs/widgets/services/netalertx.md | 16 + docs/widgets/services/netdata.md | 14 + docs/widgets/services/nextcloud.md | 2 + docs/widgets/services/nextdns.md | 2 + docs/widgets/services/nginx-proxy-manager.md | 2 + docs/widgets/services/nzbget.md | 2 + docs/widgets/services/octoprint.md | 2 + docs/widgets/services/ombi.md | 2 + docs/widgets/services/opendtu.md | 2 + docs/widgets/services/openmediavault.md | 2 + docs/widgets/services/openwrt.md | 60 + docs/widgets/services/opnsense.md | 2 + docs/widgets/services/overseerr.md | 2 + docs/widgets/services/paperlessngx.md | 2 + docs/widgets/services/peanut.md | 4 +- docs/widgets/services/pfsense.md | 13 +- docs/widgets/services/photoprism.md | 2 + docs/widgets/services/pialert.md | 14 - docs/widgets/services/pihole.md | 7 +- docs/widgets/services/plantit.md | 17 + docs/widgets/services/plex-tautulli.md | 5 + docs/widgets/services/plex.md | 2 + docs/widgets/services/portainer.md | 2 + docs/widgets/services/prometheus.md | 4 +- docs/widgets/services/prowlarr.md | 2 + docs/widgets/services/proxmox.md | 2 + docs/widgets/services/proxmoxbackupserver.md | 2 + docs/widgets/services/pterodactyl.md | 4 +- docs/widgets/services/pyload.md | 2 + docs/widgets/services/qbittorrent.md | 2 + docs/widgets/services/qnap.md | 2 + docs/widgets/services/radarr.md | 2 + docs/widgets/services/readarr.md | 2 + docs/widgets/services/romm.md | 14 + docs/widgets/services/rutorrent.md | 2 + docs/widgets/services/sabnzbd.md | 2 + docs/widgets/services/scrutiny.md | 2 + docs/widgets/services/sonarr.md | 2 + docs/widgets/services/speedtest-tracker.md | 4 + docs/widgets/services/stash.md | 20 + .../services/syncthing-relay-server.md | 2 + docs/widgets/services/tailscale.md | 2 + docs/widgets/services/tandoor.md | 15 + docs/widgets/services/tdarr.md | 2 + docs/widgets/services/traefik.md | 2 + docs/widgets/services/transmission.md | 2 + docs/widgets/services/truenas.md | 8 + docs/widgets/services/tubearchivist.md | 2 + docs/widgets/services/unifi-controller.md | 6 +- docs/widgets/services/unmanic.md | 2 + docs/widgets/services/uptime-kuma.md | 4 +- docs/widgets/services/uptimerobot.md | 2 + docs/widgets/services/urbackup.md | 2 + docs/widgets/services/watchtower.md | 2 + docs/widgets/services/whatsupdocker.md | 8 +- docs/widgets/services/xteve.md | 2 + mkdocs.yml | 14 +- next-i18next.config.js | 14 + package-lock.json | 2997 ++++--- package.json | 62 +- pnpm-lock.yaml | 7084 ++++++++++------- public/locales/af/common.json | 94 +- public/locales/ar/common.json | 100 +- public/locales/bg/common.json | 98 +- public/locales/ca/common.json | 554 +- public/locales/cs/common.json | 146 +- public/locales/da/common.json | 120 +- public/locales/de/common.json | 110 +- public/locales/el/common.json | 274 +- public/locales/en/common.json | 92 +- public/locales/eo/common.json | 92 +- public/locales/es/common.json | 298 +- public/locales/eu/common.json | 92 +- public/locales/fi/common.json | 92 +- public/locales/fr/common.json | 142 +- public/locales/he/common.json | 92 +- public/locales/hi/common.json | 102 +- public/locales/hr/common.json | 316 +- public/locales/hu/common.json | 212 +- public/locales/id/common.json | 1010 +-- public/locales/it/common.json | 118 +- public/locales/ja/common.json | 176 +- public/locales/ko/common.json | 92 +- public/locales/lv/common.json | 92 +- public/locales/ms/common.json | 444 +- public/locales/nl/common.json | 92 +- public/locales/no/common.json | 986 +-- public/locales/pl/common.json | 234 +- public/locales/pt/common.json | 158 +- public/locales/pt_BR/common.json | 336 +- public/locales/ro/common.json | 92 +- public/locales/ru/common.json | 128 +- public/locales/sk/common.json | 112 +- public/locales/sl/common.json | 100 +- public/locales/sr/common.json | 92 +- public/locales/sv/common.json | 100 +- public/locales/te/common.json | 92 +- public/locales/th/common.json | 92 +- public/locales/tr/common.json | 480 +- public/locales/uk/common.json | 100 +- public/locales/vi/common.json | 92 +- public/locales/yue/common.json | 128 +- public/locales/zh-Hans/common.json | 148 +- public/locales/zh-Hant/common.json | 150 +- requirements.txt | 4 +- src/components/bookmarks/group.jsx | 11 +- src/components/filecontent.jsx | 10 - src/components/quicklaunch.jsx | 82 +- src/components/services/group.jsx | 18 +- src/components/services/item.jsx | 6 +- src/components/services/list.jsx | 2 +- src/components/services/site-monitor.jsx | 2 +- src/components/services/status.jsx | 33 +- src/components/tab.jsx | 20 +- src/components/widgets/datetime/datetime.jsx | 1 + src/components/widgets/glances/glances.jsx | 5 +- .../widgets/openmeteo/openmeteo.jsx | 3 +- .../widgets/openweathermap/weather.jsx | 2 +- src/components/widgets/resources/cputemp.jsx | 11 +- src/components/widgets/resources/disk.jsx | 7 +- .../widgets/resources/resources.jsx | 12 +- .../widgets/resources/usage-bar.jsx | 3 +- src/components/widgets/search/search.jsx | 259 +- src/components/widgets/weather/weather.jsx | 1 + src/components/widgets/widget/container.jsx | 4 +- .../widgets/widget/container_form.jsx | 6 +- .../widgets/widget/container_link.jsx | 2 +- src/pages/api/config/[path].js | 2 +- src/pages/api/docker/stats/[...service].js | 2 +- src/pages/api/docker/status/[...service].js | 2 +- .../api/kubernetes/stats/[...service].js | 2 +- .../api/kubernetes/status/[...service].js | 2 +- src/pages/api/search/searchSuggestion.js | 23 + src/pages/api/services/proxy.js | 4 +- src/pages/api/widgets/glances.js | 5 +- src/pages/api/widgets/kubernetes.js | 2 +- src/pages/index.jsx | 60 +- src/styles/globals.css | 4 + src/utils/config/service-helpers.js | 68 +- src/utils/logger.js | 121 +- src/utils/proxy/api-helpers.js | 2 +- src/utils/proxy/cached-fetch.js | 11 +- src/utils/proxy/handlers/credentialed.js | 10 +- src/utils/proxy/handlers/generic.js | 6 + src/utils/proxy/http.js | 14 +- src/widgets/audiobookshelf/proxy.js | 2 +- src/widgets/calendar/agenda.jsx | 4 +- src/widgets/calendar/component.jsx | 5 +- src/widgets/calendar/event.jsx | 1 + src/widgets/calendar/integrations/ical.jsx | 47 +- src/widgets/calendar/monthly.jsx | 19 +- src/widgets/components.js | 14 +- src/widgets/crowdsec/component.jsx | 34 + src/widgets/crowdsec/proxy.js | 86 + src/widgets/crowdsec/widget.js | 18 + src/widgets/customapi/component.jsx | 131 +- src/widgets/emby/component.jsx | 91 +- src/widgets/esphome/component.jsx | 44 + src/widgets/esphome/widget.js | 8 + src/widgets/gamedig/proxy.js | 2 +- src/widgets/gatus/component.jsx | 51 + src/widgets/gatus/widget.js | 15 + src/widgets/gitea/component.jsx | 32 + src/widgets/gitea/widget.js | 22 + src/widgets/glances/metrics/cpu.jsx | 21 +- src/widgets/glances/metrics/disk.jsx | 4 +- src/widgets/glances/metrics/fs.jsx | 13 +- src/widgets/glances/metrics/gpu.jsx | 4 +- src/widgets/glances/metrics/info.jsx | 13 +- src/widgets/glances/metrics/memory.jsx | 4 +- src/widgets/glances/metrics/net.jsx | 17 +- src/widgets/glances/metrics/process.jsx | 10 +- src/widgets/glances/metrics/sensor.jsx | 4 +- src/widgets/glances/widget.js | 2 +- src/widgets/hdhomerun/component.jsx | 33 +- src/widgets/hdhomerun/widget.js | 3 + src/widgets/healthchecks/component.jsx | 28 +- src/widgets/healthchecks/widget.js | 3 +- src/widgets/homebox/component.jsx | 58 + src/widgets/homebox/proxy.js | 103 + src/widgets/homebox/widget.js | 7 + src/widgets/homebridge/proxy.js | 2 +- src/widgets/immich/component.jsx | 6 +- src/widgets/jackett/proxy.js | 68 + src/widgets/jackett/widget.js | 5 +- src/widgets/minecraft/proxy.js | 2 +- src/widgets/moonraker/widget.js | 4 +- src/widgets/netalertx/component.jsx | 37 + src/widgets/{pialert => netalertx}/widget.js | 0 src/widgets/netdata/component.jsx | 33 + src/widgets/netdata/widget.js | 14 + src/widgets/omada/component.jsx | 13 +- src/widgets/openwrt/component.jsx | 9 + src/widgets/openwrt/methods/interface.jsx | 37 + src/widgets/openwrt/methods/system.jsx | 27 + src/widgets/openwrt/proxy.js | 128 + src/widgets/openwrt/widget.js | 8 + src/widgets/pialert/component.jsx | 37 - src/widgets/pihole/component.jsx | 15 +- src/widgets/pihole/proxy.js | 95 + src/widgets/pihole/widget.js | 14 +- src/widgets/plantit/component.jsx | 37 + src/widgets/plantit/widget.js | 21 + src/widgets/pyload/proxy.js | 2 +- src/widgets/romm/component.jsx | 35 + src/widgets/romm/widget.js | 14 + src/widgets/sabnzbd/component.jsx | 2 +- src/widgets/speedtest/component.jsx | 18 +- src/widgets/stash/component.jsx | 62 + src/widgets/stash/widget.js | 40 + src/widgets/tandoor/component.jsx | 32 + src/widgets/tandoor/widget.js | 17 + src/widgets/tautulli/component.jsx | 65 +- src/widgets/truenas/component.jsx | 32 +- src/widgets/truenas/pool.jsx | 41 + src/widgets/truenas/widget.js | 39 +- src/widgets/unifi/component.jsx | 4 + src/widgets/widgets.js | 27 +- 300 files changed, 15919 insertions(+), 7147 deletions(-) create mode 100644 .github/DISCUSSION_TEMPLATE/support.yml create mode 100644 .github/workflows/repo-maintenance.yml create mode 100644 docs/overrides/main.html create mode 100644 docs/widgets/services/crowdsec.md create mode 100644 docs/widgets/services/esphome.md create mode 100644 docs/widgets/services/gatus.md create mode 100644 docs/widgets/services/gitea.md create mode 100644 docs/widgets/services/homebox.md create mode 100644 docs/widgets/services/netalertx.md create mode 100644 docs/widgets/services/netdata.md create mode 100644 docs/widgets/services/openwrt.md delete mode 100644 docs/widgets/services/pialert.md create mode 100644 docs/widgets/services/plantit.md create mode 100644 docs/widgets/services/romm.md create mode 100644 docs/widgets/services/stash.md create mode 100644 docs/widgets/services/tandoor.md delete mode 100644 src/components/filecontent.jsx create mode 100644 src/pages/api/search/searchSuggestion.js create mode 100644 src/widgets/crowdsec/component.jsx create mode 100644 src/widgets/crowdsec/proxy.js create mode 100644 src/widgets/crowdsec/widget.js create mode 100644 src/widgets/esphome/component.jsx create mode 100644 src/widgets/esphome/widget.js create mode 100644 src/widgets/gatus/component.jsx create mode 100644 src/widgets/gatus/widget.js create mode 100644 src/widgets/gitea/component.jsx create mode 100644 src/widgets/gitea/widget.js create mode 100644 src/widgets/homebox/component.jsx create mode 100644 src/widgets/homebox/proxy.js create mode 100644 src/widgets/homebox/widget.js create mode 100644 src/widgets/jackett/proxy.js create mode 100644 src/widgets/netalertx/component.jsx rename src/widgets/{pialert => netalertx}/widget.js (100%) create mode 100644 src/widgets/netdata/component.jsx create mode 100644 src/widgets/netdata/widget.js create mode 100644 src/widgets/openwrt/component.jsx create mode 100644 src/widgets/openwrt/methods/interface.jsx create mode 100644 src/widgets/openwrt/methods/system.jsx create mode 100644 src/widgets/openwrt/proxy.js create mode 100644 src/widgets/openwrt/widget.js delete mode 100644 src/widgets/pialert/component.jsx create mode 100644 src/widgets/pihole/proxy.js create mode 100644 src/widgets/plantit/component.jsx create mode 100644 src/widgets/plantit/widget.js create mode 100644 src/widgets/romm/component.jsx create mode 100644 src/widgets/romm/widget.js create mode 100644 src/widgets/stash/component.jsx create mode 100644 src/widgets/stash/widget.js create mode 100644 src/widgets/tandoor/component.jsx create mode 100644 src/widgets/tandoor/widget.js create mode 100644 src/widgets/truenas/pool.jsx diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 9f20426fc70..44bc17593fc 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -3,4 +3,10 @@ FROM mcr.microsoft.com/vscode/devcontainers/javascript-node:${VARIANT} RUN npm install -g pnpm +RUN apt-get update \ + && apt-get -y install --no-install-recommends \ + python3-pip \ + && apt-get clean -y \ + && rm -rf /var/lib/apt/lists/* + ENV PATH="${PATH}:./node_modules/.bin" diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 15d1b9f31be..06e7f6ee199 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,27 +1,26 @@ { - "name": "homepage", - "build": { - "dockerfile": "Dockerfile", - "args": { - "VARIANT": "18-bullseye" - } - }, - "customizations": { - "vscode": { - "extensions": [ - "dbaeumer.vscode-eslint", - "mhutchie.git-graph", - "streetsidesoftware.code-spell-checker", - ], - "settings": { - "eslint.format.enable": true, - "eslint.lintTask.enable": true, - "eslint.packageManager": "pnpm" - } - } - }, - "postCreateCommand": ".devcontainer/setup.sh", - "forwardPorts": [ - 3000 - ] + "name": "homepage", + "build": { + "dockerfile": "Dockerfile", + "args": { + "VARIANT": "18-bullseye", + }, + }, + "customizations": { + "vscode": { + "extensions": [ + "dbaeumer.vscode-eslint", + "mhutchie.git-graph", + "streetsidesoftware.code-spell-checker", + "esbenp.prettier-vscode", + ], + "settings": { + "eslint.format.enable": true, + "eslint.lintTask.enable": true, + "eslint.packageManager": "pnpm", + }, + }, + }, + "postCreateCommand": ".devcontainer/setup.sh", + "forwardPorts": [3000], } diff --git a/.devcontainer/setup.sh b/.devcontainer/setup.sh index 70bf96cfdbb..ea5d2fe9b42 100755 --- a/.devcontainer/setup.sh +++ b/.devcontainer/setup.sh @@ -3,6 +3,8 @@ # Install Node packages pnpm install +python3 -m pip install -r requirements.txt + # Copy in skeleton configuration if there is no existing configuration if [ ! -d "config/" ]; then echo "Adding skeleton config" diff --git a/.github/DISCUSSION_TEMPLATE/support.yml b/.github/DISCUSSION_TEMPLATE/support.yml new file mode 100644 index 00000000000..fd577908072 --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/support.yml @@ -0,0 +1,49 @@ +body: + - type: textarea + id: description + attributes: + label: Description + description: A clear and concise description of the issue or question. If applicable, add screenshots to help explain your problem. + validations: + required: true + - type: input + id: version + attributes: + label: homepage version + placeholder: e.g. v0.4.18 (4ea2798) + validations: + required: true + - type: dropdown + id: install-method + attributes: + label: Installation method + options: + - Docker + - Unraid + - Source + - Other (please describe above) + validations: + required: true + - type: textarea + id: config + attributes: + label: Configuration + description: Please provide any relevant service, widget or otherwise related configuration here + render: yaml + - type: textarea + id: container-logs + attributes: + label: Container Logs + description: Please review and provide any logs from the container, if relevant + - type: textarea + id: browser-logs + attributes: + label: Browser Logs + description: Please review and provide any logs from the browser, if relevant + - type: textarea + id: troubleshooting + attributes: + label: Troubleshooting + description: Please include output from your [troubleshooting tests](https://gethomepage.dev/latest/more/troubleshooting/#service-widget-errors), if relevant. + validations: + required: true diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 3e283d69cd5..683221a4934 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,3 +1,2 @@ -github: benphelps -ko_fi: benphelps -custom: ["https://paypal.me/phelpsben"] +github: [gethomepage, benphelps, shamoon] +open_collective: homepage diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index e9d4ee40597..08eebdf96b4 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,99 +1,33 @@ -name: Bug report -description: Create a report to help us improve -title: "[Bug] Concise description of the issue" -labels: ["bug, unconfirmed"] +name: ๐ Bug report +description: Please only raise an issue if you've been advised to do so in a GitHub discussion. Thanks! ๐ +labels: ["bug"] body: - type: markdown attributes: value: | - ## โ ๏ธ Please remember: issues are for *bugs* - That is, something you believe affects every single homepage user, not just you. Otherwise, start with one of the other options below. - - type: markdown - attributes: - value: | - Have a question? ๐ [Start a new discussion](https://github.com/gethomepage/homepage/discussions/new) or [ask in chat](https://discord.gg/SaPGSzrEZC). - - Before opening an issue, please double check: - - - [The troubleshooting guide](https://gethomepage.dev/latest/more/troubleshooting/). - - [The homepage documentation](https://gethomepage.dev/) - - [Existing issues](https://github.com/gethomepage/homepage/search?q=&type=issues) and [discussions](https://github.com/gethomepage/homepage/search?q=&type=discussions). - - type: textarea - id: description - attributes: - label: Description - description: A clear and concise description of what the bug is. If applicable, add screenshots to help explain your problem. - placeholder: | - Currently homepage does not work when... - - [Screenshot if applicable] - validations: - required: true - - type: textarea - id: reproduction - attributes: - label: Steps to reproduce - description: Steps to reproduce the behavior. - placeholder: | - 1. Go to '...' - 2. Click on '....' - 3. See error - validations: - required: true - - type: input - id: version - attributes: - label: homepage version - placeholder: e.g. v0.4.18 (4ea2798) - validations: - required: true - - type: dropdown - id: install-method + ## โ ๏ธ Please note + The starting point for a bug report should always be a [GitHub discussion](https://github.com/gethomepage/homepage/discussions/new?category=support) + Thank you for contributing to homepage! โ + - type: checkboxes + id: pre-flight attributes: - label: Installation method + label: Before submitting, please confirm the following options: - - Docker - - Unraid - - Source - - Other (please describe above) - validations: - required: true - - type: textarea - id: config - attributes: - label: Configuration - description: Please provide any relevant service, widget or otherwise related configuration here - render: yaml - - type: textarea - id: container-logs - attributes: - label: Container Logs - description: Please review and provide any logs from the container, if relevant - - type: textarea - id: browser-logs - attributes: - label: Browser Logs - description: Please review and provide any logs from the browser, if relevant - - type: textarea - id: troubleshooting + - label: I confirm this was discussed, and the maintainers suggest I open an issue (note that AI bots are not maintainers). + required: true + - label: I am aware that if I create this issue without a discussion, it will be removed without a response. + required: true + - type: input + id: discussion attributes: - label: Troubleshooting - description: Please include output from your [troubleshooting tests](https://gethomepage.dev/latest/more/troubleshooting/#service-widget-errors). If this is a service widget issue and you do not include any information here your issue will be closed. If it is not, indicate e.g. 'n/a' + label: Discussion Link + description: | + Please link to the GitHub discussion that led to this issue. validations: required: true - type: textarea - id: other - attributes: - label: Other - description: Include any other relevant details. E.g. service version or API version, docker version, etc. - - type: checkboxes - id: pre-flight + id: additional attributes: - label: Before submitting, I have made sure to - options: - - label: Check [the documentation](https://gethomepage.dev/) - required: true - - label: Follow [the troubleshooting guide](https://gethomepage.dev/latest/more/troubleshooting/) (please include output above if applicable). - required: true - - label: Search [existing issues](https://github.com/gethomepage/homepage/search?q=&type=issues) and [discussions](https://github.com/gethomepage/homepage/search?q=&type=discussions). - required: true + label: Additional context + description: Optional + render: Text diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index e3f14d07432..22d29ff5e35 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -2,7 +2,7 @@ blank_issues_enabled: false contact_links: - name: ๐ค Questions and Help url: https://github.com/gethomepage/homepage/discussions - about: This issue tracker is for bugs only, not general support questions. Please refer to our Discussions. + about: For support, possible bug reports or general questions. - name: ๐ฌ Chat url: https://discord.gg/k4ruYNrudu about: Want to discuss homepage with others? Check out our chat. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 1cad352abcf..bf4fa38653e 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,12 +1,12 @@ ## Proposed change Closes # (issue) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index c36b6fe8b07..ba1b1fb022f 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,7 +5,11 @@ version: 2 updates: - - package-ecosystem: "github-actions" # Maintain dependencies for GitHub Actions + - package-ecosystem: "github-actions" directory: "/" schedule: interval: "daily" + - package-ecosystem: "npm" + directory: "/" + schedule: + interval: "monthly" diff --git a/.github/workflows/docs-publish.yml b/.github/workflows/docs-publish.yml index 92900e2595c..2793f28ca7a 100644 --- a/.github/workflows/docs-publish.yml +++ b/.github/workflows/docs-publish.yml @@ -32,7 +32,7 @@ jobs: python-version: 3.x - name: Check files - uses: pre-commit/action@v3.0.0 + uses: pre-commit/action@v3.0.1 test: name: Test Build @@ -46,7 +46,7 @@ jobs: with: python-version: 3.x - run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: key: mkdocs-material-${{ env.cache_id }} path: .cache @@ -71,7 +71,7 @@ jobs: with: python-version: 3.x - run: echo "cache_id=${{github.sha}}" >> $GITHUB_ENV - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: key: mkdocs-material-${{ env.cache_id }} path: .cache diff --git a/.github/workflows/repo-maintenance.yml b/.github/workflows/repo-maintenance.yml new file mode 100644 index 00000000000..7cf47c51bb5 --- /dev/null +++ b/.github/workflows/repo-maintenance.yml @@ -0,0 +1,280 @@ +name: 'Repository Maintenance' + +on: + schedule: + - cron: '0 3 * * *' + workflow_dispatch: + +permissions: + issues: write + pull-requests: write + discussions: write + +concurrency: + group: lock + +jobs: + stale: + name: 'Stale' + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v9 + with: + days-before-stale: 7 + days-before-close: 14 + stale-issue-label: stale + stale-pr-label: stale + stale-issue-message: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. See our [contributing guidelines](https://github.com/gethomepage/homepage/blob/main/CONTRIBUTING.md#automatic-respoistory-maintenance) for more details. + lock-threads: + name: 'Lock Old Threads' + runs-on: ubuntu-latest + steps: + - uses: dessant/lock-threads@v5 + with: + issue-inactive-days: '30' + pr-inactive-days: '30' + discussion-inactive-days: '30' + log-output: true + issue-comment: > + This issue has been automatically locked since there + has not been any recent activity after it was closed. + Please open a new discussion for related concerns. + See our [contributing guidelines](https://github.com/gethomepage/homepage/blob/main/CONTRIBUTING.md#automatic-repository-maintenance) for more details. + pr-comment: > + This pull request has been automatically locked since there + has not been any recent activity after it was closed. + Please open a new discussion for related concerns. + See our [contributing guidelines](https://github.com/gethomepage/homepage/blob/main/CONTRIBUTING.md#automatic-repository-maintenance) for more details. + discussion-comment: > + This discussion has been automatically locked since there + has not been any recent activity after it was closed. + Please open a new discussion for related concerns. + See our [contributing guidelines](https://github.com/gethomepage/homepage/blob/main/CONTRIBUTING.md#automatic-repository-maintenance) for more details. + close-answered-discussions: + name: 'Close Answered Discussions' + runs-on: ubuntu-latest + steps: + - uses: actions/github-script@v7 + with: + script: | + function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); + } + + const query = `query($owner:String!, $name:String!) { + repository(owner:$owner, name:$name){ + discussions(first:100, answered:true, states:[OPEN]) { + nodes { + id, + number + } + } + } + }`; + const variables = { + owner: context.repo.owner, + name: context.repo.repo, + } + const result = await github.graphql(query, variables) + + console.log(`Found ${result.repository.discussions.nodes.length} open answered discussions`) + + for (const discussion of result.repository.discussions.nodes) { + console.log(`Closing discussion #${discussion.number} (${discussion.id})`) + + const addCommentMutation = `mutation($discussion:ID!, $body:String!) { + addDiscussionComment(input:{discussionId:$discussion, body:$body}) { + clientMutationId + } + }`; + const commentVariables = { + discussion: discussion.id, + body: 'This discussion has been automatically closed because it was marked as answered. See our [contributing guidelines](https://github.com/gethomepage/homepage/blob/main/CONTRIBUTING.md#automatic-repository-maintenance) for more details.', + } + await github.graphql(addCommentMutation, commentVariables) + + const closeDiscussionMutation = `mutation($discussion:ID!, $reason:DiscussionCloseReason!) { + closeDiscussion(input:{discussionId:$discussion, reason:$reason}) { + clientMutationId + } + }`; + const closeVariables = { + discussion: discussion.id, + reason: "RESOLVED", + } + await github.graphql(closeDiscussionMutation, closeVariables) + + await sleep(1000) + } + close-outdated-discussions: + name: 'Close Outdated Discussions' + runs-on: ubuntu-latest + steps: + - uses: actions/github-script@v7 + with: + script: | + function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); + } + + const CUTOFF_DAYS = 180; + const cutoff = new Date(); + cutoff.setDate(cutoff.getDate() - CUTOFF_DAYS); + + const query = `query( + $owner:String!, + $name:String!, + $supportCategory:ID!, + $generalCategory:ID!, + ) { + supportDiscussions: repository(owner:$owner, name:$name){ + discussions( + categoryId:$supportCategory, + last:50, + answered:false, + states:[OPEN], + ) { + nodes { + id, + number, + updatedAt + } + }, + }, + generalDiscussions: repository(owner:$owner, name:$name){ + discussions( + categoryId:$generalCategory, + last:50, + states:[OPEN], + ) { + nodes { + id, + number, + updatedAt + } + } + } + }`; + const variables = { + owner: context.repo.owner, + name: context.repo.repo, + supportCategory: "DIC_kwDOH31rQM4CRErR", + generalCategory: "DIC_kwDOH31rQM4CRErQ" + } + const result = await github.graphql(query, variables); + const combinedDiscussions = [ + ...result.supportDiscussions.discussions.nodes, + ...result.generalDiscussions.discussions.nodes, + ] + + console.log(`Checking ${combinedDiscussions.length} open discussions`); + + for (const discussion of combinedDiscussions) { + if (new Date(discussion.updatedAt) < cutoff) { + console.log(`Closing outdated discussion #${discussion.number} (${discussion.id}), last updated at ${discussion.updatedAt}`); + const addCommentMutation = `mutation($discussion:ID!, $body:String!) { + addDiscussionComment(input:{discussionId:$discussion, body:$body}) { + clientMutationId + } + }`; + const commentVariables = { + discussion: discussion.id, + body: 'This discussion has been automatically closed due to inactivity. See our [contributing guidelines](https://github.com/gethomepage/homepage/blob/main/CONTRIBUTING.md#automatic-repository-maintenance) for more details.', + } + await github.graphql(addCommentMutation, commentVariables); + + const closeDiscussionMutation = `mutation($discussion:ID!, $reason:DiscussionCloseReason!) { + closeDiscussion(input:{discussionId:$discussion, reason:$reason}) { + clientMutationId + } + }`; + const closeVariables = { + discussion: discussion.id, + reason: "OUTDATED", + } + await github.graphql(closeDiscussionMutation, closeVariables); + + await sleep(1000); + } + } + close-unsupported-feature-requests: + name: 'Close Unsupported Feature Requests' + runs-on: ubuntu-latest + steps: + - uses: actions/github-script@v7 + with: + script: | + function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); + } + + const CUTOFF_1_DAYS = 180; + const CUTOFF_1_COUNT = 5; + const CUTOFF_2_DAYS = 365; + const CUTOFF_2_COUNT = 10; + + const cutoff1Date = new Date(); + cutoff1Date.setDate(cutoff1Date.getDate() - CUTOFF_1_DAYS); + const cutoff2Date = new Date(); + cutoff2Date.setDate(cutoff2Date.getDate() - CUTOFF_2_DAYS); + + const query = `query( + $owner:String!, + $name:String!, + $featureRequestsCategory:ID!, + ) { + repository(owner:$owner, name:$name){ + discussions( + categoryId:$featureRequestsCategory, + last:100, + states:[OPEN], + ) { + nodes { + id, + number, + updatedAt, + upvoteCount, + } + }, + } + }`; + const variables = { + owner: context.repo.owner, + name: context.repo.repo, + featureRequestsCategory: "DIC_kwDOH31rQM4CRErS" + } + const result = await github.graphql(query, variables); + + for (const discussion of result.repository.discussions.nodes) { + const discussionDate = new Date(discussion.updatedAt); + if ((discussionDate < cutoff1Date && discussion.upvoteCount < CUTOFF_1_COUNT) || + (discussionDate < cutoff2Date && discussion.upvoteCount < CUTOFF_2_COUNT)) { + console.log(`Closing discussion #${discussion.number} (${discussion.id}), last updated at ${discussion.updatedAt} with votes ${discussion.upvoteCount}`); + const addCommentMutation = `mutation($discussion:ID!, $body:String!) { + addDiscussionComment(input:{discussionId:$discussion, body:$body}) { + clientMutationId + } + }`; + const commentVariables = { + discussion: discussion.id, + body: 'This discussion has been automatically closed due to lack of community support. See our [contributing guidelines](https://github.com/gethomepage/homepage/blob/main/CONTRIBUTING.md#automatic-repository-maintenance) for more details.', + } + await github.graphql(addCommentMutation, commentVariables); + + const closeDiscussionMutation = `mutation($discussion:ID!, $reason:DiscussionCloseReason!) { + closeDiscussion(input:{discussionId:$discussion, reason:$reason}) { + clientMutationId + } + }`; + const closeVariables = { + discussion: discussion.id, + reason: "OUTDATED", + } + await github.graphql(closeDiscussionMutation, closeVariables); + + await sleep(1000); + } + } diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index efcce663858..d3b07697f95 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,9 +16,9 @@ We use github to host code, to track issues and feature requests, as well as acc In short, when you submit code changes, your submissions are understood to be under the same [GNU General Public License v3.0](https://choosealicense.com/licenses/gpl-3.0/) that covers the project. Feel free to contact the maintainers if that's a concern. -## Report bugs using Github's [issues](https://github.com/gethomepage/homepage/issues) +## Report bugs using Github [discussions](https://github.com/gethomepage/homepage/discussions) -We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/gethomepage/homepage/issues/new); it's that easy! +We use GitHub discussions to triage bugs. Report a bug by [opening a new discussion](https://github.com/gethomepage/homepage/discussions/new?category=support); it's that easy! Please do not open an issue unless instructed to do so by a project maintainer. ## Write bug reports with detail, background, and sample configurations @@ -48,6 +48,24 @@ Please see information in the docs regarding [code formatting with pre-commit ho By contributing, you agree that your contributions will be licensed under its GNU General Public License. +## Use of AI for pull requests + +In general, homepage does not accept "AI-generated" PRs. If you choose to use something like that to aid the development process to generate a significant proportion of the pull request, please make sure this is explicitly stated in the PR itself. + ## References This document was adapted from the open-source contribution guidelines for [Facebook's Draft](https://github.com/facebook/draft-js/blob/main/CONTRIBUTING.md) + +## Automatic Respository Maintenance + +The homepage team appreciates all effort and interest from the community in filing bug reports, creating feature requests, sharing ideas and helping other community members. That said, in an effort to keep the repository organized and managebale the project uses automatic handling of certain areas: + +- Issues, pull requests and discussions that are closed will be locked after 30 days of inactivity. +- Discussions with a marked answer will be automatically closed. +- Discussions in the 'General' or 'Support' categories will be closed after 180 days of inactivity. +- Feature requests that do not meet the following thresholds will be closed: 5 "up-votes" after 180 days of inactivity or 10 "up-votes" after 365 days. + +In all cases, threads can be re-opened by project maintainers and, of course, users can always create a new discussion for related concerns. +Finally, remember that all information remains searchable and 'closed' feature requests can still serve as inspiration for new features. + +Thank you all for your contributions. diff --git a/README.md b/README.md index 7fc05672e2d..d137ba5e8c5 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ With features like quick search, bookmarks, weather support, a wide range of int ## Docker Integration -Homepage has built-in support for Docker, and can automatically discover and add services to the homepage based on labels. See the [Docker](https://gethomepage.dev/latest/installation/docker/) page for more information. +Homepage has built-in support for Docker, and can automatically discover and add services to the homepage based on labels. See the [Docker Service Discovery](https://gethomepage.dev/latest/configs/docker/#automatic-service-discovery) page for more information. ## Service Widgets @@ -164,8 +164,6 @@ mkdocs serve # or build, to build the static site If you have any questions, suggestions, or general issues, please start a discussion on the [Discussions](https://github.com/gethomepage/homepage/discussions) page. -For bug reports, please open an issue on the [Issues](https://github.com/gethomepage/homepage/issues) page. - ## Contributing & Contributors Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. diff --git a/docs/configs/bookmarks.md b/docs/configs/bookmarks.md index 27f6c27375f..897975e2a7e 100644 --- a/docs/configs/bookmarks.md +++ b/docs/configs/bookmarks.md @@ -3,7 +3,7 @@ title: Bookmarks description: Bookmark Configuration --- -Bookmarks function much the same as [Services](services.md), in how groups and lists work. They're just much simpler, smaller, and contain no extra features other than being a link out. +Bookmarks are configured in the `bookmarks.yaml` file. They function much the same as [Services](services.md), in how groups and lists work. They're just much simpler, smaller, and contain no extra features other than being a link out. The design of homepage expects `abbr` to be 2 letters, but is not otherwise forced. @@ -12,6 +12,7 @@ You can also use an icon for bookmarks similar to the [options for service icons By default, the description will use the hostname of the link, but you can override it with a custom description. ```yaml +--- - Developer: - Github: - abbr: GH @@ -29,4 +30,8 @@ By default, the description will use the hostname of the link, but you can overr href: https://youtube.com/ ``` +which renders to (depending on your theme, etc.): + + +The default [bookmarks.yaml](https://github.com/gethomepage/homepage/blob/main/src/skeleton/bookmarks.yaml) is a working example. diff --git a/docs/configs/docker.md b/docs/configs/docker.md index 2eaf268391e..bcd0dd610dc 100644 --- a/docs/configs/docker.md +++ b/docs/configs/docker.md @@ -164,10 +164,10 @@ labels: - homepage.description=Media server - homepage.widget.type=customapi - homepage.widget.url=http://argus.service/api/v1/service/summary/emby - - homepage.widget.field[0].label=Deployed Version - - homepage.widget.field[0].field.status=deployed_version - - homepage.widget.field[1].label=Latest Version - - homepage.widget.field[1].field.status=latest_version + - homepage.widget.mappings[0].label=Deployed Version + - homepage.widget.mappings[0].field.status=deployed_version + - homepage.widget.mappings[1].label=Latest Version + - homepage.widget.mappings[1].field.status=latest_version ``` ## Docker Swarm @@ -235,4 +235,4 @@ You can show the docker stats by clicking the status indicator but this can also showStats: true ``` -Also see the settings for [show docker stats](docker.md#show-docker-stats). +Also see the settings for [show docker stats](settings.md#show-docker-stats). diff --git a/docs/configs/services.md b/docs/configs/services.md index 010950ebc59..490356fcb5d 100644 --- a/docs/configs/services.md +++ b/docs/configs/services.md @@ -101,7 +101,7 @@ To use a local icon, first create a Docker mount to `/app/public/icons` and then ## Ping -Services may have an optional `ping` property that allows you to monitor the availability of an external host. As of v0.8.0, the ping feature attempts to use a true (ICMP) ping command on the underlying host. +Services may have an optional `ping` property that allows you to monitor the availability of an external host. As of v0.8.0, the ping feature attempts to use a true (ICMP) ping command on the underlying host. Currently, only IPv4 is supported. ```yaml - Group A: diff --git a/docs/configs/settings.md b/docs/configs/settings.md index fdc5eff23dc..ea5db734eaf 100644 --- a/docs/configs/settings.md +++ b/docs/configs/settings.md @@ -85,7 +85,7 @@ Or you may pass the path to a local image relative to the `/app/public` director ## Theme -You can configure a fixed them (and disable the theme switcher) by passing the `theme` option, like so: +You can configure a fixed theme (and disable the theme switcher) by passing the `theme` option, like so: ```yaml theme: dark # or light @@ -211,13 +211,13 @@ layout: ### Five Columns -You can add a fifth column (when `style: columns` which is default) by adding: +You can add a fifth column to services (when `style: columns` which is default) by adding: ```yaml fiveColumns: true ``` -By default homepage will max out at 4 columns for column style +By default homepage will max out at 4 columns for services with `columns` style ### Collapsible sections @@ -229,6 +229,26 @@ disableCollapse: true By default the feature is enabled. +### Initially collapsed sections + +You can initially collapse sections by adding the `initiallyCollapsed` option to the layout group. + +```yaml +layout: + Section A: + initiallyCollapsed: true +``` + +This can also be set globaly using the `groupsInitiallyCollapsed` option. + +```yaml +groupsInitiallyCollapsed: true +``` + +The value set on a group will overwrite the global setting. + +By default the feature is disabled. + ### Use Equal Height Cards You can enable equal height cards for groups of services, this will make all cards in a row the same height. @@ -343,7 +363,7 @@ providers: You can then pass `provider` instead of `apiKey` in your widget configuration. ```yaml -- weather: +- weatherapi: latitude: 50.449684 longitude: 30.525026 provider: weatherapi @@ -359,12 +379,14 @@ There are a few optional settings for the Quick Launch feature: - `searchDescriptions`: which lets you control whether item descriptions are included in searches. This is off by default. When enabled, results that match the item name will be placed above those that only match the description. - `hideInternetSearch`: disable automatically including the currently-selected web search (e.g. from the widget) as a Quick Launch option. This is false by default, enabling the feature. +- `showSearchSuggestions`: shows search suggestions for the internet search. This value will be inherited from the search widget if it is not specified. If it is not specified there either, it will default to false. - `hideVisitURL`: disable detecting and offering an option to open URLs. This is false by default, enabling the feature. ```yaml quicklaunch: searchDescriptions: true hideInternetSearch: true + showSearchSuggestions: true hideVisitURL: true ``` @@ -384,6 +406,8 @@ By default the homepage logfile is written to the a `logs` subdirectory of the ` logpath: /logfile/path ``` +By default, logs are sent both to `stdout` and to a file at the path specified. This can be changed by setting the `LOG_TARGETS` environment variable to one of `both` (default), `stdout` or `file`. + ## Show Docker Stats You can show all docker stats expanded in `settings.yaml`: diff --git a/docs/installation/k8s.md b/docs/installation/k8s.md index 685472ea0b5..6805139b65c 100644 --- a/docs/installation/k8s.md +++ b/docs/installation/k8s.md @@ -361,3 +361,33 @@ spec: port: number: 3000 ``` + +### Multiple Replicas + +If you plan to deploy homepage with a replica count greater than 1, you may +want to consider enabling sticky sessions on the homepage route. This will +prevent unnecessary re-renders on page loads and window / tab focusing. The +procedure for enabling sticky sessions depends on your Ingress controller. Below +is an example using Traefik as the Ingress controller. + +``` +apiVersion: traefik.io/v1alpha1 +kind: IngressRoute +metadata: + name: homepage.example.com +spec: + entryPoints: + - websecure + routes: + - kind: Rule + match: Host(`homepage.example.com`) + services: + - kind: Service + name: homepage + port: 3000 + sticky: + cookie: + httpOnly: true + secure: true + sameSite: none +``` diff --git a/docs/more/development.md b/docs/more/development.md index 83a2f0324f3..ec580cff4f5 100644 --- a/docs/more/development.md +++ b/docs/more/development.md @@ -39,17 +39,24 @@ Once installed, hooks will run when you commit. If the formatting isn't quite ri See the [pre-commit documentation](https://pre-commit.com/#install) to get started. +## Preferring self-hosted open-source software + +In general, homepage is meant to be a dashboard for 'self-hosted' services and we believe it is a small way we can help showcase this kind of software. While exceptions are made, mostly when there is no viable +self-hosted / open-source alternative, we ask that any widgets, etc. are developed primarily for a self-hosted tool. + ## New Feature Guidelines -- New features should be linked to an existing feature request with at least 5 'up-votes'. The purpose of this requirement is to avoid the addition (and maintenance) of features that might only benefit a small number of users. +- New features should be linked to an existing feature request with at least 10 'up-votes'. The purpose of this requirement is to avoid the addition (and maintenance) of features that might only benefit a small number of users. - If you have ideas for a larger feature, please open a discussion first. +- Please note that though it is a requirement, a discussion with 10 'up-votes' in no way guarantees that a PR will be merged. ## Service Widget Guidelines To ensure cohesiveness of various widgets, the following should be used as a guide for developing new widgets: -- Please only submit widgets that have been requested and have at least 5 'up-votes'. The purpose of this requirement is to avoid the addition (and maintenance) of service widgets that might only benefit a small number of users. +- Please only submit widgets that have been requested and have at least 10 'up-votes'. The purpose of this requirement is to avoid the addition (and maintenance) of service widgets that might only benefit a small number of users. - Widgets should be only one row of blocks -- Widgets should be no more than 4 blocks wide +- Widgets should be no more than 4 blocks wide and generally conform to the styling / design choices of other widgets - Minimize the number of API calls - Avoid the use of custom proxy unless absolutely necessary +- Widgets should be 'read-only', as in they should not make write changes using the relevant tool's API. Homepage widgets are designed to surface information, not to be a (usually worse) replacement for the tool itself. diff --git a/docs/more/troubleshooting.md b/docs/more/troubleshooting.md index a718f927c9c..9c60a09fade 100644 --- a/docs/more/troubleshooting.md +++ b/docs/more/troubleshooting.md @@ -8,7 +8,7 @@ hide: ## Introducing the Homepage AI Bot -Thanks to the generous folks at [Glime](https://glimelab.ai), Homepage is now equipped with a pretty helpful AI-powered bot. The bot has full knowledge of our docs, GitHub issues and discussions and great at answering specific questions about setting up your Homepage. To use the bot, just hit the 'Ask AI' button on any page in our docs or check out the [#ai-support channel on Discord](https://discord.com/channels/1019316731635834932/1177885603552038993)! +Thanks to the generous folks at [Glime](https://glimelab.ai), Homepage is now equipped with a pretty clever AI-powered bot. The bot has full knowledge of our docs, GitHub issues and discussions and is great at answering specific questions about setting up your Homepage. To use the bot, just hit the 'Ask AI' button on any page in our docs, [open a GitHub discussion](https://github.com/gethomepage/homepage/discussions) or check out the [#ai-support channel on Discord](https://discord.com/channels/1019316731635834932/1177885603552038993)! ## General Troubleshooting Tips diff --git a/docs/overrides/main.html b/docs/overrides/main.html new file mode 100644 index 00000000000..0a5f2bc507f --- /dev/null +++ b/docs/overrides/main.html @@ -0,0 +1,47 @@ +{% extends "base.html" %} + +{% block site_nav %} + + {% if nav %} + {% if page.meta and page.meta.hide %} + {% set hidden = "hidden" if "navigation" in page.meta.hide %} + {% endif %} +
+ {% endif %} + + + {% if "toc.integrate" not in features %} + {% if page.meta and page.meta.hide %} + {% set hidden = "hidden" if "toc" in page.meta.hide %} + {% endif %} + + {% endif %} +{% endblock %} diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css index e6bc9bf0ce8..56ed77c85d2 100644 --- a/docs/stylesheets/extra.css +++ b/docs/stylesheets/extra.css @@ -22,3 +22,15 @@ #glimeRoot * { font-family: var(--md-text-font) !important; } + +#carbonads { + margin-top: 10px; +} + +#carbon-responsive { + --carbon-padding: 1em; + --carbon-max-char: 20ch; + --carbon-bg-primary: var(--md-default-bg-color) !important; + --carbon-bg-secondary: var(--md-default-fg-color--lightest) !important; + --carbon-text-color: var(--md-typeset-color) !important; +} diff --git a/docs/widgets/info/glances.md b/docs/widgets/info/glances.md index e6fc2a6164a..52c5cf28564 100644 --- a/docs/widgets/info/glances.md +++ b/docs/widgets/info/glances.md @@ -12,11 +12,13 @@ The Glances widget allows you to monitor the resources (CPU, memory, storage, te url: http://host.or.ip:port username: user # optional if auth enabled in Glances password: pass # optional if auth enabled in Glances + version: 4 # required only if running glances v4 or higher, defaults to 3 cpu: true # optional, enabled by default, disable by setting to false mem: true # optional, enabled by default, disable by setting to false cputemp: true # disabled by default uptime: true # disabled by default disk: / # disabled by default, use mount point of disk(s) in glances. Can also be a list (see below) + diskUnits: bytes # optional, bytes (default) or bbytes. Only applies to disk expanded: true # show the expanded view label: MyMachine # optional ``` diff --git a/docs/widgets/info/openmeteo.md b/docs/widgets/info/openmeteo.md index 4cc49e26952..fb5bb171764 100644 --- a/docs/widgets/info/openmeteo.md +++ b/docs/widgets/info/openmeteo.md @@ -13,6 +13,8 @@ No registration is required at all! See [https://open-meteo.com/en/docs](https:/ timezone: Europe/Kiev # optional units: metric # or imperial cache: 5 # Time in minutes to cache API responses, to stay within limits + format: # optional, Intl.NumberFormat options + maximumFractionDigits: 1 ``` You can optionally not pass a `latitude` and `longitude` and the widget will use your current location (requires a secure context, eg. HTTPS). diff --git a/docs/widgets/info/openweathermap.md b/docs/widgets/info/openweathermap.md index 04733f5dd74..320d5d85961 100644 --- a/docs/widgets/info/openweathermap.md +++ b/docs/widgets/info/openweathermap.md @@ -14,6 +14,8 @@ The free tier "One Call API" is all that's required, you will need to [subscribe provider: openweathermap apiKey: youropenweathermapkey # required only if not using provider, this reveals api key in requests cache: 5 # Time in minutes to cache API responses, to stay within limits + format: # optional, Intl.NumberFormat options + maximumFractionDigits: 1 ``` You can optionally not pass a `latitude` and `longitude` and the widget will use your current location (requires a secure context, eg. HTTPS). diff --git a/docs/widgets/info/resources.md b/docs/widgets/info/resources.md index 35f2177b433..8281cec0a76 100644 --- a/docs/widgets/info/resources.md +++ b/docs/widgets/info/resources.md @@ -19,9 +19,12 @@ _Note: unfortunately, the package used for getting CPU temp ([systeminformation] memory: true disk: /disk/mount/path cputemp: true + tempmin: 0 # optional, minimum cpu temp + tempmax: 100 # optional, maximum cpu temp uptime: true units: imperial # only used by cpu temp refresh: 3000 # optional, in ms + diskUnits: bytes # optional, bytes (default) or bbytes. Only applies to disk ``` You can also pass a `label` option, which allows you to group resources under named sections, diff --git a/docs/widgets/info/search.md b/docs/widgets/info/search.md index a9851bb18a1..faae6c37d7c 100644 --- a/docs/widgets/info/search.md +++ b/docs/widgets/info/search.md @@ -9,6 +9,7 @@ You can add a search bar to your top widget area that can search using Google, D - search: provider: google # google, duckduckgo, bing, baidu, brave or custom focus: true # Optional, will set focus to the search bar on page load + showSearchSuggestions: true # Optional, will show search suggestions. Defaults to false target: _blank # One of _self, _blank, _parent or _top ``` @@ -17,8 +18,10 @@ or for a custom search: ```yaml - search: provider: custom - url: https://lougle.com/?q= + url: https://www.ecosia.org/search?q= target: _blank + suggestionUrl: https://ac.ecosia.org/autocomplete?type=list&q= # Optional + showSearchSuggestions: true # Optional ``` multiple providers is also supported via a dropdown (excluding custom): @@ -28,4 +31,25 @@ multiple providers is also supported via a dropdown (excluding custom): provider: [brave, google, duckduckgo] ``` +The response body for the URL provided with the `suggestionUrl` option should look like this: + +```json +[ + "home", + [ + "home depot", + "home depot near me", + "home equity loan", + "homeworkify", + "homedepot.com", + "homebase login", + "home depot credit card", + "home goods" + ] +] +``` + +The first entry of the array contains the search query, the second one is an array of the suggestions. +In the example above, the search query was **home**. + _Added in v0.1.6, updated in 0.6.0_ diff --git a/docs/widgets/info/weather.md b/docs/widgets/info/weather.md index 6357f0c0556..ab13b673626 100644 --- a/docs/widgets/info/weather.md +++ b/docs/widgets/info/weather.md @@ -15,6 +15,8 @@ The free tier is all that's required, you will need to [register](https://www.we units: metric # or imperial apiKey: yourweatherapikey cache: 5 # Time in minutes to cache API responses, to stay within limits + format: # optional, Intl.NumberFormat options + maximumFractionDigits: 1 ``` You can optionally not pass a `latitude` and `longitude` and the widget will use your current location (requires a secure context, eg. HTTPS). diff --git a/docs/widgets/services/adguard-home.md b/docs/widgets/services/adguard-home.md index af922f77f6a..a56d0dd9a4a 100644 --- a/docs/widgets/services/adguard-home.md +++ b/docs/widgets/services/adguard-home.md @@ -3,6 +3,8 @@ title: Adguard Home description: Adguard Home Widget Configuration --- +Learn more about [Adguard Home](https://github.com/AdguardTeam/AdGuardHome). + The username and password are the same as used to login to the web interface. Allowed fields: `["queries", "blocked", "filtered", "latency"]`. diff --git a/docs/widgets/services/atsumeru.md b/docs/widgets/services/atsumeru.md index 77432216804..ab110c63114 100644 --- a/docs/widgets/services/atsumeru.md +++ b/docs/widgets/services/atsumeru.md @@ -3,6 +3,8 @@ title: Atsumeru description: Atsumeru Widget Configuration --- +Learn more about [Atsumeru](https://github.com/AtsumeruDev/Atsumeru). + Define same username and password that is used for login from web or supported apps Allowed fields: `["series", "archives", "chapters", "categories"]`. diff --git a/docs/widgets/services/audiobookshelf.md b/docs/widgets/services/audiobookshelf.md index 10beec24928..96a4efce28e 100644 --- a/docs/widgets/services/audiobookshelf.md +++ b/docs/widgets/services/audiobookshelf.md @@ -3,6 +3,8 @@ title: Audiobookshelf description: Audiobookshelf Widget Configuration --- +Learn more about [Audiobookshelf](https://github.com/advplyr/audiobookshelf). + You can find your API token by logging into the Audiobookshelf web app as an admin, go to the config โ users page, and click on your account. Allowed fields: `["podcasts", "podcastsDuration", "books", "booksDuration"]` diff --git a/docs/widgets/services/authentik.md b/docs/widgets/services/authentik.md index b3f8cdd6dd2..8968f4bfb31 100644 --- a/docs/widgets/services/authentik.md +++ b/docs/widgets/services/authentik.md @@ -3,16 +3,17 @@ title: Authentik description: Authentik Widget Configuration --- +Learn more about [Authentik](https://github.com/goauthentik/authentik). + This widget reads the number of active users in the system, as well as logins for the last 24 hours. -You will need to generate an API token for an existing user. To do so follow these steps: +You will need to generate an API token for an existing user under `Admin Portal` > `Directory` > `Tokens & App passwords`. +Make sure to set Intent to "API Token". + +The account you made the API token for also needs the following **Assigned global permissions** in Authentik: -1. Navigate to the Authentik Admin Portal -2. Expand Directory, the click Tokens & App passwords -3. Click the Create button -4. Fill out the dialog making sure to set Intent to API Token -5. Click the Create button on the dialog -6. Click the copy button on the far right of the newly created API Token +- authentik Core -> Can view User (Model: User) +- authentik Events -> Can view Event (Model: Event) Allowed fields: `["users", "loginsLast24H", "failedLoginsLast24H"]`. diff --git a/docs/widgets/services/autobrr.md b/docs/widgets/services/autobrr.md index d41d7c324bc..4828f3851a0 100644 --- a/docs/widgets/services/autobrr.md +++ b/docs/widgets/services/autobrr.md @@ -3,6 +3,8 @@ title: Autobrr description: Autobrr Widget Configuration --- +Learn more about [Autobrr](https://github.com/autobrr/autobrr). + Find your API key under `Settings > API Keys`. Allowed fields: `["approvedPushes", "rejectedPushes", "filters", "indexers"]`. diff --git a/docs/widgets/services/azuredevops.md b/docs/widgets/services/azuredevops.md index 86ad741882d..788461157cf 100644 --- a/docs/widgets/services/azuredevops.md +++ b/docs/widgets/services/azuredevops.md @@ -3,12 +3,14 @@ title: Azure DevOps description: Azure DevOps Widget Configuration --- +Learn more about [Azure DevOps](https://azure.microsoft.com/en-us/products/devops). + This widget has 2 functions: -1. Pipelines: checks if the relevant pipeline is running or not, and if not, reports the last status.\ +1. Pipelines: checks if the relevant pipeline is running or not, and if not, reports the last status.