Run pre-commit hooks over existing codebase

Co-Authored-By: Ben Phelps <ben@phelps.io>
pull/2209/head
shamoon 7 months ago
parent fa50bbad9c
commit 19c25713c4

@ -48,7 +48,7 @@ jobs:
# Install the cosign tool except on PR # Install the cosign tool except on PR
# https://github.com/sigstore/cosign-installer # https://github.com/sigstore/cosign-installer
- name: Install cosign - name: Install cosign
if: github.event_name != 'pull_request' if: github.event_name != 'pull_request'
uses: sigstore/cosign-installer@main uses: sigstore/cosign-installer@main
with: with:
cosign-release: 'v1.13.1' # optional cosign-release: 'v1.13.1' # optional
@ -57,11 +57,11 @@ jobs:
# https://github.com/marketplace/actions/docker-setup-buildx#with-qemu # https://github.com/marketplace/actions/docker-setup-buildx#with-qemu
- name: Setup QEMU - name: Setup QEMU
uses: docker/setup-qemu-action@v3 uses: docker/setup-qemu-action@v3
# Workaround: https://github.com/docker/build-push-action/issues/461 # Workaround: https://github.com/docker/build-push-action/issues/461
- name: Setup Docker buildx - name: Setup Docker buildx
uses: docker/setup-buildx-action@v3 uses: docker/setup-buildx-action@v3
# This step is being disabled because the runner is on a self-hosted machine # This step is being disabled because the runner is on a self-hosted machine
# where the cache will stick between runs. # where the cache will stick between runs.
# - name: Cache Docker layers # - name: Cache Docker layers

@ -40,7 +40,7 @@ jobs:
- name: Test Docs Build - name: Test Docs Build
run: MKINSIDERS=false mkdocs build run: MKINSIDERS=false mkdocs build
deploy: deploy:
name: Build & Deploy name: Build & Deploy
if: github.repository == 'gethomepage/homepage' && github.event_name != 'pull_request' if: github.repository == 'gethomepage/homepage' && github.event_name != 'pull_request'
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:

@ -17,23 +17,23 @@ diverse, inclusive, and healthy community.
Examples of behavior that contributes to a positive environment for our Examples of behavior that contributes to a positive environment for our
community include: community include:
* Demonstrating empathy and kindness toward other people - Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences - Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback - Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes, - Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience and learning from the experience
* Focusing on what is best not just for us as individuals, but for the - Focusing on what is best not just for us as individuals, but for the
overall community overall community
Examples of unacceptable behavior include: Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or - The use of sexualized language or imagery, and sexual attention or
advances of any kind advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks - Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment - Public or private harassment
* Publishing others' private information, such as a physical or email - Publishing others' private information, such as a physical or email
address, without their explicit permission address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a - Other conduct which could reasonably be considered inappropriate in a
professional setting professional setting
## Enforcement Responsibilities ## Enforcement Responsibilities
@ -106,7 +106,7 @@ Violating these terms may lead to a permanent ban.
### 4. Permanent Ban ### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community **Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals. individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within **Consequence**: A permanent ban from any sort of public interaction within

