Compare commits

..

28 Commits

Author SHA1 Message Date
dependabot[bot]
132d8f4f6b Chore(deps-dev): Bump tailwindcss from 3.4.10 to 3.4.13 (#4048)
Bumps [tailwindcss](https://github.com/tailwindlabs/tailwindcss) from 3.4.10 to 3.4.13.
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/v3.4.13/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/compare/v3.4.10...v3.4.13)

---
updated-dependencies:
- dependency-name: tailwindcss
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-26 08:07:28 -07:00
dependabot[bot]
c085cf1e72 Chore(deps-dev): Bump eslint-plugin-react from 7.35.2 to 7.36.1 (#4050)
Bumps [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) from 7.35.2 to 7.36.1.
- [Release notes](https://github.com/jsx-eslint/eslint-plugin-react/releases)
- [Changelog](https://github.com/jsx-eslint/eslint-plugin-react/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jsx-eslint/eslint-plugin-react/compare/v7.35.2...v7.36.1)

---
updated-dependencies:
- dependency-name: eslint-plugin-react
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-26 08:07:20 -07:00
shamoon
ebb1a50e3f Move ci stuff to dev branch 2024-09-26 08:06:27 -07:00
github-actions[bot]
8f82976fe5 New Crowdin translations by GitHub Action (#3980)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
2024-09-26 08:00:50 -07:00
Tarow
6da46dd3b1 Fix: Support Gluetun widget auth (#4034)
Some checks failed
Docs / Linting Checks (push) Has been cancelled
Docker / Linting Checks (push) Has been cancelled
Docker / Docker Build & Push (push) Has been cancelled
Docs / Test Build (push) Has been cancelled
Docs / Build & Deploy (push) Has been cancelled
2024-09-24 11:15:46 -07:00
shamoon
5fc3bdee08 Create CNAME 2024-09-24 09:16:18 -07:00
shamoon
bcc867323f Try to fix docs-publish 2024-09-24 09:02:45 -07:00
shamoon
a46a234b76 Fix otudated links 2024-09-24 08:46:19 -07:00
shamoon
f0df2122de Fix some docs errors 2024-09-24 08:45:03 -07:00
shamoon
ce695850bd Remove mike 2024-09-24 08:26:53 -07:00
shamoon
8c12afced5 Feature: LubeLogger service widget (#4031)
Some checks are pending
Docker / Linting Checks (push) Waiting to run
Docker / Docker Build & Push (push) Blocked by required conditions
Docs / Linting Checks (push) Waiting to run
Docs / Test Build (push) Blocked by required conditions
Docs / Build & Deploy (push) Blocked by required conditions
2024-09-23 23:25:12 -07:00
shamoon
8c1e50d9e7 Enhancement: support photoprism app passwords (#4028)
Some checks are pending
Docker / Linting Checks (push) Waiting to run
Docker / Docker Build & Push (push) Blocked by required conditions
Docs / Linting Checks (push) Waiting to run
Docs / Test Build (push) Blocked by required conditions
Docs / Build & Deploy (push) Blocked by required conditions
2024-09-23 14:32:36 -07:00
jaygz316
20f5134606 Documentation: update mdi link (#4022)
Some checks are pending
Docs / Linting Checks (push) Waiting to run
Docs / Test Build (push) Blocked by required conditions
Docs / Build & Deploy (push) Blocked by required conditions
2024-09-22 18:01:01 -07:00
Bazooka4207
facc98018b Documentation: add changedetection.io fields (#4018)
Some checks failed
Docs / Linting Checks (push) Has been cancelled
Docs / Test Build (push) Has been cancelled
Docs / Build & Deploy (push) Has been cancelled
2024-09-20 16:44:04 -07:00
shamoon
581828d49a Enhancement: reduce properties retrieved from mikrotik endpoint (#3996)
Some checks failed
Docker / Linting Checks (push) Has been cancelled
Docs / Linting Checks (push) Has been cancelled
Docker / Docker Build & Push (push) Has been cancelled
Docs / Test Build (push) Has been cancelled
Docs / Build & Deploy (push) Has been cancelled
2024-09-14 23:36:24 -07:00
shamoon
587027df37 Enhancement: support pihole v6 with api auth disabled (#3995) 2024-09-14 23:32:56 -07:00
Simon
85736c55c9 Feature: mailcow widget (#3993)
Some checks are pending
Docker / Linting Checks (push) Waiting to run
Docker / Docker Build & Push (push) Blocked by required conditions
Docs / Linting Checks (push) Waiting to run
Docs / Test Build (push) Blocked by required conditions
Docs / Build & Deploy (push) Blocked by required conditions
---------

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2024-09-14 07:59:41 -07:00
shamoon
1f47ee8f11 Fix carbon ads light mode text contrast
Some checks failed
Docs / Linting Checks (push) Has been cancelled
Docs / Test Build (push) Has been cancelled
Docs / Build & Deploy (push) Has been cancelled
2024-09-12 22:50:51 -07:00
shamoon
1eb6ac6d90 Enhancement: support another ghostfolio breaking API change (#3987)
Some checks failed
Docker / Linting Checks (push) Has been cancelled
Docker / Docker Build & Push (push) Has been cancelled
2024-09-12 13:19:18 -07:00
Bobby Driggs
295c6ea796 Fix: Technitium widget percentage display (#3984)
Some checks are pending
Docker / Linting Checks (push) Waiting to run
Docker / Docker Build & Push (push) Blocked by required conditions
---------

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
2024-09-11 18:14:49 -07:00
moritz-john
68c2b04090 Documentation: fix mkdocs admonition in unraid.md (#3983)
Some checks failed
Docker / Linting Checks (push) Waiting to run
Docker / Docker Build & Push (push) Blocked by required conditions
Docs / Linting Checks (push) Has been cancelled
Docs / Test Build (push) Has been cancelled
Docs / Build & Deploy (push) Has been cancelled
2024-09-11 13:04:32 -07:00
Ben Phelps
1494458ba6 remove nested ternary expression 2024-09-11 16:52:56 +03:00
Ben Phelps
f7086c8aa3 fix type in last docs update
Some checks are pending
Docker / Linting Checks (push) Waiting to run
Docker / Docker Build & Push (push) Blocked by required conditions
Docs / Linting Checks (push) Waiting to run
Docs / Test Build (push) Blocked by required conditions
Docs / Build & Deploy (push) Blocked by required conditions
2024-09-11 15:20:23 +03:00
Ben Phelps
59ccc90b2f add selfh.st icons docs 2024-09-11 15:18:21 +03:00
Ben Phelps
1e9e911877 better handle the full selfh.st icon set 2024-09-11 15:13:36 +03:00
Ben Phelps
dc67024be2 fix light mode ad text contrast 2024-09-11 15:00:20 +03:00
Ben Phelps
b3591c3e69 add selfh.st icon set 2024-09-11 14:45:49 +03:00
shamoon
9243187490 Fix: handle proxmoxbackupserver without datastore (#3979)
Some checks are pending
Docker / Linting Checks (push) Waiting to run
Docker / Docker Build & Push (push) Blocked by required conditions
2024-09-10 13:11:08 -07:00
87 changed files with 1029 additions and 195 deletions

View File

@@ -4,7 +4,7 @@ body:
value: |
### ⚠️ Before opening a discussion:
- [Check the troubleshooting guide](https://gethomepage.dev/latest/troubleshooting/).
- [Check the troubleshooting guide](https://gethomepage.dev/troubleshooting/).
- [Search 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
@@ -51,6 +51,6 @@ body:
id: troubleshooting
attributes:
label: Troubleshooting
description: Please include output from your [troubleshooting tests](https://gethomepage.dev/latest/more/troubleshooting/#service-widget-errors), if relevant.
description: Please include output from your [troubleshooting tests](https://gethomepage.dev/more/troubleshooting/#service-widget-errors), if relevant.
validations:
required: true

View File

@@ -3,7 +3,7 @@
<!--
Please include a summary of the change. Screenshots and/or videos can also be helpful if appropriate.
*** Please see the development guidelines for new widgets: https://gethomepage.dev/latest/more/development/#service-widget-guidelines
*** Please see the development guidelines for new widgets: https://gethomepage.dev/more/development/#service-widget-guidelines
*** If you do not follow these guidelines your PR will likely be closed without review.
New service widgets should include example(s) of relevant API output as well as updates to the docs for the new widget.
@@ -26,6 +26,6 @@ What type of change does your PR introduce to Homepage?
## Checklist:
- [ ] If applicable, I have added corresponding documentation changes.
- [ ] If applicable, I have reviewed the [feature](https://gethomepage.dev/latest/more/development/#new-feature-guidelines) and / or [service widget guidelines](https://gethomepage.dev/latest/more/development/#service-widget-guidelines).
- [ ] I have checked that all code style checks pass using [pre-commit hooks](https://gethomepage.dev/latest/more/development/#code-formatting-with-pre-commit-hooks) and [linting checks](https://gethomepage.dev/latest/more/development/#code-linting).
- [ ] If applicable, I have reviewed the [feature](https://gethomepage.dev/more/development/#new-feature-guidelines) and / or [service widget guidelines](https://gethomepage.dev/more/development/#service-widget-guidelines).
- [ ] I have checked that all code style checks pass using [pre-commit hooks](https://gethomepage.dev/more/development/#code-formatting-with-pre-commit-hooks) and [linting checks](https://gethomepage.dev/more/development/#code-linting).
- [ ] If applicable, I have tested my code for new features & regressions on both mobile & desktop devices, using the latest version of major browsers.

View File

@@ -8,7 +8,7 @@ on:
paths: [
'/public/locales/en/**',
]
branches: [ main ]
branches: [ dev ]
jobs:
synchronize-with-crowdin:
@@ -23,8 +23,8 @@ jobs:
with:
upload_translations: false
download_translations: true
crowdin_branch_name: main
localization_branch_name: l10n_main
crowdin_branch_name: dev
localization_branch_name: l10n_dev
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}

View File

@@ -12,13 +12,14 @@ on:
branches:
- main
- feature/**
- dev
# Publish semver tags as releases.
tags: [ 'v*.*.*' ]
paths-ignore:
- 'docs/**'
- 'mkdocs.yml'
pull_request:
branches: [ "main" ]
branches: [ "dev" ]
paths-ignore:
- 'docs/**'
- 'mkdocs.yml'

View File

@@ -50,7 +50,6 @@ jobs:
restore-keys: |
mkdocs-material-
- run: sudo apt-get install pngquant
- run: pip install mike
- run: pip install mkdocs-material mkdocs-redirects "mkdocs-material[imaging]"
- name: Test Docs Build
run: MKINSIDERS=false mkdocs build
@@ -62,8 +61,10 @@ jobs:
- pre-commit
steps:
- uses: actions/checkout@v4
with:
ref: main
- name: Configure Git Credentials
run: |
git config user.name github-actions[bot]
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
- uses: actions/setup-python@v5
with:
python-version: 3.x
@@ -75,24 +76,9 @@ jobs:
restore-keys: |
mkdocs-material-
- run: sudo apt-get install pngquant
- run: pip install mike==2.0.0
- run: pip install git+https://${GH_TOKEN}@github.com/benphelps/mkdocs-material-insiders.git
- run: pip install mkdocs-redirects "mkdocs-material[imaging]"
- name: Set Git config
run: |
git config --global user.name "GitHub Action"
git config --global user.email "action@github.com"
- name: Sync gh-pages
run: |
git fetch origin gh-pages
git checkout gh-pages
git pull origin gh-pages
git checkout main
- name: Docs Deploy for Main
if: github.ref == 'refs/heads/main'
run: MKINSIDERS=true mike deploy --update --push ${{github.ref_name}}
- name: Docs Deploy for Tags
if: github.ref != 'refs/heads/main'
run: MKINSIDERS=true mike deploy --update --push ${{github.ref_name}} latest
- name: Docs Deploy
run: MKINSIDERS=true mkdocs gh-deploy --force
env:
GH_TOKEN: ${{ secrets.GH_TOKEN }}

View File

@@ -38,11 +38,11 @@ People _love_ thorough bug reports. I'm not even kidding.
## 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/more/development/) and specifically the [guidelines for new service widgets](https://gethomepage.dev/more/development/#service-widget-guidelines) if you are considering making one.
## Use a Consistent Coding Style
Please see information in the docs regarding [code formatting with pre-commit hooks](https://gethomepage.dev/latest/more/development/#code-formatting-with-pre-commit-hooks).
Please see information in the docs regarding [code formatting with pre-commit hooks](https://gethomepage.dev/more/development/#code-formatting-with-pre-commit-hooks).
## License

View File

@@ -20,7 +20,7 @@
&nbsp;
<a href="https://discord.gg/k4ruYNrudu"><img alt="Discord" src="https://img.shields.io/discord/1019316731635834932"></a>
&nbsp;
<a href="http://gethomepage.dev/latest/" title="Docs"><img title="Docs" src="https://github.com/gethomepage/homepage/actions/workflows/docs-publish.yml/badge.svg"/></a>
<a href="https://gethomepage.dev/" title="Docs"><img title="Docs" src="https://github.com/gethomepage/homepage/actions/workflows/docs-publish.yml/badge.svg"/></a>
&nbsp;
<a href="https://paypal.me/phelpsben" title="Donate"><img alt="GitHub Sponsors" src="https://img.shields.io/github/sponsors/benphelps"></a>
</p>
@@ -48,19 +48,19 @@ 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 Service Discovery](https://gethomepage.dev/latest/configs/docker/#automatic-service-discovery) 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/configs/docker/#automatic-service-discovery) page for more information.
## Service Widgets
Homepage also has support for over 100 3rd party services, including all popular starr apps, and most popular self-hosted apps. Some examples include: Radarr, Sonarr, Lidarr, Bazarr, Ombi, Tautulli, Plex, Jellyfin, Emby, Transmission, qBittorrent, Deluge, Jackett, NZBGet, SABnzbd, etc. As well as service integrations, Homepage also has a number of information providers, sourcing information from a variety of external 3rd party APIs. See the [Service](https://gethomepage.dev/latest/widgets/) page for more information.
Homepage also has support for over 100 3rd party services, including all popular starr apps, and most popular self-hosted apps. Some examples include: Radarr, Sonarr, Lidarr, Bazarr, Ombi, Tautulli, Plex, Jellyfin, Emby, Transmission, qBittorrent, Deluge, Jackett, NZBGet, SABnzbd, etc. As well as service integrations, Homepage also has a number of information providers, sourcing information from a variety of external 3rd party APIs. See the [Service](https://gethomepage.dev/widgets/) page for more information.
## Information Widgets
Homepage has built-in support for a number of information providers, including weather, time, date, search, glances and more. System and status information presented at the top of the page. See the [Information Providers](https://gethomepage.dev/latest/widgets/) page for more information.
Homepage has built-in support for a number of information providers, including weather, time, date, search, glances and more. System and status information presented at the top of the page. See the [Information Providers](https://gethomepage.dev/widgets/) page for more information.
## Customization
Homepage is highly customizable, with support for custom themes, custom CSS & JS, custom layouts, formatting, localization and more. See the [Settings](https://gethomepage.dev/latest/configs/settings/) page for more information.
Homepage is highly customizable, with support for custom themes, custom CSS & JS, custom layouts, formatting, localization and more. See the [Settings](https://gethomepage.dev/configs/settings/) page for more information.
# Getting Started
@@ -170,7 +170,7 @@ If you have any questions, suggestions, or general issues, please start a discus
## Troubleshooting
In addition to the docs, the [troubleshooting guide](https://gethomepage.dev/latest/troubleshooting/) can help reveal many basic config or network issues. If you're having a problem, it's a good place to start.
In addition to the docs, the [troubleshooting guide](https://gethomepage.dev/troubleshooting/) can help reveal many basic config or network issues. If you're having a problem, it's a good place to start.
## Contributing & Contributors

1
docs/CNAME Normal file
View File

@@ -0,0 +1 @@
gethomepage.dev

View File

@@ -65,9 +65,13 @@ Services may have descriptions,
Services may have an icon attached to them, you can use icons from [Dashboard Icons](https://github.com/walkxcode/dashboard-icons) automatically, by passing the name of the icon, with, or without `.png` or with `.svg` to use the svg version.
You can also specify prefixed icons from [Material Design Icons](https://materialdesignicons.com) with `mdi-XX` or [Simple Icons](https://simpleicons.org/) with `si-XX`.
You can also specify prefixed icons from:
You can specify a custom color by adding a hex color code as suffix e.g. `mdi-XX-#f0d453` or `si-XX-#a712a2`.
- [Material Design Icons](https://pictogrammers.com/library/mdi/) with `mdi-XX`
- [Simple Icons](https://simpleicons.org/) with `si-XX`
- [selfh.st/icons](https://selfh.st/icons/) with `sh-XX` to use the png version or `sh-XX.svg/png/webp` for a specific version
You can specify a custom color for `mdi` and `si` icons by adding a hex color code as a suffix e.g. `mdi-XX-#f0d453` or `si-XX-#a712a2`.
To use a remote icon, use the absolute URL (e.g. `https://...`).
@@ -171,7 +175,7 @@ Services may be connected to a Docker container, either running on the local mac
!!! note
This can also be controlled with `showStats`. See [show docker stats](docker.md#show-docker-stats) for more information
This can also be controlled with `showStats`. See [show docker stats](docker.md#show-stats) for more information
<img width="1038" alt="Docker Stats Expanded" src="https://github.com/gethomepage/homepage/assets/88257202/f95fd595-449e-48ae-af67-fd89618904ec">

View File

@@ -31,15 +31,15 @@ You may need to set the permissions of the folders to be able to edit the files.
- 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:
icon: /icons/plex.png
href: https://app.plex.com
container: plex
```
```
- Plex:
icon: /icons/plex.png
href: https://app.plex.com
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.

View File

@@ -57,6 +57,11 @@
--carbon-text-color: var(--md-typeset-color) !important;
}
[data-md-color-scheme="default"] .carbon-text {
color: var(--md-code-fg-color) !important;
--carbon-text-color: #313131 !important;
}
.md-typeset__table {
width: 100%;
}

View File

@@ -17,7 +17,7 @@ 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:
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/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.:

View File

@@ -7,6 +7,8 @@ Learn more about [Changedetection.io](https://github.com/dgtlmoon/changedetectio
Find your API key under `Settings > API`.
Allowed fields: `["diffsDetected", "totalObserved"]`.
```yaml
widget:
type: changedetectionio

View File

@@ -11,8 +11,11 @@ Learn more about [Gluetun](https://github.com/qdm12/gluetun).
Allowed fields: `["public_ip", "region", "country"]`.
To setup authentication, follow [the official Gluetun documentation](https://github.com/qdm12/gluetun-wiki/blob/main/setup/advanced/control-server.md#authentication).
```yaml
widget:
type: gluetun
url: http://gluetun.host.or.ip:port
key: gluetunkey # Not required if /v1/publicip/ip endpoint is configured with `auth = none`
```

View File

@@ -59,7 +59,9 @@ You can also find a list of all available service widgets in the sidebar navigat
- [Kopia](kopia.md)
- [Lidarr](lidarr.md)
- [Linkwarden](linkwarden.md)
- [Lubelogger](lubelogger.md)
- [Mastodon](mastodon.md)
- [Mailcow](mailcow.md)
- [Mealie](mealie.md)
- [Medusa](medusa.md)
- [Mikrotik](mikrotik.md)

View File

@@ -0,0 +1,20 @@
---
title: LubeLogger
description: LubeLogger Widget Configuration
---
Learn more about [LubeLogger](https://github.com/hargata/lubelog) (v1.3.7 or higher is required).
The widget comes in two 'flavors', one shows data for all vehicles or for just a specific vehicle with the `vehicleID` parameter.
Allowed fields: `["vehicles", "serviceRecords", "reminders"]`.
For the single-vehicle version: `["vehicle", "serviceRecords", "reminders", "nextReminder"]
```yaml
widget:
type: lubelogger
url: https://lubelogger.host.or.ip
username: lubeloggerusername
password: lubeloggerpassword
vehicleID: 1 # optional, changes to single-vehicle version
```

View File

@@ -0,0 +1,15 @@
---
title: Mailcow
description: Mailcow Widget Configuration
---
Learn more about [Mailcow](https://github.com/mailcow/mailcow-dockerized).
Allowed fields: `["domains", "mailboxes", "mails", "storage"]`.
```yaml
widget:
type: mailcow
url: https://mailcow.host.or.ip
key: mailcowapikey
```

View File

@@ -3,7 +3,9 @@ title: PhotoPrism
description: PhotoPrism Widget Configuration
---
Learn more about [PhotoPrism](https://github.com/photoprism/photoprism)..
Learn more about [PhotoPrism](https://github.com/photoprism/photoprism).
Authentication is possible via [app passwords](https://docs.photoprism.app/user-guide/settings/account/#apps-and-devices) or username/password.
Allowed fields: `["albums", "photos", "videos", "people"]`.
@@ -11,6 +13,7 @@ Allowed fields: `["albums", "photos", "videos", "people"]`.
widget:
type: photoprism
url: http://photoprism.host.or.ip:port
username: admin
password: password
username: admin # required only if using username/password
password: password # required only if using username/password
key: # required only if using app passwords
```

View File

@@ -5,8 +5,6 @@ description: PiHole Widget Configuration
Learn more about [PiHole](https://github.com/pi-hole/pi-hole).
As of v2022.12 [PiHole requires the use of an API key](https://pi-hole.net/blog/2022/11/17/upcoming-changes-authentication-for-more-api-endpoints-required/#page-content) if an admin password is set. Older versions do not require any authentication even if the admin uses a password.
Allowed fields: `["queries", "blocked", "blocked_percent", "gravity"]`.
Note: by default the "blocked" and "blocked_percent" fields are merged e.g. "1,234 (15%)" but explicitly including the "blocked_percent" field will change them to display separately.
@@ -18,5 +16,3 @@ widget:
version: 6 # required if running v6 or higher, defaults to 5
key: yourpiholeapikey # optional
```
_Added in v0.1.0, updated in v0.8.9_

View File

@@ -47,6 +47,7 @@ nav:
- widgets/services/crowdsec.md
- widgets/services/customapi.md
- widgets/services/deluge.md
- widgets/services/develancacheui.md
- widgets/services/diskstation.md
- widgets/services/downloadstation.md
- widgets/services/emby.md
@@ -81,7 +82,9 @@ nav:
- widgets/services/kopia.md
- widgets/services/lidarr.md
- widgets/services/linkwarden.md
- widgets/services/lubelogger.md
- widgets/services/mastodon.md
- widgets/services/mailcow.md
- widgets/services/mealie.md
- widgets/services/medusa.md
- widgets/services/mikrotik.md
@@ -231,8 +234,6 @@ extra_css:
- "stylesheets/extra.css"
extra:
version:
provider: mike
social:
- icon: fontawesome/brands/discord
link: https://discord.gg/k4ruYNrudu

18
package-lock.json generated
View File

@@ -50,12 +50,12 @@
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-jsx-a11y": "^6.8.0",
"eslint-plugin-prettier": "^5.2.1",
"eslint-plugin-react": "^7.34.2",
"eslint-plugin-react": "^7.36.1",
"eslint-plugin-react-hooks": "^4.6.2",
"postcss": "^8.4.38",
"prettier": "^3.2.5",
"tailwind-scrollbar": "^3.0.5",
"tailwindcss": "^3.4.3",
"tailwindcss": "^3.4.13",
"typescript": "^5.4.5"
},
"optionalDependencies": {
@@ -3285,11 +3285,10 @@
}
},
"node_modules/eslint-plugin-react": {
"version": "7.35.2",
"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.2.tgz",
"integrity": "sha512-Rbj2R9zwP2GYNcIak4xoAMV57hrBh3hTaR0k7hVjwCQgryE/pw5px4b13EYjduOI0hfXyZhwBxaGpOTbWSGzKQ==",
"version": "7.36.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.36.1.tgz",
"integrity": "sha512-/qwbqNXZoq+VP30s1d4Nc1C5GTxjJQjk4Jzs4Wq2qzxFM7dSmuG2UkIjg2USMLh3A/aVcUNrK7v0J5U1XEGGwA==",
"dev": true,
"license": "MIT",
"dependencies": {
"array-includes": "^3.1.8",
"array.prototype.findlast": "^1.2.5",
@@ -7721,11 +7720,10 @@
}
},
"node_modules/tailwindcss": {
"version": "3.4.10",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.10.tgz",
"integrity": "sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w==",
"version": "3.4.13",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.13.tgz",
"integrity": "sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
"arg": "^5.0.2",

View File

@@ -52,12 +52,12 @@
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-jsx-a11y": "^6.8.0",
"eslint-plugin-prettier": "^5.2.1",
"eslint-plugin-react": "^7.34.2",
"eslint-plugin-react": "^7.36.1",
"eslint-plugin-react-hooks": "^4.6.2",
"postcss": "^8.4.38",
"prettier": "^3.2.5",
"tailwind-scrollbar": "^3.0.5",
"tailwindcss": "^3.4.3",
"tailwindcss": "^3.4.13",
"typescript": "^5.4.5"
},
"optionalDependencies": {

41
pnpm-lock.yaml generated
View File

@@ -108,7 +108,7 @@ importers:
devDependencies:
'@tailwindcss/forms':
specifier: ^0.5.8
version: 0.5.9(tailwindcss@3.4.10)
version: 0.5.9(tailwindcss@3.4.13)
autoprefixer:
specifier: ^10.4.20
version: 10.4.20(postcss@8.4.45)
@@ -117,7 +117,7 @@ importers:
version: 8.57.0
eslint-config-airbnb:
specifier: ^19.0.4
version: 19.0.4(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint-plugin-jsx-a11y@6.10.0(eslint@8.57.0))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.0))(eslint-plugin-react@7.35.2(eslint@8.57.0))(eslint@8.57.0)
version: 19.0.4(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint-plugin-jsx-a11y@6.10.0(eslint@8.57.0))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.0))(eslint-plugin-react@7.36.1(eslint@8.57.0))(eslint@8.57.0)
eslint-config-next:
specifier: ^14.2.3
version: 14.2.8(eslint@8.57.0)(typescript@5.5.4)
@@ -134,8 +134,8 @@ importers:
specifier: ^5.2.1
version: 5.2.1(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.3)
eslint-plugin-react:
specifier: ^7.34.2
version: 7.35.2(eslint@8.57.0)
specifier: ^7.36.1
version: 7.36.1(eslint@8.57.0)
eslint-plugin-react-hooks:
specifier: ^4.6.2
version: 4.6.2(eslint@8.57.0)
@@ -147,10 +147,10 @@ importers:
version: 3.3.3
tailwind-scrollbar:
specifier: ^3.0.5
version: 3.1.0(tailwindcss@3.4.10)
version: 3.1.0(tailwindcss@3.4.13)
tailwindcss:
specifier: ^3.4.3
version: 3.4.10
specifier: ^3.4.13
version: 3.4.13
typescript:
specifier: ^5.4.5
version: 5.5.4
@@ -1134,8 +1134,8 @@ packages:
peerDependencies:
eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
eslint-plugin-react@7.35.2:
resolution: {integrity: sha512-Rbj2R9zwP2GYNcIak4xoAMV57hrBh3hTaR0k7hVjwCQgryE/pw5px4b13EYjduOI0hfXyZhwBxaGpOTbWSGzKQ==}
eslint-plugin-react@7.36.1:
resolution: {integrity: sha512-/qwbqNXZoq+VP30s1d4Nc1C5GTxjJQjk4Jzs4Wq2qzxFM7dSmuG2UkIjg2USMLh3A/aVcUNrK7v0J5U1XEGGwA==}
engines: {node: '>=4'}
peerDependencies:
eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
@@ -1242,6 +1242,7 @@ packages:
follow-redirects@1.15.8:
resolution: {integrity: sha512-xgrmBhBToVKay1q2Tao5LI26B83UhrB/vM1avwVSDzt8rx3rO6AizBAaF46EgksTVr+rFTQaqZZ9MVBfUe4nig==}
engines: {node: '>=4.0'}
deprecated: Browser detection issues fixed in v1.15.9
peerDependencies:
debug: '*'
peerDependenciesMeta:
@@ -2506,8 +2507,8 @@ packages:
peerDependencies:
tailwindcss: 3.x
tailwindcss@3.4.10:
resolution: {integrity: sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w==}
tailwindcss@3.4.13:
resolution: {integrity: sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==}
engines: {node: '>=14.0.0'}
hasBin: true
@@ -2952,10 +2953,10 @@ snapshots:
dependencies:
defer-to-connect: 2.0.1
'@tailwindcss/forms@0.5.9(tailwindcss@3.4.10)':
'@tailwindcss/forms@0.5.9(tailwindcss@3.4.13)':
dependencies:
mini-svg-data-uri: 1.4.4
tailwindcss: 3.4.10
tailwindcss: 3.4.13
'@tanstack/react-virtual@3.10.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
@@ -3764,13 +3765,13 @@ snapshots:
object.entries: 1.1.8
semver: 6.3.1
eslint-config-airbnb@19.0.4(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint-plugin-jsx-a11y@6.10.0(eslint@8.57.0))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.0))(eslint-plugin-react@7.35.2(eslint@8.57.0))(eslint@8.57.0):
eslint-config-airbnb@19.0.4(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint-plugin-jsx-a11y@6.10.0(eslint@8.57.0))(eslint-plugin-react-hooks@4.6.2(eslint@8.57.0))(eslint-plugin-react@7.36.1(eslint@8.57.0))(eslint@8.57.0):
dependencies:
eslint: 8.57.0
eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0))(eslint@8.57.0)
eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0)
eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.0)
eslint-plugin-react: 7.35.2(eslint@8.57.0)
eslint-plugin-react: 7.36.1(eslint@8.57.0)
eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0)
object.assign: 4.1.5
object.entries: 1.1.8
@@ -3786,7 +3787,7 @@ snapshots:
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.0)
eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0)
eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.0)
eslint-plugin-react: 7.35.2(eslint@8.57.0)
eslint-plugin-react: 7.36.1(eslint@8.57.0)
eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0)
optionalDependencies:
typescript: 5.5.4
@@ -3898,7 +3899,7 @@ snapshots:
dependencies:
eslint: 8.57.0
eslint-plugin-react@7.35.2(eslint@8.57.0):
eslint-plugin-react@7.36.1(eslint@8.57.0):
dependencies:
array-includes: 3.1.8
array.prototype.findlast: 1.2.5
@@ -5349,11 +5350,11 @@ snapshots:
systeminformation@5.23.5: {}
tailwind-scrollbar@3.1.0(tailwindcss@3.4.10):
tailwind-scrollbar@3.1.0(tailwindcss@3.4.13):
dependencies:
tailwindcss: 3.4.10
tailwindcss: 3.4.13
tailwindcss@3.4.10:
tailwindcss@3.4.13:
dependencies:
'@alloc/quick-lru': 5.2.0
arg: 5.0.2

View File

@@ -325,15 +325,15 @@
},
"technitium": {
"totalQueries": "Navraë",
"totalNoError": "Success",
"totalServerFailure": "Failures",
"totalNxDomain": "NX Domains",
"totalRefused": "Refused",
"totalAuthoritative": "Authoritative",
"totalRecursive": "Recursive",
"totalCached": "Cached",
"totalNoError": "Sukses",
"totalServerFailure": "Mislukkings",
"totalNxDomain": "NX-domeine",
"totalRefused": "Geweier",
"totalAuthoritative": "Gesaghebbend",
"totalRecursive": "Rekursief",
"totalCached": "Gekas",
"totalBlocked": "Geblok",
"totalDropped": "Dropped",
"totalDropped": "Geval",
"totalClients": "Kliënte"
},
"tdarr": {
@@ -850,6 +850,12 @@
"screenshots": "Skermskote",
"totalfilesize": "Totale Grootte"
},
"mailcow": {
"domains": "Domeine",
"mailboxes": "Posbusse",
"mails": "E-posse",
"storage": "Bergplek"
},
"netdata": {
"warnings": "Waarskuwings",
"criticals": "Kritici"
@@ -933,11 +939,19 @@
"tags": "Merkers"
},
"zabbix": {
"unclassified": "Not classified",
"unclassified": "Nie geklassifiseer nie",
"information": "Informasie",
"warning": "Warning",
"average": "Average",
"high": "High",
"disaster": "Disaster"
"warning": "Waarskuwing",
"average": "Gemiddeld",
"high": "Hoog",
"disaster": "Ramp"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "لقطات شاشة",
"totalfilesize": "الحجم الكلي"
},
"mailcow": {
"domains": "مجالات",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "التخزين"
},
"netdata": {
"warnings": "تحذيرات",
"criticals": "حرج"
@@ -939,5 +945,13 @@
"average": "متوسط",
"high": "عالي",
"disaster": "كارثة"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Domains",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Storage"
},
"netdata": {
"warnings": "Warnings",
"criticals": "Criticals"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Dominis",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Emmagatzematge"
},
"netdata": {
"warnings": "Avisos",
"criticals": "Crítics"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Domény",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Úložiště"
},
"netdata": {
"warnings": "Warnings",
"criticals": "Criticals"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Domæner",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Lager"
},
"netdata": {
"warnings": "Advarsler",
"criticals": "Criticals"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Bildschirmfotos",
"totalfilesize": "Gesamtgröße"
},
"mailcow": {
"domains": "Domänen",
"mailboxes": "Postfächer",
"mails": "E-Mails",
"storage": "Speicher"
},
"netdata": {
"warnings": "Warnungen",
"criticals": "Kritisch"
@@ -939,5 +945,13 @@
"average": "Durchschnitt",
"high": "Hoch",
"disaster": "Katastrophe"
},
"lubelogger": {
"vehicle": "Fahrzeug",
"vehicles": "Fahrzeuge",
"serviceRecords": "Wartungseinträge",
"reminders": "Erinnerungen",
"nextReminder": "Nächste Erinnerung",
"none": "Keine"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Τομείς",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Αποθηκευτικός χώρος"
},
"netdata": {
"warnings": "Warnings",
"criticals": "Criticals"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Domains",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Storage"
},
"netdata": {
"warnings": "Warnings",
"criticals": "Criticals"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Domains",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Storage"
},
"netdata": {
"warnings": "Warnings",
"criticals": "Criticals"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -325,15 +325,15 @@
},
"technitium": {
"totalQueries": "Consultas",
"totalNoError": "Success",
"totalServerFailure": "Failures",
"totalNxDomain": "NX Domains",
"totalRefused": "Refused",
"totalAuthoritative": "Authoritative",
"totalRecursive": "Recursive",
"totalCached": "Cached",
"totalNoError": "Éxitos",
"totalServerFailure": "Fallas",
"totalNxDomain": "Dominios NX",
"totalRefused": "Rechazados",
"totalAuthoritative": "Autoritarios",
"totalRecursive": "Recursivos",
"totalCached": "En caché",
"totalBlocked": "Bloqueado",
"totalDropped": "Dropped",
"totalDropped": "Descartados",
"totalClients": "Clientes"
},
"tdarr": {
@@ -844,11 +844,17 @@
},
"romm": {
"platforms": "Plataformas",
"totalRoms": "Games",
"saves": "Saves",
"states": "States",
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
"totalRoms": "Juegos",
"saves": "Guardados",
"states": "Estados",
"screenshots": "Capturas de pantalla",
"totalfilesize": "Tamaño total"
},
"mailcow": {
"domains": "Dominios",
"mailboxes": "Buzones de correo",
"mails": "Correos",
"storage": "Almacenamiento"
},
"netdata": {
"warnings": "Advertencias",
@@ -933,11 +939,19 @@
"tags": "Etiquetas"
},
"zabbix": {
"unclassified": "Not classified",
"unclassified": "No clasificado",
"information": "Información",
"warning": "Warning",
"average": "Average",
"high": "High",
"disaster": "Disaster"
"warning": "Advertencia",
"average": "Promedio",
"high": "Alto",
"disaster": "Desastre"
},
"lubelogger": {
"vehicle": "Vehículo",
"vehicles": "Vehículos",
"serviceRecords": "Registros de servicio",
"reminders": "Recordatorios",
"nextReminder": "Siguiente recordatorio",
"none": "Nada"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Domains",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Storage"
},
"netdata": {
"warnings": "Warnings",
"criticals": "Criticals"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Verkkotunnuksia",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Storage"
},
"netdata": {
"warnings": "Warnings",
"criticals": "Criticals"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Domaines",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Stockage"
},
"netdata": {
"warnings": "Avertissements",
"criticals": "Urgent"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Domains",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Storage"
},
"netdata": {
"warnings": "Warnings",
"criticals": "Criticals"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Domains",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Storage"
},
"netdata": {
"warnings": "Warnings",
"criticals": "Criticals"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Domene",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Spremište"
},
"netdata": {
"warnings": "Upozorenja",
"criticals": "Kritično"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Domainek",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Tárhely"
},
"netdata": {
"warnings": "Figyelmeztetések",
"criticals": "Kritikusok"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Jármű",
"vehicles": "Járművek",
"serviceRecords": "Szolgáltatások nyílvántartása",
"reminders": "Emlékeztetők",
"nextReminder": "Következő emlékeztető",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Jumlah Domain",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Penyimpanan"
},
"netdata": {
"warnings": "Peringatan",
"criticals": "Kritis"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Domini",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Archiviazione"
},
"netdata": {
"warnings": "Avvisi",
"criticals": "Criticals"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "スクリーンショット",
"totalfilesize": "合計サイズ"
},
"mailcow": {
"domains": "ドメイン",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "ストレージ"
},
"netdata": {
"warnings": "警告",
"criticals": "重大"
@@ -939,5 +945,13 @@
"average": "平均",
"high": "高い",
"disaster": "災害"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -130,7 +130,7 @@
},
"freshrss": {
"subscriptions": "구독",
"unread": "읽지 않음"
"unread": "미열람"
},
"fritzbox": {
"connectionStatus": "상태",
@@ -376,7 +376,7 @@
"numberOfFailQueries": "Fail Queries"
},
"jackett": {
"configured": "Configured",
"configured": "구성됨",
"errored": "오류"
},
"strelaysrv": {
@@ -404,12 +404,12 @@
},
"miniflux": {
"read": "읽음",
"unread": "읽지 않음"
"unread": "미열람"
},
"authentik": {
"users": "사용자",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
"loginsLast24H": "로그인 (24h)",
"failedLoginsLast24H": "실패한 로그인 (24h)"
},
"proxmox": {
"mem": "MEM",
@@ -538,9 +538,9 @@
},
"tubearchivist": {
"downloads": "대기열",
"videos": "Videos",
"channels": "Channels",
"playlists": "Playlists"
"videos": "동영상",
"channels": "채널",
"playlists": "재생 목록"
},
"truenas": {
"load": "System Load",
@@ -559,7 +559,7 @@
"country": "Country"
},
"hdhomerun": {
"channels": "Channels",
"channels": "채널",
"hd": "HD",
"tunerCount": "Tuners",
"channelNumber": "채널",
@@ -648,9 +648,9 @@
},
"immich": {
"users": "사용자",
"photos": "Photos",
"videos": "Videos",
"storage": "Storage"
"photos": "사진",
"videos": "동영상",
"storage": "저장됨"
},
"uptimekuma": {
"up": "Sites Up",
@@ -663,10 +663,10 @@
"series": "시리즈",
"archives": "Archives",
"chapters": "Chapters",
"categories": "Categories"
"categories": "분류"
},
"komga": {
"libraries": "Libraries",
"libraries": "서재",
"series": "시리즈",
"books": "책"
},
@@ -682,8 +682,8 @@
},
"photoprism": {
"albums": "Albums",
"photos": "Photos",
"videos": "Videos",
"photos": "사진",
"videos": "동영상",
"people": "People"
},
"fileflows": {
@@ -699,12 +699,12 @@
"alertstriggered": "Alerts Triggered"
},
"nextcloud": {
"cpuload": "Cpu Load",
"memoryusage": "Memory Usage",
"freespace": "Free Space",
"activeusers": "Active Users",
"numfiles": "Files",
"numshares": "Shared Items"
"cpuload": "CPU 부하량",
"memoryusage": "메모리 사용량",
"freespace": "여유 공간",
"activeusers": "활성 유저",
"numfiles": "파일",
"numshares": "공유된 항목"
},
"kopia": {
"status": "상태",
@@ -754,8 +754,8 @@
},
"calibreweb": {
"books": "책",
"authors": "Authors",
"categories": "Categories",
"authors": "저자",
"categories": "분류",
"series": "시리즈"
},
"jdownloader": {
@@ -766,7 +766,7 @@
},
"kavita": {
"seriesCount": "시리즈",
"totalFiles": "Files"
"totalFiles": "파일"
},
"azuredevops": {
"result": "Result",
@@ -802,7 +802,7 @@
"mealie": {
"recipes": "Recipes",
"users": "사용자",
"categories": "Categories",
"categories": "분류",
"tags": "태그"
},
"openmediavault": {
@@ -843,12 +843,18 @@
"noEventsFound": "No events found"
},
"romm": {
"platforms": "Platforms",
"totalRoms": "Games",
"saves": "Saves",
"states": "States",
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
"platforms": "기종",
"totalRoms": "게임",
"saves": "세이브",
"states": "스테이트",
"screenshots": "스크린샷",
"totalfilesize": "전체 용량"
},
"mailcow": {
"domains": "Domains",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "저장됨"
},
"netdata": {
"warnings": "Warnings",
@@ -857,7 +863,7 @@
"plantit": {
"events": "Events",
"plants": "Plants",
"photos": "Photos",
"photos": "사진",
"species": "Species"
},
"gitea": {
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Domains",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Storage"
},
"netdata": {
"warnings": "Warnings",
"criticals": "Criticals"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Domain",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Storage"
},
"netdata": {
"warnings": "Amaran",
"criticals": "Kritikal"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots ",
"totalfilesize": "Totale grootte"
},
"mailcow": {
"domains": "Domeinen",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Opslag"
},
"netdata": {
"warnings": "Waarschuwingen",
"criticals": "Kritiek"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Domener",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Lagring"
},
"netdata": {
"warnings": "Advarsler",
"criticals": "Kritiske"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -463,8 +463,8 @@
"51-night": "Lekka mżawka",
"53-day": "Mżawka",
"53-night": "Mżawka",
"55-day": "Ciężka mżawka",
"55-night": "Ciężka mżawka",
"55-day": "Gęsta mżawka",
"55-night": "Gęsta mżawka",
"56-day": "Lekko chłodna mżawka",
"56-night": "Lekko chłodna mżawka",
"57-day": "Chłodna mżawka",
@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Domeny",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Pamięć"
},
"netdata": {
"warnings": "Ostrzeżenia",
"criticals": "Krytyczny"
@@ -905,7 +911,7 @@
"total": "Całkowite"
},
"swagdashboard": {
"proxied": "Poprzez proxy",
"proxied": "Proxy",
"auth": "Z uwietrzytelnieniem",
"outdated": "Nieaktualne",
"banned": "Zbanowano"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Domínios",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Armazenamento"
},
"netdata": {
"warnings": "Avisos",
"criticals": "Críticos"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Domínios",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Armazenamento"
},
"netdata": {
"warnings": "Alertas",
"criticals": "Críticos"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Domenii",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Storage"
},
"netdata": {
"warnings": "Warnings",
"criticals": "Criticals"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Домены",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Хранилище"
},
"netdata": {
"warnings": "Предупреждения",
"criticals": "Критические"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Domény",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Úložisko"
},
"netdata": {
"warnings": "Upozornenia",
"criticals": "Kritické"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Posnetki zaslona",
"totalfilesize": "Skupna velikost"
},
"mailcow": {
"domains": "Domene",
"mailboxes": "Nabiralniki",
"mails": "Pošta",
"storage": "Shramba"
},
"netdata": {
"warnings": "Opozorila",
"criticals": "Kritično"
@@ -939,5 +945,13 @@
"average": "Povprečno",
"high": "Visoko",
"disaster": "Katastrofa"
},
"lubelogger": {
"vehicle": "Vozilo",
"vehicles": "Vozila",
"serviceRecords": "Zapisi servisov",
"reminders": "Opomniki",
"nextReminder": "Naslednji opomnik",
"none": "Brez"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Domains",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Storage"
},
"netdata": {
"warnings": "Warnings",
"criticals": "Criticals"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Domains",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Storage"
},
"netdata": {
"warnings": "Warnings",
"criticals": "Criticals"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "డొమైన్‌లు",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Storage"
},
"netdata": {
"warnings": "Warnings",
"criticals": "Criticals"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Domains",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Storage"
},
"netdata": {
"warnings": "Warnings",
"criticals": "Criticals"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Ekran görüntüleri",
"totalfilesize": "Toplam Kapasite"
},
"mailcow": {
"domains": "Etki Alanları",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Depo"
},
"netdata": {
"warnings": "Uyarılar",
"criticals": "Kritik"
@@ -939,5 +945,13 @@
"average": "Ortalama",
"high": "Yüksek",
"disaster": "Felaket"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Домени",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Сховище"
},
"netdata": {
"warnings": "Попередження",
"criticals": "Criticals"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -87,7 +87,7 @@
"ping": "Ping",
"down": "Down",
"up": "Up",
"not_available": "Not Available"
"not_available": "Không khả dụng"
},
"siteMonitor": {
"http_status": "HTTP status",
@@ -95,7 +95,7 @@
"response": "Response",
"down": "Down",
"up": "Up",
"not_available": "Not Available"
"not_available": "Không khả dụng"
},
"emby": {
"playing": "Đang chơi",
@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "Domains",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "Storage"
},
"netdata": {
"warnings": "Warnings",
"criticals": "Criticals"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "域",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "儲存空間"
},
"netdata": {
"warnings": "警告",
"criticals": "嚴重"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -54,8 +54,8 @@
"uptime": "运行时间",
"days": "天",
"wan": "WAN",
"lan": "LAN",
"wlan": "WLAN",
"lan": "局域网",
"wlan": "无线局域网",
"devices": "设备",
"lan_devices": "LAN 设备",
"wlan_devices": "无线局域网设备",
@@ -325,15 +325,15 @@
},
"technitium": {
"totalQueries": "查询",
"totalNoError": "Success",
"totalServerFailure": "Failures",
"totalNoError": "成功",
"totalServerFailure": "失败",
"totalNxDomain": "NX Domains",
"totalRefused": "Refused",
"totalAuthoritative": "Authoritative",
"totalRecursive": "Recursive",
"totalCached": "Cached",
"totalRefused": "已拒绝",
"totalAuthoritative": "权威",
"totalRecursive": "递归",
"totalCached": "缓存",
"totalBlocked": "阻止",
"totalDropped": "Dropped",
"totalDropped": "丢弃",
"totalClients": "客户端"
},
"tdarr": {
@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "域",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "储存空间"
},
"netdata": {
"warnings": "警告",
"criticals": "严重"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -850,6 +850,12 @@
"screenshots": "Screenshots",
"totalfilesize": "Total Size"
},
"mailcow": {
"domains": "網域",
"mailboxes": "Mailboxes",
"mails": "Mails",
"storage": "儲存空間"
},
"netdata": {
"warnings": "警告",
"criticals": "嚴重"
@@ -939,5 +945,13 @@
"average": "Average",
"high": "High",
"disaster": "Disaster"
},
"lubelogger": {
"vehicle": "Vehicle",
"vehicles": "Vehicles",
"serviceRecords": "Service Records",
"reminders": "Reminders",
"nextReminder": "Next Reminder",
"none": "None"
}
}

View File

@@ -35,6 +35,35 @@ export default function ResolvedIcon({ icon, width = 32, height = 32, alt = "log
// check mdi- or si- prefixed icons
const prefix = icon.split("-")[0];
if (prefix === "sh") {
const iconName = icon.replace("sh-", "").replace(".svg", "").replace(".png", "").replace(".webp", "");
let extension;
if (icon.endsWith(".svg")) {
extension = "svg";
} else if (icon.endsWith(".webp")) {
extension = "webp";
} else {
extension = "png";
}
return (
<Image
src={`https://cdn.jsdelivr.net/gh/selfhst/icons@main/${extension}/${iconName}.${extension}`}
width={width}
height={height}
style={{
width,
height,
objectFit: "contain",
maxHeight: "100%",
maxWidth: "100%",
}}
alt={alt}
/>
);
}
if (prefix in iconSetURLs) {
// default to theme setting
let iconName = icon.replace(`${prefix}-`, "").replace(".svg", "");

View File

@@ -1,6 +1,6 @@
---
# For configuration options and examples, please see:
# https://gethomepage.dev/latest/configs/bookmarks
# https://gethomepage.dev/configs/bookmarks
- Developer:
- Github:

View File

@@ -1,6 +1,6 @@
---
# For configuration options and examples, please see:
# https://gethomepage.dev/latest/configs/docker/
# https://gethomepage.dev/configs/docker/
# my-docker:
# host: 127.0.0.1

View File

@@ -1,6 +1,6 @@
---
# For configuration options and examples, please see:
# https://gethomepage.dev/latest/configs/services
# https://gethomepage.dev/configs/services
- My First Group:
- My First Service:

View File

@@ -1,6 +1,6 @@
---
# For configuration options and examples, please see:
# https://gethomepage.dev/latest/configs/settings
# https://gethomepage.dev/configs/settings
providers:
openweathermap: openweathermapapikey

View File

@@ -1,6 +1,6 @@
---
# For configuration options and examples, please see:
# https://gethomepage.dev/latest/configs/service-widgets
# https://gethomepage.dev/configs/service-widgets
- resources:
cpu: true

View File

@@ -442,6 +442,9 @@ export function cleanServiceGroups(groups) {
namespace,
podSelector,
// lubelogger
vehicleID,
// mjpeg
fit,
stream,
@@ -627,6 +630,9 @@ export function cleanServiceGroups(groups) {
if (type === "technitium") {
if (range !== undefined) cleanedService.widget.range = range;
}
if (type === "lubelogger") {
if (vehicleID !== undefined) cleanedService.widget.vehicleID = vehicleID;
}
}
return cleanedService;

View File

@@ -56,6 +56,8 @@ const components = {
kopia: dynamic(() => import("./kopia/component")),
lidarr: dynamic(() => import("./lidarr/component")),
linkwarden: dynamic(() => import("./linkwarden/component")),
lubelogger: dynamic(() => import("./lubelogger/component")),
mailcow: dynamic(() => import("./mailcow/component")),
mastodon: dynamic(() => import("./mastodon/component")),
mealie: dynamic(() => import("./mealie/component")),
medusa: dynamic(() => import("./medusa/component")),

View File

@@ -6,7 +6,9 @@ import useWidgetAPI from "utils/proxy/use-widget-api";
function getPerformancePercent(t, performanceRange) {
// ghostfolio v2.79.0 changed to grossPerformancePercentage
// ghostfolio v2.106.0 changed to netPerformancePercentageWithCurrencyEffect
const percent =
performanceRange.performance.netPerformancePercentageWithCurrencyEffect ??
performanceRange.performance.grossPerformancePercentage ??
performanceRange.performance.currentGrossPerformancePercent;
return `${percent > 0 ? "+" : ""}${t("common.percent", {

View File

@@ -1,8 +1,8 @@
import genericProxyHandler from "utils/proxy/handlers/generic";
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
const widget = {
api: "{url}/v1/{endpoint}",
proxyHandler: genericProxyHandler,
proxyHandler: credentialedProxyHandler,
mappings: {
ip: {

View File

@@ -0,0 +1,65 @@
import { useTranslation } from "react-i18next";
import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
export default function Component({ service }) {
const { t } = useTranslation();
const { widget } = service;
let { data: vehicleInfo, error } = useWidgetAPI(widget, "vehicleinfo");
if (error) {
return <Container service={service} error={error} />;
}
if (!vehicleInfo) {
return (
<Container service={service}>
<Block label="lubelogger.vehicles" />
<Block label="lubelogger.serviceRecords" />
<Block label="lubelogger.reminders" />
</Container>
);
}
const { vehicleID } = widget;
if (vehicleID) {
vehicleInfo = vehicleInfo.filter((v) => v.vehicleData.id === vehicleID);
}
const totalReminders = vehicleInfo.reduce(
(acc, val) => acc + val.veryUrgentReminderCount + val.urgentReminderCount + val.notUrgentReminderCount,
0,
);
const totalServiceRecords = vehicleInfo.reduce((acc, val) => acc + val.serviceRecordCount, 0);
if (vehicleID) {
if (vehicleInfo.length === 0) {
error = { message: "Vehicle not found" };
return <Container service={service} error={error} />;
}
const nextReminder = vehicleInfo[0].nextReminder
? t("common.date", { value: vehicleInfo[0].nextReminder.dueDate })
: t("lubelogger.none");
return (
<Container service={service}>
<Block
label="lubelogger.vehicle"
value={`${vehicleInfo[0].vehicleData.year} ${vehicleInfo[0].vehicleData.model}`}
/>
<Block label="lubelogger.serviceRecords" value={totalServiceRecords} />
<Block label="lubelogger.reminders" value={totalReminders} />
<Block label="lubelogger.nextReminder" value={nextReminder} />
</Container>
);
}
return (
<Container service={service}>
<Block label="lubelogger.vehicles" value={vehicleInfo.length} />
<Block label="lubelogger.serviceRecords" value={totalServiceRecords} />
<Block label="lubelogger.reminders" value={totalReminders} />
</Container>
);
}

View File

@@ -0,0 +1,14 @@
import genericProxyHandler from "utils/proxy/handlers/generic";
const widget = {
api: "{url}/api/{endpoint}",
proxyHandler: genericProxyHandler,
mappings: {
vehicleinfo: {
endpoint: "vehicle/info",
},
},
};
export default widget;

View File

@@ -0,0 +1,40 @@
import { useTranslation } from "next-i18next";
import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
export default function Component({ service }) {
const { t } = useTranslation();
const { widget } = service;
const { data: resultData, error: resultError } = useWidgetAPI(widget, "domains");
if (resultError || (resultData && Object.keys(resultData).length === 0)) {
return <Container service={service} error={resultError ?? { message: "No domains found" }} />;
}
if (!resultData) {
return (
<Container service={service}>
<Block label="mailcow.mailboxes" />
<Block label="mailcow.aliases" />
<Block label="mailcow.quarantined" />
</Container>
);
}
const domains = resultData.length;
const mailboxes = resultData.reduce((acc, val) => acc + val.mboxes_in_domain, 0);
const mails = resultData.reduce((acc, val) => acc + val.msgs_total, 0);
const storage = resultData.reduce((acc, val) => acc + val.bytes_total, 0);
return (
<Container service={service}>
<Block label="mailcow.domains" value={t("common.number", { value: domains })} />
<Block label="mailcow.mailboxes" value={t("common.number", { value: mailboxes })} />
<Block label="mailcow.mails" value={t("common.number", { value: mails })} />
<Block label="mailcow.storage" value={t("common.bytes", { value: storage })} />
</Container>
);
}

View File

@@ -0,0 +1,14 @@
import credentialedProxyHandler from "../../utils/proxy/handlers/credentialed";
const widget = {
api: "{url}/api/v1/get/{endpoint}",
proxyHandler: credentialedProxyHandler,
mappings: {
domains: {
endpoint: "domain/all",
},
},
};
export default widget;

View File

@@ -10,7 +10,7 @@ const widget = {
validate: ["cpu-load", "free-memory", "total-memory", "uptime"],
},
leases: {
endpoint: "ip/dhcp-server/lease",
endpoint: "ip/dhcp-server/lease?.proplist=address",
},
},
};

View File

@@ -32,6 +32,11 @@ export default async function photoprismProxyHandler(req, res) {
username: widget.username,
password: widget.password,
});
} else if (widget.key) {
params.headers.Authorization = `Bearer ${widget.key}`;
params.body = JSON.stringify({
authToken: widget.key,
});
}
const [status, contentType, data] = await httpProxy(url, params);

View File

@@ -57,23 +57,27 @@ export default async function piholeProxyHandler(req, res) {
}
// pihole v6
if (!cache.get(`${sessionSIDCacheKey}.${service}`)) {
if (!cache.get(`${sessionSIDCacheKey}.${service}`) && widget.key) {
await login(widget, service);
}
const sid = cache.get(`${sessionSIDCacheKey}.${service}`);
if (!sid) {
if (widget.key && !sid) {
return res.status(500).json({ error: "Failed to authenticate with Pi-hole" });
}
try {
logger.debug("Calling Pi-hole API endpoint: %s", endpoint);
const headers = {
"Content-Type": "application/json",
};
if (sid) {
headers["X-FTL-SID"] = sid;
} else {
logger.debug("Pi-hole request is unauthenticated");
}
[status, , data] = await httpProxy(formatApiCall(widgets[widget.type].api, { ...widget, endpoint }), {
headers: {
"Content-Type": "application/json",
"X-FTL-SID": sid,
},
headers,
});
if (status !== 200) {

View File

@@ -29,7 +29,7 @@ export default function Component({ service }) {
);
}
const datastoreUsage = (datastoreData.data[0].used / datastoreData.data[0].total) * 100;
const datastoreUsage = datastoreData.data ? (datastoreData.data[0].used / datastoreData.data[0].total) * 100 : 0;
const cpuUsage = hostData.data.cpu * 100;
const memoryUsage = (hostData.data.memory.used / hostData.data.memory.total) * 100;
const failedTasks = tasksData.total >= 100 ? "99+" : tasksData.total;

View File

@@ -53,7 +53,7 @@ export default function Component({ service }) {
function toPercent(value, total) {
return t("common.percent", {
value: !Number.isNaN(value / total) ? value / total : 0,
value: !Number.isNaN(value / total) ? 100 * (value / total) : 0,
maximumFractionDigits: 2,
});
}
@@ -64,55 +64,64 @@ export default function Component({ service }) {
<Block
label="technitium.totalNoError"
value={`${t("common.number", { value: statsData.totalNoError })} (${toPercent(
statsData.totalNoError / statsData.totalQueries,
statsData.totalNoError,
statsData.totalQueries,
)})`}
/>
<Block
label="technitium.totalServerFailure"
value={`${t("common.number", { value: statsData.totalServerFailure })} (${toPercent(
statsData.totalServerFailure / statsData.totalQueries,
statsData.totalServerFailure,
statsData.totalQueries,
)})`}
/>
<Block
label="technitium.totalNxDomain"
value={`${t("common.number", { value: statsData.totalNxDomain })} (${toPercent(
statsData.totalNxDomain / statsData.totalQueries,
statsData.totalNxDomain,
statsData.totalQueries,
)})`}
/>
<Block
label="technitium.totalRefused"
value={`${t("common.number", { value: statsData.totalRefused })} (${toPercent(
statsData.totalRefused / statsData.totalQueries,
statsData.totalRefused,
statsData.totalQueries,
)})`}
/>
<Block
label="technitium.totalAuthoritative"
value={`${t("common.number", { value: statsData.totalAuthoritative })} (${toPercent(
statsData.totalAuthoritative / statsData.totalQueries,
statsData.totalAuthoritative,
statsData.totalQueries,
)})`}
/>
<Block
label="technitium.totalRecursive"
value={`${t("common.number", { value: statsData.totalRecursive })} (${toPercent(
statsData.totalRecursive / statsData.totalQueries,
statsData.totalRecursive,
statsData.totalQueries,
)})`}
/>
<Block
label="technitium.totalCached"
value={`${t("common.number", { value: statsData.totalCached })} (${toPercent(
statsData.totalCached / statsData.totalQueries,
statsData.totalCached,
statsData.totalQueries,
)})`}
/>
<Block
label="technitium.totalBlocked"
value={`${t("common.number", { value: statsData.totalBlocked })} (${toPercent(
statsData.totalBlocked / statsData.totalQueries,
statsData.totalBlocked,
statsData.totalQueries,
)})`}
/>
<Block
label="technitium.totalDropped"
value={`${t("common.number", { value: statsData.totalDropped })} (${toPercent(
statsData.totalDropped / statsData.totalQueries,
statsData.totalDropped,
statsData.totalQueries,
)})`}
/>
<Block label="technitium.totalClients" value={`${t("common.number", { value: statsData.totalClients })}`} />

View File

@@ -9,7 +9,7 @@ const widget = {
endpoint: "dashboard/stats/get",
validate: ["response", "status"],
params: ["type"],
map: (data) => asJson(data).response.stats,
map: (data) => asJson(data).response?.stats,
},
},
};

View File

@@ -48,6 +48,8 @@ import komga from "./komga/widget";
import kopia from "./kopia/widget";
import lidarr from "./lidarr/widget";
import linkwarden from "./linkwarden/widget";
import lubelogger from "./lubelogger/widget";
import mailcow from "./mailcow/widget";
import mastodon from "./mastodon/widget";
import mealie from "./mealie/widget";
import medusa from "./medusa/widget";
@@ -173,6 +175,8 @@ const widgets = {
kopia,
lidarr,
linkwarden,
lubelogger,
mailcow,
mastodon,
mealie,
medusa,