@ -1,4 +1,5 @@
# Contributing to Homepage # Contributing to Homepage
We love your input! We want to make contributing to this project as easy and transparent as possible, whether it's: We love your input! We want to make contributing to this project as easy and transparent as possible, whether it's:
- Reporting a bug - Reporting a bug
@ -8,16 +9,20 @@ We love your input! We want to make contributing to this project as easy and tra
- Becoming a maintainer - Becoming a maintainer
## We Develop with Github ## We Develop with Github
We use github to host code, to track issues and feature requests, as well as accept pull requests. We use github to host code, to track issues and feature requests, as well as accept pull requests.
## Any contributions you make will be under the GNU General Public License v3.0 ## Any contributions you make will be under the GNU General Public License v3.0
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. 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's [issues](https://github.com/gethomepage/homepage/issues)
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 issues to track public bugs. Report a bug by [opening a new issue](https://github.com/gethomepage/homepage/issues/new); it's that easy!
## Write bug reports with detail, background, and sample configurations ## Write bug reports with detail, background, and sample configurations
Homepage includes a lot of configuration options and is often deploying in larger systems. Please include as much information (configurations, deployment method, Docker & API versions, etc) as you can when reporting an issue.
Homepage includes a lot of configuration options and is often deploying in larger systems. Please include as much information (configurations, deployment method, Docker & API versions, etc) as you can when reporting an issue.
**Great Bug Reports** tend to have: **Great Bug Reports** tend to have:
@ -29,16 +34,20 @@ Homepage includes a lot of configuration options and is often deploying in large
- What actually happens - What actually happens
- Notes (possibly including why you think this might be happening, or stuff you tried that didn't work) - Notes (possibly including why you think this might be happening, or stuff you tried that didn't work)
People *love* thorough bug reports. I'm not even kidding. People _love_ thorough bug reports. I'm not even kidding.
## Development Guidelines ## Development Guidelines
Please see the [documentation regarding development](https://gethomepage.dev/latest/more/development/) and specifically the [guidelines for new service widgets](https://gethomepage.dev/latest/more/development/#service-widget-guidelines) if you are considering making one. Please see the [documentation regarding development](https://gethomepage.dev/latest/more/development/) and specifically the [guidelines for new service widgets](https://gethomepage.dev/latest/more/development/#service-widget-guidelines) if you are considering making one.
## Use a Consistent Coding Style ## Use a Consistent Coding Style
This project follows the [Airbnb JavaScript Style Guide](https://github.com/airbnb/javascript), please follow it when submitting pull requests. This project follows the [Airbnb JavaScript Style Guide](https://github.com/airbnb/javascript), please follow it when submitting pull requests.
## License ## License
By contributing, you agree that your contributions will be licensed under its GNU General Public License. By contributing, you agree that your contributions will be licensed under its GNU General Public License.
## References ## 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) This document was adapted from the open-source contribution guidelines for [Facebook's Draft](https://github.com/facebook/draft-js/blob/main/CONTRIBUTING.md)

@ -13,20 +13,20 @@ By default, the description will use the hostname of the link, but you can overr
```yaml ```yaml
- Developer: - Developer:
- Github: - Github:
- abbr: GH - abbr: GH
href: https://github.com/ href: https://github.com/
- Social: - Social:
- Reddit: - Reddit:
- icon: reddit.png - icon: reddit.png
href: https://reddit.com/ href: https://reddit.com/
description: The front page of the internet description: The front page of the internet
- Entertainment: - Entertainment:
- YouTube: - YouTube:
- abbr: YT - abbr: YT
href: https://youtube.com/ href: https://youtube.com/
``` ```
<img width="1000" alt="Bookmarks" src="https://user-images.githubusercontent.com/19408/269307009-d7e45885-230f-4e07-b421-9822017ae878.png"> <img width="1000" alt="Bookmarks" src="https://user-images.githubusercontent.com/19408/269307009-d7e45885-230f-4e07-b421-9822017ae878.png">

@ -9,8 +9,8 @@ For IP:PORT, simply make sure your Docker instance [has been configured](https:/
```yaml ```yaml
my-remote-docker: my-remote-docker:
host: 192.168.0.101 host: 192.168.0.101
port: 2375 port: 2375
``` ```
## Using Docker TLS ## Using Docker TLS
@ -19,12 +19,12 @@ Since Docker supports connecting with TLS and client certificate authentication,
```yaml ```yaml
my-remote-docker: my-remote-docker:
host: 192.168.0.101 host: 192.168.0.101
port: 275 port: 275
tls: tls:
keyFile: tls/key.pem keyFile: tls/key.pem
caFile: tls/ca.pem caFile: tls/ca.pem
certFile: tls/cert.pem certFile: tls/cert.pem
``` ```
## Using Docker Socket Proxy ## Using Docker Socket Proxy
@ -35,35 +35,35 @@ Here is an example docker-compose file that will expose the docker socket, and t
```yaml ```yaml
dockerproxy: dockerproxy:
image: ghcr.io/tecnativa/docker-socket-proxy:latest image: ghcr.io/tecnativa/docker-socket-proxy:latest
container_name: dockerproxy container_name: dockerproxy
environment: environment:
- CONTAINERS=1 # Allow access to viewing containers - CONTAINERS=1 # Allow access to viewing containers
- SERVICES=1 # Allow access to viewing services (necessary when using Docker Swarm) - SERVICES=1 # Allow access to viewing services (necessary when using Docker Swarm)
- TASKS=1 # Allow access to viewing tasks (necessary when using Docker Swarm) - TASKS=1 # Allow access to viewing tasks (necessary when using Docker Swarm)
- POST=0 # Disallow any POST operations (effectively read-only) - POST=0 # Disallow any POST operations (effectively read-only)
ports: ports:
- 127.0.0.1:2375:2375 - 127.0.0.1:2375:2375
volumes: volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro # Mounted as read-only - /var/run/docker.sock:/var/run/docker.sock:ro # Mounted as read-only
restart: unless-stopped restart: unless-stopped
homepage: homepage:
image: ghcr.io/gethomepage/homepage:latest image: ghcr.io/gethomepage/homepage:latest
container_name: homepage container_name: homepage
volumes: volumes:
- /path/to/config:/app/config - /path/to/config:/app/config
ports: ports:
- 3000:3000 - 3000:3000
restart: unless-stopped restart: unless-stopped
``` ```
Then, inside of your `docker.yaml` settings file, you'd configure the docker instance like so: Then, inside of your `docker.yaml` settings file, you'd configure the docker instance like so:
```yaml ```yaml
my-docker: my-docker:
host: dockerproxy host: dockerproxy
port: 2375 port: 2375
``` ```
## Using Socket Directly ## Using Socket Directly
@ -76,14 +76,14 @@ If you'd rather use the socket directly, first make sure that you're passing the
```yaml ```yaml
homepage: homepage:
image: ghcr.io/gethomepage/homepage:latest image: ghcr.io/gethomepage/homepage:latest
container_name: homepage container_name: homepage
volumes: volumes:
- /path/to/config:/app/config - /path/to/config:/app/config
- /var/run/docker.sock:/var/run/docker.sock # pass local proxy - /var/run/docker.sock:/var/run/docker.sock # pass local proxy
ports: ports:
- 3000:3000 - 3000:3000
restart: unless-stopped restart: unless-stopped
``` ```
If you're using `docker run`, this would be `-v /var/run/docker.sock:/var/run/docker.sock`. If you're using `docker run`, this would be `-v /var/run/docker.sock:/var/run/docker.sock`.
@ -92,7 +92,7 @@ Then, inside of your `docker.yaml` settings file, you'd configure the docker ins
```yaml ```yaml
my-docker: my-docker:
socket: /var/run/docker.sock socket: /var/run/docker.sock
``` ```
## Services ## Services
@ -118,18 +118,18 @@ Below is an example of the same service entry shown above, as docker labels.
```yaml ```yaml
services: services:
emby: emby:
image: lscr.io/linuxserver/emby:latest image: lscr.io/linuxserver/emby:latest
container_name: emby container_name: emby
ports: ports:
- 8096:8096 - 8096:8096
restart: unless-stopped restart: unless-stopped
labels: labels:
- homepage.group=Media - homepage.group=Media
- homepage.name=Emby - homepage.name=Emby
- homepage.icon=emby.png - homepage.icon=emby.png
- homepage.href=http://emby.home/ - homepage.href=http://emby.home/
- homepage.description=Media server - homepage.description=Media server
``` ```
When your Docker instance has been properly configured, this service will be automatically discovered and added to your Homepage. **You do not need to specify the `server` or `container` values, as they will be automatically inferred.** When your Docker instance has been properly configured, this service will be automatically discovered and added to your Homepage. **You do not need to specify the `server` or `container` values, as they will be automatically inferred.**
@ -142,32 +142,32 @@ You may also configure widgets, along with the standard service entry, again, us
```yaml ```yaml
labels: labels:
- homepage.group=Media - homepage.group=Media
- homepage.name=Emby - homepage.name=Emby
- homepage.icon=emby.png - homepage.icon=emby.png
- homepage.href=http://emby.home/ - homepage.href=http://emby.home/
- homepage.description=Media server - homepage.description=Media server
- homepage.widget.type=emby - homepage.widget.type=emby
- homepage.widget.url=http://emby.home - homepage.widget.url=http://emby.home
- homepage.widget.key=yourembyapikeyhere - homepage.widget.key=yourembyapikeyhere
- homepage.widget.fields=["field1","field2"] # optional - homepage.widget.fields=["field1","field2"] # optional
``` ```
You can add specify fields for e.g. the [CustomAPI](/widgets/services/customapi) widget by using array-style dot notation: You can add specify fields for e.g. the [CustomAPI](/widgets/services/customapi) widget by using array-style dot notation:
```yaml ```yaml
labels: labels:
- homepage.group=Media - homepage.group=Media
- homepage.name=Emby - homepage.name=Emby
- homepage.icon=emby.png - homepage.icon=emby.png
- homepage.href=http://emby.home/ - homepage.href=http://emby.home/
- homepage.description=Media server - homepage.description=Media server
- homepage.widget.type=customapi - homepage.widget.type=customapi
- homepage.widget.url=http://argus.service/api/v1/service/summary/emby - homepage.widget.url=http://argus.service/api/v1/service/summary/emby
- homepage.widget.field[0].label=Deployed Version - homepage.widget.field[0].label=Deployed Version
- homepage.widget.field[0].field.status=deployed_version - homepage.widget.field[0].field.status=deployed_version
- homepage.widget.field[1].label=Latest Version - homepage.widget.field[1].label=Latest Version
- homepage.widget.field[1].field.status=latest_version - homepage.widget.field[1].field.status=latest_version
``` ```
## Docker Swarm ## Docker Swarm
@ -176,8 +176,8 @@ Docker swarm is supported and Docker services are specified with the same `serve
```yaml ```yaml
my-docker: my-docker:
socket: /var/run/docker.sock socket: /var/run/docker.sock
swarm: true swarm: true
``` ```
For the automatic service discovery to discover all services it is important that homepage should be deployed on a manager node. Set deploy requirements to the master node in your stack yaml config, e.g. For the automatic service discovery to discover all services it is important that homepage should be deployed on a manager node. Set deploy requirements to the master node in your stack yaml config, e.g.
@ -205,9 +205,9 @@ In order to detect every service within the Docker swarm it is necessary that se
As of v0.6.4 discovered services can include an optional `weight` field to determine sorting such that: As of v0.6.4 discovered services can include an optional `weight` field to determine sorting such that:
- Default weight for discovered services is 0 - Default weight for discovered services is 0
- Default weight for configured services is their index within their group scaled by 100, i.e. (index + 1) \* 100 - Default weight for configured services is their index within their group scaled by 100, i.e. (index + 1) \* 100
- If two items have the same weight value, then they will be sorted by name - If two items have the same weight value, then they will be sorted by name
## Show stats ## Show stats

@ -5,15 +5,15 @@ description: Kubernetes Configuration
The Kubernetes connectivity has the following requirements: The Kubernetes connectivity has the following requirements:
- Kubernetes 1.19+ - Kubernetes 1.19+
- Metrics Service - Metrics Service
- An Ingress controller - An Ingress controller
The Kubernetes connection is configured in the `kubernetes.yaml` file. There are 3 modes to choose from: The Kubernetes connection is configured in the `kubernetes.yaml` file. There are 3 modes to choose from:
- **disabled** - disables kubernetes connectivity - **disabled** - disables kubernetes connectivity
- **default** - uses the default kubeconfig [resolution](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/) - **default** - uses the default kubeconfig [resolution](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/)
- **cluster** - uses a service account inside the cluster - **cluster** - uses a service account inside the cluster
```yaml ```yaml
mode: default mode: default
@ -42,18 +42,18 @@ For instance, it can be utilized to roll multiple underlying deployments under o
```yaml ```yaml
- Element Chat: - Element Chat:
icon: matrix-light.png icon: matrix-light.png
href: https://chat.example.com href: https://chat.example.com
description: Matrix Synapse Powered Chat description: Matrix Synapse Powered Chat
app: matrix-element app: matrix-element
namespace: comms namespace: comms
pod-selector: >- pod-selector: >-
app.kubernetes.io/instance in ( app.kubernetes.io/instance in (
matrix-element, matrix-element,
matrix-media-repo, matrix-media-repo,
matrix-media-repo-postgresql, matrix-media-repo-postgresql,
matrix-synapse matrix-synapse
) )
``` ```
!!! note !!! note
@ -68,29 +68,29 @@ Homepage features automatic service discovery by Ingress annotations. All config
apiVersion: networking.k8s.io/v1 apiVersion: networking.k8s.io/v1
kind: Ingress kind: Ingress
metadata: metadata:
name: emby name: emby
annotations: annotations:
gethomepage.dev/enabled: "true" gethomepage.dev/enabled: "true"
gethomepage.dev/description: Media Server gethomepage.dev/description: Media Server
gethomepage.dev/group: Media gethomepage.dev/group: Media
gethomepage.dev/icon: emby.png gethomepage.dev/icon: emby.png
gethomepage.dev/name: Emby gethomepage.dev/name: Emby
gethomepage.dev/widget.type: "emby" gethomepage.dev/widget.type: "emby"
gethomepage.dev/widget.url: "https://emby.example.com" gethomepage.dev/widget.url: "https://emby.example.com"
gethomepage.dev/pod-selector: "" gethomepage.dev/pod-selector: ""
gethomepage.dev/weight: 10 # optional gethomepage.dev/weight: 10 # optional
spec: spec:
rules: rules:
- host: emby.example.com - host: emby.example.com
http: http:
paths: paths:
- backend: - backend:
service: service:
name: emby name: emby
port: port:
number: 8080 number: 8080
path: / path: /
pathType: Prefix pathType: Prefix
``` ```
When the Kubernetes cluster connection has been properly configured, this service will be automatically discovered and added to your Homepage. **You do not need to specify the `namespace` or `app` values, as they will be automatically inferred.** When the Kubernetes cluster connection has been properly configured, this service will be automatically discovered and added to your Homepage. **You do not need to specify the `namespace` or `app` values, as they will be automatically inferred.**
@ -103,33 +103,33 @@ Homepage can also read ingresses defined using the Traefik IngressRoute custom r
apiVersion: traefik.io/v1alpha1 apiVersion: traefik.io/v1alpha1
kind: IngressRoute kind: IngressRoute
metadata: metadata:
name: emby name: emby
annotations: annotations:
gethomepage.dev/href: "https://emby.example.com" gethomepage.dev/href: "https://emby.example.com"
gethomepage.dev/enabled: "true" gethomepage.dev/enabled: "true"
gethomepage.dev/description: Media Server gethomepage.dev/description: Media Server
gethomepage.dev/group: Media gethomepage.dev/group: Media
gethomepage.dev/icon: emby.png gethomepage.dev/icon: emby.png
gethomepage.dev/app: emby-app # optional, may be needed if app.kubernetes.io/name != ingress metadata.name gethomepage.dev/app: emby-app # optional, may be needed if app.kubernetes.io/name != ingress metadata.name
gethomepage.dev/name: Emby gethomepage.dev/name: Emby
gethomepage.dev/widget.type: "emby" gethomepage.dev/widget.type: "emby"
gethomepage.dev/widget.url: "https://emby.example.com" gethomepage.dev/widget.url: "https://emby.example.com"
gethomepage.dev/pod-selector: "" gethomepage.dev/pod-selector: ""
gethomepage.dev/weight: 10 # optional gethomepage.dev/weight: 10 # optional
spec: spec:
entryPoints: entryPoints:
- websecure - websecure
routes: routes:
- kind: Rule - kind: Rule
match: Host(`emby.example.com`) match: Host(`emby.example.com`)
services: services:
- kind: Service - kind: Service
name: emby name: emby
namespace: emby namespace: emby
port: 8080 port: 8080
scheme: http scheme: http
strategy: RoundRobin strategy: RoundRobin
weight: 10 weight: 10
``` ```
If the `href` attribute is not present, Homepage will ignore the specific IngressRoute. If the `href` attribute is not present, Homepage will ignore the specific IngressRoute.

@ -13,13 +13,13 @@ Using Emby as an example, this is how you would attach the Emby service widget.
```yaml ```yaml
- Emby: - Emby:
icon: emby.png icon: emby.png
href: http://emby.host.or.ip/ href: http://emby.host.or.ip/
description: Movies & TV Shows description: Movies & TV Shows
widget: widget:
type: emby type: emby
url: http://emby.host.or.ip url: http://emby.host.or.ip
key: apikeyapikeyapikeyapikeyapikey key: apikeyapikeyapikeyapikeyapikey
``` ```
## Field Visibility ## Field Visibility
@ -30,11 +30,11 @@ Each widget can optionally provide a list of which fields should be visible via
```yaml ```yaml
- Sonarr: - Sonarr:
icon: sonarr.png icon: sonarr.png
href: http://sonarr.host.or.ip href: http://sonarr.host.or.ip
widget: widget:
type: sonarr type: sonarr
fields: ["wanted", "queued"] fields: ["wanted", "queued"]
url: http://sonarr.host.or.ip url: http://sonarr.host.or.ip
key: apikeyapikeyapikeyapikeyapikey key: apikeyapikeyapikeyapikeyapikey
``` ```

@ -391,7 +391,7 @@ You can choose from the following styles for docker or k8s status and ping: `dot
For example: For example:
```yaml ```yaml
statusStyle: 'dot' statusStyle: "dot"
``` ```
or per-service (`services.yaml`) with: or per-service (`services.yaml`) with:

@ -8,14 +8,14 @@ Using docker compose:
```yaml ```yaml
version: "3.3" version: "3.3"
services: services:
homepage: homepage:
image: ghcr.io/gethomepage/homepage:latest image: ghcr.io/gethomepage/homepage:latest
container_name: homepage container_name: homepage
ports: ports:
- 3000:3000 - 3000:3000
volumes: volumes:
- /path/to/config:/app/config # Make sure your local config directory exists - /path/to/config:/app/config # Make sure your local config directory exists
- /var/run/docker.sock:/var/run/docker.sock # (optional) For docker integrations - /var/run/docker.sock:/var/run/docker.sock # (optional) For docker integrations
``` ```
### Running as non-root ### Running as non-root
@ -29,17 +29,17 @@ In the docker compose example below, the environment variables `$PUID` and `$PGI
```yaml ```yaml
version: "3.3" version: "3.3"
services: services:
homepage: homepage:
image: ghcr.io/gethomepage/homepage:latest image: ghcr.io/gethomepage/homepage:latest
container_name: homepage container_name: homepage
ports: ports:
- 3000:3000 - 3000:3000
volumes: volumes:
- /path/to/config:/app/config # Make sure your local config directory exists - /path/to/config:/app/config # Make sure your local config directory exists
- /var/run/docker.sock:/var/run/docker.sock # (optional) For docker integrations, see alternative methods - /var/run/docker.sock:/var/run/docker.sock # (optional) For docker integrations, see alternative methods
environment: environment:
PUID: $PUID PUID: $PUID
PGID: $PGID PGID: $PGID
``` ```
### With Docker Run ### With Docker Run
@ -52,6 +52,6 @@ docker run -p 3000:3000 -v /path/to/config:/app/config -v /var/run/docker.sock:/
You can also include environment variables in your config files to protect sensitive information. Note: You can also include environment variables in your config files to protect sensitive information. Note:
- Environment variables must start with `HOMEPAGE_VAR_` or `HOMEPAGE_FILE_` - Environment variables must start with `HOMEPAGE_VAR_` or `HOMEPAGE_FILE_`
- The value of env var `HOMEPAGE_VAR_XXX` will replace `{{HOMEPAGE_VAR_XXX}}` in any config - The value of env var `HOMEPAGE_VAR_XXX` will replace `{{HOMEPAGE_VAR_XXX}}` in any config
- The value of env var `HOMEPAGE_FILE_XXX` must be a file path, the contents of which will be used to replace `{{HOMEPAGE_FILE_XXX}}` in any config - The value of env var `HOMEPAGE_FILE_XXX` must be a file path, the contents of which will be used to replace `{{HOMEPAGE_FILE_XXX}}` in any config

@ -16,70 +16,70 @@ The helm chart allows for all the configurations to be inlined directly in your
```yaml ```yaml
config: config:
bookmarks: bookmarks:
- Developer: - Developer:
- Github: - Github:
- abbr: GH - abbr: GH
href: https://github.com/ href: https://github.com/
services: services:
- My First Group: - My First Group:
- My First Service: - My First Service:
href: http://localhost/ href: http://localhost/
description: Homepage is awesome description: Homepage is awesome
- My Second Group: - My Second Group:
- My Second Service: - My Second Service:
href: http://localhost/ href: http://localhost/
description: Homepage is the best description: Homepage is the best
- My Third Group: - My Third Group:
- My Third Service: - My Third Service:
href: http://localhost/ href: http://localhost/
description: Homepage is 😎 description: Homepage is 😎
widgets: widgets:
# show the kubernetes widget, with the cluster summary and individual nodes # show the kubernetes widget, with the cluster summary and individual nodes
- kubernetes: - kubernetes:
cluster: cluster:
show: true show: true
cpu: true cpu: true
memory: true memory: true
showLabel: true showLabel: true
label: "cluster" label: "cluster"
nodes: nodes:
show: true show: true
cpu: true cpu: true
memory: true memory: true
showLabel: true showLabel: true
- search: - search:
provider: duckduckgo provider: duckduckgo
target: _blank target: _blank
kubernetes: kubernetes:
mode: cluster mode: cluster
settings: settings:
# The service account is necessary to allow discovery of other services # The service account is necessary to allow discovery of other services
serviceAccount: serviceAccount:
create: true create: true
name: homepage name: homepage
# This enables the service account to access the necessary resources # This enables the service account to access the necessary resources
enableRbac: true enableRbac: true
ingress: ingress:
main: main:
enabled: true enabled: true
annotations: annotations:
# Example annotations to add Homepage to your Homepage! # Example annotations to add Homepage to your Homepage!
gethomepage.dev/enabled: "true" gethomepage.dev/enabled: "true"
gethomepage.dev/name: "Homepage" gethomepage.dev/name: "Homepage"
gethomepage.dev/description: "Dynamically Detected Homepage" gethomepage.dev/description: "Dynamically Detected Homepage"
gethomepage.dev/group: "Dynamic" gethomepage.dev/group: "Dynamic"
gethomepage.dev/icon: "homepage.png" gethomepage.dev/icon: "homepage.png"
hosts: hosts:
- host: homepage.example.com - host: homepage.example.com
paths: paths:
- path: / - path: /
pathType: Prefix pathType: Prefix
``` ```
## Install with Kubernetes Manifests ## Install with Kubernetes Manifests
@ -94,12 +94,12 @@ Here's a working example of the resources you need:
apiVersion: v1 apiVersion: v1
kind: ServiceAccount kind: ServiceAccount
metadata: metadata:
name: homepage name: homepage
namespace: default namespace: default
labels: labels:
app.kubernetes.io/name: homepage app.kubernetes.io/name: homepage
secrets: secrets:
- name: homepage - name: homepage
``` ```
#### Secret #### Secret
@ -109,12 +109,12 @@ apiVersion: v1
kind: Secret kind: Secret
type: kubernetes.io/service-account-token type: kubernetes.io/service-account-token
metadata: metadata:
name: homepage name: homepage
namespace: default namespace: default
labels: labels:
app.kubernetes.io/name: homepage app.kubernetes.io/name: homepage
annotations: annotations:
kubernetes.io/service-account.name: homepage kubernetes.io/service-account.name: homepage
``` ```
#### ConfigMap #### ConfigMap
@ -123,62 +123,62 @@ metadata:
apiVersion: v1 apiVersion: v1
kind: ConfigMap kind: ConfigMap
metadata: metadata:
name: homepage name: homepage
namespace: default namespace: default
labels: labels:
app.kubernetes.io/name: homepage app.kubernetes.io/name: homepage
data: data:
kubernetes.yaml: | kubernetes.yaml: |
mode: cluster mode: cluster
settings.yaml: "" settings.yaml: ""
#settings.yaml: | #settings.yaml: |
# providers: # providers:
# longhorn: # longhorn:
# url: https://longhorn.my.network # url: https://longhorn.my.network
custom.css: "" custom.css: ""
custom.js: "" custom.js: ""
bookmarks.yaml: | bookmarks.yaml: |
- Developer: - Developer:
- Github: - Github:
- abbr: GH - abbr: GH
href: https://github.com/ href: https://github.com/
services.yaml: | services.yaml: |
- My First Group: - My First Group:
- My First Service: - My First Service:
href: http://localhost/ href: http://localhost/
description: Homepage is awesome description: Homepage is awesome
- My Second Group: - My Second Group:
- My Second Service: - My Second Service:
href: http://localhost/ href: http://localhost/
description: Homepage is the best description: Homepage is the best
- My Third Group: - My Third Group:
- My Third Service: - My Third Service:
href: http://localhost/ href: http://localhost/
description: Homepage is 😎 description: Homepage is 😎
widgets.yaml: | widgets.yaml: |
- kubernetes: - kubernetes:
cluster: cluster:
show: true show: true
cpu: true cpu: true
memory: true memory: true
showLabel: true showLabel: true
label: "cluster" label: "cluster"
nodes: nodes:
show: true show: true
cpu: true cpu: true
memory: true memory: true
showLabel: true showLabel: true
- resources: - resources:
backend: resources backend: resources
expanded: true expanded: true
cpu: true cpu: true
memory: true memory: true
- search: - search:
provider: duckduckgo provider: duckduckgo
target: _blank target: _blank
docker.yaml: "" docker.yaml: ""
``` ```
#### ClusterRole and ClusterRoleBinding #### ClusterRole and ClusterRoleBinding
@ -187,57 +187,57 @@ data:
apiVersion: rbac.authorization.k8s.io/v1 apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole kind: ClusterRole
metadata: metadata:
name: homepage name: homepage
labels: labels:
app.kubernetes.io/name: homepage app.kubernetes.io/name: homepage
rules: rules:
- apiGroups: - apiGroups:
- "" - ""
resources: resources:
- namespaces - namespaces
- pods - pods
- nodes - nodes
verbs: verbs:
- get - get
- list - list
- apiGroups: - apiGroups:
- extensions - extensions
- networking.k8s.io - networking.k8s.io
resources: resources:
- ingresses - ingresses
verbs: verbs:
- get - get
- list - list
- apiGroups: - apiGroups:
- traefik.containo.us - traefik.containo.us
resources: resources:
- ingressroutes - ingressroutes
verbs: verbs:
- get - get
- list - list
- apiGroups: - apiGroups:
- metrics.k8s.io - metrics.k8s.io
resources: resources:
- nodes - nodes
- pods - pods
verbs: verbs:
- get - get
- list - list
--- ---
apiVersion: rbac.authorization.k8s.io/v1 apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding kind: ClusterRoleBinding
metadata: metadata:
name: homepage name: homepage
labels: labels:
app.kubernetes.io/name: homepage app.kubernetes.io/name: homepage
roleRef: roleRef:
apiGroup: rbac.authorization.k8s.io apiGroup: rbac.authorization.k8s.io
kind: ClusterRole kind: ClusterRole
name: homepage name: homepage
subjects: subjects:
- kind: ServiceAccount - kind: ServiceAccount
name: homepage name: homepage
namespace: default namespace: default
``` ```
#### Service #### Service
@ -246,20 +246,20 @@ subjects:
apiVersion: v1 apiVersion: v1
kind: Service kind: Service
metadata: metadata:
name: homepage name: homepage
namespace: default namespace: default
labels: labels:
app.kubernetes.io/name: homepage app.kubernetes.io/name: homepage
annotations: annotations:
spec: spec:
type: ClusterIP type: ClusterIP
ports: ports:
- port: 3000 - port: 3000
targetPort: http targetPort: http
protocol: TCP protocol: TCP
name: http name: http
selector: selector:
app.kubernetes.io/name: homepage app.kubernetes.io/name: homepage
``` ```
#### Deployment #### Deployment
@ -268,68 +268,68 @@ spec:
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: Deployment
metadata: metadata:
name: homepage name: homepage
namespace: default namespace: default
labels: labels:
app.kubernetes.io/name: homepage app.kubernetes.io/name: homepage
spec: spec:
revisionHistoryLimit: 3 revisionHistoryLimit: 3
replicas: 1 replicas: 1
strategy: strategy:
type: RollingUpdate type: RollingUpdate
selector: selector:
matchLabels: matchLabels:
app.kubernetes.io/name: homepage app.kubernetes.io/name: homepage
template: template:
metadata: metadata:
labels: labels:
app.kubernetes.io/name: homepage app.kubernetes.io/name: homepage
spec: spec:
serviceAccountName: homepage serviceAccountName: homepage
automountServiceAccountToken: true automountServiceAccountToken: true
dnsPolicy: ClusterFirst dnsPolicy: ClusterFirst
enableServiceLinks: true enableServiceLinks: true
containers: containers:
- name: homepage - name: homepage
image: "ghcr.io/gethomepage/homepage:latest" image: "ghcr.io/gethomepage/homepage:latest"
imagePullPolicy: Always imagePullPolicy: Always
ports: ports:
- name: http - name: http
containerPort: 3000 containerPort: 3000
protocol: TCP protocol: TCP
volumeMounts: volumeMounts:
- mountPath: /app/config/custom.js - mountPath: /app/config/custom.js
name: homepage-config name: homepage-config
subPath: custom.js subPath: custom.js
- mountPath: /app/config/custom.css - mountPath: /app/config/custom.css
name: homepage-config name: homepage-config
subPath: custom.css subPath: custom.css
- mountPath: /app/config/bookmarks.yaml - mountPath: /app/config/bookmarks.yaml
name: homepage-config name: homepage-config
subPath: bookmarks.yaml subPath: bookmarks.yaml
- mountPath: /app/config/docker.yaml - mountPath: /app/config/docker.yaml
name: homepage-config name: homepage-config
subPath: docker.yaml subPath: docker.yaml
- mountPath: /app/config/kubernetes.yaml - mountPath: /app/config/kubernetes.yaml
name: homepage-config name: homepage-config
subPath: kubernetes.yaml subPath: kubernetes.yaml
- mountPath: /app/config/services.yaml - mountPath: /app/config/services.yaml
name: homepage-config name: homepage-config
subPath: services.yaml subPath: services.yaml
- mountPath: /app/config/settings.yaml - mountPath: /app/config/settings.yaml
name: homepage-config name: homepage-config
subPath: settings.yaml subPath: settings.yaml
- mountPath: /app/config/widgets.yaml - mountPath: /app/config/widgets.yaml
name: homepage-config name: homepage-config
subPath: widgets.yaml subPath: widgets.yaml
- mountPath: /app/config/logs - mountPath: /app/config/logs
name: logs name: logs
volumes: volumes:
- name: homepage-config - name: homepage-config
configMap: configMap:
name: homepage name: homepage
- name: logs - name: logs
emptyDir: {} emptyDir: {}
``` ```
#### Ingress #### Ingress
@ -338,26 +338,26 @@ spec:
apiVersion: networking.k8s.io/v1 apiVersion: networking.k8s.io/v1
kind: Ingress kind: Ingress
metadata: metadata:
name: homepage name: homepage
namespace: default namespace: default
labels: labels:
app.kubernetes.io/name: homepage app.kubernetes.io/name: homepage
annotations: annotations:
gethomepage.dev/description: Dynamically Detected Homepage gethomepage.dev/description: Dynamically Detected Homepage
gethomepage.dev/enabled: "true" gethomepage.dev/enabled: "true"
gethomepage.dev/group: Cluster Management gethomepage.dev/group: Cluster Management
gethomepage.dev/icon: homepage.png gethomepage.dev/icon: homepage.png
gethomepage.dev/name: Homepage gethomepage.dev/name: Homepage
spec: spec:
rules: rules:
- host: "homepage.my.network" - host: "homepage.my.network"
http: http:
paths: paths:
- path: "/" - path: "/"
pathType: Prefix pathType: Prefix
backend: backend:
service: service:
name: homepage name: homepage
port: port:
number: 3000 number: 3000
``` ```

@ -7,39 +7,39 @@ Homepage has an UNRAID community package that you may use to install homepage. T
## Install the Plugin ## Install the Plugin
- In the UNRAID webGUI, go to the **Apps** tab. - In the UNRAID webGUI, go to the **Apps** tab.
- In the search bar, search for `homepage`. - In the search bar, search for `homepage`.
- Click on **Install**. - Click on **Install**.
- Change the parameters to your liking. - Change the parameters to your liking.
- Click on **APPLY**. - Click on **APPLY**.
## Run the Container ## Run the Container
- While the container is running, open the WebUI. - While the container is running, open the WebUI.
- Opening the page will generate the configuration files. - Opening the page will generate the configuration files.
You may need to set the permissions of the folders to be able to edit the files. You may need to set the permissions of the folders to be able to edit the files.
- Click on the Homepage icon. - Click on the Homepage icon.
- Click on **Console**. - Click on **Console**.
- Enter `chmod -R u-x,go-rwx,go+u,ugo+X /app/config` and press **Enter**. - Enter `chmod -R u-x,go-rwx,go+u,ugo+X /app/config` and press **Enter**.
- Enter `chmod -R u-x,go-rwx,go+u,ugo+X /app/public/icons` and press **Enter**. - Enter `chmod -R u-x,go-rwx,go+u,ugo+X /app/public/icons` and press **Enter**.
- Enter `chown -R nobody:users /app/config` and press **Enter**. - Enter `chown -R nobody:users /app/config` and press **Enter**.
- Enter `chown -R nobody:users /app/public/icons` and press **Enter**. - Enter `chown -R nobody:users /app/public/icons` and press **Enter**.
## Some Other Notes ## Some Other Notes
- To use the [Docker integration](../configs/docker.md), you only need to use the `container:` parameter. There is no need to set the server. - To use the [Docker integration](../configs/docker.md), you only need to use the `container:` parameter. There is no need to set the server.
!!! note !!! note
To view detailed container statistics (CPU, RAM, etc.), or if you use a remote docker socket, `container:` will still need to be set. For example: To view detailed container statistics (CPU, RAM, etc.), or if you use a remote docker socket, `container:` will still need to be set. For example:
``` ```
- Plex: - Plex:
icon: /icons/plex.png icon: /icons/plex.png
href: https://app.plex.com href: https://app.plex.com
container: plex container: plex
``` ```
- When you upload a new image into the **/images** folder, you will need to restart the container for it to show up in the WebUI. Please see the [service icons](../configs/services.md#icons) for more information. - When you upload a new image into the **/images** folder, you will need to restart the container for it to show up in the WebUI. Please see the [service icons](../configs/services.md#icons) for more information.

@ -35,8 +35,8 @@ pnpm lint
To ensure cohesiveness of various widgets, the following should be used as a guide for developing new widgets: 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' - Please only submit widgets that have been requested and have at least 5 'up-votes'
- Widgets should be only one row of blocks - 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
- Minimize the number of API calls - Minimize the number of API calls
- Avoid the use of custom proxy unless absolutely necessary - Avoid the use of custom proxy unless absolutely necessary

@ -5,4 +5,4 @@ description: Homepage Container Deprecation
As of v0.7.2 homepage migrated from benphelps/homepage to an "organization" repository located at [gethomepage/homepage](https://github.com/gethomepage/homepage/). The reason for this was to setup the project for longevity and allow for community maintenance. As of v0.7.2 homepage migrated from benphelps/homepage to an "organization" repository located at [gethomepage/homepage](https://github.com/gethomepage/homepage/). The reason for this was to setup the project for longevity and allow for community maintenance.
Migrating your installation should be as simple as changing `image: ghcr.io/benphelps/homepage:latest` to `image: ghcr.io/gethomepage/homepage:latest`. Migrating your installation should be as simple as changing `image: ghcr.io/benphelps/homepage:latest` to `image: ghcr.io/gethomepage/homepage:latest`.

@ -3,7 +3,7 @@ title: Translations
description: Contributing Translations description: Contributing Translations
--- ---
Homepage is developed in English, component contributions must be in English. All translations are community provided, so a huge thanks go out to all those who have helped out so far! Homepage is developed in English, component contributions must be in English. All translations are community provided, so a huge thanks go out to all those who have helped out so far!
## Support Translations ## Support Translations

@ -17,9 +17,9 @@ hide:
All service widgets work essentially the same, that is, homepage makes a proxied call to an API made available by that service. The majority of the time widgets don't work it is a configuration issue. Of course, sometimes things do break. Some basic steps to try: All service widgets work essentially the same, that is, homepage makes a proxied call to an API made available by that service. The majority of the time widgets don't work it is a configuration issue. Of course, sometimes things do break. Some basic steps to try:
1. Ensure that you follow the rule mentioned on https://gethomepage.dev/latest/configs/service-widgets/. **Unless otherwise noted, URLs should not end with a / or other API path. Each widget will handle the path on its own.**. This is very important as including a trailing slash can result in an error. 1. Ensure that you follow the rule mentioned on https://gethomepage.dev/latest/configs/service-widgets/. **Unless otherwise noted, URLs should not end with a / or other API path. Each widget will handle the path on its own.**. This is very important as including a trailing slash can result in an error.
2. Verify the homepage installation can connect to the IP address or host you are using for the widget `url`. This is most simply achieved by pinging the server from the homepage machine, in Docker this means _from inside the container_ itself, e.g.: 2. Verify the homepage installation can connect to the IP address or host you are using for the widget `url`. This is most simply achieved by pinging the server from the homepage machine, in Docker this means _from inside the container_ itself, e.g.:
``` ```
docker exec homepage ping SERVICEIPORDOMAIN docker exec homepage ping SERVICEIPORDOMAIN
@ -27,10 +27,10 @@ All service widgets work essentially the same, that is, homepage makes a proxied
If your homepage install (container) cannot reach the service then you need to figure out why, for example in Docker this can mean putting the two containers on the same network, checking firewall issues, etc. If your homepage install (container) cannot reach the service then you need to figure out why, for example in Docker this can mean putting the two containers on the same network, checking firewall issues, etc.
3. If you have verified that homepage can in fact reach the service then you can also check the API output using e.g. `curl`, which is often helpful if you do need to file a bug report. Again, depending on your networking setup this may need to be run from _inside the container_ as IP / hostname resolution can differ inside vs outside. 3. If you have verified that homepage can in fact reach the service then you can also check the API output using e.g. `curl`, which is often helpful if you do need to file a bug report. Again, depending on your networking setup this may need to be run from _inside the container_ as IP / hostname resolution can differ inside vs outside.
!!! note !!! note
`curl` is not installed in the base image by default but can be added inside the container with `apk add curl`. `curl` is not installed in the base image by default but can be added inside the container with `apk add curl`.
The exact API endpoints and authentication vary of course, but in many cases instructions can be found by searching the web or if you feel comfortable looking at the homepage source code (e.g. `src/widgets/{widget}/widget.js`). The exact API endpoints and authentication vary of course, but in many cases instructions can be found by searching the web or if you feel comfortable looking at the homepage source code (e.g. `src/widgets/{widget}/widget.js`).

@ -17,4 +17,4 @@
color: var(--md-default-bg-color--lighter); color: var(--md-default-bg-color--lighter);
border-color: var(--md-default-bg-color--lighter); border-color: var(--md-default-bg-color--lighter);
} }
} }

@ -9,9 +9,9 @@ Formatting is locale aware and will present your date in the regional format you
```yaml ```yaml
- datetime: - datetime:
text_size: xl text_size: xl
format: format:
timeStyle: short timeStyle: short
``` ```
Any options passed to `format` are passed directly to [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat), please reference the MDN documentation for all available options. Any options passed to `format` are passed directly to [Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat), please reference the MDN documentation for all available options.
@ -23,29 +23,29 @@ A few examples,
```yaml ```yaml
# 13:37 # 13:37
format: format:
timeStyle: short timeStyle: short
hourCycle: h23 hourCycle: h23
``` ```
```yaml ```yaml
# 1:37 PM # 1:37 PM
format: format:
timeStyle: short timeStyle: short
hour12: true hour12: true
``` ```
```yaml ```yaml
# 1/23/22, 1:37 PM # 1/23/22, 1:37 PM
format: format:
dateStyle: short dateStyle: short
timeStyle: short timeStyle: short
hour12: true hour12: true
``` ```
```yaml ```yaml
# 4 januari 2023 om 13:51:25 PST # 4 januari 2023 om 13:51:25 PST
locale: nl locale: nl
format: format:
dateStyle: long dateStyle: long
timeStyle: long timeStyle: long
``` ```

@ -9,16 +9,16 @@ The Glances widget allows you to monitor the resources (CPU, memory, storage, te
```yaml ```yaml
- glances: - glances:
url: http://host.or.ip:port url: http://host.or.ip:port
username: user # optional if auth enabled in Glances username: user # optional if auth enabled in Glances
password: pass # optional if auth enabled in Glances password: pass # optional if auth enabled in Glances
cpu: true # optional, enabled by default, disable by setting to false cpu: true # optional, enabled by default, disable by setting to false
mem: 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 cputemp: true # disabled by default
uptime: 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) disk: / # disabled by default, use mount point of disk(s) in glances. Can also be a list (see below)
expanded: true # show the expanded view expanded: true # show the expanded view
label: MyMachine # optional label: MyMachine # optional
``` ```
Multiple disks can be specified as: Multiple disks can be specified as:

@ -7,8 +7,8 @@ This allows you to display simple text, can be configured like so:
```yaml ```yaml
- greeting: - greeting:
text_size: xl text_size: xl
text: Greeting Text text: Greeting Text
``` ```
Valid text sizes are `4xl`, `3xl`, `2xl`, `xl`, `md`, `sm`, `xs`. Valid text sizes are `4xl`, `3xl`, `2xl`, `xl`, `md`, `sm`, `xs`.

@ -9,23 +9,23 @@ It provides CPU and Memory usage, by node and/or at the cluster level.
```yaml ```yaml
- kubernetes: - kubernetes:
cluster: cluster:
# Shows cluster-wide statistics # Shows cluster-wide statistics
show: true show: true
# Shows the aggregate CPU stats # Shows the aggregate CPU stats
cpu: true cpu: true
# Shows the aggregate memory stats # Shows the aggregate memory stats
memory: true memory: true
# Shows a custom label # Shows a custom label
showLabel: true showLabel: true
label: "cluster" label: "cluster"
nodes: nodes:
# Shows node-specific statistics # Shows node-specific statistics
show: true show: true
# Shows the CPU for each node # Shows the CPU for each node
cpu: true cpu: true
# Shows the memory for each node # Shows the memory for each node
memory: true memory: true
# Shows the label, which is always the node name # Shows the label, which is always the node name
showLabel: true showLabel: true
``` ```

@ -12,18 +12,18 @@ It can show the aggregate metrics and/or the individual node metrics.
```yaml ```yaml
- longhorn: - longhorn:
# Show the expanded view # Show the expanded view
expanded: true expanded: true
# Shows a node representing the aggregate values # Shows a node representing the aggregate values
total: true total: true
# Shows the node names as labels # Shows the node names as labels
labels: true labels: true
# Show the nodes # Show the nodes
nodes: true nodes: true
# An explicit list of nodes to show. All are shown by default if "nodes" is true # An explicit list of nodes to show. All are shown by default if "nodes" is true
include: include:
- node1 - node1
- node2 - node2
``` ```
The Longhorn URL and credentials are stored in the `providers` section of the `settings.yaml`. The Longhorn URL and credentials are stored in the `providers` section of the `settings.yaml`.

@ -7,12 +7,12 @@ No registration is required at all! See [https://open-meteo.com/en/docs](https:/
```yaml ```yaml
- openmeteo: - openmeteo:
label: Kyiv # optional label: Kyiv # optional
latitude: 50.449684 latitude: 50.449684
longitude: 30.525026 longitude: 30.525026
timezone: Europe/Kiev # optional timezone: Europe/Kiev # optional
units: metric # or imperial units: metric # or imperial
cache: 5 # Time in minutes to cache API responses, to stay within limits cache: 5 # Time in minutes to cache API responses, to stay within limits
``` ```
You can optionally not pass a `latitude` and `longitude` and the widget will use your current location (requires a secure context, eg. HTTPS). You can optionally not pass a `latitude` and `longitude` and the widget will use your current location (requires a secure context, eg. HTTPS).

@ -7,13 +7,13 @@ The free tier "One Call API" is all thats required, you will need to [subscribe]
```yaml ```yaml
- openweathermap: - openweathermap:
label: Kyiv #optional label: Kyiv #optional
latitude: 50.449684 latitude: 50.449684
longitude: 30.525026 longitude: 30.525026
units: metric # or imperial units: metric # or imperial
provider: openweathermap provider: openweathermap
apiKey: youropenweathermapkey # required only if not using provider, this reveals api key in requests 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 cache: 5 # Time in minutes to cache API responses, to stay within limits
``` ```
You can optionally not pass a `latitude` and `longitude` and the widget will use your current location (requires a secure context, eg. HTTPS). You can optionally not pass a `latitude` and `longitude` and the widget will use your current location (requires a secure context, eg. HTTPS).

@ -15,26 +15,26 @@ _Note: unfortunately, the package used for getting CPU temp ([systeminformation]
```yaml ```yaml
- resources: - resources:
cpu: true cpu: true
memory: true memory: true
disk: /disk/mount/path disk: /disk/mount/path
cputemp: true cputemp: true
uptime: true uptime: true
units: imperial # only used by cpu temp units: imperial # only used by cpu temp
refresh: 3000 # optional, in ms refresh: 3000 # optional, in ms
``` ```
You can also pass a `label` option, which allows you to group resources under named sections, You can also pass a `label` option, which allows you to group resources under named sections,
```yaml ```yaml
- resources: - resources:
label: System label: System
cpu: true cpu: true
memory: true memory: true
- resources: - resources:
label: Storage label: Storage
disk: /mnt/storage disk: /mnt/storage
``` ```
Which produces something like this, Which produces something like this,
@ -45,11 +45,11 @@ If you have more than a single disk and would like to group them together under
```yaml ```yaml
- resources: - resources:
label: Storage label: Storage
disk: disk:
- /mnt/storage - /mnt/storage
- /mnt/backup - /mnt/backup
- /mnt/media - /mnt/media
``` ```
To produce something like this, To produce something like this,
@ -60,12 +60,12 @@ You can additionally supply an optional `expanded` property set to true in order
```yaml ```yaml
- resources: - resources:
label: Array Disks label: Array Disks
expanded: true expanded: true
disk: disk:
- /disk1 - /disk1
- /disk2 - /disk2
- /disk3 - /disk3
``` ```
![194136533-c4238c82-4d67-41a4-b3c8-18bf26d33ac2](https://user-images.githubusercontent.com/3441425/194728642-a9885274-922b-4027-acf5-a746f58fdfce.png) ![194136533-c4238c82-4d67-41a4-b3c8-18bf26d33ac2](https://user-images.githubusercontent.com/3441425/194728642-a9885274-922b-4027-acf5-a746f58fdfce.png)

@ -7,25 +7,25 @@ You can add a search bar to your top widget area that can search using Google, D
```yaml ```yaml
- search: - search:
provider: google # google, duckduckgo, bing, baidu, brave or custom provider: google # google, duckduckgo, bing, baidu, brave or custom
focus: true # Optional, will set focus to the search bar on page load focus: true # Optional, will set focus to the search bar on page load
target: _blank # One of _self, _blank, _parent or _top target: _blank # One of _self, _blank, _parent or _top
``` ```
or for a custom search: or for a custom search:
```yaml ```yaml
- search: - search:
provider: custom provider: custom
url: https://lougle.com/?q= url: https://lougle.com/?q=
target: _blank target: _blank
``` ```
multiple providers is also supported via a dropdown (excluding custom): multiple providers is also supported via a dropdown (excluding custom):
```yaml ```yaml
- search: - search:
provider: [brave, google, duckduckgo] provider: [brave, google, duckduckgo]
``` ```
_Added in v0.1.6, updated in 0.6.0_ _Added in v0.1.6, updated in 0.6.0_

@ -9,12 +9,12 @@ The free tier is all thats required, you will need to [register](https://www.wea
```yaml ```yaml
- weatherapi: - weatherapi:
label: Kyiv # optional label: Kyiv # optional
latitude: 50.449684 latitude: 50.449684
longitude: 30.525026 longitude: 30.525026
units: metric # or imperial units: metric # or imperial
apiKey: yourweatherapikey apiKey: yourweatherapikey
cache: 5 # Time in minutes to cache API responses, to stay within limits cache: 5 # Time in minutes to cache API responses, to stay within limits
``` ```
You can optionally not pass a `latitude` and `longitude` and the widget will use your current location (requires a secure context, eg. HTTPS). You can optionally not pass a `latitude` and `longitude` and the widget will use your current location (requires a secure context, eg. HTTPS).

@ -9,8 +9,8 @@ Allowed fields: `["queries", "blocked", "filtered", "latency"]`.
```yaml ```yaml
widget: widget:
type: adguard type: adguard
url: http://adguard.host.or.ip url: http://adguard.host.or.ip
username: admin username: admin
password: password password: password
``` ```

@ -9,8 +9,8 @@ Allowed fields: `["series", "archives", "chapters", "categories"]`.
```yaml ```yaml
widget: widget:
type: atsumeru type: atsumeru
url: http://atsumeru.host.or.ip:port url: http://atsumeru.host.or.ip:port
username: username username: username
password: password password: password
``` ```

@ -9,7 +9,7 @@ Allowed fields: `["podcasts", "podcastsDuration", "books", "booksDuration"]`
```yaml ```yaml
widget: widget:
type: audiobookshelf type: audiobookshelf
url: http://audiobookshelf.host.or.ip:port url: http://audiobookshelf.host.or.ip:port
key: audiobookshelflapikey key: audiobookshelflapikey
``` ```

@ -18,7 +18,7 @@ Allowed fields: `["users", "loginsLast24H", "failedLoginsLast24H"]`.
```yaml ```yaml
widget: widget:
type: authentik type: authentik
url: http://authentik.host.or.ip:22070 url: http://authentik.host.or.ip:22070
key: api_token key: api_token
``` ```

@ -9,7 +9,7 @@ Allowed fields: `["approvedPushes", "rejectedPushes", "filters", "indexers"]`.
```yaml ```yaml
widget: widget:
type: autobrr type: autobrr
url: http://autobrr.host.or.ip url: http://autobrr.host.or.ip
key: apikeyapikeyapikeyapikeyapikey key: apikeyapikeyapikeyapikeyapikey
``` ```

@ -15,12 +15,12 @@ You will need to generate a personal access token for an existing user, see the
```yaml ```yaml
widget: widget:
type: azuredevops type: azuredevops
organization: myOrganization organization: myOrganization
project: myProject project: myProject
definitionId: pipelineDefinitionId # required for pipelines definitionId: pipelineDefinitionId # required for pipelines
branchName: branchName # optional for pipelines, leave empty for all branchName: branchName # optional for pipelines, leave empty for all
userEmail: email # required for pull requests userEmail: email # required for pull requests
repositoryId: prRepositoryId # required for pull requests repositoryId: prRepositoryId # required for pull requests
key: personalaccesstoken key: personalaccesstoken
``` ```

@ -9,7 +9,7 @@ Allowed fields: `["missingEpisodes", "missingMovies"]`.
```yaml ```yaml
widget: widget:
type: bazarr type: bazarr
url: http://bazarr.host.or.ip url: http://bazarr.host.or.ip
key: apikeyapikeyapikeyapikeyapikey key: apikeyapikeyapikeyapikeyapikey
``` ```

@ -7,6 +7,6 @@ Allowed fields: `["upstreams", "requests", "requests_failed"]`.
```yaml ```yaml
widget: widget:
type: caddy type: caddy
url: http://caddy.host.or.ip:adminport # default admin port is 2019 url: http://caddy.host.or.ip:adminport # default admin port is 2019
``` ```

@ -9,8 +9,8 @@ Allowed fields: `["books", "authors", "categories", "series"]`.
```yaml ```yaml
widget: widget:
type: calibreweb type: calibreweb
url: http://your.calibreweb.host:port url: http://your.calibreweb.host:port
username: username username: username
password: password password: password
``` ```

@ -7,7 +7,7 @@ Find your API key under `Settings > API`.
```yaml ```yaml
widget: widget:
type: changedetectionio type: changedetectionio
url: http://changedetection.host.or.ip:port url: http://changedetection.host.or.ip:port
key: apikeyapikeyapikeyapikeyapikey key: apikeyapikeyapikeyapikeyapikey
``` ```

@ -5,6 +5,6 @@ description: Channels DVR Server Widget Configuration
```yaml ```yaml
widget: widget:
type: channelsdvrserver type: channelsdvrserver
url: http://192.168.1.55:8089 url: http://192.168.1.55:8089
``` ```

@ -9,8 +9,8 @@ Allowed fields: `["status", "origin_ip"]`.
```yaml ```yaml
widget: widget:
type: cloudflared type: cloudflared
accountid: accountid # from zero trust dashboard url e.g. https://one.dash.cloudflare.com/<accountid>/home/quick-start accountid: accountid # from zero trust dashboard url e.g. https://one.dash.cloudflare.com/<accountid>/home/quick-start
tunnelid: tunnelid # found in tunnels dashboard under the tunnel name tunnelid: tunnelid # found in tunnels dashboard under the tunnel name
key: cloudflareapitoken # api token with `Account.Cloudflare Tunnel:Read` https://dash.cloudflare.com/profile/api-tokens key: cloudflareapitoken # api token with `Account.Cloudflare Tunnel:Read` https://dash.cloudflare.com/profile/api-tokens
``` ```

@ -9,18 +9,18 @@ Allowed fields: no configurable fields for this widget.
```yaml ```yaml
widget: widget:
type: coinmarketcap type: coinmarketcap
currency: GBP # Optional currency: GBP # Optional
symbols: [BTC, LTC, ETH] symbols: [BTC, LTC, ETH]
key: apikeyapikeyapikeyapikeyapikey key: apikeyapikeyapikeyapikeyapikey
defaultinterval: 7d # Optional defaultinterval: 7d # Optional
``` ```
You can also specify slugs instead of symbols (since symbols aren't garaunteed to be unique). If you supply both, slugs will be used. For example: You can also specify slugs instead of symbols (since symbols aren't garaunteed to be unique). If you supply both, slugs will be used. For example:
```yaml ```yaml
widget: widget:
type: coinmarketcap type: coinmarketcap
slugs: [chia-network, uniswap] slugs: [chia-network, uniswap]
key: apikeyapikeyapikeyapikeyapikey key: apikeyapikeyapikeyapikeyapikey
``` ```

@ -9,28 +9,28 @@ Fields need to be defined in the `mappings` section YAML object to correlate wit
```yaml ```yaml
widget: widget:
type: customapi type: customapi
url: http://custom.api.host.or.ip:port/path/to/exact/api/endpoint url: http://custom.api.host.or.ip:port/path/to/exact/api/endpoint
refreshInterval: 10000 # optional - in milliseconds, defaults to 10s refreshInterval: 10000 # optional - in milliseconds, defaults to 10s
username: username # auth - optional username: username # auth - optional
password: password # auth - optional password: password # auth - optional
method: GET # optional, e.g. POST method: GET # optional, e.g. POST
headers: # optional, must be object, see below headers: # optional, must be object, see below
mappings: mappings:
- field: key # needs to be YAML string or object - field: key # needs to be YAML string or object
label: Field 1 label: Field 1
format: text # optional - defaults to text format: text # optional - defaults to text
- field: # needs to be YAML string or object - field: # needs to be YAML string or object
path: path:
to: key2 to: key2
format: number # optional - defaults to text format: number # optional - defaults to text
label: Field 2 label: Field 2
- field: # needs to be YAML string or object - field: # needs to be YAML string or object
path: path:
to: to:
another: key3 another: key3
label: Field 3 label: Field 3
format: percent # optional - defaults to text format: percent # optional - defaults to text
``` ```
Supported formats for the values are `text`, `number`, `float`, `percent`, `bytes` and `bitrate`. Supported formats for the values are `text`, `number`, `float`, `percent`, `bytes` and `bitrate`.
@ -41,22 +41,22 @@ For the following JSON object from the API:
```json ```json
{ {
"id": 1, "id": 1,
"name": "Rick Sanchez", "name": "Rick Sanchez",
"status": "Alive", "status": "Alive",
"species": "Human", "species": "Human",
"gender": "Male", "gender": "Male",
"origin": { "origin": {
"name": "Earth (C-137)" "name": "Earth (C-137)"
},
"locations": [
{
"name": "Earth (C-137)"
}, },
"locations": [ {
{ "name": "Citadel of Ricks"
"name": "Earth (C-137)" }
}, ]
{
"name": "Citadel of Ricks"
}
]
} }
``` ```
@ -64,17 +64,17 @@ Define the `mappings` section as an aray, for example:
```yaml ```yaml
mappings: mappings:
- field: name # Rick Sanchez - field: name # Rick Sanchez
label: Name label: Name
- field: status # Alive - field: status # Alive
label: Status label: Status
- field: - field:
origin: name # Earth (C-137) origin: name # Earth (C-137)
label: Origin label: Origin
- field: - field:
locations: locations:
1: name # Citadel of Ricks 1: name # Citadel of Ricks
label: Location label: Location
``` ```
## Data Transformation ## Data Transformation
@ -86,12 +86,12 @@ You can manipulate data with the following tools `remap`, `scale` and `suffix`,
label: Field 4 label: Field 4
format: text format: text
remap: remap:
- value: 0 - value: 0
to: None to: None
- value: 1 - value: 1
to: Connected to: Connected
- any: true # will map all other values - any: true # will map all other values
to: Unknown to: Unknown
- field: key5 - field: key5
label: Power label: Power
format: float format: float
@ -105,5 +105,5 @@ Pass custom headers using the `headers` option, for example:
```yaml ```yaml
headers: headers:
X-API-Token: token X-API-Token: token
``` ```

@ -9,7 +9,7 @@ Allowed fields: `["leech", "download", "seed", "upload"]`.
```yaml ```yaml
widget: widget:
type: deluge type: deluge
url: http://deluge.host.or.ip url: http://deluge.host.or.ip
password: password # webui password password: password # webui password
``` ```

@ -17,9 +17,9 @@ To access these system metrics you need to connect to the DiskStation with an ac
4. On the `Permissions` tab check the top box for `No Access`, effectively prohibiting the user from accessing anything in the shared folders. 4. On the `Permissions` tab check the top box for `No Access`, effectively prohibiting the user from accessing anything in the shared folders.
5. Under `Applications` check the box next to `Deny` in the header to explicitly prohibit login to all applications. 5. Under `Applications` check the box next to `Deny` in the header to explicitly prohibit login to all applications.
6. Now _only_ allow login to the `Download Station` application, either by 6. Now _only_ allow login to the `Download Station` application, either by
- unchecking `Deny` in the respective row, or (if inheriting permission doesn't work because of other group settings) - unchecking `Deny` in the respective row, or (if inheriting permission doesn't work because of other group settings)
- checking `Allow` for this app, or - checking `Allow` for this app, or
- checking `By IP` for this app to limit the source of login attempts to one or more IP addresses/subnets. - checking `By IP` for this app to limit the source of login attempts to one or more IP addresses/subnets.
7. When the `Preview` column shows `Allow` in the `Download Station` row, click `Save`. 7. When the `Preview` column shows `Allow` in the `Download Station` row, click `Save`.
Now configure the widget with the correct login information and test it. Now configure the widget with the correct login information and test it.
@ -28,9 +28,9 @@ If you encounter issues during testing, make sure to uncheck the option for auto
```yaml ```yaml
widget: widget:
type: diskstation type: diskstation
url: http://diskstation.host.or.ip:port url: http://diskstation.host.or.ip:port
username: username username: username
password: password password: password
volume: volume_N # optional volume: volume_N # optional
``` ```

@ -9,8 +9,8 @@ Allowed fields: `["leech", "download", "seed", "upload"]`.
```yaml ```yaml
widget: widget:
type: downloadstation type: downloadstation
url: http://downloadstation.host.or.ip:port url: http://downloadstation.host.or.ip:port
username: username username: username
password: password password: password
``` ```

@ -9,9 +9,9 @@ As of v0.6.11 the widget supports fields `["movies", "series", "episodes", "song
```yaml ```yaml
widget: widget:
type: emby type: emby
url: http://emby.host.or.ip url: http://emby.host.or.ip
key: apikeyapikeyapikeyapikeyapikey key: apikeyapikeyapikeyapikeyapikey
enableBlocks: true # optional, defaults to false enableBlocks: true # optional, defaults to false
enableNowPlaying: true # optional, defaults to true enableNowPlaying: true # optional, defaults to true
``` ```

@ -7,6 +7,6 @@ Allowed fields: `["pv_power", "grid_power", "home_power", "charge_power]`.
```yaml ```yaml
widget: widget:
type: evcc type: evcc
url: http://evcc.host.or.ip:port url: http://evcc.host.or.ip:port
``` ```

@ -7,6 +7,6 @@ Allowed fields: `["queue", "processing", "processed", "time"]`.
```yaml ```yaml
widget: widget:
type: fileflows type: fileflows
url: http://your.fileflows.host:port url: http://your.fileflows.host:port
``` ```

@ -7,8 +7,8 @@ Allowed fields: `["leech", "download", "seed", "upload"]`.
```yaml ```yaml
widget: widget:
type: flood type: flood
url: http://flood.host.or.ip url: http://flood.host.or.ip
username: username # if set username: username # if set
password: password # if set password: password # if set
``` ```

@ -9,8 +9,8 @@ Allowed fields: `["subscriptions", "unread"]`.
```yaml ```yaml
widget: widget:
type: freshrss type: freshrss
url: http://freshrss.host.or.ip:port url: http://freshrss.host.or.ip:port
username: username username: username
password: password password: password
``` ```

@ -9,7 +9,7 @@ Allowed fields (limited to a max of 4): `["status", "name", "map", "currentPlaye
```yaml ```yaml
widget: widget:
type: gamedig type: gamedig
serverType: csgo # see https://github.com/gamedig/node-gamedig#games-list serverType: csgo # see https://github.com/gamedig/node-gamedig#games-list
url: udp://server.host.or.ip:port url: udp://server.host.or.ip:port
``` ```

@ -17,7 +17,7 @@ Allowed fields: `["gross_percent_today", "gross_percent_1y", "gross_percent_max"
```yaml ```yaml
widget: widget:
type: ghostfolio type: ghostfolio
url: http://ghostfoliohost:port url: http://ghostfoliohost:port
key: ghostfoliobearertoken key: ghostfoliobearertoken
``` ```

@ -9,6 +9,6 @@ Allowed fields: `["public_ip", "region", "country"]`.
```yaml ```yaml
widget: widget:
type: gluetun type: gluetun
url: http://gluetun.host.or.ip url: http://gluetun.host.or.ip
``` ```

@ -9,7 +9,7 @@ Allowed fields: `["apps", "clients", "messages"]`.
```yaml ```yaml
widget: widget:
type: gotify type: gotify
url: http://gotify.host.or.ip url: http://gotify.host.or.ip
key: clientoken key: clientoken
``` ```

@ -7,8 +7,8 @@ Allowed fields: `["dashboards", "datasources", "totalalerts", "alertstriggered"]
```yaml ```yaml
widget: widget:
type: grafana type: grafana
url: http://grafana.host.or.ip:port url: http://grafana.host.or.ip:port
username: username username: username
password: password password: password
``` ```

@ -7,6 +7,6 @@ Allowed fields: `["channels", "hd"]`.
```yaml ```yaml
widget: widget:
type: hdhomerun type: hdhomerun
url: http://hdhomerun.host.or.ip url: http://hdhomerun.host.or.ip
``` ```

@ -13,8 +13,8 @@ Allowed fields: `["status", "last_ping"]`.
```yaml ```yaml
widget: widget:
type: healthchecks type: healthchecks
url: http://healthchecks.host.or.ip:port url: http://healthchecks.host.or.ip:port
key: <YOUR_API_KEY> key: <YOUR_API_KEY>
uuid: <YOUR_CHECK_UUID> uuid: <YOUR_CHECK_UUID>
``` ```

@ -12,25 +12,25 @@ Allowed fields: `["people_home", "lights_on", "switches_on"]`.
Up to a maximum of four custom states and/or templates can be queried via the `custom` property like in the example below. Up to a maximum of four custom states and/or templates can be queried via the `custom` property like in the example below.
The `custom` property will have no effect as long as the `fields` property is defined. The `custom` property will have no effect as long as the `fields` property is defined.
- `state` will query the state of the specified `entity_id` - `state` will query the state of the specified `entity_id`
- state labels and values can be user defined and may reference entity attributes in curly brackets - state labels and values can be user defined and may reference entity attributes in curly brackets
- if no state label is defined it will default to `"{attributes.friendly_name}"` - if no state label is defined it will default to `"{attributes.friendly_name}"`
- if no state value is defined it will default to `"{state} {attributes.unit_of_measurement}"` - if no state value is defined it will default to `"{state} {attributes.unit_of_measurement}"`
- `template` will query the specified template, see (Home Assistant Templating)[https://www.home-assistant.io/docs/configuration/templating] - `template` will query the specified template, see (Home Assistant Templating)[https://www.home-assistant.io/docs/configuration/templating]
- if no template label is defined it will be empty - if no template label is defined it will be empty
```yaml ```yaml
widget: widget:
type: homeassistant type: homeassistant
url: http://homeassistant.host.or.ip:port url: http://homeassistant.host.or.ip:port
key: access_token key: access_token
custom: custom:
- state: sensor.total_power - state: sensor.total_power
- state: sensor.total_energy_today - state: sensor.total_energy_today
label: energy today label: energy today
- template: "{{ states.switch|selectattr('state','equalto','on')|list|length }}" - template: "{{ states.switch|selectattr('state','equalto','on')|list|length }}"
label: switches on label: switches on
- state: weather.forecast_home - state: weather.forecast_home
label: wind speed label: wind speed
value: "{attributes.wind_speed} {attributes.wind_speed_unit}" value: "{attributes.wind_speed} {attributes.wind_speed_unit}"
``` ```

@ -9,8 +9,8 @@ Allowed fields: `["updates", "child_bridges"]`.
```yaml ```yaml
widget: widget:
type: homebridge type: homebridge
url: http://homebridge.host.or.ip:port url: http://homebridge.host.or.ip:port
username: username username: username
password: password password: password
``` ```

@ -9,7 +9,7 @@ Note that API key must be from admin user.
```yaml ```yaml
widget: widget:
type: immich type: immich
url: http://immich.host.or.ip url: http://immich.host.or.ip
key: adminapikeyadminapikeyadminapikey key: adminapikeyadminapikeyadminapikey
``` ```

@ -9,6 +9,6 @@ Allowed fields: `["configured", "errored"]`.
```yaml ```yaml
widget: widget:
type: jackett type: jackett
url: http://jackett.host.or.ip url: http://jackett.host.or.ip
``` ```

@ -9,8 +9,8 @@ Allowed fields: `["downloadCount", "downloadTotalBytes","downloadBytesRemaining"
```yaml ```yaml
widget: widget:
type: jdownloader type: jdownloader
username: JDownloader Username username: JDownloader Username
password: JDownloader Password password: JDownloader Password
client: Name of JDownloader Instance client: Name of JDownloader Instance
``` ```

@ -9,9 +9,9 @@ As of v0.6.11 the widget supports fields `["movies", "series", "episodes", "song
```yaml ```yaml
widget: widget:
type: jellyfin type: jellyfin
url: http://jellyfin.host.or.ip url: http://jellyfin.host.or.ip
key: apikeyapikeyapikeyapikeyapikey key: apikeyapikeyapikeyapikeyapikey
enableBlocks: true # optional, defaults to false enableBlocks: true # optional, defaults to false
enableNowPlaying: true # optional, defaults to true enableNowPlaying: true # optional, defaults to true
``` ```

@ -9,7 +9,7 @@ Allowed fields: `["pending", "approved", "available"]`.
```yaml ```yaml
widget: widget:
type: jellyseerr type: jellyseerr
url: http://jellyseerr.host.or.ip url: http://jellyseerr.host.or.ip
key: apikeyapikeyapikeyapikeyapikey key: apikeyapikeyapikeyapikeyapikey
``` ```

@ -9,8 +9,8 @@ Allowed fields: `["seriesCount", "totalFiles"]`.
```yaml ```yaml
widget: widget:
type: kavita type: kavita
url: http://kavita.host.or.ip:port url: http://kavita.host.or.ip:port
username: username username: username
password: password password: password
``` ```

@ -9,8 +9,8 @@ Allowed fields: `["libraries", "series", "books"]`.
```yaml ```yaml
widget: widget:
type: komga type: komga
url: http://komga.host.or.ip:port url: http://komga.host.or.ip:port
username: username username: username
password: password password: password
``` ```

@ -9,10 +9,10 @@ You may optionally pass values for `snapshotHost` and / or `snapshotPath` to sel
```yaml ```yaml
widget: widget:
type: kopia type: kopia
url: http://kopia.host.or.ip:port url: http://kopia.host.or.ip:port
username: username username: username
password: password password: password
snapshotHost: hostname # optional snapshotHost: hostname # optional
snapshotPath: path # optional snapshotPath: path # optional
``` ```

@ -9,7 +9,7 @@ Allowed fields: `["wanted", "queued", "artists"]`.
```yaml ```yaml
widget: widget:
type: lidarr type: lidarr
url: http://lidarr.host.or.ip url: http://lidarr.host.or.ip
key: apikeyapikeyapikeyapikeyapikey key: apikeyapikeyapikeyapikeyapikey
``` ```

@ -9,6 +9,6 @@ Allowed fields: `["user_count", "status_count", "domain_count"]`.
```yaml ```yaml
widget: widget:
type: mastodon type: mastodon
url: https://mastodon.host.name url: https://mastodon.host.name
``` ```

@ -9,7 +9,7 @@ Allowed fields: `["recipes", "users", "categories", "tags"]`.
```yaml ```yaml
widget: widget:
type: mealie type: mealie
url: http://mealie-frontend.host.or.ip url: http://mealie-frontend.host.or.ip
key: mealieapitoken key: mealieapitoken
``` ```

@ -7,7 +7,7 @@ Allowed fields: `["wanted", "queued", "series"]`.
```yaml ```yaml
widget: widget:
type: medusa type: medusa
url: http://medusa.host.or.ip:port url: http://medusa.host.or.ip:port
key: medusaapikeyapikeyapikeyapikeyapikey key: medusaapikeyapikeyapikeyapikeyapikey
``` ```

@ -9,8 +9,8 @@ Allowed fields: `["uptime", "cpuLoad", "memoryUsed", "numberOfLeases"]`.
```yaml ```yaml
widget: widget:
type: mikrotik type: mikrotik
url: https://mikrotik.host.or.ip url: https://mikrotik.host.or.ip
username: username username: username
password: password password: password
``` ```

@ -7,6 +7,6 @@ Allowed fields: `["players", "version", "status"]`.
```yaml ```yaml
widget: widget:
type: minecraft type: minecraft
url: udp://minecraftserveripordomain:port url: udp://minecraftserveripordomain:port
``` ```

@ -9,7 +9,7 @@ Allowed fields: `["unread", "read"]`.
```yaml ```yaml
widget: widget:
type: miniflux type: miniflux
url: http://miniflux.host.or.ip:port url: http://miniflux.host.or.ip:port
key: minifluxapikey key: minifluxapikey
``` ```

@ -9,6 +9,6 @@ Pass the stream URL from a service like [µStreamer](https://github.com/pikvm/us
```yaml ```yaml
widget: widget:
type: mjpeg type: mjpeg
stream: http://mjpeg.host.or.ip/webcam/stream stream: http://mjpeg.host.or.ip/webcam/stream
``` ```

@ -7,6 +7,6 @@ Allowed fields: `["printer_state", "print_status", "print_progress", "layers"]`.
```yaml ```yaml
widget: widget:
type: moonraker type: moonraker
url: http://moonraker.host.or.ip:port url: http://moonraker.host.or.ip:port
``` ```

@ -9,7 +9,7 @@ Allowed fields: `["series", "issues", "wanted"]`.
```yaml ```yaml
widget: widget:
type: mylar type: mylar
url: http://mylar3.host.or.ip:port url: http://mylar3.host.or.ip:port
key: yourmylar3apikey key: yourmylar3apikey
``` ```

@ -9,9 +9,9 @@ Allowed fields: no configurable fields for this widget.
```yaml ```yaml
widget: widget:
type: navidrome type: navidrome
url: http://navidrome.host.or.ip:port url: http://navidrome.host.or.ip:port
user: username user: username
token: token #md5(password + salt) token: token #md5(password + salt)
salt: randomsalt salt: randomsalt
``` ```

@ -11,15 +11,15 @@ Note "cpuload" and "memoryusage" were deprecated in v0.6.18 and a maximum of 4 f
```yaml ```yaml
widget: widget:
type: nextcloud type: nextcloud
url: https://nextcloud.host.or.ip:port url: https://nextcloud.host.or.ip:port
key: token key: token
``` ```
```yaml ```yaml
widget: widget:
type: nextcloud type: nextcloud
url: https://nextcloud.host.or.ip:port url: https://nextcloud.host.or.ip:port
username: username username: username
password: password password: password
``` ```

@ -7,7 +7,7 @@ Api key is found under Account > API, profile ID is found under Setup > Endpoint
```yaml ```yaml
widget: widget:
type: nextdns type: nextdns
profile: profileid profile: profileid
key: yourapikeyhere key: yourapikeyhere
``` ```

@ -9,8 +9,8 @@ Allowed fields: `["enabled", "disabled", "total"]`.
```yaml ```yaml
widget: widget:
type: npm type: npm
url: http://npm.host.or.ip url: http://npm.host.or.ip
username: admin_username username: admin_username
password: admin_password password: admin_password
``` ```

@ -9,8 +9,8 @@ Allowed fields: `["rate", "remaining", "downloaded"]`.
```yaml ```yaml
widget: widget:
type: nzbget type: nzbget
url: http://nzbget.host.or.ip url: http://nzbget.host.or.ip
username: controlusername username: controlusername
password: controlpassword password: controlpassword
``` ```

@ -7,7 +7,7 @@ Allowed fields: `["printer_state", "temp_tool", "temp_bed", "job_completion"]`.
```yaml ```yaml
widget: widget:
type: octoprint type: octoprint
url: http://octoprint.host.or.ip:port url: http://octoprint.host.or.ip:port
key: youroctoprintapikey key: youroctoprintapikey
``` ```

@ -9,9 +9,9 @@ Allowed fields: `["connectedAp", "activeUser", "alerts", "connectedGateways", "c
```yaml ```yaml
widget: widget:
type: omada type: omada
url: http://omada.host.or.ip:port url: http://omada.host.or.ip:port
username: username username: username
password: password password: password
site: sitename site: sitename
``` ```

@ -9,7 +9,7 @@ Allowed fields: `["pending", "approved", "available"]`.
```yaml ```yaml
widget: widget:
type: ombi type: ombi
url: http://ombi.host.or.ip url: http://ombi.host.or.ip
key: apikeyapikeyapikeyapikeyapikey key: apikeyapikeyapikeyapikeyapikey
``` ```

@ -7,6 +7,6 @@ Allowed fields: `["yieldDay", "relativePower", "absolutePower", "limit"]`.
```yaml ```yaml
widget: widget:
type: opendtu type: opendtu
url: http://opendtu.host.or.ip url: http://opendtu.host.or.ip
``` ```

@ -7,11 +7,11 @@ Provides useful information from your OpenMediaVault
```yaml ```yaml
widget: widget:
type: openmediavault type: openmediavault
url: http://omv.host.or.ip url: http://omv.host.or.ip
username: admin username: admin
password: pass password: pass
method: services.getStatus # required method: services.getStatus # required
``` ```
## Methods ## Methods

@ -5,8 +5,8 @@ description: OPNSense Widget Configuration
The API key & secret can be generated via the webui by creating a new user at _System/Access/Users_. Ensure "Generate a scrambled password to prevent local database logins for this user" is checked and then edit the effective privileges selecting **only**: The API key & secret can be generated via the webui by creating a new user at _System/Access/Users_. Ensure "Generate a scrambled password to prevent local database logins for this user" is checked and then edit the effective privileges selecting **only**:
- Diagnostics: System Activity - Diagnostics: System Activity
- Status: Traffic Graph - Status: Traffic Graph
Finally, create a new API key which will download an `apikey.txt` file with your key and secret in it. Use the values as the username and password fields, respectively, in your homepage config. Finally, create a new API key which will download an `apikey.txt` file with your key and secret in it. Use the values as the username and password fields, respectively, in your homepage config.
@ -14,8 +14,8 @@ Allowed fields: `["cpu", "memory", "wanUpload", "wanDownload"]`.
```yaml ```yaml
widget: widget:
type: opnsense type: opnsense
url: http://opnsense.host.or.ip url: http://opnsense.host.or.ip
username: key username: key
password: secret password: secret
``` ```

@ -9,7 +9,7 @@ Allowed fields: `["pending", "approved", "available", "processing"]`.
```yaml ```yaml
widget: widget:
type: overseerr type: overseerr
url: http://overseerr.host.or.ip url: http://overseerr.host.or.ip
key: apikeyapikeyapikeyapikeyapikey key: apikeyapikeyapikeyapikeyapikey
``` ```

@ -9,15 +9,15 @@ Allowed fields: `["total", "inbox"]`.
```yaml ```yaml
widget: widget:
type: paperlessngx type: paperlessngx
url: http://paperlessngx.host.or.ip:port url: http://paperlessngx.host.or.ip:port
username: username username: username
password: password password: password
``` ```
```yaml ```yaml
widget: widget:
type: paperlessngx type: paperlessngx
url: http://paperlessngx.host.or.ip:port url: http://paperlessngx.host.or.ip:port
key: token key: token
``` ```

@ -17,9 +17,9 @@ Allowed fields: `["load", "memory", "temp", "wanStatus", "wanIP", "disk"]` (maxi
```yaml ```yaml
widget: widget:
type: pfsense type: pfsense
url: http://pfsense.host.or.ip:port url: http://pfsense.host.or.ip:port
username: user username: user
password: pass password: pass
wan: igb0 wan: igb0
``` ```

@ -7,8 +7,8 @@ Allowed fields: `["albums", "photos", "videos", "people"]`.
```yaml ```yaml
widget: widget:
type: photoprism type: photoprism
url: http://photoprism.host.or.ip:port url: http://photoprism.host.or.ip:port
username: admin username: admin
password: password password: password
``` ```

@ -9,6 +9,6 @@ Allowed fields: `["total", "connected", "new_devices", "down_alerts"]`.
```yaml ```yaml
widget: widget:
type: pialert type: pialert
url: http://ip:port url: http://ip:port
``` ```

@ -9,9 +9,9 @@ Allowed fields: `["queries", "blocked", "blocked_percent", "gravity"]`.
```yaml ```yaml
widget: widget:
type: pihole type: pihole
url: http://pi.hole.or.ip url: http://pi.hole.or.ip
key: yourpiholeapikey # optional key: yourpiholeapikey # optional
``` ```
_Added in v0.1.0, udpated in v0.6.18_ _Added in v0.1.0, udpated in v0.6.18_

@ -9,7 +9,7 @@ Allowed fields: no configurable fields for this widget.
```yaml ```yaml
widget: widget:
type: tautulli type: tautulli
url: http://tautulli.host.or.ip url: http://tautulli.host.or.ip
key: apikeyapikeyapikeyapikeyapikey key: apikeyapikeyapikeyapikeyapikey
``` ```

@ -9,7 +9,7 @@ Allowed fields: `["streams", "albums", "movies", "tv"]`.
```yaml ```yaml
widget: widget:
type: plex type: plex
url: http://plex.host.or.ip:32400 url: http://plex.host.or.ip:32400
key: mytokenhere # see https://www.plexopedia.com/plex-media-server/general/plex-token/ key: mytokenhere # see https://www.plexopedia.com/plex-media-server/general/plex-token/
``` ```

@ -9,8 +9,8 @@ Allowed fields: `["running", "stopped", "total"]`.
```yaml ```yaml
widget: widget:
type: portainer type: portainer
url: https://portainer.host.or.ip:9443 url: https://portainer.host.or.ip:9443
env: 1 env: 1
key: ptr_accesskeyaccesskeyaccesskeyaccesskey key: ptr_accesskeyaccesskeyaccesskeyaccesskey
``` ```

@ -7,6 +7,6 @@ Allowed fields: `["targets_up", "targets_down", "targets_total"]`
```yaml ```yaml
widget: widget:
type: prometheus type: prometheus
url: http://prometheushost:port url: http://prometheushost:port
``` ```

@ -9,7 +9,7 @@ Allowed fields: `["numberOfGrabs", "numberOfQueries", "numberOfFailGrabs", "numb
```yaml ```yaml
widget: widget:
type: prowlarr type: prowlarr
url: http://prowlarr.host.or.ip url: http://prowlarr.host.or.ip
key: apikeyapikeyapikeyapikeyapikey key: apikeyapikeyapikeyapikeyapikey
``` ```

@ -13,15 +13,15 @@ You will need to generate an API Token for new or an existing user. Here is an e
4. Name the group something informative, like api-ro-users 4. Name the group something informative, like api-ro-users
5. Click on the Permissions "folder" 5. Click on the Permissions "folder"
6. Click Add -> Group Permission 6. Click Add -> Group Permission
- Path: / - Path: /
- Group: group from bullet 4 above - Group: group from bullet 4 above
- Role: PVEAuditor - Role: PVEAuditor
- Propagate: Checked - Propagate: Checked
7. Expand Permissions, click on Users 7. Expand Permissions, click on Users
8. Click the Add button 8. Click the Add button
- User name: something informative like `api` - User name: something informative like `api`
- Realm: Linux PAM standard authentication - Realm: Linux PAM standard authentication
- Group: group from bullet 4 above - Group: group from bullet 4 above
9. Expand Permissions, click on API Tokens 9. Expand Permissions, click on API Tokens
10. Click the Add button 10. Click the Add button
- User: user from bullet 8 above - User: user from bullet 8 above
@ -42,9 +42,9 @@ You can set the optional `node` setting when you want to show metrics for a sing
```yaml ```yaml
widget: widget:
type: proxmox type: proxmox
url: https://proxmox.host.or.ip:8006 url: https://proxmox.host.or.ip:8006
username: api_token_id username: api_token_id
password: api_token_secret password: api_token_secret
node: pve-1 # optional node: pve-1 # optional
``` ```

@ -7,8 +7,8 @@ Allowed fields: `["datastore_usage", "failed_tasks_24h", "cpu_usage", "memory_us
```yaml ```yaml
widget: widget:
type: proxmoxbackupserver type: proxmoxbackupserver
url: https://proxmoxbackupserver.host:port url: https://proxmoxbackupserver.host:port
username: api_token_id username: api_token_id
password: api_token_secret password: api_token_secret
``` ```

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save