+
Date: Mon, 17 Mar 2025 12:32:09 -0700
Subject: [PATCH 51/89] Enhancement: support maximum group cols up 8 (#5022)
---
docs/configs/settings.md | 8 ++++----
src/components/services/group.jsx | 6 +++---
src/pages/_app.jsx | 6 ++++++
src/pages/index.jsx | 5 +++--
4 files changed, 16 insertions(+), 9 deletions(-)
diff --git a/docs/configs/settings.md b/docs/configs/settings.md
index d56d0f75..bd000ccb 100644
--- a/docs/configs/settings.md
+++ b/docs/configs/settings.md
@@ -262,15 +262,15 @@ You can make homepage take up the entire window width by adding:
fullWidth: true
```
-### Five Columns
+### Maximum Group Columns
-You can add a fifth column to services (when `style: columns` which is default) by adding:
+You can set the maximum number of columns of service groups on larger screen sizes (groups with `style: columns` which is default) by adding:
```yaml
-fiveColumns: true
+maxGroupColumns: 8 # default is 4, max 8
```
-By default homepage will max out at 4 columns for services with `columns` style
+By default homepage will max out at 4 columns (also the minimum number). If you're setting this to 8, you may want to consider enabling the [fullWidth](#full-width) option as well.
### Collapsible sections
diff --git a/src/components/services/group.jsx b/src/components/services/group.jsx
index 06fb83e1..3e6327a4 100644
--- a/src/components/services/group.jsx
+++ b/src/components/services/group.jsx
@@ -10,7 +10,7 @@ import { columnMap } from "../../utils/layout/columns";
export default function ServicesGroup({
group,
layout,
- fiveColumns,
+ maxGroupColumns,
disableCollapse,
useEqualHeights,
groupsInitiallyCollapsed,
@@ -31,7 +31,7 @@ export default function ServicesGroup({
className={classNames(
"services-group flex-1",
layout?.style === "row" ? "basis-full" : "basis-full md:basis-1/2 lg:basis-1/3 xl:basis-1/4",
- layout?.style !== "row" && fiveColumns ? "3xl:basis-1/5" : "",
+ layout?.style !== "row" && maxGroupColumns ? `3xl:basis-1/${maxGroupColumns}` : "",
groupPadding,
isSubgroup ? "subgroup" : "",
)}
@@ -97,7 +97,7 @@ export default function ServicesGroup({
key={subgroup.name}
group={subgroup}
layout={layout?.[subgroup.name]}
- fiveColumns={fiveColumns}
+ maxGroupColumns={maxGroupColumns}
disableCollapse={disableCollapse}
useEqualHeights={useEqualHeights}
groupsInitiallyCollapsed={groupsInitiallyCollapsed}
diff --git a/src/pages/_app.jsx b/src/pages/_app.jsx
index 052412d9..f4345a7c 100644
--- a/src/pages/_app.jsx
+++ b/src/pages/_app.jsx
@@ -52,6 +52,12 @@ const tailwindSafelist = [
"dark:bg-white",
"bg-orange-400",
"dark:bg-orange-400",
+ // maxGroupColumns
+ "3xl:basis-1/4",
+ "3xl:basis-1/5",
+ "3xl:basis-1/6",
+ "3xl:basis-1/7",
+ "3xl:basis-1/8",
// yep
"h-0 h-1 h-2 h-3 h-4 h-5 h-6 h-7 h-8 h-9 h-10 h-11 h-12 h-13 h-14 h-15 h-16 h-17 h-18 h-19 h-20 h-21 h-22 h-23 h-24 h-25 h-26 h-27 h-28 h-29 h-30 h-31 h-32 h-33 h-34 h-35 h-36 h-37 h-38 h-39 h-40 h-41 h-42 h-43 h-44 h-45 h-46 h-47 h-48 h-49 h-50 h-51 h-52 h-53 h-54 h-55 h-56 h-57 h-58 h-59 h-60 h-61 h-62 h-63 h-64 h-65 h-66 h-67 h-68 h-69 h-70 h-71 h-72 h-73 h-74 h-75 h-76 h-77 h-78 h-79 h-80 h-81 h-82 h-83 h-84 h-85 h-86 h-87 h-88 h-89 h-90 h-91 h-92 h-93 h-94 h-95 h-96",
"sm:h-0 sm:h-1 sm:h-2 sm:h-3 sm:h-4 sm:h-5 sm:h-6 sm:h-7 sm:h-8 sm:h-9 sm:h-10 sm:h-11 sm:h-12 sm:h-13 sm:h-14 sm:h-15 sm:h-16 sm:h-17 sm:h-18 sm:h-19 sm:h-20 sm:h-21 sm:h-22 sm:h-23 sm:h-24 sm:h-25 sm:h-26 sm:h-27 sm:h-28 sm:h-29 sm:h-30 sm:h-31 sm:h-32 sm:h-33 sm:h-34 sm:h-35 sm:h-36 sm:h-37 sm:h-38 sm:h-39 sm:h-40 sm:h-41 sm:h-42 sm:h-43 sm:h-44 sm:h-45 sm:h-46 sm:h-47 sm:h-48 sm:h-49 sm:h-50 sm:h-51 sm:h-52 sm:h-53 sm:h-54 sm:h-55 sm:h-56 sm:h-57 sm:h-58 sm:h-59 sm:h-60 sm:h-61 sm:h-62 sm:h-63 sm:h-64 sm:h-65 sm:h-66 sm:h-67 sm:h-68 sm:h-69 sm:h-70 sm:h-71 sm:h-72 sm:h-73 sm:h-74 sm:h-75 sm:h-76 sm:h-77 sm:h-78 sm:h-79 sm:h-80 sm:h-81 sm:h-82 sm:h-83 sm:h-84 sm:h-85 sm:h-86 sm:h-87 sm:h-88 sm:h-89 sm:h-90 sm:h-91 sm:h-92 sm:h-93 sm:h-94 sm:h-95 sm:h-96",
diff --git a/src/pages/index.jsx b/src/pages/index.jsx
index 51f5ead3..96a9377d 100644
--- a/src/pages/index.jsx
+++ b/src/pages/index.jsx
@@ -323,7 +323,7 @@ function Home({ initialSettings }) {
key={group.name}
group={group}
layout={settings.layout?.[group.name]}
- fiveColumns={settings.fiveColumns}
+ maxGroupColumns={settings.fiveColumns ? 5 : settings.maxGroupColumns}
disableCollapse={settings.disableCollapse}
useEqualHeights={settings.useEqualHeights}
groupsInitiallyCollapsed={settings.groupsInitiallyCollapsed}
@@ -347,7 +347,7 @@ function Home({ initialSettings }) {
key={group.name}
group={group}
layout={settings.layout?.[group.name]}
- fiveColumns={settings.fiveColumns}
+ maxGroupColumns={settings.fiveColumns ? 5 : settings.maxGroupColumns}
disableCollapse={settings.disableCollapse}
groupsInitiallyCollapsed={settings.groupsInitiallyCollapsed}
/>
@@ -377,6 +377,7 @@ function Home({ initialSettings }) {
bookmarks,
settings.layout,
settings.fiveColumns,
+ settings.maxGroupColumns,
settings.disableCollapse,
settings.useEqualHeights,
settings.cardBlur,
From 708c4e64d1a94c4e6c445e853b295aeb3fbc50c8 Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Mon, 17 Mar 2025 12:47:34 -0700
Subject: [PATCH 52/89] Tweak this
---
docs/configs/settings.md | 2 +-
src/pages/_app.jsx | 1 -
2 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/docs/configs/settings.md b/docs/configs/settings.md
index bd000ccb..d3882121 100644
--- a/docs/configs/settings.md
+++ b/docs/configs/settings.md
@@ -270,7 +270,7 @@ You can set the maximum number of columns of service groups on larger screen siz
maxGroupColumns: 8 # default is 4, max 8
```
-By default homepage will max out at 4 columns (also the minimum number). If you're setting this to 8, you may want to consider enabling the [fullWidth](#full-width) option as well.
+By default homepage will max out at 4 columns (thus the minimum for this setting is _5_). Of course, if you're setting this to higher numbers, you may want to consider enabling the [fullWidth](#full-width) option as well.
### Collapsible sections
diff --git a/src/pages/_app.jsx b/src/pages/_app.jsx
index f4345a7c..8c5020f7 100644
--- a/src/pages/_app.jsx
+++ b/src/pages/_app.jsx
@@ -53,7 +53,6 @@ const tailwindSafelist = [
"bg-orange-400",
"dark:bg-orange-400",
// maxGroupColumns
- "3xl:basis-1/4",
"3xl:basis-1/5",
"3xl:basis-1/6",
"3xl:basis-1/7",
From a3b693e2b6bfe84ca33e35d7e77a13fd678a7c2d Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Mon, 17 Mar 2025 13:03:04 -0700
Subject: [PATCH 53/89] Support maxBookmarkGroupColumns too
---
docs/configs/settings.md | 12 +++++++++---
src/components/bookmarks/group.jsx | 4 ++++
src/pages/index.jsx | 3 +++
3 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/docs/configs/settings.md b/docs/configs/settings.md
index d3882121..9d35ae07 100644
--- a/docs/configs/settings.md
+++ b/docs/configs/settings.md
@@ -264,13 +264,19 @@ fullWidth: true
### Maximum Group Columns
-You can set the maximum number of columns of service groups on larger screen sizes (groups with `style: columns` which is default) by adding:
+You can set the maximum number of columns of groups on larger screen sizes (note this is only for groups with the default `style: columns`, not groups with `stle: row`) by adding:
```yaml
-maxGroupColumns: 8 # default is 4, max 8
+maxGroupColumns: 8 # default is 4 for services, 6 for bookmarks, max 8
```
-By default homepage will max out at 4 columns (thus the minimum for this setting is _5_). Of course, if you're setting this to higher numbers, you may want to consider enabling the [fullWidth](#full-width) option as well.
+By default homepage will max out at 4 columns for services and 6 for bookmarks, thus the minimum for this setting is _5_. Of course, if you're setting this to higher numbers, you may want to consider enabling the [fullWidth](#full-width) option as well.
+
+If you want to set the maximum columns for bookmark groups separately, you can do so by adding:
+
+```yaml
+maxBookmarkGroupColumns: 6 # default is 6, max 8
+```
### Collapsible sections
diff --git a/src/components/bookmarks/group.jsx b/src/components/bookmarks/group.jsx
index d8eb296d..726f54e8 100644
--- a/src/components/bookmarks/group.jsx
+++ b/src/components/bookmarks/group.jsx
@@ -12,6 +12,7 @@ export default function BookmarksGroup({
disableCollapse,
groupsInitiallyCollapsed,
bookmarksStyle,
+ maxGroupColumns,
}) {
const panel = useRef();
@@ -25,6 +26,9 @@ export default function BookmarksGroup({
className={classNames(
"bookmark-group flex-1 overflow-hidden",
layout?.style === "row" ? "basis-full" : "basis-full md:basis-1/4 lg:basis-1/5 xl:basis-1/6",
+ layout?.style !== "row" && maxGroupColumns && parseInt(maxGroupColumns, 10) > 6
+ ? `3xl:basis-1/${maxGroupColumns}`
+ : "",
layout?.header === false ? "px-1" : "p-1 pb-0",
)}
>
diff --git a/src/pages/index.jsx b/src/pages/index.jsx
index 96a9377d..78702796 100644
--- a/src/pages/index.jsx
+++ b/src/pages/index.jsx
@@ -334,6 +334,7 @@ function Home({ initialSettings }) {
bookmarks={group}
layout={settings.layout?.[group.name]}
disableCollapse={settings.disableCollapse}
+ maxGroupColumns={settings.maxBookmarkGroupColumns ?? settings.maxGroupColumns}
groupsInitiallyCollapsed={settings.groupsInitiallyCollapsed}
/>
),
@@ -362,6 +363,7 @@ function Home({ initialSettings }) {
bookmarks={group}
layout={settings.layout?.[group.name]}
disableCollapse={settings.disableCollapse}
+ maxGroupColumns={settings.maxBookmarkGroupColumns ?? settings.maxGroupColumns}
groupsInitiallyCollapsed={settings.groupsInitiallyCollapsed}
bookmarksStyle={settings.bookmarksStyle}
/>
@@ -378,6 +380,7 @@ function Home({ initialSettings }) {
settings.layout,
settings.fiveColumns,
settings.maxGroupColumns,
+ settings.maxBookmarkGroupColumns,
settings.disableCollapse,
settings.useEqualHeights,
settings.cardBlur,
From fa28a116583b97a51f750ddec9c29cf2555432c7 Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Mon, 17 Mar 2025 23:30:07 -0700
Subject: [PATCH 54/89] Fix: include new backdrop-blur-xs option (#5030)
---
docs/configs/settings.md | 2 +-
src/pages/_app.jsx | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/docs/configs/settings.md b/docs/configs/settings.md
index 9d35ae07..c1605f4d 100644
--- a/docs/configs/settings.md
+++ b/docs/configs/settings.md
@@ -78,7 +78,7 @@ background:
You can apply a blur filter to the service & bookmark cards. Note this option is incompatible with the background blur, saturate and brightness filters.
```yaml
-cardBlur: sm # sm, "", md, etc... see https://tailwindcss.com/docs/backdrop-blur
+cardBlur: xs # xs, md, etc... see https://tailwindcss.com/docs/backdrop-blur
```
## Favicon
diff --git a/src/pages/_app.jsx b/src/pages/_app.jsx
index 8c5020f7..c5465a80 100644
--- a/src/pages/_app.jsx
+++ b/src/pages/_app.jsx
@@ -16,6 +16,7 @@ import nextI18nextConfig from "../../next-i18next.config";
const tailwindSafelist = [
// TODO: remove pending https://github.com/tailwindlabs/tailwindcss/pull/17147
"backdrop-blur",
+ "backdrop-blur-xs",
"backdrop-blur-sm",
"backdrop-blur-md",
"backdrop-blur-xl",
From aed602ad70cabf5ad259cb9ac5bbbbd0e8801d53 Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Tue, 18 Mar 2025 19:29:43 -0700
Subject: [PATCH 55/89] Tweak: try to reduce rootless startup time (#5037)
---
docker-entrypoint.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh
index c2858808..9890fbee 100755
--- a/docker-entrypoint.sh
+++ b/docker-entrypoint.sh
@@ -15,7 +15,7 @@ export HOMEPAGE_BUILDTIME=$(date +%s)
# Set privileges for /app but only if pid 1 user is root and we are dropping privileges.
# If container is run as an unprivileged user, it means owner already handled ownership setup on their own.
# Running chown in that case (as non-root) will cause error
-[ "$(id -u)" == "0" ] && [ "${PUID}" != "0" ] && chown -R ${PUID}:${PGID} /app
+[ "$(id -u)" == "0" ] && [ "${PUID}" != "0" ] && chown -R ${PUID}:${PGID} /app/config /app/public
# Drop privileges (when asked to) if root, otherwise run as current user
if [ "$(id -u)" == "0" ] && [ "${PUID}" != "0" ]; then
From 7fd5e6ccb16da4a727b5cb2d7ac1f49f87cc95f4 Mon Sep 17 00:00:00 2001
From: IhatemyISP <1625407+ihatemyisp@users.noreply.github.com>
Date: Wed, 19 Mar 2025 19:26:49 -0400
Subject: [PATCH 56/89] Tweak: change moonraker widget standby output (#4060)
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
---
src/widgets/moonraker/component.jsx | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/src/widgets/moonraker/component.jsx b/src/widgets/moonraker/component.jsx
index f70a1c5b..ed99e418 100644
--- a/src/widgets/moonraker/component.jsx
+++ b/src/widgets/moonraker/component.jsx
@@ -36,14 +36,16 @@ export default function Component({ service }) {
const printStatsInfo = printStats.result.status.print_stats.info ?? {};
const { current_layer: currentLayer = "-", total_layer: totalLayer = "-" } = printStatsInfo;
+ const layers = printStats.result.status.print_stats.state === "standby" ? "- / -" : `${currentLayer} / ${totalLayer}`;
+ const progress =
+ printStats.result.status.print_stats.state === "standby"
+ ? "-"
+ : t("common.percent", { value: displayStatus.result.status.display_status.progress * 100 });
return (
-
-
+
+
);
From d853bbfe44a63d2d0e123a6ee41b769f5f9571ec Mon Sep 17 00:00:00 2001
From: Chris <67816022+vhsdream@users.noreply.github.com>
Date: Fri, 21 Mar 2025 00:46:54 -0400
Subject: [PATCH 57/89] Feature: Slskd Service Widget (#5045)
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
---
docs/widgets/services/index.md | 1 +
docs/widgets/services/slskd.md | 25 +++++++++++++++
public/locales/en/common.json | 11 +++++++
src/widgets/components.js | 1 +
src/widgets/slskd/component.jsx | 55 +++++++++++++++++++++++++++++++++
src/widgets/slskd/widget.js | 21 +++++++++++++
src/widgets/widgets.js | 2 ++
7 files changed, 116 insertions(+)
create mode 100644 docs/widgets/services/slskd.md
create mode 100644 src/widgets/slskd/component.jsx
create mode 100644 src/widgets/slskd/widget.js
diff --git a/docs/widgets/services/index.md b/docs/widgets/services/index.md
index 15caadc2..beb6d491 100644
--- a/docs/widgets/services/index.md
+++ b/docs/widgets/services/index.md
@@ -117,6 +117,7 @@ You can also find a list of all available service widgets in the sidebar navigat
- [ruTorrent](rutorrent.md)
- [SABnzbd](sabnzbd.md)
- [Scrutiny](scrutiny.md)
+- [Slskd](slskd.md)
- [Sonarr](sonarr.md)
- [Speedtest Tracker](speedtest-tracker.md)
- [Stash](stash.md)
diff --git a/docs/widgets/services/slskd.md b/docs/widgets/services/slskd.md
new file mode 100644
index 00000000..7afb0760
--- /dev/null
+++ b/docs/widgets/services/slskd.md
@@ -0,0 +1,25 @@
+---
+title: Slskd
+description: Slskd Widget Configuration
+---
+
+Learn more about [Slskd](https://github.com/slskd/slskd).
+
+Generate an API key for slskd with `openssl rand -base64 48`.
+Add it to your `path/to/config/slskd.yml` in `web > authentication > api_keys`:
+
+```yaml
+homepage_widget:
+ key:
+ role: readonly
+ cidr:
+```
+
+Allowed fields: `["slskStatus", "updateStatus", "downloads", "uploads", "sharedFiles"]` (maximum of 4).
+
+```yaml
+widget:
+ type: slskd
+ url: http[s]://slskd.host.or.ip[:5030]
+ key: generatedapikey
+```
diff --git a/public/locales/en/common.json b/public/locales/en/common.json
index 2bc4cf9c..0535cd6e 100644
--- a/public/locales/en/common.json
+++ b/public/locales/en/common.json
@@ -1030,5 +1030,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Tags"
+ },
+ "slskd": {
+ "slskStatus": "Network",
+ "connected": "Connected",
+ "disconnected": "Disconnected",
+ "updateStatus": "Update",
+ "update_yes": "Available",
+ "update_no": "Up to Date",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Files"
}
}
diff --git a/src/widgets/components.js b/src/widgets/components.js
index 6c12d823..148a626b 100644
--- a/src/widgets/components.js
+++ b/src/widgets/components.js
@@ -113,6 +113,7 @@ const components = {
rutorrent: dynamic(() => import("./rutorrent/component")),
sabnzbd: dynamic(() => import("./sabnzbd/component")),
scrutiny: dynamic(() => import("./scrutiny/component")),
+ slskd: dynamic(() => import("./slskd/component")),
sonarr: dynamic(() => import("./sonarr/component")),
speedtest: dynamic(() => import("./speedtest/component")),
spoolman: dynamic(() => import("./spoolman/component")),
diff --git a/src/widgets/slskd/component.jsx b/src/widgets/slskd/component.jsx
new file mode 100644
index 00000000..8c26d4e4
--- /dev/null
+++ b/src/widgets/slskd/component.jsx
@@ -0,0 +1,55 @@
+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";
+
+const slskdDefaultFields = ["slskStatus", "downloads", "uploads", "sharedFiles"];
+const MAX_ALLOWED_FIELDS = 4;
+
+export default function Component({ service }) {
+ const { t } = useTranslation();
+ const { widget } = service;
+
+ const { data: appData, error: appError } = useWidgetAPI(widget, "application");
+ const { data: downData, error: downError } = useWidgetAPI(widget, "downloads");
+ const { data: upData, error: upError } = useWidgetAPI(widget, "uploads");
+
+ if (appError || downError || upError) {
+ return ;
+ }
+
+ if (!widget.fields || widget.fields.length === 0) {
+ widget.fields = slskdDefaultFields;
+ } else if (widget.fields?.length > MAX_ALLOWED_FIELDS) {
+ widget.fields = widget.fields.slice(0, MAX_ALLOWED_FIELDS);
+ }
+
+ if (!appData || !downData || !upData) {
+ return (
+
+
+
+
+
+
+
+ );
+ }
+
+ return (
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/widgets/slskd/widget.js b/src/widgets/slskd/widget.js
new file mode 100644
index 00000000..fdea7738
--- /dev/null
+++ b/src/widgets/slskd/widget.js
@@ -0,0 +1,21 @@
+import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
+import { asJson } from "utils/proxy/api-helpers";
+
+const widget = {
+ api: `{url}/api/v0/{endpoint}`,
+ proxyHandler: credentialedProxyHandler,
+
+ mappings: {
+ application: {
+ endpoint: "application",
+ },
+ downloads: {
+ endpoint: "transfers/downloads",
+ },
+ uploads: {
+ endpoint: "transfers/uploads",
+ },
+ },
+};
+
+export default widget;
diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js
index 1537301c..21cff92b 100644
--- a/src/widgets/widgets.js
+++ b/src/widgets/widgets.js
@@ -104,6 +104,7 @@ import readarr from "./readarr/widget";
import rutorrent from "./rutorrent/widget";
import sabnzbd from "./sabnzbd/widget";
import scrutiny from "./scrutiny/widget";
+import slskd from "./slskd/widget";
import sonarr from "./sonarr/widget";
import speedtest from "./speedtest/widget";
import spoolman from "./spoolman/widget";
@@ -244,6 +245,7 @@ const widgets = {
rutorrent,
sabnzbd,
scrutiny,
+ slskd,
sonarr,
speedtest,
spoolman,
From a4b07b91fedc85cad69df74d11a7001adb92328c Mon Sep 17 00:00:00 2001
From: chiragkrishna
Date: Sat, 22 Mar 2025 20:15:27 +0530
Subject: [PATCH 58/89] Enhancement: Add Repositories field to Gitea (#5053)
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
---
docs/widgets/services/gitea.md | 2 +-
public/locales/en/common.json | 7 ++++---
src/widgets/gitea/component.jsx | 11 ++++++++---
src/widgets/gitea/widget.js | 3 +++
4 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/docs/widgets/services/gitea.md b/docs/widgets/services/gitea.md
index 140c4ee7..eb47849d 100644
--- a/docs/widgets/services/gitea.md
+++ b/docs/widgets/services/gitea.md
@@ -7,7 +7,7 @@ Learn more about [Gitea](https://gitea.com).
API token requires `notifications`, `repository` and `issue` permissions. See the [gitea documentation](https://docs.gitea.com/development/api-usage#generating-and-listing-api-tokens) for details on generating tokens.
-Allowed fields: `["notifications", "issues", "pulls"]`.
+Allowed fields: `["repositories", "notifications", "issues", "pulls"]`.
```yaml
widget:
diff --git a/public/locales/en/common.json b/public/locales/en/common.json
index 0535cd6e..4a9c33d5 100644
--- a/public/locales/en/common.json
+++ b/public/locales/en/common.json
@@ -883,9 +883,10 @@
"species": "Species"
},
"gitea": {
- "notifications": "Notifications",
- "issues": "Issues",
- "pulls": "Pull Requests"
+ "notifications": "Notifications",
+ "issues": "Issues",
+ "pulls": "Pull Requests",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Scenes",
diff --git a/src/widgets/gitea/component.jsx b/src/widgets/gitea/component.jsx
index 74e6dc82..c45ded06 100644
--- a/src/widgets/gitea/component.jsx
+++ b/src/widgets/gitea/component.jsx
@@ -8,17 +8,21 @@ export default function Component({ service }) {
const { data: giteaNotifications, error: giteaNotificationsError } = useWidgetAPI(widget, "notifications");
const { data: giteaIssues, error: giteaIssuesError } = useWidgetAPI(widget, "issues");
+ const { data: giteaRepositories, error: giteaRepositoriesError } = useWidgetAPI(widget, "repositories");
- if (giteaNotificationsError || giteaIssuesError) {
- return ;
+ if (giteaNotificationsError || giteaIssuesError || giteaRepositoriesError) {
+ return (
+
+ );
}
- if (!giteaNotifications || !giteaIssues) {
+ if (!giteaNotifications || !giteaIssues || !giteaRepositories) {
return (
+
);
}
@@ -28,6 +32,7 @@ export default function Component({ service }) {
+
);
}
diff --git a/src/widgets/gitea/widget.js b/src/widgets/gitea/widget.js
index 32871b00..b0420ccc 100644
--- a/src/widgets/gitea/widget.js
+++ b/src/widgets/gitea/widget.js
@@ -16,6 +16,9 @@ const widget = {
issues: asJson(data).filter((issue) => !issue.pull_request),
}),
},
+ repositories: {
+ endpoint: "repos/search",
+ },
},
};
From 5d557844cc8a738f0cfe4a84c02fea2804862ff9 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sat, 22 Mar 2025 07:49:16 -0700
Subject: [PATCH 59/89] Chore(deps): Bump next from 15.1.7 to 15.2.3 (#5055)
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package.json | 2 +-
pnpm-lock.yaml | 113 ++++++++++++++++++++++++++-----------------------
2 files changed, 61 insertions(+), 54 deletions(-)
diff --git a/package.json b/package.json
index 2b8bd695..83e80a38 100644
--- a/package.json
+++ b/package.json
@@ -25,7 +25,7 @@
"luxon": "^3.5.0",
"memory-cache": "^0.2.0",
"minecraftstatuspinger": "^1.2.2",
- "next": "^15.1.7",
+ "next": "^15.2.3",
"next-i18next": "^12.1.0",
"ping": "^0.4.4",
"pretty-bytes": "^6.1.1",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 6b5c5910..2848e239 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -51,11 +51,11 @@ importers:
specifier: ^1.2.2
version: 1.2.2
next:
- specifier: ^15.1.7
- version: 15.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ specifier: ^15.2.3
+ version: 15.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
next-i18next:
specifier: ^12.1.0
- version: 12.1.0(next@15.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ version: 12.1.0(next@15.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
ping:
specifier: ^0.4.4
version: 0.4.4
@@ -101,6 +101,10 @@ importers:
xml-js:
specifier: ^1.6.11
version: 1.6.11
+ optionalDependencies:
+ osx-temperature-sensor:
+ specifier: ^1.0.8
+ version: 1.0.8
devDependencies:
'@tailwindcss/forms':
specifier: ^0.5.10
@@ -147,10 +151,6 @@ importers:
typescript:
specifier: ^5.7.3
version: 5.7.3
- optionalDependencies:
- osx-temperature-sensor:
- specifier: ^1.0.8
- version: 1.0.8
packages:
@@ -376,56 +376,56 @@ packages:
'@kubernetes/client-node@1.0.0':
resolution: {integrity: sha512-a8NSvFDSHKFZ0sR1hbPSf8IDFNJwctEU5RodSCNiq/moRXWmrdmqhb1RRQzF+l+TSBaDgHw3YsYNxxE92STBzw==}
- '@next/env@15.1.7':
- resolution: {integrity: sha512-d9jnRrkuOH7Mhi+LHav2XW91HOgTAWHxjMPkXMGBc9B2b7614P7kjt8tAplRvJpbSt4nbO1lugcT/kAaWzjlLQ==}
+ '@next/env@15.2.3':
+ resolution: {integrity: sha512-a26KnbW9DFEUsSxAxKBORR/uD9THoYoKbkpFywMN/AFvboTt94b8+g/07T8J6ACsdLag8/PDU60ov4rPxRAixw==}
'@next/eslint-plugin-next@15.1.7':
resolution: {integrity: sha512-kRP7RjSxfTO13NE317ek3mSGzoZlI33nc/i5hs1KaWpK+egs85xg0DJ4p32QEiHnR0mVjuUfhRIun7awqfL7pQ==}
- '@next/swc-darwin-arm64@15.1.7':
- resolution: {integrity: sha512-hPFwzPJDpA8FGj7IKV3Yf1web3oz2YsR8du4amKw8d+jAOHfYHYFpMkoF6vgSY4W6vB29RtZEklK9ayinGiCmQ==}
+ '@next/swc-darwin-arm64@15.2.3':
+ resolution: {integrity: sha512-uaBhA8aLbXLqwjnsHSkxs353WrRgQgiFjduDpc7YXEU0B54IKx3vU+cxQlYwPCyC8uYEEX7THhtQQsfHnvv8dw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
- '@next/swc-darwin-x64@15.1.7':
- resolution: {integrity: sha512-2qoas+fO3OQKkU0PBUfwTiw/EYpN+kdAx62cePRyY1LqKtP09Vp5UcUntfZYajop5fDFTjSxCHfZVRxzi+9FYQ==}
+ '@next/swc-darwin-x64@15.2.3':
+ resolution: {integrity: sha512-pVwKvJ4Zk7h+4hwhqOUuMx7Ib02u3gDX3HXPKIShBi9JlYllI0nU6TWLbPT94dt7FSi6mSBhfc2JrHViwqbOdw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
- '@next/swc-linux-arm64-gnu@15.1.7':
- resolution: {integrity: sha512-sKLLwDX709mPdzxMnRIXLIT9zaX2w0GUlkLYQnKGoXeWUhcvpCrK+yevcwCJPdTdxZEUA0mOXGLdPsGkudGdnA==}
+ '@next/swc-linux-arm64-gnu@15.2.3':
+ resolution: {integrity: sha512-50ibWdn2RuFFkOEUmo9NCcQbbV9ViQOrUfG48zHBCONciHjaUKtHcYFiCwBVuzD08fzvzkWuuZkd4AqbvKO7UQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- '@next/swc-linux-arm64-musl@15.1.7':
- resolution: {integrity: sha512-zblK1OQbQWdC8fxdX4fpsHDw+VSpBPGEUX4PhSE9hkaWPrWoeIJn+baX53vbsbDRaDKd7bBNcXRovY1hEhFd7w==}
+ '@next/swc-linux-arm64-musl@15.2.3':
+ resolution: {integrity: sha512-2gAPA7P652D3HzR4cLyAuVYwYqjG0mt/3pHSWTCyKZq/N/dJcUAEoNQMyUmwTZWCJRKofB+JPuDVP2aD8w2J6Q==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- '@next/swc-linux-x64-gnu@15.1.7':
- resolution: {integrity: sha512-GOzXutxuLvLHFDAPsMP2zDBMl1vfUHHpdNpFGhxu90jEzH6nNIgmtw/s1MDwpTOiM+MT5V8+I1hmVFeAUhkbgQ==}
+ '@next/swc-linux-x64-gnu@15.2.3':
+ resolution: {integrity: sha512-ODSKvrdMgAJOVU4qElflYy1KSZRM3M45JVbeZu42TINCMG3anp7YCBn80RkISV6bhzKwcUqLBAmOiWkaGtBA9w==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- '@next/swc-linux-x64-musl@15.1.7':
- resolution: {integrity: sha512-WrZ7jBhR7ATW1z5iEQ0ZJfE2twCNSXbpCSaAunF3BKcVeHFADSI/AW1y5Xt3DzTqPF1FzQlwQTewqetAABhZRQ==}
+ '@next/swc-linux-x64-musl@15.2.3':
+ resolution: {integrity: sha512-ZR9kLwCWrlYxwEoytqPi1jhPd1TlsSJWAc+H/CJHmHkf2nD92MQpSRIURR1iNgA/kuFSdxB8xIPt4p/T78kwsg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- '@next/swc-win32-arm64-msvc@15.1.7':
- resolution: {integrity: sha512-LDnj1f3OVbou1BqvvXVqouJZKcwq++mV2F+oFHptToZtScIEnhNRJAhJzqAtTE2dB31qDYL45xJwrc+bLeKM2Q==}
+ '@next/swc-win32-arm64-msvc@15.2.3':
+ resolution: {integrity: sha512-+G2FrDcfm2YDbhDiObDU/qPriWeiz/9cRR0yMWJeTLGGX6/x8oryO3tt7HhodA1vZ8r2ddJPCjtLcpaVl7TE2Q==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
- '@next/swc-win32-x64-msvc@15.1.7':
- resolution: {integrity: sha512-dC01f1quuf97viOfW05/K8XYv2iuBgAxJZl7mbCKEjMgdQl5JjAKJ0D2qMKZCgPWDeFbFT0Q0nYWwytEW0DWTQ==}
+ '@next/swc-win32-x64-msvc@15.2.3':
+ resolution: {integrity: sha512-gHYS9tc+G2W0ZC8rBL+H6RdtXIyk40uLiaos0yj5US85FNhbFEndMA2nW3z47nzOWiSvXTZ5kBClc3rD0zJg0w==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
@@ -882,8 +882,8 @@ packages:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
- caniuse-lite@1.0.30001700:
- resolution: {integrity: sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==}
+ caniuse-lite@1.0.30001706:
+ resolution: {integrity: sha512-3ZczoTApMAZwPKYWmwVbQMFpXBDds3/0VciVoUwPUbldlYyVLmRVuRs/PcUZtHpbLRpzzDvrvnFuREsGt6lUug==}
chalk@4.1.2:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
@@ -1955,6 +1955,11 @@ packages:
nan@2.22.0:
resolution: {integrity: sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==}
+ nanoid@3.3.11:
+ resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
nanoid@3.3.8:
resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@@ -1970,8 +1975,8 @@ packages:
next: '>= 10.0.0'
react: '>= 16.8.0'
- next@15.1.7:
- resolution: {integrity: sha512-GNeINPGS9c6OZKCvKypbL8GTsT5GhWPp4DM0fzkXJuXMilOO2EeFxuAY6JZbtk6XIl6Ws10ag3xRINDjSO5+wg==}
+ next@15.2.3:
+ resolution: {integrity: sha512-x6eDkZxk2rPpu46E1ZVUWIBhYCLszmUY6fvHBFcbzJ9dD+qRX6vcHusaqqDlnY+VngKzKbAiG2iRCkPbmi8f7w==}
engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
hasBin: true
peerDependencies:
@@ -2977,34 +2982,34 @@ snapshots:
- encoding
- utf-8-validate
- '@next/env@15.1.7': {}
+ '@next/env@15.2.3': {}
'@next/eslint-plugin-next@15.1.7':
dependencies:
fast-glob: 3.3.1
- '@next/swc-darwin-arm64@15.1.7':
+ '@next/swc-darwin-arm64@15.2.3':
optional: true
- '@next/swc-darwin-x64@15.1.7':
+ '@next/swc-darwin-x64@15.2.3':
optional: true
- '@next/swc-linux-arm64-gnu@15.1.7':
+ '@next/swc-linux-arm64-gnu@15.2.3':
optional: true
- '@next/swc-linux-arm64-musl@15.1.7':
+ '@next/swc-linux-arm64-musl@15.2.3':
optional: true
- '@next/swc-linux-x64-gnu@15.1.7':
+ '@next/swc-linux-x64-gnu@15.2.3':
optional: true
- '@next/swc-linux-x64-musl@15.1.7':
+ '@next/swc-linux-x64-musl@15.2.3':
optional: true
- '@next/swc-win32-arm64-msvc@15.1.7':
+ '@next/swc-win32-arm64-msvc@15.2.3':
optional: true
- '@next/swc-win32-x64-msvc@15.1.7':
+ '@next/swc-win32-x64-msvc@15.2.3':
optional: true
'@nodelib/fs.scandir@2.1.5':
@@ -3486,7 +3491,7 @@ snapshots:
callsites@3.1.0: {}
- caniuse-lite@1.0.30001700: {}
+ caniuse-lite@1.0.30001706: {}
chalk@4.1.2:
dependencies:
@@ -4684,11 +4689,13 @@ snapshots:
nan@2.22.0:
optional: true
+ nanoid@3.3.11: {}
+
nanoid@3.3.8: {}
natural-compare@1.4.0: {}
- next-i18next@12.1.0(next@15.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ next-i18next@12.1.0(next@15.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
'@babel/runtime': 7.26.9
'@types/hoist-non-react-statics': 3.3.6
@@ -4696,33 +4703,33 @@ snapshots:
hoist-non-react-statics: 3.3.2
i18next: 21.10.0
i18next-fs-backend: 1.2.0
- next: 15.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ next: 15.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
react-i18next: 11.18.6(i18next@21.10.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
transitivePeerDependencies:
- react-dom
- react-native
- next@15.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ next@15.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@next/env': 15.1.7
+ '@next/env': 15.2.3
'@swc/counter': 0.1.3
'@swc/helpers': 0.5.15
busboy: 1.6.0
- caniuse-lite: 1.0.30001700
+ caniuse-lite: 1.0.30001706
postcss: 8.4.31
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
styled-jsx: 5.1.6(react@18.3.1)
optionalDependencies:
- '@next/swc-darwin-arm64': 15.1.7
- '@next/swc-darwin-x64': 15.1.7
- '@next/swc-linux-arm64-gnu': 15.1.7
- '@next/swc-linux-arm64-musl': 15.1.7
- '@next/swc-linux-x64-gnu': 15.1.7
- '@next/swc-linux-x64-musl': 15.1.7
- '@next/swc-win32-arm64-msvc': 15.1.7
- '@next/swc-win32-x64-msvc': 15.1.7
+ '@next/swc-darwin-arm64': 15.2.3
+ '@next/swc-darwin-x64': 15.2.3
+ '@next/swc-linux-arm64-gnu': 15.2.3
+ '@next/swc-linux-arm64-musl': 15.2.3
+ '@next/swc-linux-x64-gnu': 15.2.3
+ '@next/swc-linux-x64-musl': 15.2.3
+ '@next/swc-win32-arm64-msvc': 15.2.3
+ '@next/swc-win32-x64-msvc': 15.2.3
sharp: 0.33.5
transitivePeerDependencies:
- '@babel/core'
@@ -4860,7 +4867,7 @@ snapshots:
postcss@8.4.31:
dependencies:
- nanoid: 3.3.8
+ nanoid: 3.3.11
picocolors: 1.1.1
source-map-js: 1.2.1
From 1f8fd1c69db299ad93a38270b7e107f5fc84174e Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Sun, 23 Mar 2025 07:11:20 -0700
Subject: [PATCH 60/89] Add install pnpm to source instructions
---
docs/installation/source.md | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/docs/installation/source.md b/docs/installation/source.md
index 6697eb92..fd0275a7 100644
--- a/docs/installation/source.md
+++ b/docs/installation/source.md
@@ -9,7 +9,13 @@ First, clone the repository:
git clone https://github.com/gethomepage/homepage.git
```
-Then install dependencies and build the production bundle (I'm using pnpm here, you can use npm or yarn if you like):
+If `pnpm` is not installed, install it:
+
+```bash
+npm install -g pnpm
+```
+
+Then install dependencies and build the production bundle:
```bash
pnpm install
From 77bbdc6a0475bd788ec729717e88eb42d2c183d7 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Thu, 27 Mar 2025 13:21:33 -0700
Subject: [PATCH 61/89] New Crowdin translations by GitHub Action (#5010)
Co-authored-by: Crowdin Bot
---
public/locales/af/common.json | 24 +++--
public/locales/ar/common.json | 14 ++-
public/locales/bg/common.json | 14 ++-
public/locales/ca/common.json | 14 ++-
public/locales/cs/common.json | 14 ++-
public/locales/da/common.json | 14 ++-
public/locales/de/common.json | 24 +++--
public/locales/el/common.json | 14 ++-
public/locales/eo/common.json | 14 ++-
public/locales/es/common.json | 14 ++-
public/locales/eu/common.json | 14 ++-
public/locales/fi/common.json | 14 ++-
public/locales/fr/common.json | 28 ++++--
public/locales/he/common.json | 14 ++-
public/locales/hi/common.json | 14 ++-
public/locales/hr/common.json | 14 ++-
public/locales/hu/common.json | 14 ++-
public/locales/id/common.json | 32 ++++---
public/locales/it/common.json | 14 ++-
public/locales/ja/common.json | 14 ++-
public/locales/ko/common.json | 14 ++-
public/locales/lv/common.json | 14 ++-
public/locales/ms/common.json | 14 ++-
public/locales/nl/common.json | 14 ++-
public/locales/no/common.json | 14 ++-
public/locales/pl/common.json | 14 ++-
public/locales/pt/common.json | 14 ++-
public/locales/pt_BR/common.json | 138 ++++++++++++++++-------------
public/locales/ro/common.json | 14 ++-
public/locales/ru/common.json | 50 +++++++----
public/locales/sk/common.json | 14 ++-
public/locales/sl/common.json | 14 ++-
public/locales/sr/common.json | 14 ++-
public/locales/sv/common.json | 14 ++-
public/locales/te/common.json | 14 ++-
public/locales/th/common.json | 14 ++-
public/locales/tr/common.json | 14 ++-
public/locales/uk/common.json | 14 ++-
public/locales/vi/common.json | 14 ++-
public/locales/yue/common.json | 14 ++-
public/locales/zh-Hans/common.json | 14 ++-
public/locales/zh-Hant/common.json | 14 ++-
42 files changed, 652 insertions(+), 148 deletions(-)
diff --git a/public/locales/af/common.json b/public/locales/af/common.json
index 20f3d170..bf1e5f9c 100644
--- a/public/locales/af/common.json
+++ b/public/locales/af/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Kennisgewings",
"issues": "Kwessies",
- "pulls": "Trek Versoeke"
+ "pulls": "Trek Versoeke",
+ "repositories": "Bewaarplekke"
},
"stash": {
"scenes": "Tonele",
@@ -1024,11 +1025,22 @@
"timeleft": "Oorblywende Tyd"
},
"hoarder": {
- "bookmarks": "Bookmarks",
- "favorites": "Favorites",
- "archived": "Archived",
- "highlights": "Highlights",
- "lists": "Lists",
+ "bookmarks": "Boekmerke",
+ "favorites": "Gunstelinge",
+ "archived": "Geargiveer",
+ "highlights": "Hoogtepunte",
+ "lists": "Lyste",
"tags": "Merkers"
+ },
+ "slskd": {
+ "slskStatus": "Netwerk",
+ "connected": "Gekoppel",
+ "disconnected": "Ontkoppel",
+ "updateStatus": "Opdateer",
+ "update_yes": "Beskikbaar",
+ "update_no": "Op Datum",
+ "downloads": "Aflaaie",
+ "uploads": "Oplaaie",
+ "sharedFiles": "Lêers"
}
}
diff --git a/public/locales/ar/common.json b/public/locales/ar/common.json
index 7c7344f8..baa4d593 100644
--- a/public/locales/ar/common.json
+++ b/public/locales/ar/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "الإشعارات",
"issues": "المُشكِلات",
- "pulls": "طلبات السحب"
+ "pulls": "طلبات السحب",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "المشاهد",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "التصنيفات"
+ },
+ "slskd": {
+ "slskStatus": "الشبكة",
+ "connected": "متصل",
+ "disconnected": "غير متصل",
+ "updateStatus": "Update",
+ "update_yes": "متاح",
+ "update_no": "حتى الآن",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "ملفات"
}
}
diff --git a/public/locales/bg/common.json b/public/locales/bg/common.json
index 74505cc6..3c721bce 100644
--- a/public/locales/bg/common.json
+++ b/public/locales/bg/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Известия",
"issues": "Издания",
- "pulls": "Заявки за сливане"
+ "pulls": "Заявки за сливане",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Сцени",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Тагове"
+ },
+ "slskd": {
+ "slskStatus": "Мрежа",
+ "connected": "Свързан",
+ "disconnected": "Не е свързан",
+ "updateStatus": "Update",
+ "update_yes": "Наличен",
+ "update_no": "Актуално",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Файлове"
}
}
diff --git a/public/locales/ca/common.json b/public/locales/ca/common.json
index 620a0df5..07b1f611 100644
--- a/public/locales/ca/common.json
+++ b/public/locales/ca/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Notificacions",
"issues": "Problemes",
- "pulls": "Sol·licitud de Canvis"
+ "pulls": "Sol·licitud de Canvis",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Escenes",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Etiquetes"
+ },
+ "slskd": {
+ "slskStatus": "Xarxa",
+ "connected": "Connectat",
+ "disconnected": "Desconnectat",
+ "updateStatus": "Update",
+ "update_yes": "Disponible",
+ "update_no": "Actualitzat",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Fitxers"
}
}
diff --git a/public/locales/cs/common.json b/public/locales/cs/common.json
index 31c7921a..e9a8061d 100644
--- a/public/locales/cs/common.json
+++ b/public/locales/cs/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Notifications",
"issues": "Problémy",
- "pulls": "Pull Requests"
+ "pulls": "Pull Requests",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Scenes",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Tags"
+ },
+ "slskd": {
+ "slskStatus": "Network",
+ "connected": "",
+ "disconnected": "Odpojeno",
+ "updateStatus": "Update",
+ "update_yes": "Dostupné",
+ "update_no": "Žádné",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Soubory"
}
}
diff --git a/public/locales/da/common.json b/public/locales/da/common.json
index 8a354b91..901d0ce4 100644
--- a/public/locales/da/common.json
+++ b/public/locales/da/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Notifications",
"issues": "Problemer",
- "pulls": "Pull Requests"
+ "pulls": "Pull Requests",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Scenes",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Tags"
+ },
+ "slskd": {
+ "slskStatus": "Network",
+ "connected": "Connected",
+ "disconnected": "Disconnected",
+ "updateStatus": "Update",
+ "update_yes": "Tilgængelig",
+ "update_no": "Opdateret",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Filer"
}
}
diff --git a/public/locales/de/common.json b/public/locales/de/common.json
index 69c0fe7c..94fb91aa 100644
--- a/public/locales/de/common.json
+++ b/public/locales/de/common.json
@@ -447,7 +447,7 @@
"write": "Schreiben",
"gpu": "GPU",
"mem": "RAM",
- "swap": "Swap"
+ "swap": "Auslagerung"
},
"quicklaunch": {
"bookmark": "Lesezeichen",
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Benachrichtigungen",
"issues": "Probleme",
- "pulls": "Pull-Requests"
+ "pulls": "Pull-Requests",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Szenen",
@@ -1024,11 +1025,22 @@
"timeleft": "Verbleibende Zeit"
},
"hoarder": {
- "bookmarks": "Bookmarks",
- "favorites": "Favorites",
- "archived": "Archived",
+ "bookmarks": "Lesezeichen",
+ "favorites": "Favoriten",
+ "archived": "Archiviert",
"highlights": "Highlights",
- "lists": "Lists",
+ "lists": "Listen",
"tags": "Schlagwörter"
+ },
+ "slskd": {
+ "slskStatus": "Netzwerk",
+ "connected": "Verbunden",
+ "disconnected": "Getrennt",
+ "updateStatus": "Update",
+ "update_yes": "Verfügbar",
+ "update_no": "Aktuell",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Dateien"
}
}
diff --git a/public/locales/el/common.json b/public/locales/el/common.json
index c582f49f..b1cbe307 100644
--- a/public/locales/el/common.json
+++ b/public/locales/el/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Notifications",
"issues": "Issues",
- "pulls": "Pull Requests"
+ "pulls": "Pull Requests",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Scenes",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Ετικέτες"
+ },
+ "slskd": {
+ "slskStatus": "Δίκτυο",
+ "connected": "Συνδέθηκε",
+ "disconnected": "Αποσυνδέθηκε",
+ "updateStatus": "Update",
+ "update_yes": "Διαθέσιμο",
+ "update_no": "Ενημερωμένο",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Αρχεία"
}
}
diff --git a/public/locales/eo/common.json b/public/locales/eo/common.json
index 8a7bb831..908bd124 100644
--- a/public/locales/eo/common.json
+++ b/public/locales/eo/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Notifications",
"issues": "Issues",
- "pulls": "Pull Requests"
+ "pulls": "Pull Requests",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Scenes",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Tags"
+ },
+ "slskd": {
+ "slskStatus": "Network",
+ "connected": "Connected",
+ "disconnected": "Disconnected",
+ "updateStatus": "Update",
+ "update_yes": "Havebla",
+ "update_no": "Up to Date",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Files"
}
}
diff --git a/public/locales/es/common.json b/public/locales/es/common.json
index 9d23e343..a5ac67ed 100644
--- a/public/locales/es/common.json
+++ b/public/locales/es/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Notificaciones",
"issues": "Números",
- "pulls": "Solicitudes de cambios"
+ "pulls": "Solicitudes de cambios",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Escenas",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Etiquetas"
+ },
+ "slskd": {
+ "slskStatus": "Red",
+ "connected": "Conectado",
+ "disconnected": "Desconectado",
+ "updateStatus": "Update",
+ "update_yes": "Disponible",
+ "update_no": "Actualizado",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Archivos"
}
}
diff --git a/public/locales/eu/common.json b/public/locales/eu/common.json
index f935b928..f0654ebb 100644
--- a/public/locales/eu/common.json
+++ b/public/locales/eu/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Jakinarazpenak",
"issues": "Arazoak",
- "pulls": "Pull Requests"
+ "pulls": "Pull Requests",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Scenes",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Zerrendak",
"tags": "Etiketak"
+ },
+ "slskd": {
+ "slskStatus": "Network",
+ "connected": "Konektatuta",
+ "disconnected": "Deskonektatuta",
+ "updateStatus": "Update",
+ "update_yes": "Available",
+ "update_no": "Up to Date",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Files"
}
}
diff --git a/public/locales/fi/common.json b/public/locales/fi/common.json
index 782bc2c4..b1ff23b4 100644
--- a/public/locales/fi/common.json
+++ b/public/locales/fi/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Notifications",
"issues": "Issues",
- "pulls": "Pull Requests"
+ "pulls": "Pull Requests",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Scenes",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Tags"
+ },
+ "slskd": {
+ "slskStatus": "Network",
+ "connected": "Connected",
+ "disconnected": "Disconnected",
+ "updateStatus": "Update",
+ "update_yes": "Saatavilla",
+ "update_no": "Up to Date",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Files"
}
}
diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json
index 191706b2..f0cd54f6 100644
--- a/public/locales/fr/common.json
+++ b/public/locales/fr/common.json
@@ -149,8 +149,8 @@
"received": "Reçu",
"sent": "Envoyé",
"externalIPAddress": "IP externe",
- "externalIPv6Address": "Ext. IPv6",
- "externalIPv6Prefix": "Ext. IPv6-Prefix"
+ "externalIPv6Address": "IPv6 externe",
+ "externalIPv6Prefix": "Préfixe IPv6 externe"
},
"caddy": {
"upstreams": "En amont",
@@ -178,7 +178,7 @@
"connectedAp": "AP connectés",
"activeUser": "Périphériques actifs",
"alerts": "Alertes",
- "connectedGateways": "Connected gateways",
+ "connectedGateways": "Passerelles connectées",
"connectedSwitches": "Switchs connectés"
},
"nzbget": {
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Notifications",
"issues": "Anomalies",
- "pulls": "Demandes de tirage"
+ "pulls": "Demandes de tirage",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Scènes",
@@ -1024,11 +1025,22 @@
"timeleft": "Temps restant"
},
"hoarder": {
- "bookmarks": "Bookmarks",
- "favorites": "Favorites",
- "archived": "Archived",
+ "bookmarks": "Marque-pages",
+ "favorites": "Favoris",
+ "archived": "Archivé",
"highlights": "Highlights",
- "lists": "Lists",
+ "lists": "Listes",
"tags": "Étiquettes"
+ },
+ "slskd": {
+ "slskStatus": "Réseau",
+ "connected": "Connecté",
+ "disconnected": "Déconnecté",
+ "updateStatus": "Mise à jour",
+ "update_yes": "Disponible",
+ "update_no": "À jour",
+ "downloads": "Téléchargements",
+ "uploads": "Téléversements",
+ "sharedFiles": "Fichiers"
}
}
diff --git a/public/locales/he/common.json b/public/locales/he/common.json
index 57ce66b9..2751430c 100644
--- a/public/locales/he/common.json
+++ b/public/locales/he/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Notifications",
"issues": "Issues",
- "pulls": "Pull Requests"
+ "pulls": "Pull Requests",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Scenes",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Tags"
+ },
+ "slskd": {
+ "slskStatus": "Network",
+ "connected": "Connected",
+ "disconnected": "Disconnected",
+ "updateStatus": "Update",
+ "update_yes": "זמין",
+ "update_no": "Up to Date",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Files"
}
}
diff --git a/public/locales/hi/common.json b/public/locales/hi/common.json
index 0744578a..19f419cd 100644
--- a/public/locales/hi/common.json
+++ b/public/locales/hi/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Notifications",
"issues": "Issues",
- "pulls": "Pull Requests"
+ "pulls": "Pull Requests",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Scenes",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Tags"
+ },
+ "slskd": {
+ "slskStatus": "Network",
+ "connected": "Connected",
+ "disconnected": "Disconnected",
+ "updateStatus": "Update",
+ "update_yes": "Available",
+ "update_no": "Up to Date",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Files"
}
}
diff --git a/public/locales/hr/common.json b/public/locales/hr/common.json
index 31f92935..2b1c013c 100644
--- a/public/locales/hr/common.json
+++ b/public/locales/hr/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Obavijesti",
"issues": "Problemi",
- "pulls": "Zahtjevi za povlačenje"
+ "pulls": "Zahtjevi za povlačenje",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Scene",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Oznake"
+ },
+ "slskd": {
+ "slskStatus": "Mreža",
+ "connected": "Povezano",
+ "disconnected": "Odspojeno",
+ "updateStatus": "Update",
+ "update_yes": "Dostupno",
+ "update_no": "Aktualno",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Datoteke"
}
}
diff --git a/public/locales/hu/common.json b/public/locales/hu/common.json
index e21689aa..f6b5e183 100644
--- a/public/locales/hu/common.json
+++ b/public/locales/hu/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Üzenetek",
"issues": "Problémák",
- "pulls": "Pull request-ek"
+ "pulls": "Pull request-ek",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Jelenetek",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Címkék"
+ },
+ "slskd": {
+ "slskStatus": "Hálózat",
+ "connected": "Csatlakozva",
+ "disconnected": "Kapcsolat bontva",
+ "updateStatus": "Update",
+ "update_yes": "Elérhető",
+ "update_no": "Naprakész",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Fájlok"
}
}
diff --git a/public/locales/id/common.json b/public/locales/id/common.json
index 7d049bec..fa4d6459 100644
--- a/public/locales/id/common.json
+++ b/public/locales/id/common.json
@@ -342,7 +342,7 @@
"totalNxDomain": "Domain NX",
"totalRefused": "Ditolak",
"totalAuthoritative": "Authoritative",
- "totalRecursive": "Recursive",
+ "totalRecursive": "Rekursif",
"totalCached": "Cached",
"totalBlocked": "Terblokir",
"totalDropped": "Dropped",
@@ -705,8 +705,8 @@
"time": "Waktu"
},
"firefly": {
- "networth": "Net Worth",
- "budget": "Budget"
+ "networth": "Kekayaan Bersih",
+ "budget": "Anggaran"
},
"grafana": {
"dashboards": "Dasbor",
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Notifikasi",
"issues": "Isu",
- "pulls": "Pull Requests"
+ "pulls": "Pull Requests",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Adegan",
@@ -965,7 +966,7 @@
"lubelogger": {
"vehicle": "Kendaraan",
"vehicles": "Kendaraan",
- "serviceRecords": "Service Records",
+ "serviceRecords": "Catatan Servis",
"reminders": "Pengingat",
"nextReminder": "Pengingat Berikutnya",
"none": "Tidak ada"
@@ -1024,11 +1025,22 @@
"timeleft": "Sisa Waktu"
},
"hoarder": {
- "bookmarks": "Bookmarks",
- "favorites": "Favorites",
- "archived": "Archived",
- "highlights": "Highlights",
- "lists": "Lists",
+ "bookmarks": "Markah",
+ "favorites": "Favorit",
+ "archived": "Diarsipkan",
+ "highlights": "Sorotan",
+ "lists": "Daftar",
"tags": "Tag"
+ },
+ "slskd": {
+ "slskStatus": "Jaringan",
+ "connected": "Tersambung",
+ "disconnected": "Terputus",
+ "updateStatus": "Update",
+ "update_yes": "Tersedia",
+ "update_no": "Terbaru",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "File"
}
}
diff --git a/public/locales/it/common.json b/public/locales/it/common.json
index 3d0dc450..4b0672f9 100644
--- a/public/locales/it/common.json
+++ b/public/locales/it/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Notifiche",
"issues": "Problemi",
- "pulls": "Richieste di Pull"
+ "pulls": "Richieste di Pull",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Scene",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Tag"
+ },
+ "slskd": {
+ "slskStatus": "Rete",
+ "connected": "Connesso",
+ "disconnected": "Disconnesso",
+ "updateStatus": "Update",
+ "update_yes": "Disponibili",
+ "update_no": "Aggiornato",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "File"
}
}
diff --git a/public/locales/ja/common.json b/public/locales/ja/common.json
index 020d7d3b..58869e84 100644
--- a/public/locales/ja/common.json
+++ b/public/locales/ja/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "通知",
"issues": "課題",
- "pulls": "プルリクエスト"
+ "pulls": "プルリクエスト",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "シーン",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "タグ"
+ },
+ "slskd": {
+ "slskStatus": "ネットワーク",
+ "connected": "接続済",
+ "disconnected": "切断されました",
+ "updateStatus": "Update",
+ "update_yes": "利用可",
+ "update_no": "最新",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "ファイル"
}
}
diff --git a/public/locales/ko/common.json b/public/locales/ko/common.json
index 00ff2ea1..5f5523ff 100644
--- a/public/locales/ko/common.json
+++ b/public/locales/ko/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "알림",
"issues": "Issues",
- "pulls": "Pull Requests"
+ "pulls": "Pull Requests",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "장면",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "태그"
+ },
+ "slskd": {
+ "slskStatus": "네트워크",
+ "connected": "연결됨",
+ "disconnected": "연결 끊김",
+ "updateStatus": "Update",
+ "update_yes": "이용 가능",
+ "update_no": "최신 상태",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "파일"
}
}
diff --git a/public/locales/lv/common.json b/public/locales/lv/common.json
index 538febf1..85d9a359 100644
--- a/public/locales/lv/common.json
+++ b/public/locales/lv/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Notifications",
"issues": "Issues",
- "pulls": "Pull Requests"
+ "pulls": "Pull Requests",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Scenes",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Tags"
+ },
+ "slskd": {
+ "slskStatus": "Network",
+ "connected": "Connected",
+ "disconnected": "Disconnected",
+ "updateStatus": "Update",
+ "update_yes": "Available",
+ "update_no": "Up to Date",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Files"
}
}
diff --git a/public/locales/ms/common.json b/public/locales/ms/common.json
index ba32381f..4ebfd6d8 100644
--- a/public/locales/ms/common.json
+++ b/public/locales/ms/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Notifications",
"issues": "Issues",
- "pulls": "Pull Requests"
+ "pulls": "Pull Requests",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Adegan",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Tanda nama"
+ },
+ "slskd": {
+ "slskStatus": "Rangkaian",
+ "connected": "Connected",
+ "disconnected": "Sambungan Terputus",
+ "updateStatus": "Update",
+ "update_yes": "Sudah Ada",
+ "update_no": "Terkemaskini",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Files"
}
}
diff --git a/public/locales/nl/common.json b/public/locales/nl/common.json
index dfa15f10..e26ad05e 100644
--- a/public/locales/nl/common.json
+++ b/public/locales/nl/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Notificaties",
"issues": "Problemen",
- "pulls": "Pull Requests"
+ "pulls": "Pull Requests",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Scènes",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Label"
+ },
+ "slskd": {
+ "slskStatus": "Netwerk",
+ "connected": "Verbonden",
+ "disconnected": "Verbinding verbroken",
+ "updateStatus": "Update",
+ "update_yes": "Beschikbaar",
+ "update_no": "Bijgewerkt",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Bestanden"
}
}
diff --git a/public/locales/no/common.json b/public/locales/no/common.json
index b179110b..67710fe1 100644
--- a/public/locales/no/common.json
+++ b/public/locales/no/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Varslinger",
"issues": "Issues",
- "pulls": "Forespørsel"
+ "pulls": "Forespørsel",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Scener",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Stikkord"
+ },
+ "slskd": {
+ "slskStatus": "Nettverk",
+ "connected": "Tilkoblet",
+ "disconnected": "Frakoblet",
+ "updateStatus": "Update",
+ "update_yes": "Tilgjengelig",
+ "update_no": "Oppdatert",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Files"
}
}
diff --git a/public/locales/pl/common.json b/public/locales/pl/common.json
index 9d669f8a..1316d5c9 100644
--- a/public/locales/pl/common.json
+++ b/public/locales/pl/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Powiadomienia",
"issues": "Zgłoszenia",
- "pulls": "Żądania Pull"
+ "pulls": "Żądania Pull",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Sceny",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Tagi"
+ },
+ "slskd": {
+ "slskStatus": "Sieć",
+ "connected": "Połączono",
+ "disconnected": "Rozłączono",
+ "updateStatus": "Update",
+ "update_yes": "Dostępne",
+ "update_no": "Aktualny",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Pliki"
}
}
diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json
index 66439545..acbf2d96 100644
--- a/public/locales/pt/common.json
+++ b/public/locales/pt/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Notificações",
"issues": "Problemas",
- "pulls": "Solicitar pull"
+ "pulls": "Solicitar pull",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Cenas",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Etiquetas"
+ },
+ "slskd": {
+ "slskStatus": "Rede",
+ "connected": "Conectado",
+ "disconnected": "Desconectado",
+ "updateStatus": "Update",
+ "update_yes": "Disponível",
+ "update_no": "Atualizado",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Ficheiros"
}
}
diff --git a/public/locales/pt_BR/common.json b/public/locales/pt_BR/common.json
index 23c5c3dc..92a1dfcf 100644
--- a/public/locales/pt_BR/common.json
+++ b/public/locales/pt_BR/common.json
@@ -47,7 +47,7 @@
"load": "Carga",
"temp": "TEMP",
"max": "Máximo",
- "uptime": "CIMA"
+ "uptime": "ATIVO"
},
"unifi": {
"users": "Usuários",
@@ -61,7 +61,7 @@
"wlan_devices": "Dispositivos WLAN",
"lan_users": "Usuários de LAN",
"wlan_users": "Usuários de WLAN",
- "up": "CIMA",
+ "up": "ATIVO",
"down": "Desligado",
"wait": "Por favor, aguarde",
"empty_data": "Status do Subsistema desconhecido"
@@ -149,8 +149,8 @@
"received": "Recebido",
"sent": "Enviado",
"externalIPAddress": "IP Externo",
- "externalIPv6Address": "Ext. IPv6",
- "externalIPv6Prefix": "Ext. IPv6-Prefix"
+ "externalIPv6Address": "IPv6 Externo",
+ "externalIPv6Prefix": "Prefixo IPv6 Externo"
},
"caddy": {
"upstreams": "Streams de Envio",
@@ -178,7 +178,7 @@
"connectedAp": "APs Ligados",
"activeUser": "Dispositivos ativos",
"alerts": "Alertas",
- "connectedGateways": "Connected gateways",
+ "connectedGateways": "Gateways conectados",
"connectedSwitches": "Switches conectados"
},
"nzbget": {
@@ -229,8 +229,8 @@
"seed": "Semente"
},
"develancacheui": {
- "cachehitbytes": "Cache Hit Bytes",
- "cachemissbytes": "Cache Miss Bytes"
+ "cachehitbytes": "Bytes de Acerto de Cache",
+ "cachemissbytes": "Bytes de Falha de Cache"
},
"downloadstation": {
"download": "Descarregar",
@@ -313,13 +313,13 @@
},
"suwayomi": {
"download": "Baixado",
- "nondownload": "Non-Downloaded",
+ "nondownload": "Não Baixado",
"read": "Lido",
"unread": "Não lida",
- "downloadedread": "Downloaded & Read",
- "downloadedunread": "Downloaded & Unread",
- "nondownloadedread": "Non-Downloaded & Read",
- "nondownloadedunread": "Non-Downloaded & Unread"
+ "downloadedread": "Baixado e Lido",
+ "downloadedunread": "Baixado e Não Lido",
+ "nondownloadedread": "Não Baixado e Lido",
+ "nondownloadedunread": "Não Baixado e Não Lido"
},
"tailscale": {
"address": "Endereço",
@@ -337,15 +337,15 @@
},
"technitium": {
"totalQueries": "Consultas",
- "totalNoError": "Success",
- "totalServerFailure": "Failures",
- "totalNxDomain": "NX Domains",
- "totalRefused": "Refused",
- "totalAuthoritative": "Authoritative",
- "totalRecursive": "Recursive",
- "totalCached": "Cached",
+ "totalNoError": "Sucesso",
+ "totalServerFailure": "Falhas",
+ "totalNxDomain": "Domínios NX",
+ "totalRefused": "Recusado",
+ "totalAuthoritative": "Autoritativo",
+ "totalRecursive": "Recursivo",
+ "totalCached": "Em cache",
"totalBlocked": "Bloqueado",
- "totalDropped": "Dropped",
+ "totalDropped": "Perdidos",
"totalClients": "Clientes"
},
"tdarr": {
@@ -436,7 +436,7 @@
"temp": "TEMP",
"_temp": "Temperatura",
"warn": "Aviso",
- "uptime": "CIMA",
+ "uptime": "ATIVO",
"total": "Total",
"free": "Livre",
"used": "Utilizado",
@@ -705,8 +705,8 @@
"time": "Hora"
},
"firefly": {
- "networth": "Net Worth",
- "budget": "Budget"
+ "networth": "Valor Líquido",
+ "budget": "Orçamento"
},
"grafana": {
"dashboards": "Painéis",
@@ -860,16 +860,16 @@
},
"romm": {
"platforms": "Plataformas",
- "totalRoms": "Games",
+ "totalRoms": "Jogos",
"saves": "Saves",
- "states": "States",
- "screenshots": "Screenshots",
- "totalfilesize": "Total Size"
+ "states": "Estados",
+ "screenshots": "Capturas de Tela",
+ "totalfilesize": "Tamanho total"
},
"mailcow": {
"domains": "Domínios",
- "mailboxes": "Mailboxes",
- "mails": "Mails",
+ "mailboxes": "Caixas de e-mail",
+ "mails": "Mensagens",
"storage": "Armazenamento"
},
"netdata": {
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Notificações",
"issues": "Problemas",
- "pulls": "Solicitações de Envio"
+ "pulls": "Solicitações de Envio",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Cenas",
@@ -951,30 +952,30 @@
},
"linkwarden": {
"links": "Links",
- "collections": "Collections",
+ "collections": "Coleções",
"tags": "Marcadores"
},
"zabbix": {
- "unclassified": "Not classified",
+ "unclassified": "Não classificado",
"information": "Informação",
- "warning": "Warning",
- "average": "Average",
- "high": "High",
- "disaster": "Disaster"
+ "warning": "Aviso",
+ "average": "Médio",
+ "high": "Alto",
+ "disaster": "Desastre"
},
"lubelogger": {
- "vehicle": "Vehicle",
- "vehicles": "Vehicles",
- "serviceRecords": "Service Records",
- "reminders": "Reminders",
- "nextReminder": "Next Reminder",
- "none": "None"
+ "vehicle": "Veículo",
+ "vehicles": "Veículos",
+ "serviceRecords": "Registros de Serviço",
+ "reminders": "Lembretes",
+ "nextReminder": "Próximo Lembrete",
+ "none": "Nenhum"
},
"vikunja": {
- "projects": "Active Projects",
- "tasks7d": "Tasks Due This Week",
- "tasksOverdue": "Overdue Tasks",
- "tasksInProgress": "Tasks In Progress"
+ "projects": "Projetos Ativos",
+ "tasks7d": "Tarefas que vencem nesta semana",
+ "tasksOverdue": "Tarefas Atrasadas",
+ "tasksInProgress": "Tarefas em Andamento"
},
"headscale": {
"name": "Nome",
@@ -986,7 +987,7 @@
},
"beszel": {
"name": "Nome",
- "systems": "Systems",
+ "systems": "Sistemas",
"up": "Ativo",
"down": "Inativo",
"paused": "Pausado",
@@ -995,27 +996,27 @@
"updated": "Atualizado",
"cpu": "CPU",
"memory": "MEM",
- "disk": "Disk",
- "network": "NET"
+ "disk": "Disco",
+ "network": "Rede"
},
"argocd": {
- "apps": "Apps",
- "synced": "Synced",
- "outOfSync": "Out Of Sync",
+ "apps": "Aplicativos",
+ "synced": "Sincronizado",
+ "outOfSync": "Fora de sincronia",
"healthy": "Saudável",
- "degraded": "Degraded",
- "progressing": "Progressing",
+ "degraded": "Degradado",
+ "progressing": "Progredindo",
"missing": "Faltando",
- "suspended": "Suspended"
+ "suspended": "Suspenso"
},
"spoolman": {
"loading": "Carregando"
},
"gitlab": {
- "groups": "Groups",
+ "groups": "Grupos",
"issues": "Problemas",
- "merges": "Merge Requests",
- "projects": "Projects"
+ "merges": "Solicitações de mesclagem",
+ "projects": "Projetos"
},
"apcups": {
"status": "Status",
@@ -1024,11 +1025,22 @@
"timeleft": "Tempo restante"
},
"hoarder": {
- "bookmarks": "Bookmarks",
- "favorites": "Favorites",
- "archived": "Archived",
- "highlights": "Highlights",
- "lists": "Lists",
+ "bookmarks": "Favoritos",
+ "favorites": "Favoritos",
+ "archived": "Arquivados",
+ "highlights": "Destaques",
+ "lists": "Listas",
"tags": "Marcadores"
+ },
+ "slskd": {
+ "slskStatus": "Rede",
+ "connected": "Conectado",
+ "disconnected": "Desconectado",
+ "updateStatus": "Update",
+ "update_yes": "Disponível",
+ "update_no": "Atualizado",
+ "downloads": "Transferências",
+ "uploads": "Envios",
+ "sharedFiles": "Arquivos"
}
}
diff --git a/public/locales/ro/common.json b/public/locales/ro/common.json
index 4d38502d..b0eb7747 100644
--- a/public/locales/ro/common.json
+++ b/public/locales/ro/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Notifications",
"issues": "Issues",
- "pulls": "Pull Requests"
+ "pulls": "Pull Requests",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Scenes",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Tags"
+ },
+ "slskd": {
+ "slskStatus": "Network",
+ "connected": "Connected",
+ "disconnected": "Disconnected",
+ "updateStatus": "Update",
+ "update_yes": "Disponibile",
+ "update_no": "Up to Date",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Files"
}
}
diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json
index 72785a96..e1e1a94f 100644
--- a/public/locales/ru/common.json
+++ b/public/locales/ru/common.json
@@ -149,8 +149,8 @@
"received": "Получено",
"sent": "Отправлено",
"externalIPAddress": "Внеш. IP",
- "externalIPv6Address": "Ext. IPv6",
- "externalIPv6Prefix": "Ext. IPv6-Prefix"
+ "externalIPv6Address": "Внешний IPv6",
+ "externalIPv6Prefix": "Внешний IPv6 префикс"
},
"caddy": {
"upstreams": "Входящие каналы",
@@ -178,7 +178,7 @@
"connectedAp": "Подключенные точки доступа",
"activeUser": "Активные устройства",
"alerts": "Предупреждения",
- "connectedGateways": "Connected gateways",
+ "connectedGateways": "Подключенные шлюзы",
"connectedSwitches": "Подключенные коммутаторы"
},
"nzbget": {
@@ -705,8 +705,8 @@
"time": "Время"
},
"firefly": {
- "networth": "Net Worth",
- "budget": "Budget"
+ "networth": "Общая средства",
+ "budget": "Бюджет"
},
"grafana": {
"dashboards": "Панели",
@@ -861,7 +861,7 @@
"romm": {
"platforms": "Платформы",
"totalRoms": "Игры",
- "saves": "Сейвы",
+ "saves": "Сохранения",
"states": "Состояния",
"screenshots": "Скриншоты",
"totalfilesize": "Общий объем"
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Уведомления",
"issues": "Вопросы",
- "pulls": "Запросы на слияние (Pull Request)"
+ "pulls": "Запросы на слияние (Pull Request)",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Сцены",
@@ -927,7 +928,7 @@
"total": "Всего"
},
"swagdashboard": {
- "proxied": "Прокси",
+ "proxied": "Проксировано",
"auth": "С Авторизацией",
"outdated": "Устаревшие",
"banned": "Заблокированные"
@@ -958,17 +959,17 @@
"unclassified": "Не классифицировано",
"information": "Информация",
"warning": "Предупреждение",
- "average": "Средняя",
+ "average": "Среднее",
"high": "Высокая",
- "disaster": "Чрезвычайная"
+ "disaster": "Чрезвычайное"
},
"lubelogger": {
- "vehicle": "Автомобиль",
- "vehicles": "Автомобили",
- "serviceRecords": "Сервисные работы",
+ "vehicle": "Транспорт",
+ "vehicles": "Транспорты",
+ "serviceRecords": "Сервисные записи",
"reminders": "Напоминания",
"nextReminder": "Следующее напоминание",
- "none": "Нет"
+ "none": "Отсутствует"
},
"vikunja": {
"projects": "Активные Проекты",
@@ -1024,11 +1025,22 @@
"timeleft": "Осталось"
},
"hoarder": {
- "bookmarks": "Bookmarks",
- "favorites": "Favorites",
- "archived": "Archived",
- "highlights": "Highlights",
- "lists": "Lists",
+ "bookmarks": "Закладки",
+ "favorites": "Избранное",
+ "archived": "Архивированное",
+ "highlights": "События",
+ "lists": "Список",
"tags": "Теги"
+ },
+ "slskd": {
+ "slskStatus": "Сеть",
+ "connected": "Подключено",
+ "disconnected": "Отключено",
+ "updateStatus": "Обновление",
+ "update_yes": "Доступно",
+ "update_no": "Последняя версия",
+ "downloads": "Скачивания",
+ "uploads": "Загрузки",
+ "sharedFiles": "Файлов"
}
}
diff --git a/public/locales/sk/common.json b/public/locales/sk/common.json
index 4272c51f..9c154cce 100644
--- a/public/locales/sk/common.json
+++ b/public/locales/sk/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Oznámenia",
"issues": "Problémy",
- "pulls": "Pull requesty"
+ "pulls": "Pull requesty",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Scény",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Štítky"
+ },
+ "slskd": {
+ "slskStatus": "Sieť",
+ "connected": "Pripojené",
+ "disconnected": "Odpojené",
+ "updateStatus": "Update",
+ "update_yes": "Dostupné",
+ "update_no": "Aktuálny",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Súborov"
}
}
diff --git a/public/locales/sl/common.json b/public/locales/sl/common.json
index 34db459d..a32aa0dd 100644
--- a/public/locales/sl/common.json
+++ b/public/locales/sl/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Obvestila",
"issues": "Težave",
- "pulls": "Zahteve za prenos"
+ "pulls": "Zahteve za prenos",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Scene",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Značke"
+ },
+ "slskd": {
+ "slskStatus": "Omrežje",
+ "connected": "Povezan",
+ "disconnected": "Prekinjeno",
+ "updateStatus": "Update",
+ "update_yes": "Na voljo",
+ "update_no": "Posodobljeno",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Datotek"
}
}
diff --git a/public/locales/sr/common.json b/public/locales/sr/common.json
index ba50eef1..4e3f5fb0 100644
--- a/public/locales/sr/common.json
+++ b/public/locales/sr/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Notifications",
"issues": "Issues",
- "pulls": "Pull Requests"
+ "pulls": "Pull Requests",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Scenes",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Tags"
+ },
+ "slskd": {
+ "slskStatus": "Network",
+ "connected": "Connected",
+ "disconnected": "Disconnected",
+ "updateStatus": "Update",
+ "update_yes": "Available",
+ "update_no": "Up to Date",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Files"
}
}
diff --git a/public/locales/sv/common.json b/public/locales/sv/common.json
index ead80b0b..caa18acd 100644
--- a/public/locales/sv/common.json
+++ b/public/locales/sv/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Notifications",
"issues": "Issues",
- "pulls": "Pull Requests"
+ "pulls": "Pull Requests",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Scenes",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Tags"
+ },
+ "slskd": {
+ "slskStatus": "Network",
+ "connected": "Connected",
+ "disconnected": "Disconnected",
+ "updateStatus": "Update",
+ "update_yes": "Tillgänglig",
+ "update_no": "Up to Date",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Files"
}
}
diff --git a/public/locales/te/common.json b/public/locales/te/common.json
index 2cd066a6..e34d6fae 100644
--- a/public/locales/te/common.json
+++ b/public/locales/te/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Notifications",
"issues": "Issues",
- "pulls": "Pull Requests"
+ "pulls": "Pull Requests",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Scenes",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Tags"
+ },
+ "slskd": {
+ "slskStatus": "Network",
+ "connected": "Connected",
+ "disconnected": "Disconnected",
+ "updateStatus": "Update",
+ "update_yes": "అందుబాటులో వున్నవి",
+ "update_no": "తాజాగా",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Files"
}
}
diff --git a/public/locales/th/common.json b/public/locales/th/common.json
index 42a0b6a2..b37b662d 100644
--- a/public/locales/th/common.json
+++ b/public/locales/th/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Notifications",
"issues": "Issues",
- "pulls": "Pull Requests"
+ "pulls": "Pull Requests",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Scenes",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Tags"
+ },
+ "slskd": {
+ "slskStatus": "Network",
+ "connected": "Connected",
+ "disconnected": "Disconnected",
+ "updateStatus": "Update",
+ "update_yes": "Available",
+ "update_no": "Up to Date",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Files"
}
}
diff --git a/public/locales/tr/common.json b/public/locales/tr/common.json
index 40611dac..815b9150 100644
--- a/public/locales/tr/common.json
+++ b/public/locales/tr/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Bildirimler",
"issues": "Sorunlar",
- "pulls": "Değişiklik İstekleri"
+ "pulls": "Değişiklik İstekleri",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Sahneler",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Etiketler"
+ },
+ "slskd": {
+ "slskStatus": "Ağ",
+ "connected": "Bağlandı",
+ "disconnected": "Bağlantı kesildi",
+ "updateStatus": "Update",
+ "update_yes": "Kullanılabilir",
+ "update_no": "Güncel",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Dosyalar"
}
}
diff --git a/public/locales/uk/common.json b/public/locales/uk/common.json
index 0914c49f..3412d591 100644
--- a/public/locales/uk/common.json
+++ b/public/locales/uk/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Сповіщення",
"issues": "Питання",
- "pulls": "Pull-запити"
+ "pulls": "Pull-запити",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Сцени",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Теги"
+ },
+ "slskd": {
+ "slskStatus": "Мережа",
+ "connected": "З'єднано",
+ "disconnected": "Відключено",
+ "updateStatus": "Update",
+ "update_yes": "Доступно",
+ "update_no": "Актуально",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Файли"
}
}
diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json
index d2753c97..7e8974f8 100644
--- a/public/locales/vi/common.json
+++ b/public/locales/vi/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "Notifications",
"issues": "Issues",
- "pulls": "Pull Requests"
+ "pulls": "Pull Requests",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "Scenes",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Tags"
+ },
+ "slskd": {
+ "slskStatus": "Network",
+ "connected": "Connected",
+ "disconnected": "Disconnected",
+ "updateStatus": "Update",
+ "update_yes": "Available",
+ "update_no": "Up to Date",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Files"
}
}
diff --git a/public/locales/yue/common.json b/public/locales/yue/common.json
index 64bc1e72..dfe604dd 100644
--- a/public/locales/yue/common.json
+++ b/public/locales/yue/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "信息",
"issues": "出版",
- "pulls": "提取請求"
+ "pulls": "提取請求",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "場景",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "標籤"
+ },
+ "slskd": {
+ "slskStatus": "網絡",
+ "connected": "Connected",
+ "disconnected": "連接已中斷",
+ "updateStatus": "Update",
+ "update_yes": "可用",
+ "update_no": "已更新至最新",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "檔案"
}
}
diff --git a/public/locales/zh-Hans/common.json b/public/locales/zh-Hans/common.json
index 5e54cd8d..064e2c1c 100644
--- a/public/locales/zh-Hans/common.json
+++ b/public/locales/zh-Hans/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "通知",
"issues": "问题",
- "pulls": "PR"
+ "pulls": "PR",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "场景",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "Tags"
+ },
+ "slskd": {
+ "slskStatus": "网络",
+ "connected": "已连接",
+ "disconnected": "未连接",
+ "updateStatus": "Update",
+ "update_yes": "可用",
+ "update_no": "Up to Date",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "Files"
}
}
diff --git a/public/locales/zh-Hant/common.json b/public/locales/zh-Hant/common.json
index 5a356009..eb1f7423 100644
--- a/public/locales/zh-Hant/common.json
+++ b/public/locales/zh-Hant/common.json
@@ -885,7 +885,8 @@
"gitea": {
"notifications": "信息",
"issues": "出版",
- "pulls": "提取請求"
+ "pulls": "提取請求",
+ "repositories": "Repositories"
},
"stash": {
"scenes": "場景",
@@ -1030,5 +1031,16 @@
"highlights": "Highlights",
"lists": "Lists",
"tags": "標籤"
+ },
+ "slskd": {
+ "slskStatus": "網絡",
+ "connected": "Connected",
+ "disconnected": "連接已中斷",
+ "updateStatus": "Update",
+ "update_yes": "可觀看",
+ "update_no": "已更新至最新",
+ "downloads": "Downloads",
+ "uploads": "Uploads",
+ "sharedFiles": "檔案"
}
}
From cadf1433af005b54fd5b26270100eddc91cc36d9 Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Thu, 27 Mar 2025 13:22:02 -0700
Subject: [PATCH 62/89] Bump version to 1.1.0
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 209aea33..ae9047c1 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "homepage",
- "version": "1.0.4",
+ "version": "1.1.0",
"private": true,
"scripts": {
"preinstall": "npx only-allow pnpm",
From e19dcc2729795fc6a1feac8744f239a7f9677752 Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Thu, 27 Mar 2025 13:27:20 -0700
Subject: [PATCH 63/89] Only deploy docs from main branch
---
.github/workflows/docs-publish.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/docs-publish.yml b/.github/workflows/docs-publish.yml
index def1ee1e..5479e492 100644
--- a/.github/workflows/docs-publish.yml
+++ b/.github/workflows/docs-publish.yml
@@ -55,7 +55,7 @@ jobs:
run: MKINSIDERS=false mkdocs 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' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
needs:
- pre-commit
From 2cabe77b555b94e8adfba75cfea1afdce4b3b23a Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Thu, 27 Mar 2025 20:15:39 -0700
Subject: [PATCH 64/89] Fix: add fallback for shvl syntax
---
src/widgets/customapi/component.jsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/widgets/customapi/component.jsx b/src/widgets/customapi/component.jsx
index b8147caa..7624c2f5 100644
--- a/src/widgets/customapi/component.jsx
+++ b/src/widgets/customapi/component.jsx
@@ -18,7 +18,7 @@ function getValue(field, data) {
// shvl is easier, everything else is kept for backwards compatibility.
if (typeof field === "string") {
- return shvl.get(data, field, null);
+ return shvl.get(data, field, null) ?? data[field] ?? null;
}
while (typeof lastField === "object") {
From 999dade86114deae80870364282f251e35993a78 Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Thu, 27 Mar 2025 20:16:50 -0700
Subject: [PATCH 65/89] Fix: add fallback for shvl syntax (#5080)
From 313835c0e6ba383c9da2d6204cfa14923eef84bb Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Thu, 27 Mar 2025 20:20:02 -0700
Subject: [PATCH 66/89] Bump version to 1.1.1
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index ae9047c1..7f0fbdf7 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "homepage",
- "version": "1.1.0",
+ "version": "1.1.1",
"private": true,
"scripts": {
"preinstall": "npx only-allow pnpm",
From ee7e8fab615c6d7d473f85fd95f251070ceb3571 Mon Sep 17 00:00:00 2001
From: Matheus Vellone
Date: Fri, 28 Mar 2025 20:29:23 -0300
Subject: [PATCH 67/89] Fix: support shvl on customapi dynamic list target
(#5081)
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
---
src/widgets/customapi/component.jsx | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/src/widgets/customapi/component.jsx b/src/widgets/customapi/component.jsx
index 7624c2f5..cb377628 100644
--- a/src/widgets/customapi/component.jsx
+++ b/src/widgets/customapi/component.jsx
@@ -245,7 +245,15 @@ export default function Component({ service }) {
listItems.map((item, index) => {
const itemName = shvl.get(item, name, "");
const itemLabel = shvl.get(item, label, "");
- const itemUrl = target ? target.replace(/\{([^}]+)\}/g, (_, key) => item[key] || "") : null;
+
+ const itemUrl = target
+ ? [...target.matchAll(/\{(.*?)\}/g)]
+ .map((match) => match[1])
+ .reduce((url, targetTemplate) => {
+ const value = shvl.get(item, targetTemplate, item[targetTemplate]) ?? "";
+ return url.replaceAll(`{${targetTemplate}}`, value);
+ }, target)
+ : null;
const className =
"bg-theme-200/50 dark:bg-theme-900/20 rounded-sm m-1 flex-1 flex flex-row items-center justify-between p-1 text-xs";
From 4567427b9cde4c468174b466869dd29f2b039664 Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Fri, 28 Mar 2025 16:32:56 -0700
Subject: [PATCH 68/89] Enhancement: add shvl fallback for custom api dynamic
list (#5091)
---
src/widgets/customapi/component.jsx | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/widgets/customapi/component.jsx b/src/widgets/customapi/component.jsx
index cb377628..b651045f 100644
--- a/src/widgets/customapi/component.jsx
+++ b/src/widgets/customapi/component.jsx
@@ -243,8 +243,8 @@ export default function Component({ service }) {
) : (
listItems.map((item, index) => {
- const itemName = shvl.get(item, name, "");
- const itemLabel = shvl.get(item, label, "");
+ const itemName = shvl.get(item, name, item[name]) ?? "";
+ const itemLabel = shvl.get(item, label, item[label]) ?? "";
const itemUrl = target
? [...target.matchAll(/\{(.*?)\}/g)]
From 30cb893354883a33b67588693e74f296bd02604c Mon Sep 17 00:00:00 2001
From: Chris <67816022+vhsdream@users.noreply.github.com>
Date: Sat, 29 Mar 2025 22:49:53 -0400
Subject: [PATCH 69/89] Fix: remove unneeded import from Hoarder widget.js
(#5097)
---
src/widgets/hoarder/widget.js | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/widgets/hoarder/widget.js b/src/widgets/hoarder/widget.js
index 8a3cfef0..b005b04f 100644
--- a/src/widgets/hoarder/widget.js
+++ b/src/widgets/hoarder/widget.js
@@ -1,5 +1,4 @@
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
-import { asJson } from "utils/proxy/api-helpers";
const widget = {
api: `{url}/api/v1/{endpoint}`,
From 954ab544931658dfcab1540382b7d241e5e907b5 Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Sun, 30 Mar 2025 08:52:23 -0700
Subject: [PATCH 70/89] Speed up CI: Skip unnecessary build steps, optimize
caching etc (#5098)
---
.dockerignore | 2 +-
.github/workflows/docker-publish.yml | 131 ++++++++++++++-------------
Dockerfile | 72 +++++++--------
3 files changed, 104 insertions(+), 101 deletions(-)
diff --git a/.dockerignore b/.dockerignore
index edbf8525..698137cb 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -16,11 +16,11 @@
**/compose*
**/Dockerfile*
**/node_modules
+!.next/standalone/node_modules
**/npm-debug.log
**/obj
**/secrets.dev.yaml
**/values.dev.yaml
-**/.next
README.md
config/
k3d/
diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml
index c7d36f33..afb7fca4 100644
--- a/.github/workflows/docker-publish.yml
+++ b/.github/workflows/docker-publish.yml
@@ -1,9 +1,4 @@
-name: Docker
-
-# This workflow uses actions that are not certified by GitHub.
-# They are provided by a third-party and are governed by
-# separate terms of service, privacy policy, and support
-# documentation.
+name: Docker CI
on:
schedule:
@@ -13,7 +8,6 @@ on:
- main
- feature/**
- dev
- # Publish semver tags as releases.
tags: [ 'v*.*.*' ]
paths-ignore:
- 'docs/**'
@@ -26,89 +20,56 @@ on:
merge_group:
env:
- # github.repository as
/
IMAGE_NAME: ${{ github.repository }}
-
jobs:
pre-commit:
name: Linting Checks
runs-on: ubuntu-22.04
steps:
- -
- name: Checkout repository
+ - name: Checkout repository
uses: actions/checkout@v4
- -
- name: Install python
+
+ - name: Install python
uses: actions/setup-python@v5
with:
python-version: 3.x
- -
- name: Check files
+
+ - name: Check files
uses: pre-commit/action@v3.0.1
- -
- name: Install pnpm
+
+ - name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 10
run_install: false
- -
- name: Install Node.js
+
+ - name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- -
- name: Install dependencies
+
+ - name: Install dependencies
run: pnpm install
- -
- name: Lint frontend
+
+ - name: Lint frontend
run: pnpm run lint
build:
name: Docker Build & Push
- if: github.repository == 'gethomepage/homepage'
+ if: github.repository == 'gethomepage/homepage'
runs-on: self-hosted
- needs:
- - pre-commit
+ needs: [ pre-commit ]
permissions:
contents: read
packages: write
- # This is used to complete the identity challenge
- # with sigstore/fulcio when running outside of PRs.
id-token: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- # Login to Docker Registry
- # https://github.com/docker/login-action
- - name: Log into registry ${{ env.REGISTRY }}
- if: github.event_name != 'pull_request'
- uses: docker/login-action@v3
- with:
- registry: ghcr.io
- username: ${{ github.actor }}
- password: ${{ secrets.GITHUB_TOKEN }}
- - name: Login to Docker Hub
- if: github.event_name != 'pull_request'
- uses: docker/login-action@v3
- with:
- username: ${{ secrets.DOCKERHUB_USERNAME }}
- password: ${{ secrets.DOCKERHUB_TOKEN }}
-
- # Setup QEMU
- # https://github.com/marketplace/actions/docker-setup-buildx#with-qemu
- - name: Setup QEMU
- uses: docker/setup-qemu-action@v3.6.0
-
- # Workaround: https://github.com/docker/build-push-action/issues/461
- - name: Setup Docker buildx
- uses: docker/setup-buildx-action@v3
-
- # Extract metadata (tags, labels) for Docker
- # https://github.com/docker/metadata-action
- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@v5
@@ -119,8 +80,57 @@ jobs:
flavor: |
latest=auto
- # Build and push Docker image with Buildx (don't push on PR)
- # https://github.com/docker/build-push-action
+ - name: Next.js build cache
+ uses: actions/cache@v4
+ with:
+ path: .next/cache
+ key: nextjs-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}-${{ hashFiles('**/*.js', '**/*.jsx') }}
+ restore-keys: |
+ nextjs-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
+
+ - name: Install pnpm
+ uses: pnpm/action-setup@v4
+ with:
+ version: 10
+ run_install: false
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20
+ cache: 'pnpm'
+
+ - name: Install dependencies
+ run: pnpm install
+
+ - name: Build app
+ run: |
+ NEXT_PUBLIC_BUILDTIME="${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }}" \
+ NEXT_PUBLIC_VERSION="${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.version'] }}" \
+ NEXT_PUBLIC_REVISION="${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }}" \
+ pnpm run build
+
+ - name: Log into registry ${{ env.REGISTRY }}
+ if: github.event_name != 'pull_request'
+ uses: docker/login-action@v3
+ with:
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Login to Docker Hub
+ if: github.event_name != 'pull_request'
+ uses: docker/login-action@v3
+ with:
+ username: ${{ secrets.DOCKERHUB_USERNAME }}
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
+
+ - name: Setup QEMU
+ uses: docker/setup-qemu-action@v3.6.0
+
+ - name: Setup Docker buildx
+ uses: docker/setup-buildx-action@v3
+
- name: Build and push Docker image
id: build-and-push
uses: docker/build-push-action@v6
@@ -130,18 +140,15 @@ jobs:
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: |
+ CI=true
BUILDTIME=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }}
VERSION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.version'] }}
REVISION=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }}
- # https://github.com/docker/setup-qemu-action#about
- # platforms: linux/amd64,linux/arm64,linux/riscv64,linux/ppc64le,linux/s390x,linux/386,linux/mips64le,linux/mips64,linux/arm/v7,linux/arm/v6
platforms: linux/amd64,linux/arm64
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max
- # Temp fix
- # https://github.com/docker/build-push-action/issues/252
- # https://github.com/moby/buildkit/issues/1896
+ # https://github.com/docker/build-push-action/issues/252 / https://github.com/moby/buildkit/issues/1896
- name: Move cache
run: |
rm -rf /tmp/.buildx-cache
diff --git a/Dockerfile b/Dockerfile
index 7963407c..ec59c6b0 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,67 +1,63 @@
-# Install dependencies only when needed
-FROM docker.io/node:22-alpine AS deps
-
-WORKDIR /app
-
-COPY --link package.json pnpm-lock.yaml* ./
-
-SHELL ["/bin/ash", "-xeo", "pipefail", "-c"]
-RUN apk add --no-cache libc6-compat \
- && apk add --no-cache --virtual .gyp python3 make g++ \
- && npm install -g pnpm
-
-RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store pnpm fetch | grep -v "cross-device link not permitted\|Falling back to copying packages from store"
-
-RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store pnpm install -r --offline
-
-# Rebuild the source code only when needed
-FROM docker.io/node:22-alpine AS builder
+# =========================
+# Builder Stage
+# =========================
+FROM node:22-slim AS builder
WORKDIR /app
+# Setup
RUN mkdir config
+COPY . .
+ARG CI
ARG BUILDTIME
ARG VERSION
ARG REVISION
+ENV CI=$CI
-COPY --link --from=deps /app/node_modules ./node_modules/
-COPY . .
+# Install and build only outside CI
+RUN if [ "$CI" != "true" ]; then \
+ corepack enable && corepack prepare pnpm@latest --activate && \
+ pnpm install --frozen-lockfile --prefer-offline && \
+ NEXT_TELEMETRY_DISABLED=1 \
+ NEXT_PUBLIC_BUILDTIME=$BUILDTIME \
+ NEXT_PUBLIC_VERSION=$VERSION \
+ NEXT_PUBLIC_REVISION=$REVISION \
+ pnpm run build; \
+ else \
+ echo "✅ Using prebuilt app from CI context"; \
+ fi
-SHELL ["/bin/ash", "-xeo", "pipefail", "-c"]
-RUN npm install -g pnpm \
- && pnpm run telemetry \
- && NEXT_PUBLIC_BUILDTIME=$BUILDTIME NEXT_PUBLIC_VERSION=$VERSION NEXT_PUBLIC_REVISION=$REVISION pnpm run build
-
-# Production image, copy all the files and run next
-FROM docker.io/node:22-alpine AS runner
-LABEL org.opencontainers.image.title "Homepage"
-LABEL org.opencontainers.image.description "A self-hosted services landing page, with docker and service integrations."
+# =========================
+# Runtime Stage
+# =========================
+FROM node:22-alpine AS runner
+LABEL org.opencontainers.image.title="Homepage"
+LABEL org.opencontainers.image.description="A self-hosted services landing page, with docker and service integrations."
LABEL org.opencontainers.image.url="https://github.com/gethomepage/homepage"
LABEL org.opencontainers.image.documentation='https://github.com/gethomepage/homepage/wiki'
LABEL org.opencontainers.image.source='https://github.com/gethomepage/homepage'
LABEL org.opencontainers.image.licenses='Apache-2.0'
-ENV NODE_ENV=production
-
+# Setup
WORKDIR /app
-# Copy files from context (this allows the files to copy before the builder stage is done).
-COPY --link --chown=1000:1000 package.json next.config.js ./
+# Copy some files from context
COPY --link --chown=1000:1000 /public ./public/
-
-# Copy files from builder
-COPY --link --from=builder --chown=1000:1000 /app/.next/standalone ./
-COPY --link --from=builder --chown=1000:1000 /app/.next/static/ ./.next/static/
COPY --link --chmod=755 docker-entrypoint.sh /usr/local/bin/
+# Copy only necessary files from the build stage
+COPY --link --from=builder --chown=1000:1000 /app/.next/standalone/ ./
+COPY --link --from=builder --chown=1000:1000 /app/.next/static/ ./.next/static
+
RUN apk add --no-cache su-exec
+ENV NODE_ENV=production
ENV HOSTNAME=0.0.0.0
ENV PORT=3000
EXPOSE $PORT
HEALTHCHECK --interval=10s --timeout=3s --start-period=20s \
- CMD wget --no-verbose --tries=1 --spider --no-check-certificate http://127.0.0.1:$PORT/api/healthcheck || exit 1
+ CMD wget --no-verbose --tries=1 --spider http://127.0.0.1:$PORT/api/healthcheck || exit 1
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["node", "server.js"]
From eda06965fa55709bb7dbbc8bca1d2616d7f36b51 Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Sun, 30 Mar 2025 21:40:03 -0700
Subject: [PATCH 71/89] Chore: add organize imports to pre-commit (#5104)
---
.pre-commit-config.yaml | 7 ++--
.prettierrc | 1 -
.prettierrc.js | 5 +++
next-i18next.config.js | 4 +--
package.json | 1 +
pnpm-lock.yaml | 26 +++++++++++---
src/components/bookmarks/group.jsx | 8 ++---
src/components/bookmarks/item.jsx | 4 +--
src/components/favicon.jsx | 2 +-
src/components/quicklaunch.jsx | 6 ++--
src/components/resolvedicon.jsx | 2 +-
src/components/services/dropdown.jsx | 4 +--
src/components/services/group.jsx | 8 ++---
src/components/services/item.jsx | 10 +++---
src/components/services/kubernetes-status.jsx | 2 +-
src/components/services/widget.jsx | 2 +-
src/components/services/widget/block.jsx | 2 +-
src/components/tab.jsx | 2 +-
src/components/toggles/color.jsx | 4 +--
src/components/version.jsx | 4 +--
src/components/widgets/datetime/datetime.jsx | 2 +-
src/components/widgets/glances/glances.jsx | 6 ++--
.../widgets/kubernetes/kubernetes.jsx | 4 +--
src/components/widgets/kubernetes/node.jsx | 2 +-
src/components/widgets/longhorn/longhorn.jsx | 2 +-
.../widgets/openmeteo/openmeteo.jsx | 14 ++++----
.../widgets/openweathermap/weather.jsx | 12 +++----
src/components/widgets/resources/cpu.jsx | 6 ++--
src/components/widgets/resources/cputemp.jsx | 6 ++--
src/components/widgets/resources/disk.jsx | 6 ++--
src/components/widgets/resources/memory.jsx | 6 ++--
src/components/widgets/resources/network.jsx | 6 ++--
.../widgets/resources/resources.jsx | 6 ++--
src/components/widgets/resources/uptime.jsx | 6 ++--
src/components/widgets/search/search.jsx | 12 +++----
src/components/widgets/stocks/stocks.jsx | 8 ++---
.../widgets/unifi_console/unifi_console.jsx | 8 ++---
src/components/widgets/weather/weather.jsx | 14 ++++----
src/components/widgets/widget.jsx | 2 +-
src/components/widgets/widget/container.jsx | 4 +--
.../widgets/widget/container_button.jsx | 2 +-
.../widgets/widget/container_form.jsx | 2 +-
.../widgets/widget/container_link.jsx | 2 +-
src/components/widgets/widget/resources.jsx | 2 +-
src/pages/_app.jsx | 6 ++--
src/pages/_document.jsx | 2 +-
src/pages/api/config/[path].js | 2 +-
src/pages/api/hash.js | 2 +-
src/pages/api/releases.js | 2 +-
src/pages/api/search/searchSuggestion.js | 2 +-
src/pages/api/services/proxy.js | 10 +++---
src/pages/api/widgets/glances.js | 4 +--
src/pages/api/widgets/longhorn.js | 4 +--
src/pages/api/widgets/openweathermap.js | 2 +-
src/pages/api/widgets/stocks.js | 2 +-
src/pages/api/widgets/weather.js | 2 +-
src/pages/index.jsx | 36 +++++++++----------
src/utils/config/api-response.js | 6 ++--
src/utils/config/config.js | 4 +--
src/utils/config/docker.js | 2 +-
src/utils/config/kubernetes.js | 4 +--
src/utils/config/service-helpers.js | 6 ++--
src/utils/contexts/color.jsx | 2 +-
src/utils/contexts/settings.jsx | 2 +-
src/utils/contexts/tab.jsx | 2 +-
src/utils/contexts/theme.jsx | 2 +-
src/utils/hooks/window-focus.js | 2 +-
src/utils/kubernetes/export.js | 6 ++--
src/utils/kubernetes/ingress-list.js | 2 +-
src/utils/kubernetes/resource-helpers.js | 6 ++--
src/utils/kubernetes/traefik-list.js | 2 +-
src/utils/proxy/handlers/credentialed.js | 10 +++---
src/utils/proxy/handlers/generic.js | 6 ++--
src/utils/proxy/handlers/jsonrpc.js | 4 +--
src/utils/proxy/handlers/synology.js | 2 +-
src/utils/proxy/http.js | 2 +-
src/utils/proxy/validate-widget-data.js | 2 +-
src/widgets/adguard/component.jsx | 4 +--
src/widgets/apcups/component.jsx | 2 +-
src/widgets/apcups/proxy.js | 2 +-
src/widgets/argocd/component.jsx | 2 +-
src/widgets/atsumeru/component.jsx | 4 +--
src/widgets/audiobookshelf/component.jsx | 4 +--
src/widgets/audiobookshelf/proxy.js | 4 +--
src/widgets/authentik/component.jsx | 4 +--
src/widgets/autobrr/component.jsx | 4 +--
src/widgets/azuredevops/component.jsx | 4 +--
src/widgets/bazarr/component.jsx | 4 +--
src/widgets/bazarr/widget.js | 2 +-
src/widgets/beszel/component.jsx | 4 +--
src/widgets/beszel/proxy.js | 2 +-
src/widgets/caddy/component.jsx | 4 +--
src/widgets/calendar/agenda.jsx | 2 +-
src/widgets/calendar/component.jsx | 8 ++---
src/widgets/calendar/event.jsx | 6 ++--
src/widgets/calendar/integrations/ical.jsx | 6 ++--
src/widgets/calendar/integrations/lidarr.jsx | 2 +-
src/widgets/calendar/integrations/radarr.jsx | 4 +--
src/widgets/calendar/integrations/readarr.jsx | 2 +-
src/widgets/calendar/integrations/sonarr.jsx | 2 +-
src/widgets/calendar/monthly.jsx | 4 +--
src/widgets/calendar/proxy.js | 2 +-
src/widgets/calibreweb/component.jsx | 4 +--
src/widgets/changedetectionio/component.jsx | 4 +--
src/widgets/channelsdvrserver/component.jsx | 4 +--
src/widgets/cloudflared/component.jsx | 2 +-
src/widgets/coinmarketcap/component.jsx | 8 ++---
src/widgets/crowdsec/component.jsx | 4 +--
src/widgets/crowdsec/proxy.js | 4 +--
src/widgets/customapi/component.jsx | 8 ++---
src/widgets/deluge/component.jsx | 4 +--
src/widgets/deluge/proxy.js | 4 +--
src/widgets/develancacheui/component.jsx | 4 +--
src/widgets/diskstation/component.jsx | 4 +--
src/widgets/docker/component.jsx | 8 ++---
src/widgets/downloadstation/component.jsx | 4 +--
src/widgets/emby/component.jsx | 6 ++--
src/widgets/esphome/component.jsx | 2 +-
src/widgets/evcc/component.jsx | 4 +--
src/widgets/fileflows/component.jsx | 4 +--
src/widgets/firefly/component.jsx | 4 +--
src/widgets/flood/component.jsx | 4 +--
src/widgets/flood/proxy.js | 4 +--
src/widgets/freshrss/component.jsx | 4 +--
src/widgets/freshrss/proxy.js | 4 +--
src/widgets/frigate/component.jsx | 4 +--
src/widgets/fritzbox/component.jsx | 4 +--
src/widgets/fritzbox/proxy.js | 2 +-
src/widgets/gamedig/component.jsx | 4 +--
src/widgets/gamedig/proxy.js | 2 +-
src/widgets/gatus/component.jsx | 4 +--
src/widgets/ghostfolio/component.jsx | 4 +--
src/widgets/gitea/component.jsx | 2 +-
src/widgets/gitlab/component.jsx | 4 +--
src/widgets/glances/component.jsx | 12 +++----
src/widgets/glances/components/chart.jsx | 2 +-
src/widgets/glances/components/chart_dual.jsx | 2 +-
src/widgets/glances/components/container.jsx | 2 +-
src/widgets/glances/metrics/containers.jsx | 4 +--
src/widgets/glances/metrics/cpu.jsx | 6 ++--
src/widgets/glances/metrics/disk.jsx | 6 ++--
src/widgets/glances/metrics/fs.jsx | 2 +-
src/widgets/glances/metrics/gpu.jsx | 6 ++--
src/widgets/glances/metrics/info.jsx | 2 +-
src/widgets/glances/metrics/memory.jsx | 6 ++--
src/widgets/glances/metrics/net.jsx | 6 ++--
src/widgets/glances/metrics/process.jsx | 4 +--
src/widgets/glances/metrics/sensor.jsx | 6 ++--
src/widgets/gluetun/component.jsx | 2 +-
src/widgets/gotify/component.jsx | 2 +-
src/widgets/grafana/component.jsx | 4 +--
src/widgets/hdhomerun/component.jsx | 2 +-
src/widgets/headscale/component.jsx | 4 +--
src/widgets/healthchecks/component.jsx | 2 +-
src/widgets/hoarder/component.jsx | 4 +--
src/widgets/homeassistant/component.jsx | 2 +-
src/widgets/homeassistant/proxy.js | 2 +-
src/widgets/homebox/component.jsx | 4 +--
src/widgets/homebox/proxy.js | 4 +--
src/widgets/homebridge/component.jsx | 4 +--
src/widgets/homebridge/proxy.js | 4 +--
src/widgets/iframe/component.jsx | 2 +-
src/widgets/immich/component.jsx | 4 +--
src/widgets/jackett/component.jsx | 4 +--
src/widgets/jackett/proxy.js | 4 +--
src/widgets/jdownloader/component.jsx | 2 +-
src/widgets/jdownloader/proxy.js | 4 +--
src/widgets/jellyseerr/component.jsx | 2 +-
src/widgets/kavita/component.jsx | 4 +--
src/widgets/kavita/proxy.js | 4 +--
src/widgets/komga/component.jsx | 4 +--
src/widgets/komga/proxy.js | 2 +-
src/widgets/kopia/component.jsx | 4 +--
src/widgets/kubernetes/component.jsx | 6 ++--
src/widgets/lidarr/component.jsx | 4 +--
src/widgets/linkwarden/component.jsx | 4 +--
src/widgets/lubelogger/component.jsx | 4 +--
src/widgets/mailcow/component.jsx | 4 +--
src/widgets/mastodon/component.jsx | 4 +--
src/widgets/mealie/component.jsx | 4 +--
src/widgets/medusa/component.jsx | 4 +--
src/widgets/mikrotik/component.jsx | 4 +--
src/widgets/minecraft/component.jsx | 4 +--
src/widgets/minecraft/proxy.js | 2 +-
src/widgets/miniflux/component.jsx | 4 +--
src/widgets/moonraker/component.jsx | 4 +--
src/widgets/mylar/component.jsx | 4 +--
src/widgets/myspeed/component.jsx | 4 +--
src/widgets/navidrome/component.jsx | 2 +-
src/widgets/netalertx/component.jsx | 4 +--
src/widgets/netdata/component.jsx | 4 +--
src/widgets/nextcloud/component.jsx | 4 +--
src/widgets/nextdns/component.jsx | 4 +--
src/widgets/npm/component.jsx | 2 +-
src/widgets/npm/proxy.js | 2 +-
src/widgets/nzbget/component.jsx | 4 +--
src/widgets/octoprint/component.jsx | 2 +-
src/widgets/omada/component.jsx | 4 +--
src/widgets/omada/proxy.js | 2 +-
src/widgets/ombi/component.jsx | 2 +-
src/widgets/opendtu/component.jsx | 4 +--
src/widgets/openmediavault/component.jsx | 2 +-
.../methods/downloader_get_downloadlist.jsx | 2 +-
.../methods/services_get_status.jsx | 2 +-
.../openmediavault/methods/smart_get_list.jsx | 2 +-
src/widgets/openmediavault/proxy.js | 6 ++--
src/widgets/openwrt/methods/interface.jsx | 4 +--
src/widgets/openwrt/methods/system.jsx | 4 +--
src/widgets/openwrt/proxy.js | 4 +--
src/widgets/opnsense/component.jsx | 4 +--
src/widgets/overseerr/component.jsx | 4 +--
src/widgets/paperlessngx/component.jsx | 2 +-
src/widgets/peanut/component.jsx | 4 +--
src/widgets/pfsense/component.jsx | 4 +--
src/widgets/photoprism/component.jsx | 4 +--
src/widgets/photoprism/proxy.js | 4 +--
src/widgets/pihole/component.jsx | 4 +--
src/widgets/pihole/proxy.js | 4 +--
src/widgets/plantit/component.jsx | 4 +--
src/widgets/plex/component.jsx | 2 +-
src/widgets/plex/proxy.js | 4 +--
src/widgets/portainer/component.jsx | 2 +-
src/widgets/prometheus/component.jsx | 4 +--
src/widgets/prometheusmetric/component.jsx | 4 +--
src/widgets/prowlarr/component.jsx | 4 +--
src/widgets/proxmox/component.jsx | 4 +--
src/widgets/proxmoxbackupserver/component.jsx | 4 +--
src/widgets/pterodactyl/component.jsx | 2 +-
src/widgets/pyload/component.jsx | 4 +--
src/widgets/pyload/proxy.js | 4 +--
src/widgets/qbittorrent/component.jsx | 4 +--
src/widgets/qbittorrent/proxy.js | 4 +--
src/widgets/qnap/component.jsx | 4 +--
src/widgets/qnap/proxy.js | 4 +--
src/widgets/radarr/component.jsx | 4 +--
src/widgets/radarr/widget.js | 2 +-
src/widgets/readarr/component.jsx | 4 +--
src/widgets/readarr/widget.js | 2 +-
src/widgets/romm/component.jsx | 4 +--
src/widgets/rutorrent/component.jsx | 4 +--
src/widgets/rutorrent/proxy.js | 4 +--
src/widgets/sabnzbd/component.jsx | 4 +--
src/widgets/scrutiny/component.jsx | 2 +-
src/widgets/slskd/component.jsx | 4 +--
src/widgets/slskd/widget.js | 1 -
src/widgets/sonarr/component.jsx | 4 +--
src/widgets/sonarr/widget.js | 2 +-
src/widgets/speedtest/component.jsx | 4 +--
src/widgets/spoolman/component.jsx | 4 +--
src/widgets/stash/component.jsx | 4 +--
src/widgets/stocks/component.jsx | 4 +--
src/widgets/strelaysrv/component.jsx | 4 +--
src/widgets/suwayomi/component.jsx | 4 +--
src/widgets/suwayomi/proxy.js | 4 +--
src/widgets/swagdashboard/component.jsx | 2 +-
src/widgets/tailscale/component.jsx | 4 +--
src/widgets/tandoor/component.jsx | 2 +-
src/widgets/tautulli/component.jsx | 6 ++--
src/widgets/tdarr/component.jsx | 4 +--
src/widgets/tdarr/proxy.js | 4 +--
src/widgets/technitium/component.jsx | 4 +--
src/widgets/technitium/widget.js | 2 +-
src/widgets/traefik/component.jsx | 2 +-
src/widgets/transmission/component.jsx | 4 +--
src/widgets/transmission/proxy.js | 4 +--
src/widgets/truenas/component.jsx | 4 +--
src/widgets/truenas/widget.js | 2 +-
src/widgets/tubearchivist/component.jsx | 4 +--
src/widgets/unifi/component.jsx | 4 +--
src/widgets/unifi/proxy.js | 6 ++--
src/widgets/unmanic/component.jsx | 6 ++--
src/widgets/unmanic/widget.js | 2 +-
src/widgets/uptimekuma/component.jsx | 4 +--
src/widgets/uptimerobot/component.jsx | 4 +--
src/widgets/urbackup/component.jsx | 4 +--
src/widgets/vikunja/component.jsx | 4 +--
src/widgets/vikunja/widget.js | 2 +-
src/widgets/watchtower/component.jsx | 4 +--
src/widgets/watchtower/proxy.js | 4 +--
src/widgets/wgeasy/component.jsx | 2 +-
src/widgets/whatsupdocker/component.jsx | 2 +-
src/widgets/widgets.js | 22 ++++++------
src/widgets/xteve/component.jsx | 4 +--
src/widgets/xteve/proxy.js | 4 +--
src/widgets/zabbix/component.jsx | 4 +--
285 files changed, 601 insertions(+), 576 deletions(-)
delete mode 100644 .prettierrc
create mode 100644 .prettierrc.js
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 6cc46b47..0b4f5624 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -9,11 +9,14 @@ repos:
- id: check-yaml
exclude: "(^mkdocs\\.yml$)"
- id: check-added-large-files
-- repo: https://github.com/pre-commit/mirrors-prettier
- rev: 'v3.0.3'
+- repo: https://github.com/rbubley/mirrors-prettier
+ rev: 'v3.3.3'
hooks:
- id: prettier
types_or:
- javascript
- markdown
- jsx
+ additional_dependencies:
+ - prettier@3.3.3
+ - 'prettier-plugin-organize-imports@4.1.0'
diff --git a/.prettierrc b/.prettierrc
deleted file mode 100644
index 0967ef42..00000000
--- a/.prettierrc
+++ /dev/null
@@ -1 +0,0 @@
-{}
diff --git a/.prettierrc.js b/.prettierrc.js
new file mode 100644
index 00000000..b48ef007
--- /dev/null
+++ b/.prettierrc.js
@@ -0,0 +1,5 @@
+const config = {
+ plugins: [require("prettier-plugin-organize-imports")],
+};
+
+module.exports = config;
diff --git a/next-i18next.config.js b/next-i18next.config.js
index a1b5c7b3..f6968dc3 100644
--- a/next-i18next.config.js
+++ b/next-i18next.config.js
@@ -131,8 +131,8 @@ module.exports = {
? BIBIT_UNITS
: BIT_UNITS
: options.binary
- ? BIBYTE_UNITS
- : BYTE_UNITS;
+ ? BIBYTE_UNITS
+ : BYTE_UNITS;
if (value === 0) return `0 ${sizes[0]}/s`;
diff --git a/package.json b/package.json
index 7f0fbdf7..07be3d1d 100644
--- a/package.json
+++ b/package.json
@@ -56,6 +56,7 @@
"eslint-plugin-react-hooks": "^5.1.0",
"postcss": "^8.5.2",
"prettier": "^3.5.2",
+ "prettier-plugin-organize-imports": "^4.1.0",
"tailwind-scrollbar": "^4.0.1",
"tailwindcss": "^4.0.9",
"typescript": "^5.7.3"
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 2848e239..40069cad 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -101,10 +101,6 @@ importers:
xml-js:
specifier: ^1.6.11
version: 1.6.11
- optionalDependencies:
- osx-temperature-sensor:
- specifier: ^1.0.8
- version: 1.0.8
devDependencies:
'@tailwindcss/forms':
specifier: ^0.5.10
@@ -142,6 +138,9 @@ importers:
prettier:
specifier: ^3.5.2
version: 3.5.2
+ prettier-plugin-organize-imports:
+ specifier: ^4.1.0
+ version: 4.1.0(prettier@3.5.2)(typescript@5.7.3)
tailwind-scrollbar:
specifier: ^4.0.1
version: 4.0.1(react@18.3.1)(tailwindcss@4.0.9)
@@ -151,6 +150,10 @@ importers:
typescript:
specifier: ^5.7.3
version: 5.7.3
+ optionalDependencies:
+ osx-temperature-sensor:
+ specifier: ^1.0.8
+ version: 1.0.8
packages:
@@ -2144,6 +2147,16 @@ packages:
resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
engines: {node: '>=6.0.0'}
+ prettier-plugin-organize-imports@4.1.0:
+ resolution: {integrity: sha512-5aWRdCgv645xaa58X8lOxzZoiHAldAPChljr/MT0crXVOWTZ+Svl4hIWlz+niYSlO6ikE5UXkN1JrRvIP2ut0A==}
+ peerDependencies:
+ prettier: '>=2.0'
+ typescript: '>=2.9'
+ vue-tsc: ^2.1.0
+ peerDependenciesMeta:
+ vue-tsc:
+ optional: true
+
prettier@3.5.2:
resolution: {integrity: sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==}
engines: {node: '>=14'}
@@ -4883,6 +4896,11 @@ snapshots:
dependencies:
fast-diff: 1.3.0
+ prettier-plugin-organize-imports@4.1.0(prettier@3.5.2)(typescript@5.7.3):
+ dependencies:
+ prettier: 3.5.2
+ typescript: 5.7.3
+
prettier@3.5.2: {}
pretty-bytes@6.1.1: {}
diff --git a/src/components/bookmarks/group.jsx b/src/components/bookmarks/group.jsx
index 726f54e8..2334dad5 100644
--- a/src/components/bookmarks/group.jsx
+++ b/src/components/bookmarks/group.jsx
@@ -1,10 +1,10 @@
-import { useRef, useEffect } from "react";
-import classNames from "classnames";
import { Disclosure, Transition } from "@headlessui/react";
-import { MdKeyboardArrowDown } from "react-icons/md";
-import ErrorBoundary from "components/errorboundry";
+import classNames from "classnames";
import List from "components/bookmarks/list";
+import ErrorBoundary from "components/errorboundry";
import ResolvedIcon from "components/resolvedicon";
+import { useEffect, useRef } from "react";
+import { MdKeyboardArrowDown } from "react-icons/md";
export default function BookmarksGroup({
bookmarks,
diff --git a/src/components/bookmarks/item.jsx b/src/components/bookmarks/item.jsx
index c9b84eac..7ea16bba 100644
--- a/src/components/bookmarks/item.jsx
+++ b/src/components/bookmarks/item.jsx
@@ -1,7 +1,7 @@
-import { useContext } from "react";
import classNames from "classnames";
-import { SettingsContext } from "utils/contexts/settings";
import ResolvedIcon from "components/resolvedicon";
+import { useContext } from "react";
+import { SettingsContext } from "utils/contexts/settings";
export default function Item({ bookmark, iconOnly = false }) {
const description = bookmark.description ?? new URL(bookmark.href).hostname;
diff --git a/src/components/favicon.jsx b/src/components/favicon.jsx
index 8221c799..8961d655 100644
--- a/src/components/favicon.jsx
+++ b/src/components/favicon.jsx
@@ -1,6 +1,6 @@
/* eslint-disable @next/next/no-img-element */
/* eslint-disable jsx-a11y/alt-text */
-import { useRef, useEffect, useContext } from "react";
+import { useContext, useEffect, useRef } from "react";
import { ColorContext } from "utils/contexts/color";
import themes from "utils/styles/themes";
diff --git a/src/components/quicklaunch.jsx b/src/components/quicklaunch.jsx
index e1f6bc09..14f0f4fb 100644
--- a/src/components/quicklaunch.jsx
+++ b/src/components/quicklaunch.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "react-i18next";
-import { useEffect, useState, useRef, useCallback, useContext } from "react";
import classNames from "classnames";
+import { useCallback, useContext, useEffect, useRef, useState } from "react";
+import { useTranslation } from "react-i18next";
import useSWR from "swr";
import { SettingsContext } from "utils/contexts/settings";
@@ -53,7 +53,7 @@ export default function QuickLaunch({ servicesAndBookmarks, searchString, setSea
const result = results[currentItemIndex];
window.open(
result.href,
- newWindow ? "_blank" : result.target ?? searchProvider?.target ?? settings.target ?? "_blank",
+ newWindow ? "_blank" : (result.target ?? searchProvider?.target ?? settings.target ?? "_blank"),
"noreferrer",
);
}
diff --git a/src/components/resolvedicon.jsx b/src/components/resolvedicon.jsx
index eb2a5c0d..77ba9119 100644
--- a/src/components/resolvedicon.jsx
+++ b/src/components/resolvedicon.jsx
@@ -1,5 +1,5 @@
-import { useContext } from "react";
import Image from "next/image";
+import { useContext } from "react";
import { SettingsContext } from "utils/contexts/settings";
import { ThemeContext } from "utils/contexts/theme";
diff --git a/src/components/services/dropdown.jsx b/src/components/services/dropdown.jsx
index 00b8a429..e8e11d97 100644
--- a/src/components/services/dropdown.jsx
+++ b/src/components/services/dropdown.jsx
@@ -1,7 +1,7 @@
-import { Fragment } from "react";
import { Menu, Transition } from "@headlessui/react";
-import { BiCog } from "react-icons/bi";
import classNames from "classnames";
+import { Fragment } from "react";
+import { BiCog } from "react-icons/bi";
export default function Dropdown({ options, value, setValue }) {
return (
diff --git a/src/components/services/group.jsx b/src/components/services/group.jsx
index 3e6327a4..cad7b5aa 100644
--- a/src/components/services/group.jsx
+++ b/src/components/services/group.jsx
@@ -1,9 +1,9 @@
-import { useRef, useEffect } from "react";
-import classNames from "classnames";
import { Disclosure, Transition } from "@headlessui/react";
-import { MdKeyboardArrowDown } from "react-icons/md";
-import List from "components/services/list";
+import classNames from "classnames";
import ResolvedIcon from "components/resolvedicon";
+import List from "components/services/list";
+import { useEffect, useRef } from "react";
+import { MdKeyboardArrowDown } from "react-icons/md";
import { columnMap } from "../../utils/layout/columns";
diff --git a/src/components/services/item.jsx b/src/components/services/item.jsx
index 72b0fd50..8e851611 100644
--- a/src/components/services/item.jsx
+++ b/src/components/services/item.jsx
@@ -1,15 +1,15 @@
import classNames from "classnames";
+import ResolvedIcon from "components/resolvedicon";
import { useContext, useState } from "react";
+import { SettingsContext } from "utils/contexts/settings";
import Docker from "widgets/docker/component";
import Kubernetes from "widgets/kubernetes/component";
-import { SettingsContext } from "utils/contexts/settings";
-import ResolvedIcon from "components/resolvedicon";
-import Status from "./status";
-import Widget from "./widget";
+import KubernetesStatus from "./kubernetes-status";
import Ping from "./ping";
import SiteMonitor from "./site-monitor";
-import KubernetesStatus from "./kubernetes-status";
+import Status from "./status";
+import Widget from "./widget";
export default function Item({ service, groupName, useEqualHeights }) {
const hasLink = service.href && service.href !== "#";
diff --git a/src/components/services/kubernetes-status.jsx b/src/components/services/kubernetes-status.jsx
index a256a2df..e4ea958d 100644
--- a/src/components/services/kubernetes-status.jsx
+++ b/src/components/services/kubernetes-status.jsx
@@ -1,5 +1,5 @@
-import useSWR from "swr";
import { t } from "i18next";
+import useSWR from "swr";
export default function KubernetesStatus({ service, style }) {
const podSelectorString = service.podSelector !== undefined ? `podSelector=${service.podSelector}` : "";
diff --git a/src/components/services/widget.jsx b/src/components/services/widget.jsx
index bda638a4..6e3a6360 100644
--- a/src/components/services/widget.jsx
+++ b/src/components/services/widget.jsx
@@ -1,5 +1,5 @@
-import { useTranslation } from "next-i18next";
import ErrorBoundary from "components/errorboundry";
+import { useTranslation } from "next-i18next";
import components from "widgets/components";
diff --git a/src/components/services/widget/block.jsx b/src/components/services/widget/block.jsx
index 8cd74aad..720140cc 100644
--- a/src/components/services/widget/block.jsx
+++ b/src/components/services/widget/block.jsx
@@ -1,5 +1,5 @@
-import { useTranslation } from "next-i18next";
import classNames from "classnames";
+import { useTranslation } from "next-i18next";
export default function Block({ value, label }) {
const { t } = useTranslation();
diff --git a/src/components/tab.jsx b/src/components/tab.jsx
index 2c3984c9..dc183fe4 100644
--- a/src/components/tab.jsx
+++ b/src/components/tab.jsx
@@ -1,5 +1,5 @@
-import { useContext } from "react";
import classNames from "classnames";
+import { useContext } from "react";
import { TabContext } from "utils/contexts/tab";
function slugify(tabName) {
diff --git a/src/components/toggles/color.jsx b/src/components/toggles/color.jsx
index 60cc8de8..7ea700ab 100644
--- a/src/components/toggles/color.jsx
+++ b/src/components/toggles/color.jsx
@@ -1,7 +1,7 @@
-import { useContext, Fragment } from "react";
-import { IoColorPalette } from "react-icons/io5";
import { Popover, Transition } from "@headlessui/react";
import classNames from "classnames";
+import { Fragment, useContext } from "react";
+import { IoColorPalette } from "react-icons/io5";
import { ColorContext } from "utils/contexts/color";
const colors = [
diff --git a/src/components/version.jsx b/src/components/version.jsx
index b8ee1eb8..946fb0a9 100644
--- a/src/components/version.jsx
+++ b/src/components/version.jsx
@@ -1,8 +1,8 @@
+import { compareVersions, validate } from "compare-versions";
import cache from "memory-cache";
import { useTranslation } from "next-i18next";
-import useSWR from "swr";
-import { compareVersions, validate } from "compare-versions";
import { MdNewReleases } from "react-icons/md";
+import useSWR from "swr";
const LATEST_RELEASE_CACHE_KEY = "latestRelease";
diff --git a/src/components/widgets/datetime/datetime.jsx b/src/components/widgets/datetime/datetime.jsx
index a7aec5da..b59cf809 100644
--- a/src/components/widgets/datetime/datetime.jsx
+++ b/src/components/widgets/datetime/datetime.jsx
@@ -1,5 +1,5 @@
-import { useState, useEffect } from "react";
import { useTranslation } from "next-i18next";
+import { useEffect, useState } from "react";
import Container from "../widget/container";
import Raw from "../widget/raw";
diff --git a/src/components/widgets/glances/glances.jsx b/src/components/widgets/glances/glances.jsx
index 0803b88c..7f772808 100644
--- a/src/components/widgets/glances/glances.jsx
+++ b/src/components/widgets/glances/glances.jsx
@@ -1,9 +1,9 @@
-import useSWR from "swr";
+import classNames from "classnames";
+import { useTranslation } from "next-i18next";
import { useContext } from "react";
import { FaMemory, FaRegClock, FaThermometerHalf } from "react-icons/fa";
import { FiCpu, FiHardDrive } from "react-icons/fi";
-import { useTranslation } from "next-i18next";
-import classNames from "classnames";
+import useSWR from "swr";
import { SettingsContext } from "utils/contexts/settings";
import Error from "../widget/error";
diff --git a/src/components/widgets/kubernetes/kubernetes.jsx b/src/components/widgets/kubernetes/kubernetes.jsx
index f7b101c7..50b173bc 100644
--- a/src/components/widgets/kubernetes/kubernetes.jsx
+++ b/src/components/widgets/kubernetes/kubernetes.jsx
@@ -1,8 +1,8 @@
-import useSWR from "swr";
import { useTranslation } from "next-i18next";
+import useSWR from "swr";
-import Error from "../widget/error";
import Container from "../widget/container";
+import Error from "../widget/error";
import Raw from "../widget/raw";
import Node from "./node";
diff --git a/src/components/widgets/kubernetes/node.jsx b/src/components/widgets/kubernetes/node.jsx
index ba8f8b77..aebb40f2 100644
--- a/src/components/widgets/kubernetes/node.jsx
+++ b/src/components/widgets/kubernetes/node.jsx
@@ -1,7 +1,7 @@
+import { useTranslation } from "next-i18next";
import { FaMemory } from "react-icons/fa";
import { FiAlertTriangle, FiCpu, FiServer } from "react-icons/fi";
import { SiKubernetes } from "react-icons/si";
-import { useTranslation } from "next-i18next";
import UsageBar from "../resources/usage-bar";
diff --git a/src/components/widgets/longhorn/longhorn.jsx b/src/components/widgets/longhorn/longhorn.jsx
index 22047e2c..235c77d0 100644
--- a/src/components/widgets/longhorn/longhorn.jsx
+++ b/src/components/widgets/longhorn/longhorn.jsx
@@ -1,7 +1,7 @@
import useSWR from "swr";
-import Error from "../widget/error";
import Container from "../widget/container";
+import Error from "../widget/error";
import Raw from "../widget/raw";
import Node from "./node";
diff --git a/src/components/widgets/openmeteo/openmeteo.jsx b/src/components/widgets/openmeteo/openmeteo.jsx
index 4d3e7e89..a46f53ab 100644
--- a/src/components/widgets/openmeteo/openmeteo.jsx
+++ b/src/components/widgets/openmeteo/openmeteo.jsx
@@ -1,16 +1,16 @@
-import useSWR from "swr";
-import { useState } from "react";
-import { WiCloudDown } from "react-icons/wi";
-import { MdLocationDisabled, MdLocationSearching } from "react-icons/md";
import { useTranslation } from "next-i18next";
+import { useState } from "react";
+import { MdLocationDisabled, MdLocationSearching } from "react-icons/md";
+import { WiCloudDown } from "react-icons/wi";
+import useSWR from "swr";
-import Error from "../widget/error";
+import mapIcon from "../../../utils/weather/openmeteo-condition-map";
import Container from "../widget/container";
import ContainerButton from "../widget/container_button";
-import WidgetIcon from "../widget/widget_icon";
+import Error from "../widget/error";
import PrimaryText from "../widget/primary_text";
import SecondaryText from "../widget/secondary_text";
-import mapIcon from "../../../utils/weather/openmeteo-condition-map";
+import WidgetIcon from "../widget/widget_icon";
function Widget({ options }) {
const { t } = useTranslation();
diff --git a/src/components/widgets/openweathermap/weather.jsx b/src/components/widgets/openweathermap/weather.jsx
index df0280e3..3336ed4f 100644
--- a/src/components/widgets/openweathermap/weather.jsx
+++ b/src/components/widgets/openweathermap/weather.jsx
@@ -1,16 +1,16 @@
-import useSWR from "swr";
-import { useState } from "react";
-import { WiCloudDown } from "react-icons/wi";
-import { MdLocationDisabled, MdLocationSearching } from "react-icons/md";
import { useTranslation } from "next-i18next";
+import { useState } from "react";
+import { MdLocationDisabled, MdLocationSearching } from "react-icons/md";
+import { WiCloudDown } from "react-icons/wi";
+import useSWR from "swr";
-import Error from "../widget/error";
+import mapIcon from "../../../utils/weather/owm-condition-map";
import Container from "../widget/container";
import ContainerButton from "../widget/container_button";
+import Error from "../widget/error";
import PrimaryText from "../widget/primary_text";
import SecondaryText from "../widget/secondary_text";
import WidgetIcon from "../widget/widget_icon";
-import mapIcon from "../../../utils/weather/owm-condition-map";
function Widget({ options }) {
const { t, i18n } = useTranslation();
diff --git a/src/components/widgets/resources/cpu.jsx b/src/components/widgets/resources/cpu.jsx
index 1963637d..1bea4af9 100644
--- a/src/components/widgets/resources/cpu.jsx
+++ b/src/components/widgets/resources/cpu.jsx
@@ -1,9 +1,9 @@
-import useSWR from "swr";
-import { FiCpu } from "react-icons/fi";
import { useTranslation } from "next-i18next";
+import { FiCpu } from "react-icons/fi";
+import useSWR from "swr";
-import Resource from "../widget/resource";
import Error from "../widget/error";
+import Resource from "../widget/resource";
export default function Cpu({ expanded, refresh = 1500 }) {
const { t } = useTranslation();
diff --git a/src/components/widgets/resources/cputemp.jsx b/src/components/widgets/resources/cputemp.jsx
index ef994c65..248cd396 100644
--- a/src/components/widgets/resources/cputemp.jsx
+++ b/src/components/widgets/resources/cputemp.jsx
@@ -1,9 +1,9 @@
-import useSWR from "swr";
-import { FaThermometerHalf } from "react-icons/fa";
import { useTranslation } from "next-i18next";
+import { FaThermometerHalf } from "react-icons/fa";
+import useSWR from "swr";
-import Resource from "../widget/resource";
import Error from "../widget/error";
+import Resource from "../widget/resource";
function convertToFahrenheit(t) {
return (t * 9) / 5 + 32;
diff --git a/src/components/widgets/resources/disk.jsx b/src/components/widgets/resources/disk.jsx
index 15da7780..d5706ba5 100644
--- a/src/components/widgets/resources/disk.jsx
+++ b/src/components/widgets/resources/disk.jsx
@@ -1,9 +1,9 @@
-import useSWR from "swr";
-import { FiHardDrive } from "react-icons/fi";
import { useTranslation } from "next-i18next";
+import { FiHardDrive } from "react-icons/fi";
+import useSWR from "swr";
-import Resource from "../widget/resource";
import Error from "../widget/error";
+import Resource from "../widget/resource";
export default function Disk({ options, expanded, diskUnits, refresh = 1500 }) {
const { t } = useTranslation();
diff --git a/src/components/widgets/resources/memory.jsx b/src/components/widgets/resources/memory.jsx
index 155b7ecb..a8c82cbf 100644
--- a/src/components/widgets/resources/memory.jsx
+++ b/src/components/widgets/resources/memory.jsx
@@ -1,9 +1,9 @@
-import useSWR from "swr";
-import { FaMemory } from "react-icons/fa";
import { useTranslation } from "next-i18next";
+import { FaMemory } from "react-icons/fa";
+import useSWR from "swr";
-import Resource from "../widget/resource";
import Error from "../widget/error";
+import Resource from "../widget/resource";
export default function Memory({ expanded, refresh = 1500 }) {
const { t } = useTranslation();
diff --git a/src/components/widgets/resources/network.jsx b/src/components/widgets/resources/network.jsx
index a2a3acac..48286030 100644
--- a/src/components/widgets/resources/network.jsx
+++ b/src/components/widgets/resources/network.jsx
@@ -1,9 +1,9 @@
-import useSWR from "swr";
-import { FaNetworkWired } from "react-icons/fa";
import { useTranslation } from "next-i18next";
+import { FaNetworkWired } from "react-icons/fa";
+import useSWR from "swr";
-import Resource from "../widget/resource";
import Error from "../widget/error";
+import Resource from "../widget/resource";
export default function Network({ options, refresh = 1500 }) {
const { t } = useTranslation();
diff --git a/src/components/widgets/resources/resources.jsx b/src/components/widgets/resources/resources.jsx
index db26caa7..1002f98c 100644
--- a/src/components/widgets/resources/resources.jsx
+++ b/src/components/widgets/resources/resources.jsx
@@ -1,12 +1,12 @@
import Container from "../widget/container";
import Raw from "../widget/raw";
-import Disk from "./disk";
import Cpu from "./cpu";
-import Memory from "./memory";
import CpuTemp from "./cputemp";
-import Uptime from "./uptime";
+import Disk from "./disk";
+import Memory from "./memory";
import Network from "./network";
+import Uptime from "./uptime";
export default function Resources({ options }) {
const { expanded, units, diskUnits, tempmin, tempmax } = options;
diff --git a/src/components/widgets/resources/uptime.jsx b/src/components/widgets/resources/uptime.jsx
index 2fac0fcd..f21634c2 100644
--- a/src/components/widgets/resources/uptime.jsx
+++ b/src/components/widgets/resources/uptime.jsx
@@ -1,9 +1,9 @@
-import useSWR from "swr";
-import { FaRegClock } from "react-icons/fa";
import { useTranslation } from "next-i18next";
+import { FaRegClock } from "react-icons/fa";
+import useSWR from "swr";
-import Resource from "../widget/resource";
import Error from "../widget/error";
+import Resource from "../widget/resource";
export default function Uptime({ refresh = 1500 }) {
const { t } = useTranslation();
diff --git a/src/components/widgets/search/search.jsx b/src/components/widgets/search/search.jsx
index e0564c48..6699a374 100644
--- a/src/components/widgets/search/search.jsx
+++ b/src/components/widgets/search/search.jsx
@@ -1,10 +1,10 @@
-import { useState, useEffect, Fragment } from "react";
-import { useTranslation } from "next-i18next";
-import { FiSearch } from "react-icons/fi";
-import { SiDuckduckgo, SiGoogle, SiBaidu, SiBrave } from "react-icons/si";
-import { BiLogoBing } from "react-icons/bi";
-import { Listbox, Transition, Combobox } from "@headlessui/react";
+import { Combobox, Listbox, Transition } from "@headlessui/react";
import classNames from "classnames";
+import { useTranslation } from "next-i18next";
+import { Fragment, useEffect, useState } from "react";
+import { BiLogoBing } from "react-icons/bi";
+import { FiSearch } from "react-icons/fi";
+import { SiBaidu, SiBrave, SiDuckduckgo, SiGoogle } from "react-icons/si";
import ContainerForm from "../widget/container_form";
import Raw from "../widget/raw";
diff --git a/src/components/widgets/stocks/stocks.jsx b/src/components/widgets/stocks/stocks.jsx
index 1a9018d3..e6657878 100644
--- a/src/components/widgets/stocks/stocks.jsx
+++ b/src/components/widgets/stocks/stocks.jsx
@@ -1,13 +1,13 @@
-import useSWR from "swr";
-import { useState } from "react";
import { useTranslation } from "next-i18next";
+import { useState } from "react";
import { FaChartLine } from "react-icons/fa6";
+import useSWR from "swr";
-import Error from "../widget/error";
import Container from "../widget/container";
+import Error from "../widget/error";
import PrimaryText from "../widget/primary_text";
-import WidgetIcon from "../widget/widget_icon";
import Raw from "../widget/raw";
+import WidgetIcon from "../widget/widget_icon";
export default function Widget({ options }) {
const { t, i18n } = useTranslation();
diff --git a/src/components/widgets/unifi_console/unifi_console.jsx b/src/components/widgets/unifi_console/unifi_console.jsx
index 5295dbb7..09e6952f 100644
--- a/src/components/widgets/unifi_console/unifi_console.jsx
+++ b/src/components/widgets/unifi_console/unifi_console.jsx
@@ -1,13 +1,13 @@
-import { BiError, BiWifi, BiCheckCircle, BiXCircle, BiNetworkChart } from "react-icons/bi";
-import { MdSettingsEthernet } from "react-icons/md";
import { useTranslation } from "next-i18next";
+import { BiCheckCircle, BiError, BiNetworkChart, BiWifi, BiXCircle } from "react-icons/bi";
+import { MdSettingsEthernet } from "react-icons/md";
import { SiUbiquiti } from "react-icons/si";
-import Error from "../widget/error";
import Container from "../widget/container";
+import Error from "../widget/error";
+import PrimaryText from "../widget/primary_text";
import Raw from "../widget/raw";
import WidgetIcon from "../widget/widget_icon";
-import PrimaryText from "../widget/primary_text";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/components/widgets/weather/weather.jsx b/src/components/widgets/weather/weather.jsx
index 4ebb08c5..98768963 100644
--- a/src/components/widgets/weather/weather.jsx
+++ b/src/components/widgets/weather/weather.jsx
@@ -1,16 +1,16 @@
-import useSWR from "swr";
-import { useState } from "react";
-import { WiCloudDown } from "react-icons/wi";
-import { MdLocationDisabled, MdLocationSearching } from "react-icons/md";
import { useTranslation } from "next-i18next";
+import { useState } from "react";
+import { MdLocationDisabled, MdLocationSearching } from "react-icons/md";
+import { WiCloudDown } from "react-icons/wi";
+import useSWR from "swr";
-import Error from "../widget/error";
+import mapIcon from "../../../utils/weather/condition-map";
import Container from "../widget/container";
+import ContainerButton from "../widget/container_button";
+import Error from "../widget/error";
import PrimaryText from "../widget/primary_text";
import SecondaryText from "../widget/secondary_text";
import WidgetIcon from "../widget/widget_icon";
-import ContainerButton from "../widget/container_button";
-import mapIcon from "../../../utils/weather/condition-map";
function Widget({ options }) {
const { t, i18n } = useTranslation();
diff --git a/src/components/widgets/widget.jsx b/src/components/widgets/widget.jsx
index 6cb48fde..ebc706ac 100644
--- a/src/components/widgets/widget.jsx
+++ b/src/components/widgets/widget.jsx
@@ -1,5 +1,5 @@
-import dynamic from "next/dynamic";
import ErrorBoundary from "components/errorboundry";
+import dynamic from "next/dynamic";
const widgetMappings = {
weatherapi: dynamic(() => import("components/widgets/weather/weather")),
diff --git a/src/components/widgets/widget/container.jsx b/src/components/widgets/widget/container.jsx
index ae06d8ba..fe6397e0 100644
--- a/src/components/widgets/widget/container.jsx
+++ b/src/components/widgets/widget/container.jsx
@@ -2,10 +2,10 @@ import classNames from "classnames";
import { useContext } from "react";
import { SettingsContext } from "utils/contexts/settings";
-import WidgetIcon from "./widget_icon";
import PrimaryText from "./primary_text";
-import SecondaryText from "./secondary_text";
import Raw from "./raw";
+import SecondaryText from "./secondary_text";
+import WidgetIcon from "./widget_icon";
export function getAllClasses(options, additionalClassNames = "") {
if (options?.style?.header === "boxedWidgets") {
diff --git a/src/components/widgets/widget/container_button.jsx b/src/components/widgets/widget/container_button.jsx
index a6379081..e0802511 100644
--- a/src/components/widgets/widget/container_button.jsx
+++ b/src/components/widgets/widget/container_button.jsx
@@ -1,4 +1,4 @@
-import { getAllClasses, getInnerBlock, getBottomBlock } from "./container";
+import { getAllClasses, getBottomBlock, getInnerBlock } from "./container";
export default function ContainerButton({ children = [], options, additionalClassNames = "", callback }) {
return (
diff --git a/src/components/widgets/widget/container_form.jsx b/src/components/widgets/widget/container_form.jsx
index 68cbd64b..a9afef3a 100644
--- a/src/components/widgets/widget/container_form.jsx
+++ b/src/components/widgets/widget/container_form.jsx
@@ -1,4 +1,4 @@
-import { getAllClasses, getInnerBlock, getBottomBlock } from "./container";
+import { getAllClasses, getBottomBlock, getInnerBlock } from "./container";
export default function ContainerForm({ children = [], options, additionalClassNames = "", callback }) {
return (
diff --git a/src/components/widgets/widget/container_link.jsx b/src/components/widgets/widget/container_link.jsx
index 6f157875..a36f311c 100644
--- a/src/components/widgets/widget/container_link.jsx
+++ b/src/components/widgets/widget/container_link.jsx
@@ -1,4 +1,4 @@
-import { getAllClasses, getInnerBlock, getBottomBlock } from "./container";
+import { getAllClasses, getBottomBlock, getInnerBlock } from "./container";
export default function ContainerLink({ children = [], options, additionalClassNames = "", target }) {
return (
diff --git a/src/components/widgets/widget/resources.jsx b/src/components/widgets/widget/resources.jsx
index 2f594942..b9a48a41 100644
--- a/src/components/widgets/widget/resources.jsx
+++ b/src/components/widgets/widget/resources.jsx
@@ -1,8 +1,8 @@
import classNames from "classnames";
import ContainerLink from "./container_link";
-import Resource from "./resource";
import Raw from "./raw";
+import Resource from "./resource";
import WidgetLabel from "./widget_label";
export default function Resources({ options, children, target, additionalClassNames }) {
diff --git a/src/pages/_app.jsx b/src/pages/_app.jsx
index c5465a80..8e88f6b2 100644
--- a/src/pages/_app.jsx
+++ b/src/pages/_app.jsx
@@ -1,14 +1,14 @@
/* eslint-disable react/jsx-props-no-spreading */
-import { SWRConfig } from "swr";
import { appWithTranslation } from "next-i18next";
import Head from "next/head";
import "styles/globals.css";
-import "styles/theme.css";
import "styles/manrope.css";
+import "styles/theme.css";
+import { SWRConfig } from "swr";
import { ColorProvider } from "utils/contexts/color";
-import { ThemeProvider } from "utils/contexts/theme";
import { SettingsProvider } from "utils/contexts/settings";
import { TabProvider } from "utils/contexts/tab";
+import { ThemeProvider } from "utils/contexts/theme";
import nextI18nextConfig from "../../next-i18next.config";
diff --git a/src/pages/_document.jsx b/src/pages/_document.jsx
index 31083438..ece38aec 100644
--- a/src/pages/_document.jsx
+++ b/src/pages/_document.jsx
@@ -1,4 +1,4 @@
-import { Html, Head, Main, NextScript } from "next/document";
+import { Head, Html, Main, NextScript } from "next/document";
export default function Document() {
return (
diff --git a/src/pages/api/config/[path].js b/src/pages/api/config/[path].js
index 6cb04698..b69ddff5 100644
--- a/src/pages/api/config/[path].js
+++ b/src/pages/api/config/[path].js
@@ -1,5 +1,5 @@
-import path from "path";
import fs from "fs";
+import path from "path";
import { CONF_DIR } from "utils/config/config";
import createLogger from "utils/logger";
diff --git a/src/pages/api/hash.js b/src/pages/api/hash.js
index 992f9ea6..33fb4ef5 100644
--- a/src/pages/api/hash.js
+++ b/src/pages/api/hash.js
@@ -1,6 +1,6 @@
-import { join } from "path";
import { createHash } from "crypto";
import { readFileSync } from "fs";
+import { join } from "path";
import checkAndCopyConfig, { CONF_DIR } from "utils/config/config";
diff --git a/src/pages/api/releases.js b/src/pages/api/releases.js
index 372ace9d..01d0e8a5 100644
--- a/src/pages/api/releases.js
+++ b/src/pages/api/releases.js
@@ -1,5 +1,5 @@
-import { cachedRequest } from "utils/proxy/http";
import createLogger from "utils/logger";
+import { cachedRequest } from "utils/proxy/http";
const logger = createLogger("releases");
diff --git a/src/pages/api/search/searchSuggestion.js b/src/pages/api/search/searchSuggestion.js
index 209d1f2c..13f3f301 100644
--- a/src/pages/api/search/searchSuggestion.js
+++ b/src/pages/api/search/searchSuggestion.js
@@ -1,8 +1,8 @@
import { searchProviders } from "components/widgets/search/search";
import { getSettings } from "utils/config/config";
-import { cachedRequest } from "utils/proxy/http";
import { widgetsFromConfig } from "utils/config/widget-helpers";
+import { cachedRequest } from "utils/proxy/http";
export default async function handler(req, res) {
const { query, providerName } = req.query;
diff --git a/src/pages/api/services/proxy.js b/src/pages/api/services/proxy.js
index 3f8adc88..0cdf806f 100644
--- a/src/pages/api/services/proxy.js
+++ b/src/pages/api/services/proxy.js
@@ -1,9 +1,9 @@
-import { formatApiCall } from "utils/proxy/api-helpers";
-import createLogger from "utils/logger";
-import genericProxyHandler from "utils/proxy/handlers/generic";
-import widgets from "widgets/widgets";
-import calendarProxyHandler from "widgets/calendar/proxy";
import getServiceWidget from "utils/config/service-helpers";
+import createLogger from "utils/logger";
+import { formatApiCall } from "utils/proxy/api-helpers";
+import genericProxyHandler from "utils/proxy/handlers/generic";
+import calendarProxyHandler from "widgets/calendar/proxy";
+import widgets from "widgets/widgets";
const logger = createLogger("servicesProxy");
diff --git a/src/pages/api/widgets/glances.js b/src/pages/api/widgets/glances.js
index 199c133e..f0a3a7d9 100644
--- a/src/pages/api/widgets/glances.js
+++ b/src/pages/api/widgets/glances.js
@@ -1,6 +1,6 @@
-import { httpProxy } from "utils/proxy/http";
-import createLogger from "utils/logger";
import { getPrivateWidgetOptions } from "utils/config/widget-helpers";
+import createLogger from "utils/logger";
+import { httpProxy } from "utils/proxy/http";
const logger = createLogger("glances");
diff --git a/src/pages/api/widgets/longhorn.js b/src/pages/api/widgets/longhorn.js
index 9126e937..c45086bc 100644
--- a/src/pages/api/widgets/longhorn.js
+++ b/src/pages/api/widgets/longhorn.js
@@ -1,6 +1,6 @@
-import { httpProxy } from "../../../utils/proxy/http";
-import createLogger from "../../../utils/logger";
import { getSettings } from "../../../utils/config/config";
+import createLogger from "../../../utils/logger";
+import { httpProxy } from "../../../utils/proxy/http";
const logger = createLogger("longhorn");
diff --git a/src/pages/api/widgets/openweathermap.js b/src/pages/api/widgets/openweathermap.js
index 3bdc7a82..993ee1f5 100644
--- a/src/pages/api/widgets/openweathermap.js
+++ b/src/pages/api/widgets/openweathermap.js
@@ -1,6 +1,6 @@
-import { cachedRequest } from "utils/proxy/http";
import { getSettings } from "utils/config/config";
import { getPrivateWidgetOptions } from "utils/config/widget-helpers";
+import { cachedRequest } from "utils/proxy/http";
export default async function handler(req, res) {
const { latitude, longitude, units, provider, cache, lang, index } = req.query;
diff --git a/src/pages/api/widgets/stocks.js b/src/pages/api/widgets/stocks.js
index 4e9f3f55..77881ad7 100644
--- a/src/pages/api/widgets/stocks.js
+++ b/src/pages/api/widgets/stocks.js
@@ -1,6 +1,6 @@
-import { cachedRequest } from "utils/proxy/http";
import { getSettings } from "utils/config/config";
import createLogger from "utils/logger";
+import { cachedRequest } from "utils/proxy/http";
const logger = createLogger("stocks");
diff --git a/src/pages/api/widgets/weather.js b/src/pages/api/widgets/weather.js
index 9e63e48d..78418f74 100644
--- a/src/pages/api/widgets/weather.js
+++ b/src/pages/api/widgets/weather.js
@@ -1,6 +1,6 @@
-import { cachedRequest } from "utils/proxy/http";
import { getSettings } from "utils/config/config";
import { getPrivateWidgetOptions } from "utils/config/widget-helpers";
+import { cachedRequest } from "utils/proxy/http";
export default async function handler(req, res) {
const { latitude, longitude, provider, cache, lang, index } = req.query;
diff --git a/src/pages/index.jsx b/src/pages/index.jsx
index 78702796..f8d48fdf 100644
--- a/src/pages/index.jsx
+++ b/src/pages/index.jsx
@@ -1,31 +1,31 @@
/* eslint-disable react/no-array-index-key */
-import useSWR, { SWRConfig } from "swr";
-import Head from "next/head";
-import Script from "next/script";
-import dynamic from "next/dynamic";
import classNames from "classnames";
-import { useTranslation } from "next-i18next";
-import { useEffect, useContext, useState, useMemo } from "react";
-import { BiError } from "react-icons/bi";
-import { serverSideTranslations } from "next-i18next/serverSideTranslations";
-import { useRouter } from "next/router";
-import Tab, { slugifyAndEncode } from "components/tab";
-import ServicesGroup from "components/services/group";
import BookmarksGroup from "components/bookmarks/group";
-import Widget from "components/widgets/widget";
-import Revalidate from "components/toggles/revalidate";
-import { ColorContext } from "utils/contexts/color";
-import { ThemeContext } from "utils/contexts/theme";
-import { SettingsContext } from "utils/contexts/settings";
-import { TabContext } from "utils/contexts/tab";
import ErrorBoundary from "components/errorboundry";
import QuickLaunch from "components/quicklaunch";
+import ServicesGroup from "components/services/group";
+import Tab, { slugifyAndEncode } from "components/tab";
+import Revalidate from "components/toggles/revalidate";
+import Widget from "components/widgets/widget";
+import { useTranslation } from "next-i18next";
+import { serverSideTranslations } from "next-i18next/serverSideTranslations";
+import dynamic from "next/dynamic";
+import Head from "next/head";
+import { useRouter } from "next/router";
+import Script from "next/script";
+import { useContext, useEffect, useMemo, useState } from "react";
+import { BiError } from "react-icons/bi";
+import useSWR, { SWRConfig } from "swr";
+import { ColorContext } from "utils/contexts/color";
+import { SettingsContext } from "utils/contexts/settings";
+import { TabContext } from "utils/contexts/tab";
+import { ThemeContext } from "utils/contexts/theme";
import { bookmarksResponse, servicesResponse, widgetsResponse } from "utils/config/api-response";
-import themes from "utils/styles/themes";
import { getSettings } from "utils/config/config";
import useWindowFocus from "utils/hooks/window-focus";
import createLogger from "utils/logger";
+import themes from "utils/styles/themes";
const ThemeToggle = dynamic(() => import("components/toggles/theme"), {
ssr: false,
diff --git a/src/utils/config/api-response.js b/src/utils/config/api-response.js
index 03f155fb..4691f9bc 100644
--- a/src/utils/config/api-response.js
+++ b/src/utils/config/api-response.js
@@ -4,13 +4,13 @@ import path from "path";
import yaml from "js-yaml";
-import checkAndCopyConfig, { getSettings, substituteEnvironmentVars, CONF_DIR } from "utils/config/config";
+import checkAndCopyConfig, { CONF_DIR, getSettings, substituteEnvironmentVars } from "utils/config/config";
import {
+ cleanServiceGroups,
+ findGroupByName,
servicesFromConfig,
servicesFromDocker,
- cleanServiceGroups,
servicesFromKubernetes,
- findGroupByName,
} from "utils/config/service-helpers";
import { cleanWidgetGroups, widgetsFromConfig } from "utils/config/widget-helpers";
diff --git a/src/utils/config/config.js b/src/utils/config/config.js
index 18dedf62..3f688842 100644
--- a/src/utils/config/config.js
+++ b/src/utils/config/config.js
@@ -1,9 +1,9 @@
/* eslint-disable no-console */
-import { join } from "path";
import { copyFileSync, existsSync, mkdirSync, readFileSync } from "fs";
+import { join } from "path";
-import cache from "memory-cache";
import yaml from "js-yaml";
+import cache from "memory-cache";
const cacheKey = "homepageEnvironmentVariables";
const homepageVarPrefix = "HOMEPAGE_VAR_";
diff --git a/src/utils/config/docker.js b/src/utils/config/docker.js
index 6ea728e9..ed1d3347 100644
--- a/src/utils/config/docker.js
+++ b/src/utils/config/docker.js
@@ -1,5 +1,5 @@
-import path from "path";
import { readFileSync } from "fs";
+import path from "path";
import yaml from "js-yaml";
diff --git a/src/utils/config/kubernetes.js b/src/utils/config/kubernetes.js
index 6d2fc17b..680c408e 100644
--- a/src/utils/config/kubernetes.js
+++ b/src/utils/config/kubernetes.js
@@ -1,8 +1,8 @@
-import path from "path";
import { readFileSync } from "fs";
+import path from "path";
+import { ApiextensionsV1Api, KubeConfig } from "@kubernetes/client-node";
import yaml from "js-yaml";
-import { KubeConfig, ApiextensionsV1Api } from "@kubernetes/client-node";
import checkAndCopyConfig, { CONF_DIR, substituteEnvironmentVars } from "utils/config/config";
diff --git a/src/utils/config/service-helpers.js b/src/utils/config/service-helpers.js
index 38e7a2bf..c3df6579 100644
--- a/src/utils/config/service-helpers.js
+++ b/src/utils/config/service-helpers.js
@@ -1,15 +1,15 @@
import { promises as fs } from "fs";
import path from "path";
-import yaml from "js-yaml";
import Docker from "dockerode";
+import yaml from "js-yaml";
-import createLogger from "utils/logger";
import checkAndCopyConfig, { CONF_DIR, getSettings, substituteEnvironmentVars } from "utils/config/config";
import getDockerArguments from "utils/config/docker";
-import kubernetes from "utils/kubernetes/export";
import { getKubeConfig } from "utils/config/kubernetes";
import * as shvl from "utils/config/shvl";
+import kubernetes from "utils/kubernetes/export";
+import createLogger from "utils/logger";
const logger = createLogger("service-helpers");
diff --git a/src/utils/contexts/color.jsx b/src/utils/contexts/color.jsx
index d7d985f0..bc16d605 100644
--- a/src/utils/contexts/color.jsx
+++ b/src/utils/contexts/color.jsx
@@ -1,4 +1,4 @@
-import { createContext, useState, useEffect, useMemo } from "react";
+import { createContext, useEffect, useMemo, useState } from "react";
let lastColor = false;
diff --git a/src/utils/contexts/settings.jsx b/src/utils/contexts/settings.jsx
index d6993b14..76451953 100644
--- a/src/utils/contexts/settings.jsx
+++ b/src/utils/contexts/settings.jsx
@@ -1,4 +1,4 @@
-import { createContext, useState, useMemo } from "react";
+import { createContext, useMemo, useState } from "react";
export const SettingsContext = createContext();
diff --git a/src/utils/contexts/tab.jsx b/src/utils/contexts/tab.jsx
index 8cd5d520..2a3d3457 100644
--- a/src/utils/contexts/tab.jsx
+++ b/src/utils/contexts/tab.jsx
@@ -1,4 +1,4 @@
-import { createContext, useState, useMemo } from "react";
+import { createContext, useMemo, useState } from "react";
export const TabContext = createContext();
diff --git a/src/utils/contexts/theme.jsx b/src/utils/contexts/theme.jsx
index 85d613fc..385eeaa2 100644
--- a/src/utils/contexts/theme.jsx
+++ b/src/utils/contexts/theme.jsx
@@ -1,4 +1,4 @@
-import { createContext, useState, useEffect, useMemo } from "react";
+import { createContext, useEffect, useMemo, useState } from "react";
const getInitialTheme = () => {
if (typeof window !== "undefined" && window.localStorage) {
diff --git a/src/utils/hooks/window-focus.js b/src/utils/hooks/window-focus.js
index 3ad57ad0..a221e48e 100644
--- a/src/utils/hooks/window-focus.js
+++ b/src/utils/hooks/window-focus.js
@@ -1,4 +1,4 @@
-import { useState, useEffect } from "react";
+import { useEffect, useState } from "react";
const hasFocus = () => typeof document !== "undefined" && document.hasFocus();
diff --git a/src/utils/kubernetes/export.js b/src/utils/kubernetes/export.js
index ba41593e..ae53aaca 100644
--- a/src/utils/kubernetes/export.js
+++ b/src/utils/kubernetes/export.js
@@ -1,7 +1,7 @@
-import listIngress from "utils/kubernetes/ingress-list";
-import listTraefikIngress from "utils/kubernetes/traefik-list";
import listHttpRoute from "utils/kubernetes/httproute-list";
-import { isDiscoverable, constructedServiceFromResource } from "utils/kubernetes/resource-helpers";
+import listIngress from "utils/kubernetes/ingress-list";
+import { constructedServiceFromResource, isDiscoverable } from "utils/kubernetes/resource-helpers";
+import listTraefikIngress from "utils/kubernetes/traefik-list";
const kubernetes = {
listIngress,
diff --git a/src/utils/kubernetes/ingress-list.js b/src/utils/kubernetes/ingress-list.js
index 49b5d667..1cd9ca95 100644
--- a/src/utils/kubernetes/ingress-list.js
+++ b/src/utils/kubernetes/ingress-list.js
@@ -1,6 +1,6 @@
import { NetworkingV1Api } from "@kubernetes/client-node";
-import { getKubernetes, getKubeConfig } from "utils/config/kubernetes";
+import { getKubeConfig, getKubernetes } from "utils/config/kubernetes";
import createLogger from "utils/logger";
const logger = createLogger("ingress-list");
diff --git a/src/utils/kubernetes/resource-helpers.js b/src/utils/kubernetes/resource-helpers.js
index 1b59526a..0ac143ac 100644
--- a/src/utils/kubernetes/resource-helpers.js
+++ b/src/utils/kubernetes/resource-helpers.js
@@ -1,15 +1,15 @@
import { CustomObjectsApi } from "@kubernetes/client-node";
+import { substituteEnvironmentVars } from "utils/config/config";
import {
- getKubeConfig,
ANNOTATION_BASE,
ANNOTATION_WIDGET_BASE,
+ getKubeConfig,
HTTPROUTE_API_GROUP,
HTTPROUTE_API_VERSION,
} from "utils/config/kubernetes";
-import { substituteEnvironmentVars } from "utils/config/config";
-import createLogger from "utils/logger";
import * as shvl from "utils/config/shvl";
+import createLogger from "utils/logger";
const logger = createLogger("resource-helpers");
const kc = getKubeConfig();
diff --git a/src/utils/kubernetes/traefik-list.js b/src/utils/kubernetes/traefik-list.js
index 0368629a..f6e07241 100644
--- a/src/utils/kubernetes/traefik-list.js
+++ b/src/utils/kubernetes/traefik-list.js
@@ -1,6 +1,6 @@
import { CustomObjectsApi } from "@kubernetes/client-node";
-import { getKubernetes, getKubeConfig, checkCRD, ANNOTATION_BASE } from "utils/config/kubernetes";
+import { ANNOTATION_BASE, checkCRD, getKubeConfig, getKubernetes } from "utils/config/kubernetes";
import createLogger from "utils/logger";
const logger = createLogger("traefik-list");
diff --git a/src/utils/proxy/handlers/credentialed.js b/src/utils/proxy/handlers/credentialed.js
index 056e919f..d0dbc2d6 100644
--- a/src/utils/proxy/handlers/credentialed.js
+++ b/src/utils/proxy/handlers/credentialed.js
@@ -1,9 +1,9 @@
-import getServiceWidget from "utils/config/service-helpers";
-import { formatApiCall, sanitizeErrorURL } from "utils/proxy/api-helpers";
-import validateWidgetData from "utils/proxy/validate-widget-data";
-import { httpProxy } from "utils/proxy/http";
-import createLogger from "utils/logger";
import { getSettings } from "utils/config/config";
+import getServiceWidget from "utils/config/service-helpers";
+import createLogger from "utils/logger";
+import { formatApiCall, sanitizeErrorURL } from "utils/proxy/api-helpers";
+import { httpProxy } from "utils/proxy/http";
+import validateWidgetData from "utils/proxy/validate-widget-data";
import widgets from "widgets/widgets";
const logger = createLogger("credentialedProxyHandler");
diff --git a/src/utils/proxy/handlers/generic.js b/src/utils/proxy/handlers/generic.js
index 4a71f704..1914114c 100644
--- a/src/utils/proxy/handlers/generic.js
+++ b/src/utils/proxy/handlers/generic.js
@@ -1,8 +1,8 @@
import getServiceWidget from "utils/config/service-helpers";
-import { formatApiCall, sanitizeErrorURL } from "utils/proxy/api-helpers";
-import validateWidgetData from "utils/proxy/validate-widget-data";
-import { httpProxy } from "utils/proxy/http";
import createLogger from "utils/logger";
+import { formatApiCall, sanitizeErrorURL } from "utils/proxy/api-helpers";
+import { httpProxy } from "utils/proxy/http";
+import validateWidgetData from "utils/proxy/validate-widget-data";
import widgets from "widgets/widgets";
const logger = createLogger("genericProxyHandler");
diff --git a/src/utils/proxy/handlers/jsonrpc.js b/src/utils/proxy/handlers/jsonrpc.js
index f9fb1883..bdb10e02 100644
--- a/src/utils/proxy/handlers/jsonrpc.js
+++ b/src/utils/proxy/handlers/jsonrpc.js
@@ -1,9 +1,9 @@
import { JSONRPCClient, JSONRPCErrorException } from "json-rpc-2.0";
-import { formatApiCall } from "utils/proxy/api-helpers";
-import { httpProxy } from "utils/proxy/http";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
+import { formatApiCall } from "utils/proxy/api-helpers";
+import { httpProxy } from "utils/proxy/http";
import widgets from "widgets/widgets";
const logger = createLogger("jsonrpcProxyHandler");
diff --git a/src/utils/proxy/handlers/synology.js b/src/utils/proxy/handlers/synology.js
index 030e53ba..6fe98dce 100644
--- a/src/utils/proxy/handlers/synology.js
+++ b/src/utils/proxy/handlers/synology.js
@@ -1,9 +1,9 @@
import cache from "memory-cache";
import getServiceWidget from "utils/config/service-helpers";
+import createLogger from "utils/logger";
import { asJson, formatApiCall } from "utils/proxy/api-helpers";
import { httpProxy } from "utils/proxy/http";
-import createLogger from "utils/logger";
import widgets from "widgets/widgets";
const INFO_ENDPOINT = "{url}/webapi/query.cgi?api=SYNO.API.Info&version=1&method=query";
diff --git a/src/utils/proxy/http.js b/src/utils/proxy/http.js
index f8d2dcce..1a22a7f7 100644
--- a/src/utils/proxy/http.js
+++ b/src/utils/proxy/http.js
@@ -5,8 +5,8 @@ import { createUnzip, constants as zlibConstants } from "node:zlib";
import { http, https } from "follow-redirects";
import cache from "memory-cache";
-import { addCookieToJar, setCookieHeader } from "./cookie-jar";
import { sanitizeErrorURL } from "./api-helpers";
+import { addCookieToJar, setCookieHeader } from "./cookie-jar";
import createLogger from "utils/logger";
diff --git a/src/utils/proxy/validate-widget-data.js b/src/utils/proxy/validate-widget-data.js
index 8f865fe2..de2a3c4e 100644
--- a/src/utils/proxy/validate-widget-data.js
+++ b/src/utils/proxy/validate-widget-data.js
@@ -1,6 +1,6 @@
/* eslint-disable no-console */
-import widgets from "widgets/widgets";
import createLogger from "utils/logger";
+import widgets from "widgets/widgets";
const logger = createLogger("validateWidgetData");
diff --git a/src/widgets/adguard/component.jsx b/src/widgets/adguard/component.jsx
index 6cb9175a..e5a7670a 100644
--- a/src/widgets/adguard/component.jsx
+++ b/src/widgets/adguard/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/apcups/component.jsx b/src/widgets/apcups/component.jsx
index c1c26b5c..85e621db 100644
--- a/src/widgets/apcups/component.jsx
+++ b/src/widgets/apcups/component.jsx
@@ -1,5 +1,5 @@
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/apcups/proxy.js b/src/widgets/apcups/proxy.js
index 8e1d7ffc..bf22730e 100644
--- a/src/widgets/apcups/proxy.js
+++ b/src/widgets/apcups/proxy.js
@@ -1,5 +1,5 @@
-import net from "node:net";
import { Buffer } from "node:buffer";
+import net from "node:net";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
diff --git a/src/widgets/argocd/component.jsx b/src/widgets/argocd/component.jsx
index d4283acf..f61bed43 100644
--- a/src/widgets/argocd/component.jsx
+++ b/src/widgets/argocd/component.jsx
@@ -1,5 +1,5 @@
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/atsumeru/component.jsx b/src/widgets/atsumeru/component.jsx
index 2b87ac34..01cc8e46 100644
--- a/src/widgets/atsumeru/component.jsx
+++ b/src/widgets/atsumeru/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/audiobookshelf/component.jsx b/src/widgets/audiobookshelf/component.jsx
index 0444b6b4..b410e1a7 100755
--- a/src/widgets/audiobookshelf/component.jsx
+++ b/src/widgets/audiobookshelf/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/audiobookshelf/proxy.js b/src/widgets/audiobookshelf/proxy.js
index 1a89736b..afff3ba9 100644
--- a/src/widgets/audiobookshelf/proxy.js
+++ b/src/widgets/audiobookshelf/proxy.js
@@ -1,7 +1,7 @@
-import { httpProxy } from "utils/proxy/http";
-import { formatApiCall } from "utils/proxy/api-helpers";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
+import { formatApiCall } from "utils/proxy/api-helpers";
+import { httpProxy } from "utils/proxy/http";
import widgets from "widgets/widgets";
const proxyName = "audiobookshelfProxyHandler";
diff --git a/src/widgets/authentik/component.jsx b/src/widgets/authentik/component.jsx
index d4446551..edf5ece1 100644
--- a/src/widgets/authentik/component.jsx
+++ b/src/widgets/authentik/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/autobrr/component.jsx b/src/widgets/autobrr/component.jsx
index a73a7d17..5454cd3c 100644
--- a/src/widgets/autobrr/component.jsx
+++ b/src/widgets/autobrr/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/azuredevops/component.jsx b/src/widgets/azuredevops/component.jsx
index bfe9797f..7a36aab2 100644
--- a/src/widgets/azuredevops/component.jsx
+++ b/src/widgets/azuredevops/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/bazarr/component.jsx b/src/widgets/bazarr/component.jsx
index 120774fb..f79ec206 100644
--- a/src/widgets/bazarr/component.jsx
+++ b/src/widgets/bazarr/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/bazarr/widget.js b/src/widgets/bazarr/widget.js
index 5b89b2b4..c54e38ad 100644
--- a/src/widgets/bazarr/widget.js
+++ b/src/widgets/bazarr/widget.js
@@ -1,5 +1,5 @@
-import genericProxyHandler from "utils/proxy/handlers/generic";
import { asJson } from "utils/proxy/api-helpers";
+import genericProxyHandler from "utils/proxy/handlers/generic";
const widget = {
api: "{url}/api/{endpoint}/wanted?apikey={key}",
diff --git a/src/widgets/beszel/component.jsx b/src/widgets/beszel/component.jsx
index a191c31f..e80a9fab 100644
--- a/src/widgets/beszel/component.jsx
+++ b/src/widgets/beszel/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/beszel/proxy.js b/src/widgets/beszel/proxy.js
index 078e22c3..96dfc913 100644
--- a/src/widgets/beszel/proxy.js
+++ b/src/widgets/beszel/proxy.js
@@ -1,10 +1,10 @@
import cache from "memory-cache";
import getServiceWidget from "utils/config/service-helpers";
+import createLogger from "utils/logger";
import { formatApiCall } from "utils/proxy/api-helpers";
import { httpProxy } from "utils/proxy/http";
import widgets from "widgets/widgets";
-import createLogger from "utils/logger";
const proxyName = "beszelProxyHandler";
const tokenCacheKey = `${proxyName}__token`;
diff --git a/src/widgets/caddy/component.jsx b/src/widgets/caddy/component.jsx
index 60e71e9e..1613760d 100644
--- a/src/widgets/caddy/component.jsx
+++ b/src/widgets/caddy/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/calendar/agenda.jsx b/src/widgets/calendar/agenda.jsx
index 6a3be031..cb00c1d2 100644
--- a/src/widgets/calendar/agenda.jsx
+++ b/src/widgets/calendar/agenda.jsx
@@ -1,5 +1,5 @@
-import { DateTime } from "luxon";
import classNames from "classnames";
+import { DateTime } from "luxon";
import { useTranslation } from "next-i18next";
import Event, { compareDateTimezone } from "./event";
diff --git a/src/widgets/calendar/component.jsx b/src/widgets/calendar/component.jsx
index 56858fad..0647d4ad 100644
--- a/src/widgets/calendar/component.jsx
+++ b/src/widgets/calendar/component.jsx
@@ -1,12 +1,12 @@
-import { useEffect, useMemo, useState, useContext } from "react";
-import dynamic from "next/dynamic";
+import Container from "components/services/widget/container";
import { DateTime } from "luxon";
import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
+import dynamic from "next/dynamic";
+import { useContext, useEffect, useMemo, useState } from "react";
import { SettingsContext } from "utils/contexts/settings";
-import Monthly from "./monthly";
import Agenda from "./agenda";
+import Monthly from "./monthly";
const colorVariants = {
// https://tailwindcss.com/docs/content-configuration#dynamic-class-names
diff --git a/src/widgets/calendar/event.jsx b/src/widgets/calendar/event.jsx
index 754c6ee9..6ea2e1ae 100644
--- a/src/widgets/calendar/event.jsx
+++ b/src/widgets/calendar/event.jsx
@@ -1,7 +1,7 @@
-import { useState } from "react";
-import { useTranslation } from "next-i18next";
-import { DateTime } from "luxon";
import classNames from "classnames";
+import { DateTime } from "luxon";
+import { useTranslation } from "next-i18next";
+import { useState } from "react";
import { IoMdCheckmarkCircleOutline } from "react-icons/io";
export default function Event({ event, colorVariants, showDate = false, showTime = false, showDateColumn = true }) {
diff --git a/src/widgets/calendar/integrations/ical.jsx b/src/widgets/calendar/integrations/ical.jsx
index 77729982..46217977 100644
--- a/src/widgets/calendar/integrations/ical.jsx
+++ b/src/widgets/calendar/integrations/ical.jsx
@@ -1,11 +1,11 @@
-import { DateTime } from "luxon";
import { parseString } from "cal-parser";
-import { useEffect } from "react";
+import { DateTime } from "luxon";
import { useTranslation } from "next-i18next";
+import { useEffect } from "react";
import { RRule } from "rrule";
-import useWidgetAPI from "../../../utils/proxy/use-widget-api";
import Error from "../../../components/services/widget/error";
+import useWidgetAPI from "../../../utils/proxy/use-widget-api";
// https://gist.github.com/jlevy/c246006675becc446360a798e2b2d781
function simpleHash(str) {
diff --git a/src/widgets/calendar/integrations/lidarr.jsx b/src/widgets/calendar/integrations/lidarr.jsx
index d4a6edbe..65ad1da2 100644
--- a/src/widgets/calendar/integrations/lidarr.jsx
+++ b/src/widgets/calendar/integrations/lidarr.jsx
@@ -1,8 +1,8 @@
import { DateTime } from "luxon";
import { useEffect } from "react";
-import useWidgetAPI from "../../../utils/proxy/use-widget-api";
import Error from "../../../components/services/widget/error";
+import useWidgetAPI from "../../../utils/proxy/use-widget-api";
export default function Integration({ config, params, setEvents, hideErrors = false }) {
const { data: lidarrData, error: lidarrError } = useWidgetAPI(config, "calendar", {
diff --git a/src/widgets/calendar/integrations/radarr.jsx b/src/widgets/calendar/integrations/radarr.jsx
index 945eadd9..9c8880a9 100644
--- a/src/widgets/calendar/integrations/radarr.jsx
+++ b/src/widgets/calendar/integrations/radarr.jsx
@@ -1,9 +1,9 @@
import { DateTime } from "luxon";
-import { useEffect } from "react";
import { useTranslation } from "next-i18next";
+import { useEffect } from "react";
-import useWidgetAPI from "../../../utils/proxy/use-widget-api";
import Error from "../../../components/services/widget/error";
+import useWidgetAPI from "../../../utils/proxy/use-widget-api";
export default function Integration({ config, params, setEvents, hideErrors = false }) {
const { t } = useTranslation();
diff --git a/src/widgets/calendar/integrations/readarr.jsx b/src/widgets/calendar/integrations/readarr.jsx
index 6ae919ef..4fe3872e 100644
--- a/src/widgets/calendar/integrations/readarr.jsx
+++ b/src/widgets/calendar/integrations/readarr.jsx
@@ -1,8 +1,8 @@
import { DateTime } from "luxon";
import { useEffect } from "react";
-import useWidgetAPI from "../../../utils/proxy/use-widget-api";
import Error from "../../../components/services/widget/error";
+import useWidgetAPI from "../../../utils/proxy/use-widget-api";
export default function Integration({ config, params, setEvents, hideErrors = false }) {
const { data: readarrData, error: readarrError } = useWidgetAPI(config, "calendar", {
diff --git a/src/widgets/calendar/integrations/sonarr.jsx b/src/widgets/calendar/integrations/sonarr.jsx
index 34cc679d..abdec328 100644
--- a/src/widgets/calendar/integrations/sonarr.jsx
+++ b/src/widgets/calendar/integrations/sonarr.jsx
@@ -1,8 +1,8 @@
import { DateTime } from "luxon";
import { useEffect } from "react";
-import useWidgetAPI from "../../../utils/proxy/use-widget-api";
import Error from "../../../components/services/widget/error";
+import useWidgetAPI from "../../../utils/proxy/use-widget-api";
export default function Integration({ config, params, setEvents, hideErrors = false }) {
const { data: sonarrData, error: sonarrError } = useWidgetAPI(config, "calendar", {
diff --git a/src/widgets/calendar/monthly.jsx b/src/widgets/calendar/monthly.jsx
index 7313232f..4e870261 100644
--- a/src/widgets/calendar/monthly.jsx
+++ b/src/widgets/calendar/monthly.jsx
@@ -1,7 +1,7 @@
-import { useMemo } from "react";
-import { DateTime, Info } from "luxon";
import classNames from "classnames";
+import { DateTime, Info } from "luxon";
import { useTranslation } from "next-i18next";
+import { useMemo } from "react";
import Event, { compareDateTimezone } from "./event";
diff --git a/src/widgets/calendar/proxy.js b/src/widgets/calendar/proxy.js
index d36f30c9..c98441ee 100644
--- a/src/widgets/calendar/proxy.js
+++ b/src/widgets/calendar/proxy.js
@@ -1,6 +1,6 @@
import getServiceWidget from "utils/config/service-helpers";
-import { httpProxy } from "utils/proxy/http";
import createLogger from "utils/logger";
+import { httpProxy } from "utils/proxy/http";
const logger = createLogger("calendarProxyHandler");
diff --git a/src/widgets/calibreweb/component.jsx b/src/widgets/calibreweb/component.jsx
index c334d7d2..be8424e5 100644
--- a/src/widgets/calibreweb/component.jsx
+++ b/src/widgets/calibreweb/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/changedetectionio/component.jsx b/src/widgets/changedetectionio/component.jsx
index a08f38d9..d7d7272b 100644
--- a/src/widgets/changedetectionio/component.jsx
+++ b/src/widgets/changedetectionio/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/channelsdvrserver/component.jsx b/src/widgets/channelsdvrserver/component.jsx
index 42202c05..79ca3f14 100644
--- a/src/widgets/channelsdvrserver/component.jsx
+++ b/src/widgets/channelsdvrserver/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/cloudflared/component.jsx b/src/widgets/cloudflared/component.jsx
index 8825402c..790a5f34 100644
--- a/src/widgets/cloudflared/component.jsx
+++ b/src/widgets/cloudflared/component.jsx
@@ -1,5 +1,5 @@
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/coinmarketcap/component.jsx b/src/widgets/coinmarketcap/component.jsx
index 35a3401f..fd9c030f 100644
--- a/src/widgets/coinmarketcap/component.jsx
+++ b/src/widgets/coinmarketcap/component.jsx
@@ -1,9 +1,9 @@
-import { useState } from "react";
-import { useTranslation } from "next-i18next";
import classNames from "classnames";
-import Container from "components/services/widget/container";
-import Block from "components/services/widget/block";
import Dropdown from "components/services/dropdown";
+import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
+import { useState } from "react";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/crowdsec/component.jsx b/src/widgets/crowdsec/component.jsx
index 5bc34d1a..f567ad70 100644
--- a/src/widgets/crowdsec/component.jsx
+++ b/src/widgets/crowdsec/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/crowdsec/proxy.js b/src/widgets/crowdsec/proxy.js
index 85803845..d3257fa6 100644
--- a/src/widgets/crowdsec/proxy.js
+++ b/src/widgets/crowdsec/proxy.js
@@ -1,9 +1,9 @@
import cache from "memory-cache";
-import { httpProxy } from "utils/proxy/http";
-import { formatApiCall } from "utils/proxy/api-helpers";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
+import { formatApiCall } from "utils/proxy/api-helpers";
+import { httpProxy } from "utils/proxy/http";
import widgets from "widgets/widgets";
const proxyName = "crowdsecProxyHandler";
diff --git a/src/widgets/customapi/component.jsx b/src/widgets/customapi/component.jsx
index b651045f..50a371ad 100644
--- a/src/widgets/customapi/component.jsx
+++ b/src/widgets/customapi/component.jsx
@@ -1,10 +1,10 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
-import Block from "components/services/widget/block";
import classNames from "classnames";
+import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
-import useWidgetAPI from "utils/proxy/use-widget-api";
import * as shvl from "utils/config/shvl";
+import useWidgetAPI from "utils/proxy/use-widget-api";
function getValue(field, data) {
let value = data;
diff --git a/src/widgets/deluge/component.jsx b/src/widgets/deluge/component.jsx
index 510340b7..eb6ddfaa 100644
--- a/src/widgets/deluge/component.jsx
+++ b/src/widgets/deluge/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import QueueEntry from "../../components/widgets/queue/queueEntry";
diff --git a/src/widgets/deluge/proxy.js b/src/widgets/deluge/proxy.js
index 0430a6ac..ef255160 100644
--- a/src/widgets/deluge/proxy.js
+++ b/src/widgets/deluge/proxy.js
@@ -1,7 +1,7 @@
-import { formatApiCall } from "utils/proxy/api-helpers";
-import { sendJsonRpcRequest } from "utils/proxy/handlers/jsonrpc";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
+import { formatApiCall } from "utils/proxy/api-helpers";
+import { sendJsonRpcRequest } from "utils/proxy/handlers/jsonrpc";
import widgets from "widgets/widgets";
const logger = createLogger("delugeProxyHandler");
diff --git a/src/widgets/develancacheui/component.jsx b/src/widgets/develancacheui/component.jsx
index 4fc184ef..61f608e1 100644
--- a/src/widgets/develancacheui/component.jsx
+++ b/src/widgets/develancacheui/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/diskstation/component.jsx b/src/widgets/diskstation/component.jsx
index 9c516af9..0ca0b8ae 100644
--- a/src/widgets/diskstation/component.jsx
+++ b/src/widgets/diskstation/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/docker/component.jsx b/src/widgets/docker/component.jsx
index 074ce1eb..6e05454f 100644
--- a/src/widgets/docker/component.jsx
+++ b/src/widgets/docker/component.jsx
@@ -1,9 +1,9 @@
-import useSWR from "swr";
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
+import useSWR from "swr";
-import { calculateCPUPercent, calculateUsedMemory, calculateThroughput } from "./stats-helpers";
+import { calculateCPUPercent, calculateThroughput, calculateUsedMemory } from "./stats-helpers";
export default function Component({ service }) {
const { t } = useTranslation();
diff --git a/src/widgets/downloadstation/component.jsx b/src/widgets/downloadstation/component.jsx
index 0d9d8085..016f4953 100644
--- a/src/widgets/downloadstation/component.jsx
+++ b/src/widgets/downloadstation/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/emby/component.jsx b/src/widgets/emby/component.jsx
index 41220e22..88858da2 100644
--- a/src/widgets/emby/component.jsx
+++ b/src/widgets/emby/component.jsx
@@ -1,8 +1,8 @@
-import { useTranslation } from "next-i18next";
-import { BsVolumeMuteFill, BsFillPlayFill, BsPauseFill, BsCpu, BsFillCpuFill } from "react-icons/bs";
-import { MdOutlineSmartDisplay } from "react-icons/md";
import Block from "components/services/widget/block";
import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
+import { BsCpu, BsFillCpuFill, BsFillPlayFill, BsPauseFill, BsVolumeMuteFill } from "react-icons/bs";
+import { MdOutlineSmartDisplay } from "react-icons/md";
import { getURLSearchParams } from "utils/proxy/api-helpers";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/esphome/component.jsx b/src/widgets/esphome/component.jsx
index 6ed1b7b1..e0f02089 100644
--- a/src/widgets/esphome/component.jsx
+++ b/src/widgets/esphome/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
import Block from "components/services/widget/block";
import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/evcc/component.jsx b/src/widgets/evcc/component.jsx
index 2f086902..d0debdc3 100644
--- a/src/widgets/evcc/component.jsx
+++ b/src/widgets/evcc/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/fileflows/component.jsx b/src/widgets/fileflows/component.jsx
index 9b8e0794..fdc75c6e 100755
--- a/src/widgets/fileflows/component.jsx
+++ b/src/widgets/fileflows/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/firefly/component.jsx b/src/widgets/firefly/component.jsx
index baff2304..af236a80 100644
--- a/src/widgets/firefly/component.jsx
+++ b/src/widgets/firefly/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/flood/component.jsx b/src/widgets/flood/component.jsx
index 44c03fd3..92a2b61a 100644
--- a/src/widgets/flood/component.jsx
+++ b/src/widgets/flood/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/flood/proxy.js b/src/widgets/flood/proxy.js
index e0c10173..5e5335ae 100644
--- a/src/widgets/flood/proxy.js
+++ b/src/widgets/flood/proxy.js
@@ -1,7 +1,7 @@
-import { formatApiCall } from "utils/proxy/api-helpers";
-import { httpProxy } from "utils/proxy/http";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
+import { formatApiCall } from "utils/proxy/api-helpers";
+import { httpProxy } from "utils/proxy/http";
const logger = createLogger("floodProxyHandler");
diff --git a/src/widgets/freshrss/component.jsx b/src/widgets/freshrss/component.jsx
index c5029b8f..70833e1d 100644
--- a/src/widgets/freshrss/component.jsx
+++ b/src/widgets/freshrss/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/freshrss/proxy.js b/src/widgets/freshrss/proxy.js
index 881094bd..6168db86 100644
--- a/src/widgets/freshrss/proxy.js
+++ b/src/widgets/freshrss/proxy.js
@@ -1,9 +1,9 @@
import cache from "memory-cache";
-import { httpProxy } from "utils/proxy/http";
-import { formatApiCall } from "utils/proxy/api-helpers";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
+import { formatApiCall } from "utils/proxy/api-helpers";
+import { httpProxy } from "utils/proxy/http";
import widgets from "widgets/widgets";
const proxyName = "freshrssProxyHandler";
diff --git a/src/widgets/frigate/component.jsx b/src/widgets/frigate/component.jsx
index a19a464a..ab67c461 100644
--- a/src/widgets/frigate/component.jsx
+++ b/src/widgets/frigate/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/fritzbox/component.jsx b/src/widgets/fritzbox/component.jsx
index c557ece5..d7928c20 100644
--- a/src/widgets/fritzbox/component.jsx
+++ b/src/widgets/fritzbox/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/fritzbox/proxy.js b/src/widgets/fritzbox/proxy.js
index 20521560..c8c57fbc 100644
--- a/src/widgets/fritzbox/proxy.js
+++ b/src/widgets/fritzbox/proxy.js
@@ -2,9 +2,9 @@ import { xml2json } from "xml-js";
import { fritzboxDefaultFields } from "./component";
-import { httpProxy } from "utils/proxy/http";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
+import { httpProxy } from "utils/proxy/http";
const logger = createLogger("fritzboxProxyHandler");
diff --git a/src/widgets/gamedig/component.jsx b/src/widgets/gamedig/component.jsx
index 1c127538..5acd1b9c 100644
--- a/src/widgets/gamedig/component.jsx
+++ b/src/widgets/gamedig/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/gamedig/proxy.js b/src/widgets/gamedig/proxy.js
index 731bb445..79d7fa02 100644
--- a/src/widgets/gamedig/proxy.js
+++ b/src/widgets/gamedig/proxy.js
@@ -1,7 +1,7 @@
import { GameDig } from "gamedig";
-import createLogger from "utils/logger";
import getServiceWidget from "utils/config/service-helpers";
+import createLogger from "utils/logger";
const proxyName = "gamedigProxyHandler";
const logger = createLogger(proxyName);
diff --git a/src/widgets/gatus/component.jsx b/src/widgets/gatus/component.jsx
index 668c0388..25aae239 100644
--- a/src/widgets/gatus/component.jsx
+++ b/src/widgets/gatus/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/ghostfolio/component.jsx b/src/widgets/ghostfolio/component.jsx
index 524e30d9..f2587586 100644
--- a/src/widgets/ghostfolio/component.jsx
+++ b/src/widgets/ghostfolio/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/gitea/component.jsx b/src/widgets/gitea/component.jsx
index c45ded06..81b69d67 100644
--- a/src/widgets/gitea/component.jsx
+++ b/src/widgets/gitea/component.jsx
@@ -1,5 +1,5 @@
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/gitlab/component.jsx b/src/widgets/gitlab/component.jsx
index a012ee12..4d2805ba 100644
--- a/src/widgets/gitlab/component.jsx
+++ b/src/widgets/gitlab/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/glances/component.jsx b/src/widgets/glances/component.jsx
index bff31ac1..4ca0cc72 100644
--- a/src/widgets/glances/component.jsx
+++ b/src/widgets/glances/component.jsx
@@ -1,13 +1,13 @@
-import Memory from "./metrics/memory";
+import Containers from "./metrics/containers";
import Cpu from "./metrics/cpu";
-import Sensor from "./metrics/sensor";
-import Net from "./metrics/net";
-import Process from "./metrics/process";
import Disk from "./metrics/disk";
+import Fs from "./metrics/fs";
import GPU from "./metrics/gpu";
import Info from "./metrics/info";
-import Fs from "./metrics/fs";
-import Containers from "./metrics/containers";
+import Memory from "./metrics/memory";
+import Net from "./metrics/net";
+import Process from "./metrics/process";
+import Sensor from "./metrics/sensor";
export default function Component({ service }) {
const { widget } = service;
diff --git a/src/widgets/glances/components/chart.jsx b/src/widgets/glances/components/chart.jsx
index 132fcc8e..b919a92d 100644
--- a/src/widgets/glances/components/chart.jsx
+++ b/src/widgets/glances/components/chart.jsx
@@ -1,5 +1,5 @@
import { PureComponent } from "react";
-import { AreaChart, Area, ResponsiveContainer, Tooltip } from "recharts";
+import { Area, AreaChart, ResponsiveContainer, Tooltip } from "recharts";
import CustomTooltip from "./custom_tooltip";
diff --git a/src/widgets/glances/components/chart_dual.jsx b/src/widgets/glances/components/chart_dual.jsx
index 5fabe755..d6ec2076 100644
--- a/src/widgets/glances/components/chart_dual.jsx
+++ b/src/widgets/glances/components/chart_dual.jsx
@@ -1,5 +1,5 @@
import { PureComponent } from "react";
-import { AreaChart, Area, ResponsiveContainer, Tooltip } from "recharts";
+import { Area, AreaChart, ResponsiveContainer, Tooltip } from "recharts";
import CustomTooltip from "./custom_tooltip";
diff --git a/src/widgets/glances/components/container.jsx b/src/widgets/glances/components/container.jsx
index 0b6fb5f2..7bcd5c46 100644
--- a/src/widgets/glances/components/container.jsx
+++ b/src/widgets/glances/components/container.jsx
@@ -1,5 +1,5 @@
-import { useContext } from "react";
import classNames from "classnames";
+import { useContext } from "react";
import { SettingsContext } from "utils/contexts/settings";
import Error from "./error";
diff --git a/src/widgets/glances/metrics/containers.jsx b/src/widgets/glances/metrics/containers.jsx
index 4b7ac001..93ecbc28 100644
--- a/src/widgets/glances/metrics/containers.jsx
+++ b/src/widgets/glances/metrics/containers.jsx
@@ -1,8 +1,8 @@
-import { useTranslation } from "next-i18next";
import ResolvedIcon from "components/resolvedicon";
+import { useTranslation } from "next-i18next";
-import Container from "../components/container";
import Block from "../components/block";
+import Container from "../components/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/glances/metrics/cpu.jsx b/src/widgets/glances/metrics/cpu.jsx
index e993fca9..3debf11a 100644
--- a/src/widgets/glances/metrics/cpu.jsx
+++ b/src/widgets/glances/metrics/cpu.jsx
@@ -1,9 +1,9 @@
-import dynamic from "next/dynamic";
-import { useState, useEffect } from "react";
import { useTranslation } from "next-i18next";
+import dynamic from "next/dynamic";
+import { useEffect, useState } from "react";
-import Container from "../components/container";
import Block from "../components/block";
+import Container from "../components/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/glances/metrics/disk.jsx b/src/widgets/glances/metrics/disk.jsx
index 0a459e07..69dd2d99 100644
--- a/src/widgets/glances/metrics/disk.jsx
+++ b/src/widgets/glances/metrics/disk.jsx
@@ -1,9 +1,9 @@
-import dynamic from "next/dynamic";
-import { useState, useEffect } from "react";
import { useTranslation } from "next-i18next";
+import dynamic from "next/dynamic";
+import { useEffect, useState } from "react";
-import Container from "../components/container";
import Block from "../components/block";
+import Container from "../components/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/glances/metrics/fs.jsx b/src/widgets/glances/metrics/fs.jsx
index 4dd238e0..317a781f 100644
--- a/src/widgets/glances/metrics/fs.jsx
+++ b/src/widgets/glances/metrics/fs.jsx
@@ -1,7 +1,7 @@
import { useTranslation } from "next-i18next";
-import Container from "../components/container";
import Block from "../components/block";
+import Container from "../components/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/glances/metrics/gpu.jsx b/src/widgets/glances/metrics/gpu.jsx
index 37b06ce3..7eab536c 100644
--- a/src/widgets/glances/metrics/gpu.jsx
+++ b/src/widgets/glances/metrics/gpu.jsx
@@ -1,9 +1,9 @@
-import dynamic from "next/dynamic";
-import { useState, useEffect } from "react";
import { useTranslation } from "next-i18next";
+import dynamic from "next/dynamic";
+import { useEffect, useState } from "react";
-import Container from "../components/container";
import Block from "../components/block";
+import Container from "../components/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/glances/metrics/info.jsx b/src/widgets/glances/metrics/info.jsx
index 5e969800..3c0ef429 100644
--- a/src/widgets/glances/metrics/info.jsx
+++ b/src/widgets/glances/metrics/info.jsx
@@ -1,7 +1,7 @@
import { useTranslation } from "next-i18next";
-import Container from "../components/container";
import Block from "../components/block";
+import Container from "../components/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/glances/metrics/memory.jsx b/src/widgets/glances/metrics/memory.jsx
index 8cfddb66..e5fbc350 100644
--- a/src/widgets/glances/metrics/memory.jsx
+++ b/src/widgets/glances/metrics/memory.jsx
@@ -1,9 +1,9 @@
-import dynamic from "next/dynamic";
-import { useState, useEffect } from "react";
import { useTranslation } from "next-i18next";
+import dynamic from "next/dynamic";
+import { useEffect, useState } from "react";
-import Container from "../components/container";
import Block from "../components/block";
+import Container from "../components/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/glances/metrics/net.jsx b/src/widgets/glances/metrics/net.jsx
index 372c4ec6..2bdd491c 100644
--- a/src/widgets/glances/metrics/net.jsx
+++ b/src/widgets/glances/metrics/net.jsx
@@ -1,9 +1,9 @@
-import dynamic from "next/dynamic";
-import { useState, useEffect } from "react";
import { useTranslation } from "next-i18next";
+import dynamic from "next/dynamic";
+import { useEffect, useState } from "react";
-import Container from "../components/container";
import Block from "../components/block";
+import Container from "../components/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/glances/metrics/process.jsx b/src/widgets/glances/metrics/process.jsx
index 06001e6e..ad3fee54 100644
--- a/src/widgets/glances/metrics/process.jsx
+++ b/src/widgets/glances/metrics/process.jsx
@@ -1,8 +1,8 @@
-import { useTranslation } from "next-i18next";
import ResolvedIcon from "components/resolvedicon";
+import { useTranslation } from "next-i18next";
-import Container from "../components/container";
import Block from "../components/block";
+import Container from "../components/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/glances/metrics/sensor.jsx b/src/widgets/glances/metrics/sensor.jsx
index 3cb38c1c..b5a16d10 100644
--- a/src/widgets/glances/metrics/sensor.jsx
+++ b/src/widgets/glances/metrics/sensor.jsx
@@ -1,9 +1,9 @@
-import dynamic from "next/dynamic";
-import { useState, useEffect } from "react";
import { useTranslation } from "next-i18next";
+import dynamic from "next/dynamic";
+import { useEffect, useState } from "react";
-import Container from "../components/container";
import Block from "../components/block";
+import Container from "../components/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/gluetun/component.jsx b/src/widgets/gluetun/component.jsx
index a834cb4c..f7128237 100644
--- a/src/widgets/gluetun/component.jsx
+++ b/src/widgets/gluetun/component.jsx
@@ -1,5 +1,5 @@
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/gotify/component.jsx b/src/widgets/gotify/component.jsx
index 57b6b9c7..6cf9cea9 100644
--- a/src/widgets/gotify/component.jsx
+++ b/src/widgets/gotify/component.jsx
@@ -1,5 +1,5 @@
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/grafana/component.jsx b/src/widgets/grafana/component.jsx
index 859be017..82d6e5c9 100755
--- a/src/widgets/grafana/component.jsx
+++ b/src/widgets/grafana/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/hdhomerun/component.jsx b/src/widgets/hdhomerun/component.jsx
index dd55013f..2532f92b 100644
--- a/src/widgets/hdhomerun/component.jsx
+++ b/src/widgets/hdhomerun/component.jsx
@@ -1,5 +1,5 @@
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/headscale/component.jsx b/src/widgets/headscale/component.jsx
index 9d0da65b..acee3a82 100644
--- a/src/widgets/headscale/component.jsx
+++ b/src/widgets/headscale/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/healthchecks/component.jsx b/src/widgets/healthchecks/component.jsx
index 5fcef856..b65f91c5 100644
--- a/src/widgets/healthchecks/component.jsx
+++ b/src/widgets/healthchecks/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
import Block from "components/services/widget/block";
import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import { i18n } from "../../../next-i18next.config";
diff --git a/src/widgets/hoarder/component.jsx b/src/widgets/hoarder/component.jsx
index 99497d6f..4be6fbab 100644
--- a/src/widgets/hoarder/component.jsx
+++ b/src/widgets/hoarder/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/homeassistant/component.jsx b/src/widgets/homeassistant/component.jsx
index 5bd2f55c..1df415ae 100644
--- a/src/widgets/homeassistant/component.jsx
+++ b/src/widgets/homeassistant/component.jsx
@@ -1,5 +1,5 @@
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/homeassistant/proxy.js b/src/widgets/homeassistant/proxy.js
index e1f02ddb..7702eb5d 100644
--- a/src/widgets/homeassistant/proxy.js
+++ b/src/widgets/homeassistant/proxy.js
@@ -1,6 +1,6 @@
-import { httpProxy } from "utils/proxy/http";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
+import { httpProxy } from "utils/proxy/http";
const logger = createLogger("homeassistantProxyHandler");
diff --git a/src/widgets/homebox/component.jsx b/src/widgets/homebox/component.jsx
index d5ca97be..4c550748 100644
--- a/src/widgets/homebox/component.jsx
+++ b/src/widgets/homebox/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/homebox/proxy.js b/src/widgets/homebox/proxy.js
index c91ce552..8a4550fc 100644
--- a/src/widgets/homebox/proxy.js
+++ b/src/widgets/homebox/proxy.js
@@ -1,9 +1,9 @@
import cache from "memory-cache";
-import { formatApiCall } from "utils/proxy/api-helpers";
-import { httpProxy } from "utils/proxy/http";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
+import { formatApiCall } from "utils/proxy/api-helpers";
+import { httpProxy } from "utils/proxy/http";
const proxyName = "homeboxProxyHandler";
const sessionTokenCacheKey = `${proxyName}__sessionToken`;
diff --git a/src/widgets/homebridge/component.jsx b/src/widgets/homebridge/component.jsx
index 97896af1..6201b70b 100644
--- a/src/widgets/homebridge/component.jsx
+++ b/src/widgets/homebridge/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/homebridge/proxy.js b/src/widgets/homebridge/proxy.js
index 4da9197b..675e2976 100644
--- a/src/widgets/homebridge/proxy.js
+++ b/src/widgets/homebridge/proxy.js
@@ -1,9 +1,9 @@
import cache from "memory-cache";
-import { httpProxy } from "utils/proxy/http";
-import { formatApiCall } from "utils/proxy/api-helpers";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
+import { formatApiCall } from "utils/proxy/api-helpers";
+import { httpProxy } from "utils/proxy/http";
import widgets from "widgets/widgets";
const proxyName = "homebridgeProxyHandler";
diff --git a/src/widgets/iframe/component.jsx b/src/widgets/iframe/component.jsx
index 01146771..9d2d60ca 100644
--- a/src/widgets/iframe/component.jsx
+++ b/src/widgets/iframe/component.jsx
@@ -1,6 +1,6 @@
-import { useState, useEffect } from "react";
import classNames from "classnames";
import Container from "components/services/widget/container";
+import { useEffect, useState } from "react";
export default function Component({ service }) {
const [refreshTimer, setRefreshTimer] = useState(0);
diff --git a/src/widgets/immich/component.jsx b/src/widgets/immich/component.jsx
index 7f614797..a38cac1e 100644
--- a/src/widgets/immich/component.jsx
+++ b/src/widgets/immich/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/jackett/component.jsx b/src/widgets/jackett/component.jsx
index 9c5ce0c5..63e3e1c3 100644
--- a/src/widgets/jackett/component.jsx
+++ b/src/widgets/jackett/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/jackett/proxy.js b/src/widgets/jackett/proxy.js
index 035309b3..10e85175 100644
--- a/src/widgets/jackett/proxy.js
+++ b/src/widgets/jackett/proxy.js
@@ -1,7 +1,7 @@
-import { httpProxy } from "utils/proxy/http";
-import { formatApiCall } from "utils/proxy/api-helpers";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
+import { formatApiCall } from "utils/proxy/api-helpers";
+import { httpProxy } from "utils/proxy/http";
import widgets from "widgets/widgets";
const logger = createLogger("jackettProxyHandler");
diff --git a/src/widgets/jdownloader/component.jsx b/src/widgets/jdownloader/component.jsx
index 6350faeb..a7722c7c 100644
--- a/src/widgets/jdownloader/component.jsx
+++ b/src/widgets/jdownloader/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
import Block from "components/services/widget/block";
import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/jdownloader/proxy.js b/src/widgets/jdownloader/proxy.js
index ae8c845c..d5d5ac3d 100644
--- a/src/widgets/jdownloader/proxy.js
+++ b/src/widgets/jdownloader/proxy.js
@@ -2,11 +2,11 @@
import crypto from "crypto";
import querystring from "querystring";
-import { sha256, uniqueRid, validateRid, createEncryptionToken, decrypt, encrypt } from "./tools";
+import { createEncryptionToken, decrypt, encrypt, sha256, uniqueRid, validateRid } from "./tools";
import getServiceWidget from "utils/config/service-helpers";
-import { httpProxy } from "utils/proxy/http";
import createLogger from "utils/logger";
+import { httpProxy } from "utils/proxy/http";
const proxyName = "jdownloaderProxyHandler";
const logger = createLogger(proxyName);
diff --git a/src/widgets/jellyseerr/component.jsx b/src/widgets/jellyseerr/component.jsx
index 06456c4d..d99fffdb 100644
--- a/src/widgets/jellyseerr/component.jsx
+++ b/src/widgets/jellyseerr/component.jsx
@@ -1,5 +1,5 @@
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/kavita/component.jsx b/src/widgets/kavita/component.jsx
index df982328..887b3bbe 100644
--- a/src/widgets/kavita/component.jsx
+++ b/src/widgets/kavita/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/kavita/proxy.js b/src/widgets/kavita/proxy.js
index 842e4b87..cb3b3569 100644
--- a/src/widgets/kavita/proxy.js
+++ b/src/widgets/kavita/proxy.js
@@ -1,9 +1,9 @@
import cache from "memory-cache";
-import { httpProxy } from "utils/proxy/http";
-import { formatApiCall } from "utils/proxy/api-helpers";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
+import { formatApiCall } from "utils/proxy/api-helpers";
+import { httpProxy } from "utils/proxy/http";
import widgets from "widgets/widgets";
const proxyName = "kavitaProxyHandler";
diff --git a/src/widgets/komga/component.jsx b/src/widgets/komga/component.jsx
index 4272ddfc..1e31b726 100644
--- a/src/widgets/komga/component.jsx
+++ b/src/widgets/komga/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/komga/proxy.js b/src/widgets/komga/proxy.js
index a827f408..b3d72690 100644
--- a/src/widgets/komga/proxy.js
+++ b/src/widgets/komga/proxy.js
@@ -1,8 +1,8 @@
import getServiceWidget from "utils/config/service-helpers";
+import createLogger from "utils/logger";
import { formatApiCall } from "utils/proxy/api-helpers";
import { httpProxy } from "utils/proxy/http";
import widgets from "widgets/widgets";
-import createLogger from "utils/logger";
const proxyName = "komgaProxyHandler";
const logger = createLogger(proxyName);
diff --git a/src/widgets/kopia/component.jsx b/src/widgets/kopia/component.jsx
index 92c6774c..d022a545 100755
--- a/src/widgets/kopia/component.jsx
+++ b/src/widgets/kopia/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/kubernetes/component.jsx b/src/widgets/kubernetes/component.jsx
index b93e07fb..d3587a59 100644
--- a/src/widgets/kubernetes/component.jsx
+++ b/src/widgets/kubernetes/component.jsx
@@ -1,7 +1,7 @@
-import useSWR from "swr";
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
+import useSWR from "swr";
export default function Component({ service }) {
const { t } = useTranslation();
diff --git a/src/widgets/lidarr/component.jsx b/src/widgets/lidarr/component.jsx
index 28295e57..92f5b893 100644
--- a/src/widgets/lidarr/component.jsx
+++ b/src/widgets/lidarr/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/linkwarden/component.jsx b/src/widgets/linkwarden/component.jsx
index 8046faf9..b2b0d91a 100644
--- a/src/widgets/linkwarden/component.jsx
+++ b/src/widgets/linkwarden/component.jsx
@@ -1,6 +1,6 @@
-import React, { useState, useEffect } from "react";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useEffect, useState } from "react";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/lubelogger/component.jsx b/src/widgets/lubelogger/component.jsx
index 8a18f158..390b74ea 100644
--- a/src/widgets/lubelogger/component.jsx
+++ b/src/widgets/lubelogger/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "react-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "react-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/mailcow/component.jsx b/src/widgets/mailcow/component.jsx
index 96ef0e45..e5d9db65 100644
--- a/src/widgets/mailcow/component.jsx
+++ b/src/widgets/mailcow/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/mastodon/component.jsx b/src/widgets/mastodon/component.jsx
index dbb36320..3a5d9ab6 100644
--- a/src/widgets/mastodon/component.jsx
+++ b/src/widgets/mastodon/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/mealie/component.jsx b/src/widgets/mealie/component.jsx
index aa18c459..4a558157 100644
--- a/src/widgets/mealie/component.jsx
+++ b/src/widgets/mealie/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/medusa/component.jsx b/src/widgets/medusa/component.jsx
index a5ea4ca1..88f55bcb 100644
--- a/src/widgets/medusa/component.jsx
+++ b/src/widgets/medusa/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/mikrotik/component.jsx b/src/widgets/mikrotik/component.jsx
index a34ce62f..4bab6792 100644
--- a/src/widgets/mikrotik/component.jsx
+++ b/src/widgets/mikrotik/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/minecraft/component.jsx b/src/widgets/minecraft/component.jsx
index e277abb6..00c5f6f8 100644
--- a/src/widgets/minecraft/component.jsx
+++ b/src/widgets/minecraft/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/minecraft/proxy.js b/src/widgets/minecraft/proxy.js
index 5f238acb..d1fe1463 100644
--- a/src/widgets/minecraft/proxy.js
+++ b/src/widgets/minecraft/proxy.js
@@ -1,7 +1,7 @@
import mc from "minecraftstatuspinger";
-import createLogger from "utils/logger";
import getServiceWidget from "utils/config/service-helpers";
+import createLogger from "utils/logger";
const proxyName = "minecraftProxyHandler";
const logger = createLogger(proxyName);
diff --git a/src/widgets/miniflux/component.jsx b/src/widgets/miniflux/component.jsx
index 5f5f649e..2cbbb254 100644
--- a/src/widgets/miniflux/component.jsx
+++ b/src/widgets/miniflux/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/moonraker/component.jsx b/src/widgets/moonraker/component.jsx
index ed99e418..238c8327 100644
--- a/src/widgets/moonraker/component.jsx
+++ b/src/widgets/moonraker/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/mylar/component.jsx b/src/widgets/mylar/component.jsx
index 0306b1b6..95ec1aca 100644
--- a/src/widgets/mylar/component.jsx
+++ b/src/widgets/mylar/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/myspeed/component.jsx b/src/widgets/myspeed/component.jsx
index 7de1b2b0..dacd2b59 100644
--- a/src/widgets/myspeed/component.jsx
+++ b/src/widgets/myspeed/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/navidrome/component.jsx b/src/widgets/navidrome/component.jsx
index 7a89f6ca..6218e6d9 100644
--- a/src/widgets/navidrome/component.jsx
+++ b/src/widgets/navidrome/component.jsx
@@ -1,5 +1,5 @@
-import { useTranslation } from "next-i18next";
import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/netalertx/component.jsx b/src/widgets/netalertx/component.jsx
index a52defd3..786db9a5 100644
--- a/src/widgets/netalertx/component.jsx
+++ b/src/widgets/netalertx/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/netdata/component.jsx b/src/widgets/netdata/component.jsx
index 98d0f797..2d04aa23 100644
--- a/src/widgets/netdata/component.jsx
+++ b/src/widgets/netdata/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/nextcloud/component.jsx b/src/widgets/nextcloud/component.jsx
index 2989b6f4..d1f1cac9 100755
--- a/src/widgets/nextcloud/component.jsx
+++ b/src/widgets/nextcloud/component.jsx
@@ -1,7 +1,7 @@
+import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import { useTranslation } from "next-i18next";
import { useMemo } from "react";
-import Container from "components/services/widget/container";
-import Block from "components/services/widget/block";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/nextdns/component.jsx b/src/widgets/nextdns/component.jsx
index 75c04a85..45e01281 100644
--- a/src/widgets/nextdns/component.jsx
+++ b/src/widgets/nextdns/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/npm/component.jsx b/src/widgets/npm/component.jsx
index 1ffaf27e..54e123a8 100644
--- a/src/widgets/npm/component.jsx
+++ b/src/widgets/npm/component.jsx
@@ -1,5 +1,5 @@
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/npm/proxy.js b/src/widgets/npm/proxy.js
index 6c7ba09e..79307782 100644
--- a/src/widgets/npm/proxy.js
+++ b/src/widgets/npm/proxy.js
@@ -1,10 +1,10 @@
import cache from "memory-cache";
import getServiceWidget from "utils/config/service-helpers";
+import createLogger from "utils/logger";
import { formatApiCall } from "utils/proxy/api-helpers";
import { httpProxy } from "utils/proxy/http";
import widgets from "widgets/widgets";
-import createLogger from "utils/logger";
const proxyName = "npmProxyHandler";
const tokenCacheKey = `${proxyName}__token`;
diff --git a/src/widgets/nzbget/component.jsx b/src/widgets/nzbget/component.jsx
index 4c0a9d48..a11ac9da 100644
--- a/src/widgets/nzbget/component.jsx
+++ b/src/widgets/nzbget/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/octoprint/component.jsx b/src/widgets/octoprint/component.jsx
index 21c3f7d0..e6b13809 100644
--- a/src/widgets/octoprint/component.jsx
+++ b/src/widgets/octoprint/component.jsx
@@ -1,5 +1,5 @@
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/omada/component.jsx b/src/widgets/omada/component.jsx
index 0d76e1a1..bf301d81 100644
--- a/src/widgets/omada/component.jsx
+++ b/src/widgets/omada/component.jsx
@@ -1,8 +1,8 @@
import { useTranslation } from "next-i18next";
-import useWidgetAPI from "../../utils/proxy/use-widget-api";
-import Container from "../../components/services/widget/container";
import Block from "../../components/services/widget/block";
+import Container from "../../components/services/widget/container";
+import useWidgetAPI from "../../utils/proxy/use-widget-api";
export default function Component({ service }) {
const { t } = useTranslation();
diff --git a/src/widgets/omada/proxy.js b/src/widgets/omada/proxy.js
index f4da1293..a5af47b2 100644
--- a/src/widgets/omada/proxy.js
+++ b/src/widgets/omada/proxy.js
@@ -1,6 +1,6 @@
-import { httpProxy } from "utils/proxy/http";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
+import { httpProxy } from "utils/proxy/http";
const proxyName = "omadaProxyHandler";
diff --git a/src/widgets/ombi/component.jsx b/src/widgets/ombi/component.jsx
index 3beb1198..859c01aa 100644
--- a/src/widgets/ombi/component.jsx
+++ b/src/widgets/ombi/component.jsx
@@ -1,5 +1,5 @@
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/opendtu/component.jsx b/src/widgets/opendtu/component.jsx
index 4fed88e4..c1b924b9 100644
--- a/src/widgets/opendtu/component.jsx
+++ b/src/widgets/opendtu/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/openmediavault/component.jsx b/src/widgets/openmediavault/component.jsx
index bd34a750..c14581f9 100644
--- a/src/widgets/openmediavault/component.jsx
+++ b/src/widgets/openmediavault/component.jsx
@@ -1,6 +1,6 @@
+import DownloaderGetDownloadList from "./methods/downloader_get_downloadlist";
import ServicesGetStatus from "./methods/services_get_status";
import SmartGetList from "./methods/smart_get_list";
-import DownloaderGetDownloadList from "./methods/downloader_get_downloadlist";
export default function Component({ service }) {
switch (service.widget.method) {
diff --git a/src/widgets/openmediavault/methods/downloader_get_downloadlist.jsx b/src/widgets/openmediavault/methods/downloader_get_downloadlist.jsx
index 22327b92..7caf3426 100644
--- a/src/widgets/openmediavault/methods/downloader_get_downloadlist.jsx
+++ b/src/widgets/openmediavault/methods/downloader_get_downloadlist.jsx
@@ -1,5 +1,5 @@
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/openmediavault/methods/services_get_status.jsx b/src/widgets/openmediavault/methods/services_get_status.jsx
index 0579f41a..7ab0f8c1 100644
--- a/src/widgets/openmediavault/methods/services_get_status.jsx
+++ b/src/widgets/openmediavault/methods/services_get_status.jsx
@@ -1,5 +1,5 @@
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/openmediavault/methods/smart_get_list.jsx b/src/widgets/openmediavault/methods/smart_get_list.jsx
index 6c812449..4998c02f 100644
--- a/src/widgets/openmediavault/methods/smart_get_list.jsx
+++ b/src/widgets/openmediavault/methods/smart_get_list.jsx
@@ -1,5 +1,5 @@
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/openmediavault/proxy.js b/src/widgets/openmediavault/proxy.js
index 9cda42e8..d2365f2b 100644
--- a/src/widgets/openmediavault/proxy.js
+++ b/src/widgets/openmediavault/proxy.js
@@ -1,8 +1,8 @@
-import { formatApiCall } from "utils/proxy/api-helpers";
-import { httpProxy } from "utils/proxy/http";
import getServiceWidget from "utils/config/service-helpers";
-import { addCookieToJar, setCookieHeader } from "utils/proxy/cookie-jar";
import createLogger from "utils/logger";
+import { formatApiCall } from "utils/proxy/api-helpers";
+import { addCookieToJar, setCookieHeader } from "utils/proxy/cookie-jar";
+import { httpProxy } from "utils/proxy/http";
import widgets from "widgets/widgets";
const PROXY_NAME = "OMVProxyHandler";
diff --git a/src/widgets/openwrt/methods/interface.jsx b/src/widgets/openwrt/methods/interface.jsx
index e02e3171..4f77036f 100644
--- a/src/widgets/openwrt/methods/interface.jsx
+++ b/src/widgets/openwrt/methods/interface.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/openwrt/methods/system.jsx b/src/widgets/openwrt/methods/system.jsx
index 56c3dc9e..55c0b005 100644
--- a/src/widgets/openwrt/methods/system.jsx
+++ b/src/widgets/openwrt/methods/system.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/openwrt/proxy.js b/src/widgets/openwrt/proxy.js
index 0a0da3ff..5db90790 100644
--- a/src/widgets/openwrt/proxy.js
+++ b/src/widgets/openwrt/proxy.js
@@ -1,7 +1,7 @@
-import { sendJsonRpcRequest } from "utils/proxy/handlers/jsonrpc";
-import { formatApiCall } from "utils/proxy/api-helpers";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
+import { formatApiCall } from "utils/proxy/api-helpers";
+import { sendJsonRpcRequest } from "utils/proxy/handlers/jsonrpc";
import widgets from "widgets/widgets";
const PROXY_NAME = "OpenWRTProxyHandler";
diff --git a/src/widgets/opnsense/component.jsx b/src/widgets/opnsense/component.jsx
index b8a90d72..1caaab47 100644
--- a/src/widgets/opnsense/component.jsx
+++ b/src/widgets/opnsense/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/overseerr/component.jsx b/src/widgets/overseerr/component.jsx
index 3ec66587..d5c64392 100644
--- a/src/widgets/overseerr/component.jsx
+++ b/src/widgets/overseerr/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/paperlessngx/component.jsx b/src/widgets/paperlessngx/component.jsx
index 6585d231..bafc2e99 100644
--- a/src/widgets/paperlessngx/component.jsx
+++ b/src/widgets/paperlessngx/component.jsx
@@ -1,5 +1,5 @@
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/peanut/component.jsx b/src/widgets/peanut/component.jsx
index bc0b739b..54a293ad 100644
--- a/src/widgets/peanut/component.jsx
+++ b/src/widgets/peanut/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/pfsense/component.jsx b/src/widgets/pfsense/component.jsx
index 18a54933..9f43488b 100644
--- a/src/widgets/pfsense/component.jsx
+++ b/src/widgets/pfsense/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/photoprism/component.jsx b/src/widgets/photoprism/component.jsx
index 71772a7a..21817a10 100644
--- a/src/widgets/photoprism/component.jsx
+++ b/src/widgets/photoprism/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/photoprism/proxy.js b/src/widgets/photoprism/proxy.js
index fe5096b3..1959817a 100644
--- a/src/widgets/photoprism/proxy.js
+++ b/src/widgets/photoprism/proxy.js
@@ -1,7 +1,7 @@
-import { formatApiCall } from "utils/proxy/api-helpers";
-import { httpProxy } from "utils/proxy/http";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
+import { formatApiCall } from "utils/proxy/api-helpers";
+import { httpProxy } from "utils/proxy/http";
const logger = createLogger("photoprismProxyHandler");
diff --git a/src/widgets/pihole/component.jsx b/src/widgets/pihole/component.jsx
index e065bf39..6895ab28 100644
--- a/src/widgets/pihole/component.jsx
+++ b/src/widgets/pihole/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/pihole/proxy.js b/src/widgets/pihole/proxy.js
index 2f2d9a88..75cd0fb5 100644
--- a/src/widgets/pihole/proxy.js
+++ b/src/widgets/pihole/proxy.js
@@ -1,9 +1,9 @@
import cache from "memory-cache";
-import { httpProxy } from "utils/proxy/http";
-import { formatApiCall } from "utils/proxy/api-helpers";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
+import { formatApiCall } from "utils/proxy/api-helpers";
+import { httpProxy } from "utils/proxy/http";
import widgets from "widgets/widgets";
const proxyName = "piholeProxyHandler";
diff --git a/src/widgets/plantit/component.jsx b/src/widgets/plantit/component.jsx
index af46e964..d93304e7 100644
--- a/src/widgets/plantit/component.jsx
+++ b/src/widgets/plantit/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/plex/component.jsx b/src/widgets/plex/component.jsx
index 688893d3..153d57b5 100644
--- a/src/widgets/plex/component.jsx
+++ b/src/widgets/plex/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
import Block from "components/services/widget/block";
import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/plex/proxy.js b/src/widgets/plex/proxy.js
index c092ebaa..18ffc49b 100644
--- a/src/widgets/plex/proxy.js
+++ b/src/widgets/plex/proxy.js
@@ -2,10 +2,10 @@
import cache from "memory-cache";
import { xml2json } from "xml-js";
-import { formatApiCall } from "utils/proxy/api-helpers";
-import { httpProxy } from "utils/proxy/http";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
+import { formatApiCall } from "utils/proxy/api-helpers";
+import { httpProxy } from "utils/proxy/http";
import widgets from "widgets/widgets";
const proxyName = "plexProxyHandler";
diff --git a/src/widgets/portainer/component.jsx b/src/widgets/portainer/component.jsx
index 149707fc..f8a89507 100644
--- a/src/widgets/portainer/component.jsx
+++ b/src/widgets/portainer/component.jsx
@@ -1,5 +1,5 @@
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/prometheus/component.jsx b/src/widgets/prometheus/component.jsx
index 003831e5..7b3722d0 100644
--- a/src/widgets/prometheus/component.jsx
+++ b/src/widgets/prometheus/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/prometheusmetric/component.jsx b/src/widgets/prometheusmetric/component.jsx
index 3ea20af0..d58efde9 100644
--- a/src/widgets/prometheusmetric/component.jsx
+++ b/src/widgets/prometheusmetric/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/prowlarr/component.jsx b/src/widgets/prowlarr/component.jsx
index 55f28634..13d388f7 100644
--- a/src/widgets/prowlarr/component.jsx
+++ b/src/widgets/prowlarr/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "react-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "react-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/proxmox/component.jsx b/src/widgets/proxmox/component.jsx
index fc4c728c..51762a73 100644
--- a/src/widgets/proxmox/component.jsx
+++ b/src/widgets/proxmox/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/proxmoxbackupserver/component.jsx b/src/widgets/proxmoxbackupserver/component.jsx
index 2eb12258..efc71bbb 100644
--- a/src/widgets/proxmoxbackupserver/component.jsx
+++ b/src/widgets/proxmoxbackupserver/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/pterodactyl/component.jsx b/src/widgets/pterodactyl/component.jsx
index b1ccab8d..9a702eef 100644
--- a/src/widgets/pterodactyl/component.jsx
+++ b/src/widgets/pterodactyl/component.jsx
@@ -1,5 +1,5 @@
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/pyload/component.jsx b/src/widgets/pyload/component.jsx
index f0e58f52..f618f75e 100644
--- a/src/widgets/pyload/component.jsx
+++ b/src/widgets/pyload/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/pyload/proxy.js b/src/widgets/pyload/proxy.js
index a380c865..2a1949c1 100644
--- a/src/widgets/pyload/proxy.js
+++ b/src/widgets/pyload/proxy.js
@@ -1,10 +1,10 @@
import cache from "memory-cache";
import getServiceWidget from "utils/config/service-helpers";
-import { formatApiCall } from "utils/proxy/api-helpers";
-import widgets from "widgets/widgets";
import createLogger from "utils/logger";
+import { formatApiCall } from "utils/proxy/api-helpers";
import { httpProxy } from "utils/proxy/http";
+import widgets from "widgets/widgets";
const proxyName = "pyloadProxyHandler";
const logger = createLogger(proxyName);
diff --git a/src/widgets/qbittorrent/component.jsx b/src/widgets/qbittorrent/component.jsx
index 7fc47f99..c9f64816 100644
--- a/src/widgets/qbittorrent/component.jsx
+++ b/src/widgets/qbittorrent/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import QueueEntry from "../../components/widgets/queue/queueEntry";
diff --git a/src/widgets/qbittorrent/proxy.js b/src/widgets/qbittorrent/proxy.js
index aead7582..8f1874bf 100644
--- a/src/widgets/qbittorrent/proxy.js
+++ b/src/widgets/qbittorrent/proxy.js
@@ -1,7 +1,7 @@
-import { formatApiCall } from "utils/proxy/api-helpers";
-import { httpProxy } from "utils/proxy/http";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
+import { formatApiCall } from "utils/proxy/api-helpers";
+import { httpProxy } from "utils/proxy/http";
const logger = createLogger("qbittorrentProxyHandler");
diff --git a/src/widgets/qnap/component.jsx b/src/widgets/qnap/component.jsx
index 79f3c8be..d7fdf8bc 100644
--- a/src/widgets/qnap/component.jsx
+++ b/src/widgets/qnap/component.jsx
@@ -1,8 +1,8 @@
/* eslint no-underscore-dangle: ["error", { "allow": ["_text", "_cdata"] }] */
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/qnap/proxy.js b/src/widgets/qnap/proxy.js
index 07917d28..1c5356ae 100644
--- a/src/widgets/qnap/proxy.js
+++ b/src/widgets/qnap/proxy.js
@@ -3,10 +3,10 @@
import cache from "memory-cache";
import { xml2json } from "xml-js";
-import { httpProxy } from "utils/proxy/http";
-import { formatApiCall } from "utils/proxy/api-helpers";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
+import { formatApiCall } from "utils/proxy/api-helpers";
+import { httpProxy } from "utils/proxy/http";
const proxyName = "qnapProxyHandler";
const sessionTokenCacheKey = `${proxyName}__sessionToken`;
diff --git a/src/widgets/radarr/component.jsx b/src/widgets/radarr/component.jsx
index 70ddcb33..bcf9301b 100644
--- a/src/widgets/radarr/component.jsx
+++ b/src/widgets/radarr/component.jsx
@@ -1,7 +1,7 @@
+import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import { useTranslation } from "next-i18next";
import { useCallback } from "react";
-import Container from "components/services/widget/container";
-import Block from "components/services/widget/block";
import QueueEntry from "../../components/widgets/queue/queueEntry";
diff --git a/src/widgets/radarr/widget.js b/src/widgets/radarr/widget.js
index 7d370378..4f71b8d9 100644
--- a/src/widgets/radarr/widget.js
+++ b/src/widgets/radarr/widget.js
@@ -1,5 +1,5 @@
-import genericProxyHandler from "utils/proxy/handlers/generic";
import { asJson, jsonArrayFilter } from "utils/proxy/api-helpers";
+import genericProxyHandler from "utils/proxy/handlers/generic";
const widget = {
api: "{url}/api/v3/{endpoint}?apikey={key}",
diff --git a/src/widgets/readarr/component.jsx b/src/widgets/readarr/component.jsx
index cbf68a4d..845b7820 100644
--- a/src/widgets/readarr/component.jsx
+++ b/src/widgets/readarr/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/readarr/widget.js b/src/widgets/readarr/widget.js
index 58cc09c4..f786f0bc 100644
--- a/src/widgets/readarr/widget.js
+++ b/src/widgets/readarr/widget.js
@@ -1,5 +1,5 @@
-import genericProxyHandler from "utils/proxy/handlers/generic";
import { jsonArrayFilter } from "utils/proxy/api-helpers";
+import genericProxyHandler from "utils/proxy/handlers/generic";
const widget = {
api: "{url}/api/v1/{endpoint}?apikey={key}",
diff --git a/src/widgets/romm/component.jsx b/src/widgets/romm/component.jsx
index 5c6349d0..b0787fb3 100644
--- a/src/widgets/romm/component.jsx
+++ b/src/widgets/romm/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/rutorrent/component.jsx b/src/widgets/rutorrent/component.jsx
index 9d2ad4e2..245a786c 100644
--- a/src/widgets/rutorrent/component.jsx
+++ b/src/widgets/rutorrent/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/rutorrent/proxy.js b/src/widgets/rutorrent/proxy.js
index e0ae44fe..910f2311 100644
--- a/src/widgets/rutorrent/proxy.js
+++ b/src/widgets/rutorrent/proxy.js
@@ -1,8 +1,8 @@
import getServiceWidget from "utils/config/service-helpers";
+import createLogger from "utils/logger";
+import { formatApiCall } from "utils/proxy/api-helpers";
import { httpProxy } from "utils/proxy/http";
import widgets from "widgets/widgets";
-import { formatApiCall } from "utils/proxy/api-helpers";
-import createLogger from "utils/logger";
const logger = createLogger("rutorrentProxyHandler");
diff --git a/src/widgets/sabnzbd/component.jsx b/src/widgets/sabnzbd/component.jsx
index 5a9ba488..9807dd93 100644
--- a/src/widgets/sabnzbd/component.jsx
+++ b/src/widgets/sabnzbd/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/scrutiny/component.jsx b/src/widgets/scrutiny/component.jsx
index f81a519c..2450a95e 100644
--- a/src/widgets/scrutiny/component.jsx
+++ b/src/widgets/scrutiny/component.jsx
@@ -1,5 +1,5 @@
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/slskd/component.jsx b/src/widgets/slskd/component.jsx
index 8c26d4e4..40a206b6 100644
--- a/src/widgets/slskd/component.jsx
+++ b/src/widgets/slskd/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/slskd/widget.js b/src/widgets/slskd/widget.js
index fdea7738..3eedd356 100644
--- a/src/widgets/slskd/widget.js
+++ b/src/widgets/slskd/widget.js
@@ -1,5 +1,4 @@
import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
-import { asJson } from "utils/proxy/api-helpers";
const widget = {
api: `{url}/api/v0/{endpoint}`,
diff --git a/src/widgets/sonarr/component.jsx b/src/widgets/sonarr/component.jsx
index 725e6d66..19cc2c12 100644
--- a/src/widgets/sonarr/component.jsx
+++ b/src/widgets/sonarr/component.jsx
@@ -1,7 +1,7 @@
+import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import { useTranslation } from "next-i18next";
import { useCallback } from "react";
-import Container from "components/services/widget/container";
-import Block from "components/services/widget/block";
import QueueEntry from "../../components/widgets/queue/queueEntry";
diff --git a/src/widgets/sonarr/widget.js b/src/widgets/sonarr/widget.js
index acb4a551..1fcef8eb 100644
--- a/src/widgets/sonarr/widget.js
+++ b/src/widgets/sonarr/widget.js
@@ -1,5 +1,5 @@
-import genericProxyHandler from "utils/proxy/handlers/generic";
import { asJson } from "utils/proxy/api-helpers";
+import genericProxyHandler from "utils/proxy/handlers/generic";
const widget = {
api: "{url}/api/v3/{endpoint}?apikey={key}",
diff --git a/src/widgets/speedtest/component.jsx b/src/widgets/speedtest/component.jsx
index e34f53ac..7be00aa2 100644
--- a/src/widgets/speedtest/component.jsx
+++ b/src/widgets/speedtest/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/spoolman/component.jsx b/src/widgets/spoolman/component.jsx
index b690f9c0..62eb3a1d 100644
--- a/src/widgets/spoolman/component.jsx
+++ b/src/widgets/spoolman/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/stash/component.jsx b/src/widgets/stash/component.jsx
index e3986d4b..965c6b59 100644
--- a/src/widgets/stash/component.jsx
+++ b/src/widgets/stash/component.jsx
@@ -1,7 +1,7 @@
+import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import { useTranslation } from "next-i18next";
import { useEffect, useState } from "react";
-import Container from "components/services/widget/container";
-import Block from "components/services/widget/block";
import { formatProxyUrl } from "utils/proxy/api-helpers";
diff --git a/src/widgets/stocks/component.jsx b/src/widgets/stocks/component.jsx
index bcd3b110..be471ddf 100644
--- a/src/widgets/stocks/component.jsx
+++ b/src/widgets/stocks/component.jsx
@@ -1,7 +1,7 @@
-import { useTranslation } from "next-i18next";
import classNames from "classnames";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/strelaysrv/component.jsx b/src/widgets/strelaysrv/component.jsx
index 0aa70d88..026e19b7 100644
--- a/src/widgets/strelaysrv/component.jsx
+++ b/src/widgets/strelaysrv/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/suwayomi/component.jsx b/src/widgets/suwayomi/component.jsx
index 1a8625b9..1cbd8c53 100644
--- a/src/widgets/suwayomi/component.jsx
+++ b/src/widgets/suwayomi/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/suwayomi/proxy.js b/src/widgets/suwayomi/proxy.js
index def811cc..4df55b95 100644
--- a/src/widgets/suwayomi/proxy.js
+++ b/src/widgets/suwayomi/proxy.js
@@ -1,7 +1,7 @@
-import { httpProxy } from "utils/proxy/http";
-import { formatApiCall } from "utils/proxy/api-helpers";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
+import { formatApiCall } from "utils/proxy/api-helpers";
+import { httpProxy } from "utils/proxy/http";
import widgets from "widgets/widgets";
const proxyName = "suwayomiProxyHandler";
diff --git a/src/widgets/swagdashboard/component.jsx b/src/widgets/swagdashboard/component.jsx
index 2b17278f..4220e3c8 100644
--- a/src/widgets/swagdashboard/component.jsx
+++ b/src/widgets/swagdashboard/component.jsx
@@ -1,5 +1,5 @@
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/tailscale/component.jsx b/src/widgets/tailscale/component.jsx
index a6e76bed..b95cb016 100644
--- a/src/widgets/tailscale/component.jsx
+++ b/src/widgets/tailscale/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/tandoor/component.jsx b/src/widgets/tandoor/component.jsx
index b31cad95..4a02d539 100644
--- a/src/widgets/tandoor/component.jsx
+++ b/src/widgets/tandoor/component.jsx
@@ -1,5 +1,5 @@
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/tautulli/component.jsx b/src/widgets/tautulli/component.jsx
index 50e8295f..3f6443dd 100644
--- a/src/widgets/tautulli/component.jsx
+++ b/src/widgets/tautulli/component.jsx
@@ -1,8 +1,8 @@
/* eslint-disable camelcase */
-import { useTranslation } from "next-i18next";
-import { BsFillPlayFill, BsPauseFill, BsCpu, BsFillCpuFill } from "react-icons/bs";
-import { MdOutlineSmartDisplay, MdSmartDisplay } from "react-icons/md";
import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
+import { BsCpu, BsFillCpuFill, BsFillPlayFill, BsPauseFill } from "react-icons/bs";
+import { MdOutlineSmartDisplay, MdSmartDisplay } from "react-icons/md";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/tdarr/component.jsx b/src/widgets/tdarr/component.jsx
index ce9d43fd..824a56b3 100644
--- a/src/widgets/tdarr/component.jsx
+++ b/src/widgets/tdarr/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/tdarr/proxy.js b/src/widgets/tdarr/proxy.js
index 88da30fd..d6897dfc 100644
--- a/src/widgets/tdarr/proxy.js
+++ b/src/widgets/tdarr/proxy.js
@@ -1,7 +1,7 @@
-import { httpProxy } from "utils/proxy/http";
-import { formatApiCall } from "utils/proxy/api-helpers";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
+import { formatApiCall } from "utils/proxy/api-helpers";
+import { httpProxy } from "utils/proxy/http";
import widgets from "widgets/widgets";
const proxyName = "tdarrProxyHandler";
diff --git a/src/widgets/technitium/component.jsx b/src/widgets/technitium/component.jsx
index 22f56e96..fa221025 100644
--- a/src/widgets/technitium/component.jsx
+++ b/src/widgets/technitium/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/technitium/widget.js b/src/widgets/technitium/widget.js
index c3432a67..fc4577be 100644
--- a/src/widgets/technitium/widget.js
+++ b/src/widgets/technitium/widget.js
@@ -1,5 +1,5 @@
-import genericProxyHandler from "utils/proxy/handlers/generic";
import { asJson } from "utils/proxy/api-helpers";
+import genericProxyHandler from "utils/proxy/handlers/generic";
const widget = {
api: "{url}/api/{endpoint}?token={key}&utc=true",
diff --git a/src/widgets/traefik/component.jsx b/src/widgets/traefik/component.jsx
index 598170fa..e4b3b46b 100644
--- a/src/widgets/traefik/component.jsx
+++ b/src/widgets/traefik/component.jsx
@@ -1,5 +1,5 @@
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/transmission/component.jsx b/src/widgets/transmission/component.jsx
index bd19c52e..474fe69f 100644
--- a/src/widgets/transmission/component.jsx
+++ b/src/widgets/transmission/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/transmission/proxy.js b/src/widgets/transmission/proxy.js
index 8b8049bc..b0be7bac 100644
--- a/src/widgets/transmission/proxy.js
+++ b/src/widgets/transmission/proxy.js
@@ -1,9 +1,9 @@
import cache from "memory-cache";
-import { httpProxy } from "utils/proxy/http";
-import { formatApiCall } from "utils/proxy/api-helpers";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
+import { formatApiCall } from "utils/proxy/api-helpers";
+import { httpProxy } from "utils/proxy/http";
import widgets from "widgets/widgets";
const proxyName = "transmissionProxyHandler";
diff --git a/src/widgets/truenas/component.jsx b/src/widgets/truenas/component.jsx
index 0e56bc91..12ceef56 100644
--- a/src/widgets/truenas/component.jsx
+++ b/src/widgets/truenas/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import Pool from "widgets/truenas/pool";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/truenas/widget.js b/src/widgets/truenas/widget.js
index d322753f..528114ed 100644
--- a/src/widgets/truenas/widget.js
+++ b/src/widgets/truenas/widget.js
@@ -1,5 +1,5 @@
-import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
import { asJson, jsonArrayFilter } from "utils/proxy/api-helpers";
+import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
const widget = {
api: "{url}/api/v2.0/{endpoint}",
diff --git a/src/widgets/tubearchivist/component.jsx b/src/widgets/tubearchivist/component.jsx
index 6af255cd..427298e4 100644
--- a/src/widgets/tubearchivist/component.jsx
+++ b/src/widgets/tubearchivist/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/unifi/component.jsx b/src/widgets/unifi/component.jsx
index 0c00b487..ad58d1d9 100644
--- a/src/widgets/unifi/component.jsx
+++ b/src/widgets/unifi/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/unifi/proxy.js b/src/widgets/unifi/proxy.js
index 24be7dd9..c932fc41 100644
--- a/src/widgets/unifi/proxy.js
+++ b/src/widgets/unifi/proxy.js
@@ -1,11 +1,11 @@
import cache from "memory-cache";
-import { formatApiCall } from "utils/proxy/api-helpers";
-import { httpProxy } from "utils/proxy/http";
-import { addCookieToJar, setCookieHeader } from "utils/proxy/cookie-jar";
import getServiceWidget from "utils/config/service-helpers";
import { getPrivateWidgetOptions } from "utils/config/widget-helpers";
import createLogger from "utils/logger";
+import { formatApiCall } from "utils/proxy/api-helpers";
+import { addCookieToJar, setCookieHeader } from "utils/proxy/cookie-jar";
+import { httpProxy } from "utils/proxy/http";
import widgets from "widgets/widgets";
const udmpPrefix = "/proxy/network";
diff --git a/src/widgets/unmanic/component.jsx b/src/widgets/unmanic/component.jsx
index 7cc8eec1..12069e52 100644
--- a/src/widgets/unmanic/component.jsx
+++ b/src/widgets/unmanic/component.jsx
@@ -1,9 +1,9 @@
-import { useEffect, useState } from "react";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useEffect, useState } from "react";
-import useWidgetAPI from "utils/proxy/use-widget-api";
import { formatProxyUrl } from "utils/proxy/api-helpers";
+import useWidgetAPI from "utils/proxy/use-widget-api";
export default function Component({ service }) {
const { widget } = service;
diff --git a/src/widgets/unmanic/widget.js b/src/widgets/unmanic/widget.js
index 4c9713e4..ef4493e9 100644
--- a/src/widgets/unmanic/widget.js
+++ b/src/widgets/unmanic/widget.js
@@ -1,5 +1,5 @@
-import genericProxyHandler from "utils/proxy/handlers/generic";
import { asJson } from "utils/proxy/api-helpers";
+import genericProxyHandler from "utils/proxy/handlers/generic";
const widget = {
api: "{url}/unmanic/api/v2/{endpoint}",
diff --git a/src/widgets/uptimekuma/component.jsx b/src/widgets/uptimekuma/component.jsx
index d044c255..e8a42e48 100644
--- a/src/widgets/uptimekuma/component.jsx
+++ b/src/widgets/uptimekuma/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/uptimerobot/component.jsx b/src/widgets/uptimerobot/component.jsx
index c18462ba..a1f234c2 100644
--- a/src/widgets/uptimerobot/component.jsx
+++ b/src/widgets/uptimerobot/component.jsx
@@ -1,7 +1,7 @@
+import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import { useTranslation } from "next-i18next";
import { useEffect, useState } from "react";
-import Container from "components/services/widget/container";
-import Block from "components/services/widget/block";
import { formatProxyUrl } from "utils/proxy/api-helpers";
diff --git a/src/widgets/urbackup/component.jsx b/src/widgets/urbackup/component.jsx
index 76769e13..9d8f92ba 100644
--- a/src/widgets/urbackup/component.jsx
+++ b/src/widgets/urbackup/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/vikunja/component.jsx b/src/widgets/vikunja/component.jsx
index 7f8efb41..1afccd38 100644
--- a/src/widgets/vikunja/component.jsx
+++ b/src/widgets/vikunja/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/vikunja/widget.js b/src/widgets/vikunja/widget.js
index 9a192026..8e5e680a 100644
--- a/src/widgets/vikunja/widget.js
+++ b/src/widgets/vikunja/widget.js
@@ -1,5 +1,5 @@
-import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
import { asJson } from "utils/proxy/api-helpers";
+import credentialedProxyHandler from "utils/proxy/handlers/credentialed";
const widget = {
api: `{url}/api/v1/{endpoint}`,
diff --git a/src/widgets/watchtower/component.jsx b/src/widgets/watchtower/component.jsx
index 0bed9445..58b2a3f5 100644
--- a/src/widgets/watchtower/component.jsx
+++ b/src/widgets/watchtower/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/watchtower/proxy.js b/src/widgets/watchtower/proxy.js
index 588d08ee..484c3c7d 100644
--- a/src/widgets/watchtower/proxy.js
+++ b/src/widgets/watchtower/proxy.js
@@ -1,7 +1,7 @@
-import { httpProxy } from "utils/proxy/http";
-import { formatApiCall } from "utils/proxy/api-helpers";
import getServiceWidget from "utils/config/service-helpers";
import createLogger from "utils/logger";
+import { formatApiCall } from "utils/proxy/api-helpers";
+import { httpProxy } from "utils/proxy/http";
import widgets from "widgets/widgets";
const proxyName = "watchtowerProxyHandler";
diff --git a/src/widgets/wgeasy/component.jsx b/src/widgets/wgeasy/component.jsx
index eb42532e..829b120d 100644
--- a/src/widgets/wgeasy/component.jsx
+++ b/src/widgets/wgeasy/component.jsx
@@ -1,5 +1,5 @@
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/whatsupdocker/component.jsx b/src/widgets/whatsupdocker/component.jsx
index 52afe09d..cc3b5174 100644
--- a/src/widgets/whatsupdocker/component.jsx
+++ b/src/widgets/whatsupdocker/component.jsx
@@ -1,5 +1,5 @@
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js
index 21cff92b..992855d0 100644
--- a/src/widgets/widgets.js
+++ b/src/widgets/widgets.js
@@ -41,15 +41,15 @@ import gotify from "./gotify/widget";
import grafana from "./grafana/widget";
import hdhomerun from "./hdhomerun/widget";
import headscale from "./headscale/widget";
+import healthchecks from "./healthchecks/widget";
import hoarder from "./hoarder/widget";
import homeassistant from "./homeassistant/widget";
import homebox from "./homebox/widget";
import homebridge from "./homebridge/widget";
-import healthchecks from "./healthchecks/widget";
import immich from "./immich/widget";
import jackett from "./jackett/widget";
-import jellyseerr from "./jellyseerr/widget";
import jdownloader from "./jdownloader/widget";
+import jellyseerr from "./jellyseerr/widget";
import kavita from "./kavita/widget";
import komga from "./komga/widget";
import kopia from "./kopia/widget";
@@ -60,9 +60,9 @@ import mailcow from "./mailcow/widget";
import mastodon from "./mastodon/widget";
import mealie from "./mealie/widget";
import medusa from "./medusa/widget";
+import mikrotik from "./mikrotik/widget";
import minecraft from "./minecraft/widget";
import miniflux from "./miniflux/widget";
-import mikrotik from "./mikrotik/widget";
import mjpeg from "./mjpeg/widget";
import moonraker from "./moonraker/widget";
import mylar from "./mylar/widget";
@@ -78,15 +78,14 @@ import octoprint from "./octoprint/widget";
import omada from "./omada/widget";
import ombi from "./ombi/widget";
import opendtu from "./opendtu/widget";
-import opnsense from "./opnsense/widget";
-import overseerr from "./overseerr/widget";
import openmediavault from "./openmediavault/widget";
import openwrt from "./openwrt/widget";
+import opnsense from "./opnsense/widget";
+import overseerr from "./overseerr/widget";
import paperlessngx from "./paperlessngx/widget";
import peanut from "./peanut/widget";
import pfsense from "./pfsense/widget";
import photoprism from "./photoprism/widget";
-import proxmoxbackupserver from "./proxmoxbackupserver/widget";
import pihole from "./pihole/widget";
import plantit from "./plantit/widget";
import plex from "./plex/widget";
@@ -95,12 +94,14 @@ import prometheus from "./prometheus/widget";
import prometheusmetric from "./prometheusmetric/widget";
import prowlarr from "./prowlarr/widget";
import proxmox from "./proxmox/widget";
+import proxmoxbackupserver from "./proxmoxbackupserver/widget";
import pterodactyl from "./pterodactyl/widget";
import pyload from "./pyload/widget";
import qbittorrent from "./qbittorrent/widget";
import qnap from "./qnap/widget";
import radarr from "./radarr/widget";
import readarr from "./readarr/widget";
+import romm from "./romm/widget";
import rutorrent from "./rutorrent/widget";
import sabnzbd from "./sabnzbd/widget";
import scrutiny from "./scrutiny/widget";
@@ -111,28 +112,27 @@ import spoolman from "./spoolman/widget";
import stash from "./stash/widget";
import stocks from "./stocks/widget";
import strelaysrv from "./strelaysrv/widget";
-import swagdashboard from "./swagdashboard/widget";
import suwayomi from "./suwayomi/widget";
+import swagdashboard from "./swagdashboard/widget";
import tailscale from "./tailscale/widget";
import tandoor from "./tandoor/widget";
import tautulli from "./tautulli/widget";
-import technitium from "./technitium/widget";
import tdarr from "./tdarr/widget";
+import technitium from "./technitium/widget";
import traefik from "./traefik/widget";
import transmission from "./transmission/widget";
-import tubearchivist from "./tubearchivist/widget";
import truenas from "./truenas/widget";
+import tubearchivist from "./tubearchivist/widget";
import unifi from "./unifi/widget";
import unmanic from "./unmanic/widget";
import uptimekuma from "./uptimekuma/widget";
import uptimerobot from "./uptimerobot/widget";
+import urbackup from "./urbackup/widget";
import vikunja from "./vikunja/widget";
import watchtower from "./watchtower/widget";
import wgeasy from "./wgeasy/widget";
import whatsupdocker from "./whatsupdocker/widget";
import xteve from "./xteve/widget";
-import urbackup from "./urbackup/widget";
-import romm from "./romm/widget";
import zabbix from "./zabbix/widget";
const widgets = {
diff --git a/src/widgets/xteve/component.jsx b/src/widgets/xteve/component.jsx
index 9d514e75..41f2beb0 100644
--- a/src/widgets/xteve/component.jsx
+++ b/src/widgets/xteve/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/xteve/proxy.js b/src/widgets/xteve/proxy.js
index 453e3645..53d82bc4 100644
--- a/src/widgets/xteve/proxy.js
+++ b/src/widgets/xteve/proxy.js
@@ -1,8 +1,8 @@
+import getServiceWidget from "utils/config/service-helpers";
+import createLogger from "utils/logger";
import { formatApiCall } from "utils/proxy/api-helpers";
import { httpProxy } from "utils/proxy/http";
-import createLogger from "utils/logger";
import widgets from "widgets/widgets";
-import getServiceWidget from "utils/config/service-helpers";
const logger = createLogger("xteveProxyHandler");
diff --git a/src/widgets/zabbix/component.jsx b/src/widgets/zabbix/component.jsx
index a2cc8168..b6a5b20b 100644
--- a/src/widgets/zabbix/component.jsx
+++ b/src/widgets/zabbix/component.jsx
@@ -1,6 +1,6 @@
-import { useTranslation } from "next-i18next";
-import Container from "components/services/widget/container";
import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
From 1666106dcd5e7e8a4c0a0f66da23a1684dd5385c Mon Sep 17 00:00:00 2001
From: RoboMagus <68224306+RoboMagus@users.noreply.github.com>
Date: Mon, 31 Mar 2025 15:44:17 +0200
Subject: [PATCH 72/89] Chore: add more Docker Semver Tags (#5107)
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
---
.github/workflows/docker-publish.yml | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml
index afb7fca4..7a133c1d 100644
--- a/.github/workflows/docker-publish.yml
+++ b/.github/workflows/docker-publish.yml
@@ -77,6 +77,15 @@ jobs:
images: |
${{ env.IMAGE_NAME }}
ghcr.io/${{ env.IMAGE_NAME }}
+ tags: |
+ # Default tags
+ type=schedule,pattern=nightly
+ type=ref,event=branch
+ type=ref,event=tag
+ # Versioning tags
+ type=semver,pattern=v{{version}}
+ type=semver,pattern=v{{major}}.{{minor}}
+ type=semver,pattern=v{{major}}
flavor: |
latest=auto
From 6741eb723d1781972465304d9ab5f27d7c3101b2 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 1 Apr 2025 09:22:36 -0700
Subject: [PATCH 73/89] Chore(deps): Bump i18next from 21.10.0 to 24.2.3
(#5109)
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package.json | 2 +-
pnpm-lock.yaml | 51 ++++++++++++++++++++++++++++++++++++++++----------
2 files changed, 42 insertions(+), 11 deletions(-)
diff --git a/package.json b/package.json
index 07be3d1d..2386454c 100644
--- a/package.json
+++ b/package.json
@@ -19,7 +19,7 @@
"dockerode": "^4.0.4",
"follow-redirects": "^1.15.9",
"gamedig": "^5.2.0",
- "i18next": "^21.10.0",
+ "i18next": "^24.2.3",
"js-yaml": "^4.1.0",
"json-rpc-2.0": "^1.7.0",
"luxon": "^3.5.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 40069cad..2e0b8b3f 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -33,8 +33,8 @@ importers:
specifier: ^5.2.0
version: 5.2.0
i18next:
- specifier: ^21.10.0
- version: 21.10.0
+ specifier: ^24.2.3
+ version: 24.2.3(typescript@5.7.3)
js-yaml:
specifier: ^4.1.0
version: 4.1.0
@@ -73,7 +73,7 @@ importers:
version: 18.3.1(react@18.3.1)
react-i18next:
specifier: ^11.18.6
- version: 11.18.6(i18next@21.10.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ version: 11.18.6(i18next@24.2.3(typescript@5.7.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react-icons:
specifier: ^5.4.0
version: 5.4.0(react@18.3.1)
@@ -101,6 +101,10 @@ importers:
xml-js:
specifier: ^1.6.11
version: 1.6.11
+ optionalDependencies:
+ osx-temperature-sensor:
+ specifier: ^1.0.8
+ version: 1.0.8
devDependencies:
'@tailwindcss/forms':
specifier: ^0.5.10
@@ -150,10 +154,6 @@ importers:
typescript:
specifier: ^5.7.3
version: 5.7.3
- optionalDependencies:
- osx-temperature-sensor:
- specifier: ^1.0.8
- version: 1.0.8
packages:
@@ -165,6 +165,10 @@ packages:
resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==}
engines: {node: '>=6.9.0'}
+ '@babel/runtime@7.27.0':
+ resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==}
+ engines: {node: '>=6.9.0'}
+
'@balena/dockerignore@1.0.2':
resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==}
@@ -1554,6 +1558,14 @@ packages:
i18next@21.10.0:
resolution: {integrity: sha512-YeuIBmFsGjUfO3qBmMOc0rQaun4mIpGKET5WDwvu8lU7gvwpcariZLNtL0Fzj+zazcHUrlXHiptcFhBMFaxzfg==}
+ i18next@24.2.3:
+ resolution: {integrity: sha512-lfbf80OzkocvX7nmZtu7nSTNbrTYR52sLWxPtlXX1zAhVw8WEnFk4puUkCR4B1dNQwbSpEHHHemcZu//7EcB7A==}
+ peerDependencies:
+ typescript: ^5
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
ical-date-parser@4.0.0:
resolution: {integrity: sha512-XRCK/FU1akC2ZaJOdKIeZI6BLLgzWUuE0pegSrrkEva89GOan5mNkLVqCU4EMhCJ9nkG5TLWdMXrVX1fNAkFzw==}
@@ -2783,6 +2795,10 @@ snapshots:
dependencies:
regenerator-runtime: 0.14.1
+ '@babel/runtime@7.27.0':
+ dependencies:
+ regenerator-runtime: 0.14.1
+
'@balena/dockerignore@1.0.2': {}
'@colors/colors@1.6.0': {}
@@ -3741,7 +3757,7 @@ snapshots:
dom-helpers@5.2.1:
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.27.0
csstype: 3.1.3
dom-serializer@2.0.0:
@@ -4346,7 +4362,13 @@ snapshots:
i18next@21.10.0:
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.27.0
+
+ i18next@24.2.3(typescript@5.7.3):
+ dependencies:
+ '@babel/runtime': 7.27.0
+ optionalDependencies:
+ typescript: 5.7.3
ical-date-parser@4.0.0: {}
@@ -4967,6 +4989,15 @@ snapshots:
optionalDependencies:
react-dom: 18.3.1(react@18.3.1)
+ react-i18next@11.18.6(i18next@24.2.3(typescript@5.7.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@babel/runtime': 7.26.9
+ html-parse-stringify: 3.0.1
+ i18next: 24.2.3(typescript@5.7.3)
+ react: 18.3.1
+ optionalDependencies:
+ react-dom: 18.3.1(react@18.3.1)
+
react-icons@5.4.0(react@18.3.1):
dependencies:
react: 18.3.1
@@ -4985,7 +5016,7 @@ snapshots:
react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.27.0
dom-helpers: 5.2.1
loose-envify: 1.4.0
prop-types: 15.8.1
From 5e946ed2c251e098d1cfd48cd0e78866809ee305 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 1 Apr 2025 09:24:24 -0700
Subject: [PATCH 74/89] Chore(deps-dev): Bump postcss from 8.5.2 to 8.5.3
(#5110)
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package.json | 2 +-
pnpm-lock.yaml | 21 +++++++--------------
2 files changed, 8 insertions(+), 15 deletions(-)
diff --git a/package.json b/package.json
index 2386454c..25a0e85e 100644
--- a/package.json
+++ b/package.json
@@ -54,7 +54,7 @@
"eslint-plugin-prettier": "^5.2.3",
"eslint-plugin-react": "^7.37.4",
"eslint-plugin-react-hooks": "^5.1.0",
- "postcss": "^8.5.2",
+ "postcss": "^8.5.3",
"prettier": "^3.5.2",
"prettier-plugin-organize-imports": "^4.1.0",
"tailwind-scrollbar": "^4.0.1",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 2e0b8b3f..e1255a5c 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -137,8 +137,8 @@ importers:
specifier: ^5.1.0
version: 5.1.0(eslint@9.21.0(jiti@2.4.2))
postcss:
- specifier: ^8.5.2
- version: 8.5.2
+ specifier: ^8.5.3
+ version: 8.5.3
prettier:
specifier: ^3.5.2
version: 3.5.2
@@ -1975,11 +1975,6 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
- nanoid@3.3.8:
- resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
- engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
- hasBin: true
-
natural-compare@1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
@@ -2147,8 +2142,8 @@ packages:
resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
engines: {node: ^10 || ^12 || >=14}
- postcss@8.5.2:
- resolution: {integrity: sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==}
+ postcss@8.5.3:
+ resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==}
engines: {node: ^10 || ^12 || >=14}
prelude-ls@1.2.1:
@@ -3163,7 +3158,7 @@ snapshots:
'@tailwindcss/node': 4.0.9
'@tailwindcss/oxide': 4.0.9
lightningcss: 1.29.1
- postcss: 8.5.2
+ postcss: 8.5.3
tailwindcss: 4.0.9
'@tanstack/react-virtual@3.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
@@ -4726,8 +4721,6 @@ snapshots:
nanoid@3.3.11: {}
- nanoid@3.3.8: {}
-
natural-compare@1.4.0: {}
next-i18next@12.1.0(next@15.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
@@ -4906,9 +4899,9 @@ snapshots:
picocolors: 1.1.1
source-map-js: 1.2.1
- postcss@8.5.2:
+ postcss@8.5.3:
dependencies:
- nanoid: 3.3.8
+ nanoid: 3.3.11
picocolors: 1.1.1
source-map-js: 1.2.1
From f46568ec2a1eaae1204230631e92870d33ccf6de Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 1 Apr 2025 09:24:46 -0700
Subject: [PATCH 75/89] Chore(deps-dev): Bump eslint-config-prettier from
10.0.2 to 10.1.1 (#5112)
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package.json | 2 +-
pnpm-lock.yaml | 16 ++++++++--------
2 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/package.json b/package.json
index 25a0e85e..3a0d1d11 100644
--- a/package.json
+++ b/package.json
@@ -48,7 +48,7 @@
"@tailwindcss/postcss": "^4.0.9",
"eslint": "^9.21.0",
"eslint-config-next": "^15.1.7",
- "eslint-config-prettier": "^10.0.2",
+ "eslint-config-prettier": "^10.1.1",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-prettier": "^5.2.3",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index e1255a5c..d68783f6 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -119,8 +119,8 @@ importers:
specifier: ^15.1.7
version: 15.1.7(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
eslint-config-prettier:
- specifier: ^10.0.2
- version: 10.0.2(eslint@9.21.0(jiti@2.4.2))
+ specifier: ^10.1.1
+ version: 10.1.1(eslint@9.21.0(jiti@2.4.2))
eslint-plugin-import:
specifier: ^2.31.0
version: 2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.2)(eslint@9.21.0(jiti@2.4.2))
@@ -129,7 +129,7 @@ importers:
version: 6.10.2(eslint@9.21.0(jiti@2.4.2))
eslint-plugin-prettier:
specifier: ^5.2.3
- version: 5.2.3(eslint-config-prettier@10.0.2(eslint@9.21.0(jiti@2.4.2)))(eslint@9.21.0(jiti@2.4.2))(prettier@3.5.2)
+ version: 5.2.3(eslint-config-prettier@10.1.1(eslint@9.21.0(jiti@2.4.2)))(eslint@9.21.0(jiti@2.4.2))(prettier@3.5.2)
eslint-plugin-react:
specifier: ^7.37.4
version: 7.37.4(eslint@9.21.0(jiti@2.4.2))
@@ -1207,8 +1207,8 @@ packages:
typescript:
optional: true
- eslint-config-prettier@10.0.2:
- resolution: {integrity: sha512-1105/17ZIMjmCOJOPNfVdbXafLCLj3hPmkmB7dLgt7XsQ/zkxSuDerE/xgO3RxoHysR1N1whmquY0lSn2O0VLg==}
+ eslint-config-prettier@10.1.1:
+ resolution: {integrity: sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw==}
hasBin: true
peerDependencies:
eslint: '>=7.0.0'
@@ -3920,7 +3920,7 @@ snapshots:
- eslint-plugin-import-x
- supports-color
- eslint-config-prettier@10.0.2(eslint@9.21.0(jiti@2.4.2)):
+ eslint-config-prettier@10.1.1(eslint@9.21.0(jiti@2.4.2)):
dependencies:
eslint: 9.21.0(jiti@2.4.2)
@@ -4006,14 +4006,14 @@ snapshots:
safe-regex-test: 1.1.0
string.prototype.includes: 2.0.1
- eslint-plugin-prettier@5.2.3(eslint-config-prettier@10.0.2(eslint@9.21.0(jiti@2.4.2)))(eslint@9.21.0(jiti@2.4.2))(prettier@3.5.2):
+ eslint-plugin-prettier@5.2.3(eslint-config-prettier@10.1.1(eslint@9.21.0(jiti@2.4.2)))(eslint@9.21.0(jiti@2.4.2))(prettier@3.5.2):
dependencies:
eslint: 9.21.0(jiti@2.4.2)
prettier: 3.5.2
prettier-linter-helpers: 1.0.0
synckit: 0.9.2
optionalDependencies:
- eslint-config-prettier: 10.0.2(eslint@9.21.0(jiti@2.4.2))
+ eslint-config-prettier: 10.1.1(eslint@9.21.0(jiti@2.4.2))
eslint-plugin-react-hooks@5.1.0(eslint@9.21.0(jiti@2.4.2)):
dependencies:
From a59ee5a6057e4e42708745489ff2c8d5541d77eb Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 1 Apr 2025 09:32:05 -0700
Subject: [PATCH 76/89] Chore(deps-dev): Bump eslint-config-next from 15.1.7 to
15.2.4 (#5113)
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package.json | 2 +-
pnpm-lock.yaml | 405 ++++++++++++++++++++++++++++++++++++-------------
2 files changed, 302 insertions(+), 105 deletions(-)
diff --git a/package.json b/package.json
index 3a0d1d11..53d1e770 100644
--- a/package.json
+++ b/package.json
@@ -47,7 +47,7 @@
"@tailwindcss/forms": "^0.5.10",
"@tailwindcss/postcss": "^4.0.9",
"eslint": "^9.21.0",
- "eslint-config-next": "^15.1.7",
+ "eslint-config-next": "^15.2.4",
"eslint-config-prettier": "^10.1.1",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-jsx-a11y": "^6.10.2",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index d68783f6..d2eabfe9 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -116,14 +116,14 @@ importers:
specifier: ^9.21.0
version: 9.21.0(jiti@2.4.2)
eslint-config-next:
- specifier: ^15.1.7
- version: 15.1.7(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
+ specifier: ^15.2.4
+ version: 15.2.4(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
eslint-config-prettier:
specifier: ^10.1.1
version: 10.1.1(eslint@9.21.0(jiti@2.4.2))
eslint-plugin-import:
specifier: ^2.31.0
- version: 2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.2)(eslint@9.21.0(jiti@2.4.2))
+ version: 2.31.0(@typescript-eslint/parser@8.29.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.10.0)(eslint@9.21.0(jiti@2.4.2))
eslint-plugin-jsx-a11y:
specifier: ^6.10.2
version: 6.10.2(eslint@9.21.0(jiti@2.4.2))
@@ -179,15 +179,30 @@ packages:
'@dabh/diagnostics@2.0.3':
resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==}
+ '@emnapi/core@1.4.0':
+ resolution: {integrity: sha512-H+N/FqT07NmLmt6OFFtDfwe8PNygprzBikrEMyQfgqSmT0vzE515Pz7R8izwB9q/zsH/MA64AKoul3sA6/CzVg==}
+
'@emnapi/runtime@1.3.1':
resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==}
+ '@emnapi/runtime@1.4.0':
+ resolution: {integrity: sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==}
+
+ '@emnapi/wasi-threads@1.0.1':
+ resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==}
+
'@eslint-community/eslint-utils@4.4.1':
resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+ '@eslint-community/eslint-utils@4.5.1':
+ resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+
'@eslint-community/regexpp@4.12.1':
resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
@@ -383,11 +398,14 @@ packages:
'@kubernetes/client-node@1.0.0':
resolution: {integrity: sha512-a8NSvFDSHKFZ0sR1hbPSf8IDFNJwctEU5RodSCNiq/moRXWmrdmqhb1RRQzF+l+TSBaDgHw3YsYNxxE92STBzw==}
+ '@napi-rs/wasm-runtime@0.2.8':
+ resolution: {integrity: sha512-OBlgKdX7gin7OIq4fadsjpg+cp2ZphvAIKucHsNfTdJiqdOmOEwQd/bHi0VwNrcw5xpBJyUw6cK/QilCqy1BSg==}
+
'@next/env@15.2.3':
resolution: {integrity: sha512-a26KnbW9DFEUsSxAxKBORR/uD9THoYoKbkpFywMN/AFvboTt94b8+g/07T8J6ACsdLag8/PDU60ov4rPxRAixw==}
- '@next/eslint-plugin-next@15.1.7':
- resolution: {integrity: sha512-kRP7RjSxfTO13NE317ek3mSGzoZlI33nc/i5hs1KaWpK+egs85xg0DJ4p32QEiHnR0mVjuUfhRIun7awqfL7pQ==}
+ '@next/eslint-plugin-next@15.2.4':
+ resolution: {integrity: sha512-O8ScvKtnxkp8kL9TpJTTKnMqlkZnS+QxwoQnJwPGBxjBbzd6OVVPEJ5/pMNrktSyXQD/chEfzfFzYLM6JANOOQ==}
'@next/swc-darwin-arm64@15.2.3':
resolution: {integrity: sha512-uaBhA8aLbXLqwjnsHSkxs353WrRgQgiFjduDpc7YXEU0B54IKx3vU+cxQlYwPCyC8uYEEX7THhtQQsfHnvv8dw==}
@@ -494,8 +512,8 @@ packages:
'@rtsao/scc@1.1.0':
resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
- '@rushstack/eslint-patch@1.10.5':
- resolution: {integrity: sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==}
+ '@rushstack/eslint-patch@1.11.0':
+ resolution: {integrity: sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==}
'@sindresorhus/is@5.6.0':
resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==}
@@ -601,6 +619,9 @@ packages:
'@tanstack/virtual-core@3.13.0':
resolution: {integrity: sha512-NBKJP3OIdmZY3COJdWkSonr50FMVIi+aj5ZJ7hI/DTpEKg2RMfo/KvP8A3B/zOSpMgIe52B5E2yn7rryULzA6g==}
+ '@tybys/wasm-util@0.9.0':
+ resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==}
+
'@types/d3-array@3.2.1':
resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==}
@@ -670,53 +691,128 @@ packages:
'@types/ws@8.5.14':
resolution: {integrity: sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==}
- '@typescript-eslint/eslint-plugin@8.24.1':
- resolution: {integrity: sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==}
+ '@typescript-eslint/eslint-plugin@8.29.0':
+ resolution: {integrity: sha512-PAIpk/U7NIS6H7TEtN45SPGLQaHNgB7wSjsQV/8+KYokAb2T/gloOA/Bee2yd4/yKVhPKe5LlaUGhAZk5zmSaQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
'@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
eslint: ^8.57.0 || ^9.0.0
- typescript: '>=4.8.4 <5.8.0'
+ typescript: '>=4.8.4 <5.9.0'
- '@typescript-eslint/parser@8.24.1':
- resolution: {integrity: sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==}
+ '@typescript-eslint/parser@8.29.0':
+ resolution: {integrity: sha512-8C0+jlNJOwQso2GapCVWWfW/rzaq7Lbme+vGUFKE31djwNncIpgXD7Cd4weEsDdkoZDjH0lwwr3QDQFuyrMg9g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
- typescript: '>=4.8.4 <5.8.0'
+ typescript: '>=4.8.4 <5.9.0'
- '@typescript-eslint/scope-manager@8.24.1':
- resolution: {integrity: sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==}
+ '@typescript-eslint/scope-manager@8.29.0':
+ resolution: {integrity: sha512-aO1PVsq7Gm+tcghabUpzEnVSFMCU4/nYIgC2GOatJcllvWfnhrgW0ZEbnTxm36QsikmCN1K/6ZgM7fok2I7xNw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/type-utils@8.24.1':
- resolution: {integrity: sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==}
+ '@typescript-eslint/type-utils@8.29.0':
+ resolution: {integrity: sha512-ahaWQ42JAOx+NKEf5++WC/ua17q5l+j1GFrbbpVKzFL/tKVc0aYY8rVSYUpUvt2hUP1YBr7mwXzx+E/DfUWI9Q==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
- typescript: '>=4.8.4 <5.8.0'
+ typescript: '>=4.8.4 <5.9.0'
- '@typescript-eslint/types@8.24.1':
- resolution: {integrity: sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==}
+ '@typescript-eslint/types@8.29.0':
+ resolution: {integrity: sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/typescript-estree@8.24.1':
- resolution: {integrity: sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==}
+ '@typescript-eslint/typescript-estree@8.29.0':
+ resolution: {integrity: sha512-yOfen3jE9ISZR/hHpU/bmNvTtBW1NjRbkSFdZOksL1N+ybPEE7UVGMwqvS6CP022Rp00Sb0tdiIkhSCe6NI8ow==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- typescript: '>=4.8.4 <5.8.0'
+ typescript: '>=4.8.4 <5.9.0'
- '@typescript-eslint/utils@8.24.1':
- resolution: {integrity: sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==}
+ '@typescript-eslint/utils@8.29.0':
+ resolution: {integrity: sha512-gX/A0Mz9Bskm8avSWFcK0gP7cZpbY4AIo6B0hWYFCaIsz750oaiWR4Jr2CI+PQhfW1CpcQr9OlfPS+kMFegjXA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
- typescript: '>=4.8.4 <5.8.0'
+ typescript: '>=4.8.4 <5.9.0'
- '@typescript-eslint/visitor-keys@8.24.1':
- resolution: {integrity: sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==}
+ '@typescript-eslint/visitor-keys@8.29.0':
+ resolution: {integrity: sha512-Sne/pVz8ryR03NFK21VpN88dZ2FdQXOlq3VIklbrTYEt8yXtRFr9tvUhqvCeKjqYk5FSim37sHbooT6vzBTZcg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@unrs/resolver-binding-darwin-arm64@1.3.3':
+ resolution: {integrity: sha512-EpRILdWr3/xDa/7MoyfO7JuBIJqpBMphtu4+80BK1bRfFcniVT74h3Z7q1+WOc92FuIAYatB1vn9TJR67sORGw==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@unrs/resolver-binding-darwin-x64@1.3.3':
+ resolution: {integrity: sha512-ntj/g7lPyqwinMJWZ+DKHBse8HhVxswGTmNgFKJtdgGub3M3zp5BSZ3bvMP+kBT6dnYJLSVlDqdwOq1P8i0+/g==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@unrs/resolver-binding-freebsd-x64@1.3.3':
+ resolution: {integrity: sha512-l6BT8f2CU821EW7U8hSUK8XPq4bmyTlt9Mn4ERrfjJNoCw0/JoHAh9amZZtV3cwC3bwwIat+GUnrcHTG9+qixw==}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@unrs/resolver-binding-linux-arm-gnueabihf@1.3.3':
+ resolution: {integrity: sha512-8ScEc5a4y7oE2BonRvzJ+2GSkBaYWyh0/Ko4Q25e/ix6ANpJNhwEPZvCR6GVRmsQAYMIfQvYLdM6YEN+qRjnAQ==}
+ cpu: [arm]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-arm-musleabihf@1.3.3':
+ resolution: {integrity: sha512-8qQ6l1VTzLNd3xb2IEXISOKwMGXDCzY/UNy/7SovFW2Sp0K3YbL7Ao7R18v6SQkLqQlhhqSBIFRk+u6+qu5R5A==}
+ cpu: [arm]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-arm64-gnu@1.3.3':
+ resolution: {integrity: sha512-v81R2wjqcWXJlQY23byqYHt9221h4anQ6wwN64oMD/WAE+FmxPHFZee5bhRkNVtzqO/q7wki33VFWlhiADwUeQ==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-arm64-musl@1.3.3':
+ resolution: {integrity: sha512-cAOx/j0u5coMg4oct/BwMzvWJdVciVauUvsd+GQB/1FZYKQZmqPy0EjJzJGbVzFc6gbnfEcSqvQE6gvbGf2N8Q==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-ppc64-gnu@1.3.3':
+ resolution: {integrity: sha512-mq2blqwErgDJD4gtFDlTX/HZ7lNP8YCHYFij2gkXPtMzrXxPW1hOtxL6xg4NWxvnj4bppppb0W3s/buvM55yfg==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-s390x-gnu@1.3.3':
+ resolution: {integrity: sha512-u0VRzfFYysarYHnztj2k2xr+eu9rmgoTUUgCCIT37Nr+j0A05Xk2c3RY8Mh5+DhCl2aYibihnaAEJHeR0UOFIQ==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-x64-gnu@1.3.3':
+ resolution: {integrity: sha512-OrVo5ZsG29kBF0Ug95a2KidS16PqAMmQNozM6InbquOfW/udouk063e25JVLqIBhHLB2WyBnixOQ19tmeC/hIg==}
+ cpu: [x64]
+ os: [linux]
+
+ '@unrs/resolver-binding-linux-x64-musl@1.3.3':
+ resolution: {integrity: sha512-PYnmrwZ4HMp9SkrOhqPghY/aoL+Rtd4CQbr93GlrRTjK6kDzfMfgz3UH3jt6elrQAfupa1qyr1uXzeVmoEAxUA==}
+ cpu: [x64]
+ os: [linux]
+
+ '@unrs/resolver-binding-wasm32-wasi@1.3.3':
+ resolution: {integrity: sha512-81AnQY6fShmktQw4hWDUIilsKSdvr/acdJ5azAreu2IWNlaJOKphJSsUVWE+yCk6kBMoQyG9ZHCb/krb5K0PEA==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+
+ '@unrs/resolver-binding-win32-arm64-msvc@1.3.3':
+ resolution: {integrity: sha512-X/42BMNw7cW6xrB9syuP5RusRnWGoq+IqvJO8IDpp/BZg64J1uuIW6qA/1Cl13Y4LyLXbJVYbYNSKwR/FiHEng==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@unrs/resolver-binding-win32-ia32-msvc@1.3.3':
+ resolution: {integrity: sha512-EGNnNGQxMU5aTN7js3ETYvuw882zcO+dsVjs+DwO2j/fRVKth87C8e2GzxW1L3+iWAXMyJhvFBKRavk9Og1Z6A==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@unrs/resolver-binding-win32-x64-msvc@1.3.3':
+ resolution: {integrity: sha512-GraLbYqOJcmW1qY3osB+2YIiD62nVf2/bVLHZmrb4t/YSUwE03l7TwcDJl08T/Tm3SVhepX8RQkpzWbag/Sb4w==}
+ cpu: [x64]
+ os: [win32]
+
acorn-jsx@5.3.2:
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies:
@@ -1198,8 +1294,8 @@ packages:
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
engines: {node: '>=10'}
- eslint-config-next@15.1.7:
- resolution: {integrity: sha512-zXoMnYUIy3XHaAoOhrcYkT9UQWvXqWju2K7NNsmb5wd/7XESDwof61eUdW4QhERr3eJ9Ko/vnXqIrj8kk/drYw==}
+ eslint-config-next@15.2.4:
+ resolution: {integrity: sha512-v4gYjd4eYIme8qzaJItpR5MMBXJ0/YV07u7eb50kEnlEmX7yhOjdUdzz70v4fiINYRjLf8X8TbogF0k7wlz6sA==}
peerDependencies:
eslint: ^7.23.0 || ^8.0.0 || ^9.0.0
typescript: '>=3.3.1'
@@ -1216,8 +1312,8 @@ packages:
eslint-import-resolver-node@0.3.9:
resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
- eslint-import-resolver-typescript@3.8.2:
- resolution: {integrity: sha512-o0nvXxsatYCDTzI1K5b3aYGQ6PjpDGJEVN86zqJw5SEewhmmggfRTotd2dqWr2t2zbeYpIEWGTCkgtUpIEIcaQ==}
+ eslint-import-resolver-typescript@3.10.0:
+ resolution: {integrity: sha512-aV3/dVsT0/H9BtpNwbaqvl+0xGMRGzncLyhm793NFGvbwGGvzyAykqWZ8oZlZuGwuHkwJjhWJkG1cM3ynvd2pQ==}
engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies:
eslint: '*'
@@ -1365,8 +1461,8 @@ packages:
fast-levenshtein@2.0.6:
resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
- fastq@1.19.0:
- resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==}
+ fastq@1.19.1:
+ resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
fdir@6.4.3:
resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==}
@@ -1618,8 +1714,8 @@ packages:
resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
engines: {node: '>= 0.4'}
- is-bun-module@1.3.0:
- resolution: {integrity: sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==}
+ is-bun-module@2.0.0:
+ resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==}
is-callable@1.2.7:
resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
@@ -2309,8 +2405,8 @@ packages:
resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==}
engines: {node: '>=14.16'}
- reusify@1.0.4:
- resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+ reusify@1.1.0:
+ resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
rfc4648@1.5.4:
@@ -2434,8 +2530,8 @@ packages:
resolution: {integrity: sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==}
engines: {node: '>=10.16.0'}
- stable-hash@0.0.4:
- resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==}
+ stable-hash@0.0.5:
+ resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==}
stack-trace@0.0.10:
resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==}
@@ -2577,8 +2673,8 @@ packages:
tiny-invariant@1.3.3:
resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==}
- tinyglobby@0.2.11:
- resolution: {integrity: sha512-32TmKeeKUahv0Go8WmQgiEp9Y21NuxjwjqiRC1nrUB51YacfSwuB44xgXD+HdIppmMRgjQNPdrHyA6vIybYZ+g==}
+ tinyglobby@0.2.12:
+ resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==}
engines: {node: '>=12.0.0'}
tldts-core@6.1.82:
@@ -2614,8 +2710,8 @@ packages:
resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==}
engines: {node: '>= 14.0.0'}
- ts-api-utils@2.0.1:
- resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==}
+ ts-api-utils@2.1.0:
+ resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==}
engines: {node: '>=18.12'}
peerDependencies:
typescript: '>=4.8.4'
@@ -2665,6 +2761,9 @@ packages:
resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
engines: {node: '>= 0.8'}
+ unrs-resolver@1.3.3:
+ resolution: {integrity: sha512-PFLAGQzYlyjniXdbmQ3dnGMZJXX5yrl2YS4DLRfR3BhgUsE1zpRIrccp9XMOGRfIHpdFvCn/nr5N1KMVda4x3A==}
+
urbackup-server-api@0.8.9:
resolution: {integrity: sha512-Igu6A0xSZeMsiN6PWT7zG4aD+iJR5fXT/j5+xwAvnD/vCNfvVrettIsXv6MftxOajvTmtlgaYu8KDoH1EJQ6DQ==}
@@ -2804,16 +2903,37 @@ snapshots:
enabled: 2.0.0
kuler: 2.0.0
+ '@emnapi/core@1.4.0':
+ dependencies:
+ '@emnapi/wasi-threads': 1.0.1
+ tslib: 2.8.1
+ optional: true
+
'@emnapi/runtime@1.3.1':
dependencies:
tslib: 2.8.1
optional: true
+ '@emnapi/runtime@1.4.0':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@emnapi/wasi-threads@1.0.1':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
'@eslint-community/eslint-utils@4.4.1(eslint@9.21.0(jiti@2.4.2))':
dependencies:
eslint: 9.21.0(jiti@2.4.2)
eslint-visitor-keys: 3.4.3
+ '@eslint-community/eslint-utils@4.5.1(eslint@9.21.0(jiti@2.4.2))':
+ dependencies:
+ eslint: 9.21.0(jiti@2.4.2)
+ eslint-visitor-keys: 3.4.3
+
'@eslint-community/regexpp@4.12.1': {}
'@eslint/config-array@0.19.2':
@@ -3006,9 +3126,16 @@ snapshots:
- encoding
- utf-8-validate
+ '@napi-rs/wasm-runtime@0.2.8':
+ dependencies:
+ '@emnapi/core': 1.4.0
+ '@emnapi/runtime': 1.4.0
+ '@tybys/wasm-util': 0.9.0
+ optional: true
+
'@next/env@15.2.3': {}
- '@next/eslint-plugin-next@15.1.7':
+ '@next/eslint-plugin-next@15.2.4':
dependencies:
fast-glob: 3.3.1
@@ -3046,7 +3173,7 @@ snapshots:
'@nodelib/fs.walk@1.2.8':
dependencies:
'@nodelib/fs.scandir': 2.1.5
- fastq: 1.19.0
+ fastq: 1.19.1
'@nolyfill/is-core-module@1.0.39': {}
@@ -3080,7 +3207,7 @@ snapshots:
'@rtsao/scc@1.1.0': {}
- '@rushstack/eslint-patch@1.10.5': {}
+ '@rushstack/eslint-patch@1.11.0': {}
'@sindresorhus/is@5.6.0': {}
@@ -3169,6 +3296,11 @@ snapshots:
'@tanstack/virtual-core@3.13.0': {}
+ '@tybys/wasm-util@0.9.0':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
'@types/d3-array@3.2.1': {}
'@types/d3-color@3.1.3': {}
@@ -3238,83 +3370,130 @@ snapshots:
dependencies:
'@types/node': 22.13.4
- '@typescript-eslint/eslint-plugin@8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)':
+ '@typescript-eslint/eslint-plugin@8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)':
dependencies:
'@eslint-community/regexpp': 4.12.1
- '@typescript-eslint/parser': 8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
- '@typescript-eslint/scope-manager': 8.24.1
- '@typescript-eslint/type-utils': 8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
- '@typescript-eslint/utils': 8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
- '@typescript-eslint/visitor-keys': 8.24.1
+ '@typescript-eslint/parser': 8.29.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
+ '@typescript-eslint/scope-manager': 8.29.0
+ '@typescript-eslint/type-utils': 8.29.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
+ '@typescript-eslint/utils': 8.29.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
+ '@typescript-eslint/visitor-keys': 8.29.0
eslint: 9.21.0(jiti@2.4.2)
graphemer: 1.4.0
ignore: 5.3.2
natural-compare: 1.4.0
- ts-api-utils: 2.0.1(typescript@5.7.3)
+ ts-api-utils: 2.1.0(typescript@5.7.3)
typescript: 5.7.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)':
+ '@typescript-eslint/parser@8.29.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)':
dependencies:
- '@typescript-eslint/scope-manager': 8.24.1
- '@typescript-eslint/types': 8.24.1
- '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.7.3)
- '@typescript-eslint/visitor-keys': 8.24.1
+ '@typescript-eslint/scope-manager': 8.29.0
+ '@typescript-eslint/types': 8.29.0
+ '@typescript-eslint/typescript-estree': 8.29.0(typescript@5.7.3)
+ '@typescript-eslint/visitor-keys': 8.29.0
debug: 4.4.0
eslint: 9.21.0(jiti@2.4.2)
typescript: 5.7.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/scope-manager@8.24.1':
+ '@typescript-eslint/scope-manager@8.29.0':
dependencies:
- '@typescript-eslint/types': 8.24.1
- '@typescript-eslint/visitor-keys': 8.24.1
+ '@typescript-eslint/types': 8.29.0
+ '@typescript-eslint/visitor-keys': 8.29.0
- '@typescript-eslint/type-utils@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)':
+ '@typescript-eslint/type-utils@8.29.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)':
dependencies:
- '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.7.3)
- '@typescript-eslint/utils': 8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
+ '@typescript-eslint/typescript-estree': 8.29.0(typescript@5.7.3)
+ '@typescript-eslint/utils': 8.29.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
debug: 4.4.0
eslint: 9.21.0(jiti@2.4.2)
- ts-api-utils: 2.0.1(typescript@5.7.3)
+ ts-api-utils: 2.1.0(typescript@5.7.3)
typescript: 5.7.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/types@8.24.1': {}
+ '@typescript-eslint/types@8.29.0': {}
- '@typescript-eslint/typescript-estree@8.24.1(typescript@5.7.3)':
+ '@typescript-eslint/typescript-estree@8.29.0(typescript@5.7.3)':
dependencies:
- '@typescript-eslint/types': 8.24.1
- '@typescript-eslint/visitor-keys': 8.24.1
+ '@typescript-eslint/types': 8.29.0
+ '@typescript-eslint/visitor-keys': 8.29.0
debug: 4.4.0
fast-glob: 3.3.3
is-glob: 4.0.3
minimatch: 9.0.5
semver: 7.7.1
- ts-api-utils: 2.0.1(typescript@5.7.3)
+ ts-api-utils: 2.1.0(typescript@5.7.3)
typescript: 5.7.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/utils@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)':
+ '@typescript-eslint/utils@8.29.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)':
dependencies:
- '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@2.4.2))
- '@typescript-eslint/scope-manager': 8.24.1
- '@typescript-eslint/types': 8.24.1
- '@typescript-eslint/typescript-estree': 8.24.1(typescript@5.7.3)
+ '@eslint-community/eslint-utils': 4.5.1(eslint@9.21.0(jiti@2.4.2))
+ '@typescript-eslint/scope-manager': 8.29.0
+ '@typescript-eslint/types': 8.29.0
+ '@typescript-eslint/typescript-estree': 8.29.0(typescript@5.7.3)
eslint: 9.21.0(jiti@2.4.2)
typescript: 5.7.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/visitor-keys@8.24.1':
+ '@typescript-eslint/visitor-keys@8.29.0':
dependencies:
- '@typescript-eslint/types': 8.24.1
+ '@typescript-eslint/types': 8.29.0
eslint-visitor-keys: 4.2.0
+ '@unrs/resolver-binding-darwin-arm64@1.3.3':
+ optional: true
+
+ '@unrs/resolver-binding-darwin-x64@1.3.3':
+ optional: true
+
+ '@unrs/resolver-binding-freebsd-x64@1.3.3':
+ optional: true
+
+ '@unrs/resolver-binding-linux-arm-gnueabihf@1.3.3':
+ optional: true
+
+ '@unrs/resolver-binding-linux-arm-musleabihf@1.3.3':
+ optional: true
+
+ '@unrs/resolver-binding-linux-arm64-gnu@1.3.3':
+ optional: true
+
+ '@unrs/resolver-binding-linux-arm64-musl@1.3.3':
+ optional: true
+
+ '@unrs/resolver-binding-linux-ppc64-gnu@1.3.3':
+ optional: true
+
+ '@unrs/resolver-binding-linux-s390x-gnu@1.3.3':
+ optional: true
+
+ '@unrs/resolver-binding-linux-x64-gnu@1.3.3':
+ optional: true
+
+ '@unrs/resolver-binding-linux-x64-musl@1.3.3':
+ optional: true
+
+ '@unrs/resolver-binding-wasm32-wasi@1.3.3':
+ dependencies:
+ '@napi-rs/wasm-runtime': 0.2.8
+ optional: true
+
+ '@unrs/resolver-binding-win32-arm64-msvc@1.3.3':
+ optional: true
+
+ '@unrs/resolver-binding-win32-ia32-msvc@1.3.3':
+ optional: true
+
+ '@unrs/resolver-binding-win32-x64-msvc@1.3.3':
+ optional: true
+
acorn-jsx@5.3.2(acorn@8.14.0):
dependencies:
acorn: 8.14.0
@@ -3900,16 +4079,16 @@ snapshots:
escape-string-regexp@4.0.0: {}
- eslint-config-next@15.1.7(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3):
+ eslint-config-next@15.2.4(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3):
dependencies:
- '@next/eslint-plugin-next': 15.1.7
- '@rushstack/eslint-patch': 1.10.5
- '@typescript-eslint/eslint-plugin': 8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
- '@typescript-eslint/parser': 8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
+ '@next/eslint-plugin-next': 15.2.4
+ '@rushstack/eslint-patch': 1.11.0
+ '@typescript-eslint/eslint-plugin': 8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
+ '@typescript-eslint/parser': 8.29.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
eslint: 9.21.0(jiti@2.4.2)
eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.8.2(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@2.4.2))
- eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.2)(eslint@9.21.0(jiti@2.4.2))
+ eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@2.4.2))
+ eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.29.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.10.0)(eslint@9.21.0(jiti@2.4.2))
eslint-plugin-jsx-a11y: 6.10.2(eslint@9.21.0(jiti@2.4.2))
eslint-plugin-react: 7.37.4(eslint@9.21.0(jiti@2.4.2))
eslint-plugin-react-hooks: 5.1.0(eslint@9.21.0(jiti@2.4.2))
@@ -3932,33 +4111,33 @@ snapshots:
transitivePeerDependencies:
- supports-color
- eslint-import-resolver-typescript@3.8.2(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@2.4.2)):
+ eslint-import-resolver-typescript@3.10.0(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@2.4.2)):
dependencies:
'@nolyfill/is-core-module': 1.0.39
debug: 4.4.0
- enhanced-resolve: 5.18.1
eslint: 9.21.0(jiti@2.4.2)
get-tsconfig: 4.10.0
- is-bun-module: 1.3.0
- stable-hash: 0.0.4
- tinyglobby: 0.2.11
+ is-bun-module: 2.0.0
+ stable-hash: 0.0.5
+ tinyglobby: 0.2.12
+ unrs-resolver: 1.3.3
optionalDependencies:
- eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.2)(eslint@9.21.0(jiti@2.4.2))
+ eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.29.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.10.0)(eslint@9.21.0(jiti@2.4.2))
transitivePeerDependencies:
- supports-color
- eslint-module-utils@2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.2)(eslint@9.21.0(jiti@2.4.2)):
+ eslint-module-utils@2.12.0(@typescript-eslint/parser@8.29.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0)(eslint@9.21.0(jiti@2.4.2)):
dependencies:
debug: 3.2.7
optionalDependencies:
- '@typescript-eslint/parser': 8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
+ '@typescript-eslint/parser': 8.29.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
eslint: 9.21.0(jiti@2.4.2)
eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.8.2(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@2.4.2))
+ eslint-import-resolver-typescript: 3.10.0(eslint-plugin-import@2.31.0)(eslint@9.21.0(jiti@2.4.2))
transitivePeerDependencies:
- supports-color
- eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.8.2)(eslint@9.21.0(jiti@2.4.2)):
+ eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.29.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-typescript@3.10.0)(eslint@9.21.0(jiti@2.4.2)):
dependencies:
'@rtsao/scc': 1.1.0
array-includes: 3.1.8
@@ -3969,7 +4148,7 @@ snapshots:
doctrine: 2.1.0
eslint: 9.21.0(jiti@2.4.2)
eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.8.2)(eslint@9.21.0(jiti@2.4.2))
+ eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.29.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.0)(eslint@9.21.0(jiti@2.4.2))
hasown: 2.0.2
is-core-module: 2.16.1
is-glob: 4.0.3
@@ -3981,7 +4160,7 @@ snapshots:
string.prototype.trimend: 1.0.9
tsconfig-paths: 3.15.0
optionalDependencies:
- '@typescript-eslint/parser': 8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
+ '@typescript-eslint/parser': 8.29.0(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
@@ -4139,9 +4318,9 @@ snapshots:
fast-levenshtein@2.0.6: {}
- fastq@1.19.0:
+ fastq@1.19.1:
dependencies:
- reusify: 1.0.4
+ reusify: 1.1.0
fdir@6.4.3(picomatch@4.0.2):
optionalDependencies:
@@ -4417,7 +4596,7 @@ snapshots:
call-bound: 1.0.3
has-tostringtag: 1.0.2
- is-bun-module@1.3.0:
+ is-bun-module@2.0.0:
dependencies:
semver: 7.7.1
@@ -5106,7 +5285,7 @@ snapshots:
dependencies:
lowercase-keys: 3.0.0
- reusify@1.0.4: {}
+ reusify@1.1.0: {}
rfc4648@1.5.4: {}
@@ -5268,7 +5447,7 @@ snapshots:
cpu-features: 0.0.10
nan: 2.22.0
- stable-hash@0.0.4: {}
+ stable-hash@0.0.5: {}
stack-trace@0.0.10: {}
@@ -5428,7 +5607,7 @@ snapshots:
tiny-invariant@1.3.3: {}
- tinyglobby@0.2.11:
+ tinyglobby@0.2.12:
dependencies:
fdir: 6.4.3(picomatch@4.0.2)
picomatch: 4.0.2
@@ -5459,7 +5638,7 @@ snapshots:
triple-beam@1.4.1: {}
- ts-api-utils@2.0.1(typescript@5.7.3):
+ ts-api-utils@2.1.0(typescript@5.7.3):
dependencies:
typescript: 5.7.3
@@ -5524,6 +5703,24 @@ snapshots:
unpipe@1.0.0: {}
+ unrs-resolver@1.3.3:
+ optionalDependencies:
+ '@unrs/resolver-binding-darwin-arm64': 1.3.3
+ '@unrs/resolver-binding-darwin-x64': 1.3.3
+ '@unrs/resolver-binding-freebsd-x64': 1.3.3
+ '@unrs/resolver-binding-linux-arm-gnueabihf': 1.3.3
+ '@unrs/resolver-binding-linux-arm-musleabihf': 1.3.3
+ '@unrs/resolver-binding-linux-arm64-gnu': 1.3.3
+ '@unrs/resolver-binding-linux-arm64-musl': 1.3.3
+ '@unrs/resolver-binding-linux-ppc64-gnu': 1.3.3
+ '@unrs/resolver-binding-linux-s390x-gnu': 1.3.3
+ '@unrs/resolver-binding-linux-x64-gnu': 1.3.3
+ '@unrs/resolver-binding-linux-x64-musl': 1.3.3
+ '@unrs/resolver-binding-wasm32-wasi': 1.3.3
+ '@unrs/resolver-binding-win32-arm64-msvc': 1.3.3
+ '@unrs/resolver-binding-win32-ia32-msvc': 1.3.3
+ '@unrs/resolver-binding-win32-x64-msvc': 1.3.3
+
urbackup-server-api@0.8.9:
dependencies:
async-mutex: 0.3.2
From dbc26e835c25b519086304999bf94e9db17647c0 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 1 Apr 2025 09:36:44 -0700
Subject: [PATCH 77/89] Chore(deps): Bump swr from 1.3.0 to 2.3.3 (#5111)
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package.json | 2 +-
pnpm-lock.yaml | 29 +++++++++++++++++++++++------
2 files changed, 24 insertions(+), 7 deletions(-)
diff --git a/package.json b/package.json
index 53d1e770..96772f7f 100644
--- a/package.json
+++ b/package.json
@@ -36,7 +36,7 @@
"react-icons": "^5.4.0",
"recharts": "^2.15.1",
"rrule": "^2.8.1",
- "swr": "^1.3.0",
+ "swr": "^2.3.3",
"systeminformation": "^5.25.11",
"tough-cookie": "^5.1.2",
"urbackup-server-api": "^0.8.9",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index d2eabfe9..938fd85b 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -84,8 +84,8 @@ importers:
specifier: ^2.8.1
version: 2.8.1
swr:
- specifier: ^1.3.0
- version: 1.3.0(react@18.3.1)
+ specifier: ^2.3.3
+ version: 2.3.3(react@18.3.1)
systeminformation:
specifier: ^5.25.11
version: 5.25.11
@@ -1190,6 +1190,10 @@ packages:
resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
engines: {node: '>= 0.8'}
+ dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+
detect-libc@1.0.3:
resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
engines: {node: '>=0.10'}
@@ -2628,10 +2632,10 @@ packages:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
- swr@1.3.0:
- resolution: {integrity: sha512-dkghQrOl2ORX9HYrMDtPa7LTVHJjCTeZoB1dqTbnnEDlSvN8JEKpYIYurDfvbQFUUS8Cg8PceFVZNkW0KNNYPw==}
+ swr@2.3.3:
+ resolution: {integrity: sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==}
peerDependencies:
- react: ^16.11.0 || ^17.0.0 || ^18.0.0
+ react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
synckit@0.9.2:
resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==}
@@ -2770,6 +2774,11 @@ packages:
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ use-sync-external-store@1.5.0:
+ resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
@@ -3899,6 +3908,8 @@ snapshots:
depd@2.0.0: {}
+ dequal@2.0.3: {}
+
detect-libc@1.0.3: {}
detect-libc@2.0.3:
@@ -5557,9 +5568,11 @@ snapshots:
supports-preserve-symlinks-flag@1.0.0: {}
- swr@1.3.0(react@18.3.1):
+ swr@2.3.3(react@18.3.1):
dependencies:
+ dequal: 2.0.3
react: 18.3.1
+ use-sync-external-store: 1.5.0(react@18.3.1)
synckit@0.9.2:
dependencies:
@@ -5732,6 +5745,10 @@ snapshots:
dependencies:
punycode: 2.3.1
+ use-sync-external-store@1.5.0(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+
util-deprecate@1.0.2: {}
uuid@10.0.0: {}
From 52399e21e137264c944078f1bb54ab0a77dee816 Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Tue, 1 Apr 2025 09:48:28 -0700
Subject: [PATCH 78/89] Fix depth issue with t
---
src/components/quicklaunch.jsx | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/components/quicklaunch.jsx b/src/components/quicklaunch.jsx
index 14f0f4fb..7278647f 100644
--- a/src/components/quicklaunch.jsx
+++ b/src/components/quicklaunch.jsx
@@ -204,7 +204,8 @@ export default function QuickLaunch({ servicesAndBookmarks, searchString, setSea
return () => {
abortController.abort();
};
- }, [searchString, servicesAndBookmarks, searchDescriptions, hideVisitURL, searchSuggestions, searchProvider, url, t]);
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [searchString, servicesAndBookmarks, searchDescriptions, hideVisitURL, searchSuggestions, searchProvider, url]);
const [hidden, setHidden] = useState(true);
useEffect(() => {
From 6597ec566bb164b8815b8cfbfbf79af1632b545e Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Tue, 1 Apr 2025 09:52:33 -0700
Subject: [PATCH 79/89] Fix translation issue
---
src/components/quicklaunch.jsx | 2 +-
src/components/services/ping.jsx | 2 +-
src/components/services/site-monitor.jsx | 2 +-
src/components/services/status.jsx | 2 +-
src/components/services/widget/error.jsx | 2 +-
src/components/widgets/widget/error.jsx | 2 +-
src/widgets/lubelogger/component.jsx | 2 +-
src/widgets/prowlarr/component.jsx | 2 +-
8 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/src/components/quicklaunch.jsx b/src/components/quicklaunch.jsx
index 7278647f..a9827659 100644
--- a/src/components/quicklaunch.jsx
+++ b/src/components/quicklaunch.jsx
@@ -1,6 +1,6 @@
import classNames from "classnames";
+import { useTranslation } from "next-i18next";
import { useCallback, useContext, useEffect, useRef, useState } from "react";
-import { useTranslation } from "react-i18next";
import useSWR from "swr";
import { SettingsContext } from "utils/contexts/settings";
diff --git a/src/components/services/ping.jsx b/src/components/services/ping.jsx
index 670f9d4b..f8665e33 100644
--- a/src/components/services/ping.jsx
+++ b/src/components/services/ping.jsx
@@ -1,4 +1,4 @@
-import { useTranslation } from "react-i18next";
+import { useTranslation } from "next-i18next";
import useSWR from "swr";
export default function Ping({ groupName, serviceName, style }) {
diff --git a/src/components/services/site-monitor.jsx b/src/components/services/site-monitor.jsx
index 4dceb44c..79496f65 100644
--- a/src/components/services/site-monitor.jsx
+++ b/src/components/services/site-monitor.jsx
@@ -1,4 +1,4 @@
-import { useTranslation } from "react-i18next";
+import { useTranslation } from "next-i18next";
import useSWR from "swr";
export default function SiteMonitor({ groupName, serviceName, style }) {
diff --git a/src/components/services/status.jsx b/src/components/services/status.jsx
index 3a6f3b33..2688ca0f 100644
--- a/src/components/services/status.jsx
+++ b/src/components/services/status.jsx
@@ -1,4 +1,4 @@
-import { useTranslation } from "react-i18next";
+import { useTranslation } from "next-i18next";
import useSWR from "swr";
export default function Status({ service, style }) {
diff --git a/src/components/services/widget/error.jsx b/src/components/services/widget/error.jsx
index 30c41283..0d4757d3 100644
--- a/src/components/services/widget/error.jsx
+++ b/src/components/services/widget/error.jsx
@@ -1,4 +1,4 @@
-import { useTranslation } from "react-i18next";
+import { useTranslation } from "next-i18next";
import { IoAlertCircle } from "react-icons/io5";
function displayError(error) {
diff --git a/src/components/widgets/widget/error.jsx b/src/components/widgets/widget/error.jsx
index e454256f..e0e8b1e1 100644
--- a/src/components/widgets/widget/error.jsx
+++ b/src/components/widgets/widget/error.jsx
@@ -1,4 +1,4 @@
-import { useTranslation } from "react-i18next";
+import { useTranslation } from "next-i18next";
import { BiError } from "react-icons/bi";
import Container from "./container";
diff --git a/src/widgets/lubelogger/component.jsx b/src/widgets/lubelogger/component.jsx
index 390b74ea..5ec88983 100644
--- a/src/widgets/lubelogger/component.jsx
+++ b/src/widgets/lubelogger/component.jsx
@@ -1,6 +1,6 @@
import Block from "components/services/widget/block";
import Container from "components/services/widget/container";
-import { useTranslation } from "react-i18next";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
diff --git a/src/widgets/prowlarr/component.jsx b/src/widgets/prowlarr/component.jsx
index 13d388f7..e454c1a7 100644
--- a/src/widgets/prowlarr/component.jsx
+++ b/src/widgets/prowlarr/component.jsx
@@ -1,6 +1,6 @@
import Block from "components/services/widget/block";
import Container from "components/services/widget/container";
-import { useTranslation } from "react-i18next";
+import { useTranslation } from "next-i18next";
import useWidgetAPI from "utils/proxy/use-widget-api";
From ae9fbdcb8bae4c00388aca132faa67d6b33069e1 Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Sat, 5 Apr 2025 23:54:48 -0700
Subject: [PATCH 80/89] Chore: change hoarder widget to karakeep (#5143)
---
docs/widgets/services/hoarder.md | 17 -------
docs/widgets/services/index.md | 2 +-
docs/widgets/services/karakeep.md | 17 +++++++
mkdocs.yml | 2 +-
public/locales/en/common.json | 2 +-
src/components/services/widget/container.jsx | 17 ++++++-
src/utils/proxy/handlers/credentialed.js | 1 +
src/widgets/components.js | 3 +-
src/widgets/hoarder/component.jsx | 49 --------------------
src/widgets/karakeep/component.jsx | 49 ++++++++++++++++++++
src/widgets/{hoarder => karakeep}/widget.js | 0
src/widgets/widgets.js | 5 +-
12 files changed, 91 insertions(+), 73 deletions(-)
delete mode 100644 docs/widgets/services/hoarder.md
create mode 100644 docs/widgets/services/karakeep.md
delete mode 100644 src/widgets/hoarder/component.jsx
create mode 100644 src/widgets/karakeep/component.jsx
rename src/widgets/{hoarder => karakeep}/widget.js (100%)
diff --git a/docs/widgets/services/hoarder.md b/docs/widgets/services/hoarder.md
deleted file mode 100644
index 3e8c82ad..00000000
--- a/docs/widgets/services/hoarder.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-title: Hoarder
-description: Hoarder Widget Configuration
----
-
-Learn more about [Hoarder](https://hoarder.app).
-
-Generate an API key for your user at `User Settings > API Keys`.
-
-Allowed fields: `["bookmarks", "favorites", "archived", "highlights", "lists", "tags"]` (maximum of 4).
-
-```yaml
-widget:
- type: hoarder
- url: http[s]://hoarder.host.or.ip[:port]
- key: hoarderapikey
-```
diff --git a/docs/widgets/services/index.md b/docs/widgets/services/index.md
index beb6d491..80ff72ba 100644
--- a/docs/widgets/services/index.md
+++ b/docs/widgets/services/index.md
@@ -51,7 +51,7 @@ You can also find a list of all available service widgets in the sidebar navigat
- [HDHomeRun](hdhomerun.md)
- [Headscale](headscale.md)
- [Healthchecks](healthchecks.md)
-- [Hoarder](hoarder.md)
+- [Karakeep](karakeep.md)
- [Home Assistant](homeassistant.md)
- [HomeBox](homebox.md)
- [Homebridge](homebridge.md)
diff --git a/docs/widgets/services/karakeep.md b/docs/widgets/services/karakeep.md
new file mode 100644
index 00000000..a2902315
--- /dev/null
+++ b/docs/widgets/services/karakeep.md
@@ -0,0 +1,17 @@
+---
+title: Karakeep
+description: Karakeep Widget Configuration
+---
+
+Learn more about [Karakeep](https://karakeep.app) (formerly known as Hoarder).
+
+Generate an API key for your user at `User Settings > API Keys`.
+
+Allowed fields: `["bookmarks", "favorites", "archived", "highlights", "lists", "tags"]` (maximum of 4).
+
+```yaml
+widget:
+ type: karakeep
+ url: http[s]://karakeep.host.or.ip[:port]
+ key: karakeep_api_key
+```
diff --git a/mkdocs.yml b/mkdocs.yml
index 01a5295b..8bb19e43 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -74,7 +74,7 @@ nav:
- widgets/services/hdhomerun.md
- widgets/services/headscale.md
- widgets/services/healthchecks.md
- - widgets/services/hoarder.md
+ - widgets/services/karakeep.md
- widgets/services/homeassistant.md
- widgets/services/homebox.md
- widgets/services/homebridge.md
diff --git a/public/locales/en/common.json b/public/locales/en/common.json
index 4a9c33d5..09b9c2d3 100644
--- a/public/locales/en/common.json
+++ b/public/locales/en/common.json
@@ -1024,7 +1024,7 @@
"bcharge":"Battery Charge",
"timeleft":"Time Left"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/src/components/services/widget/container.jsx b/src/components/services/widget/container.jsx
index 9b10233c..f5957382 100644
--- a/src/components/services/widget/container.jsx
+++ b/src/components/services/widget/container.jsx
@@ -3,6 +3,11 @@ import { SettingsContext } from "utils/contexts/settings";
import Error from "./error";
+const ALIASED_WIDGETS = {
+ pialert: "netalertx",
+ hoarder: "karakeep",
+};
+
export default function Container({ error = false, children, service }) {
const { settings } = useContext(SettingsContext);
@@ -32,7 +37,17 @@ export default function Container({ error = false, children, service }) {
if (!field.includes(".")) {
fullField = `${type}.${field}`;
}
- return fullField === child?.props?.label;
+ let matches = fullField === child?.props?.label;
+ // check if the field is an 'alias'
+ if (matches) {
+ return true;
+ } else if (ALIASED_WIDGETS[type]) {
+ matches = fullField.replace(type, ALIASED_WIDGETS[type]) === child?.props?.label;
+
+ return matches;
+ }
+ // no match
+ return false;
}),
);
}
diff --git a/src/utils/proxy/handlers/credentialed.js b/src/utils/proxy/handlers/credentialed.js
index d0dbc2d6..017d44c9 100644
--- a/src/utils/proxy/handlers/credentialed.js
+++ b/src/utils/proxy/handlers/credentialed.js
@@ -42,6 +42,7 @@ export default async function credentialedProxyHandler(req, res, map) {
"ghostfolio",
"headscale",
"hoarder",
+ "karakeep",
"linkwarden",
"mealie",
"netalertx",
diff --git a/src/widgets/components.js b/src/widgets/components.js
index 148a626b..880c8222 100644
--- a/src/widgets/components.js
+++ b/src/widgets/components.js
@@ -47,7 +47,8 @@ const components = {
grafana: dynamic(() => import("./grafana/component")),
hdhomerun: dynamic(() => import("./hdhomerun/component")),
headscale: dynamic(() => import("./headscale/component")),
- hoarder: dynamic(() => import("./hoarder/component")),
+ hoarder: dynamic(() => import("./karakeep/component")),
+ karakeep: dynamic(() => import("./karakeep/component")),
peanut: dynamic(() => import("./peanut/component")),
homeassistant: dynamic(() => import("./homeassistant/component")),
homebox: dynamic(() => import("./homebox/component")),
diff --git a/src/widgets/hoarder/component.jsx b/src/widgets/hoarder/component.jsx
deleted file mode 100644
index 4be6fbab..00000000
--- a/src/widgets/hoarder/component.jsx
+++ /dev/null
@@ -1,49 +0,0 @@
-import Block from "components/services/widget/block";
-import Container from "components/services/widget/container";
-import { useTranslation } from "next-i18next";
-
-import useWidgetAPI from "utils/proxy/use-widget-api";
-
-export const hoarderDefaultFields = ["bookmarks", "favorites", "archived", "highlights"];
-const MAX_ALLOWED_FIELDS = 4;
-
-export default function Component({ service }) {
- const { t } = useTranslation();
- const { widget } = service;
-
- const { data: statsData, error: statsError } = useWidgetAPI(widget, "stats");
-
- if (statsError) {
- return ;
- }
-
- if (!widget.fields || widget.fields.length === 0) {
- widget.fields = hoarderDefaultFields;
- } else if (widget.fields?.length > MAX_ALLOWED_FIELDS) {
- widget.fields = widget.fields.slice(0, MAX_ALLOWED_FIELDS);
- }
-
- if (!statsData) {
- return (
-
-
-
-
-
-
-
-
- );
- }
-
- return (
-
-
-
-
-
-
-
-
- );
-}
diff --git a/src/widgets/karakeep/component.jsx b/src/widgets/karakeep/component.jsx
new file mode 100644
index 00000000..8a74662d
--- /dev/null
+++ b/src/widgets/karakeep/component.jsx
@@ -0,0 +1,49 @@
+import Block from "components/services/widget/block";
+import Container from "components/services/widget/container";
+import { useTranslation } from "next-i18next";
+
+import useWidgetAPI from "utils/proxy/use-widget-api";
+
+export const karakeepDefaultFields = ["bookmarks", "favorites", "archived", "highlights"];
+const MAX_ALLOWED_FIELDS = 4;
+
+export default function Component({ service }) {
+ const { t } = useTranslation();
+ const { widget } = service;
+
+ const { data: statsData, error: statsError } = useWidgetAPI(widget, "stats");
+
+ if (statsError) {
+ return ;
+ }
+
+ if (!widget.fields || widget.fields.length === 0) {
+ widget.fields = karakeepDefaultFields;
+ } else if (widget.fields?.length > MAX_ALLOWED_FIELDS) {
+ widget.fields = widget.fields.slice(0, MAX_ALLOWED_FIELDS);
+ }
+
+ if (!statsData) {
+ return (
+
+
+
+
+
+
+
+
+ );
+ }
+
+ return (
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/widgets/hoarder/widget.js b/src/widgets/karakeep/widget.js
similarity index 100%
rename from src/widgets/hoarder/widget.js
rename to src/widgets/karakeep/widget.js
diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js
index 992855d0..e183a9c6 100644
--- a/src/widgets/widgets.js
+++ b/src/widgets/widgets.js
@@ -42,7 +42,6 @@ import grafana from "./grafana/widget";
import hdhomerun from "./hdhomerun/widget";
import headscale from "./headscale/widget";
import healthchecks from "./healthchecks/widget";
-import hoarder from "./hoarder/widget";
import homeassistant from "./homeassistant/widget";
import homebox from "./homebox/widget";
import homebridge from "./homebridge/widget";
@@ -50,6 +49,7 @@ import immich from "./immich/widget";
import jackett from "./jackett/widget";
import jdownloader from "./jdownloader/widget";
import jellyseerr from "./jellyseerr/widget";
+import karakeep from "./karakeep/widget";
import kavita from "./kavita/widget";
import komga from "./komga/widget";
import kopia from "./kopia/widget";
@@ -178,7 +178,8 @@ const widgets = {
grafana,
hdhomerun,
headscale,
- hoarder,
+ hoarder: karakeep,
+ karakeep,
homeassistant,
homebox,
homebridge,
From e2c997f29d10cd6dddb60d17e8205b7ab55c8942 Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Mon, 7 Apr 2025 23:59:22 -0700
Subject: [PATCH 81/89] Change: install iputils-ping inside docker image
(#5153)
---
Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Dockerfile b/Dockerfile
index ec59c6b0..cac7623e 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -49,7 +49,7 @@ COPY --link --chmod=755 docker-entrypoint.sh /usr/local/bin/
COPY --link --from=builder --chown=1000:1000 /app/.next/standalone/ ./
COPY --link --from=builder --chown=1000:1000 /app/.next/static/ ./.next/static
-RUN apk add --no-cache su-exec
+RUN apk add --no-cache su-exec iputils-ping
ENV NODE_ENV=production
ENV HOSTNAME=0.0.0.0
From 0a1bf3b2be10220e5ee5ec8de7578f8f35bedd7f Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 8 Apr 2025 15:08:54 -0700
Subject: [PATCH 82/89] Chore(deps): Bump next from 15.2.3 to 15.2.4 (#5159)
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
package.json | 2 +-
pnpm-lock.yaml | 106 +++++++++++++++++++++++--------------------------
2 files changed, 50 insertions(+), 58 deletions(-)
diff --git a/package.json b/package.json
index 96772f7f..0c3afd92 100644
--- a/package.json
+++ b/package.json
@@ -25,7 +25,7 @@
"luxon": "^3.5.0",
"memory-cache": "^0.2.0",
"minecraftstatuspinger": "^1.2.2",
- "next": "^15.2.3",
+ "next": "^15.2.4",
"next-i18next": "^12.1.0",
"ping": "^0.4.4",
"pretty-bytes": "^6.1.1",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 938fd85b..170e380e 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -51,11 +51,11 @@ importers:
specifier: ^1.2.2
version: 1.2.2
next:
- specifier: ^15.2.3
- version: 15.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ specifier: ^15.2.4
+ version: 15.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
next-i18next:
specifier: ^12.1.0
- version: 12.1.0(next@15.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ version: 12.1.0(next@15.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
ping:
specifier: ^0.4.4
version: 0.4.4
@@ -182,9 +182,6 @@ packages:
'@emnapi/core@1.4.0':
resolution: {integrity: sha512-H+N/FqT07NmLmt6OFFtDfwe8PNygprzBikrEMyQfgqSmT0vzE515Pz7R8izwB9q/zsH/MA64AKoul3sA6/CzVg==}
- '@emnapi/runtime@1.3.1':
- resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==}
-
'@emnapi/runtime@1.4.0':
resolution: {integrity: sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==}
@@ -401,56 +398,56 @@ packages:
'@napi-rs/wasm-runtime@0.2.8':
resolution: {integrity: sha512-OBlgKdX7gin7OIq4fadsjpg+cp2ZphvAIKucHsNfTdJiqdOmOEwQd/bHi0VwNrcw5xpBJyUw6cK/QilCqy1BSg==}
- '@next/env@15.2.3':
- resolution: {integrity: sha512-a26KnbW9DFEUsSxAxKBORR/uD9THoYoKbkpFywMN/AFvboTt94b8+g/07T8J6ACsdLag8/PDU60ov4rPxRAixw==}
+ '@next/env@15.2.4':
+ resolution: {integrity: sha512-+SFtMgoiYP3WoSswuNmxJOCwi06TdWE733D+WPjpXIe4LXGULwEaofiiAy6kbS0+XjM5xF5n3lKuBwN2SnqD9g==}
'@next/eslint-plugin-next@15.2.4':
resolution: {integrity: sha512-O8ScvKtnxkp8kL9TpJTTKnMqlkZnS+QxwoQnJwPGBxjBbzd6OVVPEJ5/pMNrktSyXQD/chEfzfFzYLM6JANOOQ==}
- '@next/swc-darwin-arm64@15.2.3':
- resolution: {integrity: sha512-uaBhA8aLbXLqwjnsHSkxs353WrRgQgiFjduDpc7YXEU0B54IKx3vU+cxQlYwPCyC8uYEEX7THhtQQsfHnvv8dw==}
+ '@next/swc-darwin-arm64@15.2.4':
+ resolution: {integrity: sha512-1AnMfs655ipJEDC/FHkSr0r3lXBgpqKo4K1kiwfUf3iE68rDFXZ1TtHdMvf7D0hMItgDZ7Vuq3JgNMbt/+3bYw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
- '@next/swc-darwin-x64@15.2.3':
- resolution: {integrity: sha512-pVwKvJ4Zk7h+4hwhqOUuMx7Ib02u3gDX3HXPKIShBi9JlYllI0nU6TWLbPT94dt7FSi6mSBhfc2JrHViwqbOdw==}
+ '@next/swc-darwin-x64@15.2.4':
+ resolution: {integrity: sha512-3qK2zb5EwCwxnO2HeO+TRqCubeI/NgCe+kL5dTJlPldV/uwCnUgC7VbEzgmxbfrkbjehL4H9BPztWOEtsoMwew==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
- '@next/swc-linux-arm64-gnu@15.2.3':
- resolution: {integrity: sha512-50ibWdn2RuFFkOEUmo9NCcQbbV9ViQOrUfG48zHBCONciHjaUKtHcYFiCwBVuzD08fzvzkWuuZkd4AqbvKO7UQ==}
+ '@next/swc-linux-arm64-gnu@15.2.4':
+ resolution: {integrity: sha512-HFN6GKUcrTWvem8AZN7tT95zPb0GUGv9v0d0iyuTb303vbXkkbHDp/DxufB04jNVD+IN9yHy7y/6Mqq0h0YVaQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- '@next/swc-linux-arm64-musl@15.2.3':
- resolution: {integrity: sha512-2gAPA7P652D3HzR4cLyAuVYwYqjG0mt/3pHSWTCyKZq/N/dJcUAEoNQMyUmwTZWCJRKofB+JPuDVP2aD8w2J6Q==}
+ '@next/swc-linux-arm64-musl@15.2.4':
+ resolution: {integrity: sha512-Oioa0SORWLwi35/kVB8aCk5Uq+5/ZIumMK1kJV+jSdazFm2NzPDztsefzdmzzpx5oGCJ6FkUC7vkaUseNTStNA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- '@next/swc-linux-x64-gnu@15.2.3':
- resolution: {integrity: sha512-ODSKvrdMgAJOVU4qElflYy1KSZRM3M45JVbeZu42TINCMG3anp7YCBn80RkISV6bhzKwcUqLBAmOiWkaGtBA9w==}
+ '@next/swc-linux-x64-gnu@15.2.4':
+ resolution: {integrity: sha512-yb5WTRaHdkgOqFOZiu6rHV1fAEK0flVpaIN2HB6kxHVSy/dIajWbThS7qON3W9/SNOH2JWkVCyulgGYekMePuw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- '@next/swc-linux-x64-musl@15.2.3':
- resolution: {integrity: sha512-ZR9kLwCWrlYxwEoytqPi1jhPd1TlsSJWAc+H/CJHmHkf2nD92MQpSRIURR1iNgA/kuFSdxB8xIPt4p/T78kwsg==}
+ '@next/swc-linux-x64-musl@15.2.4':
+ resolution: {integrity: sha512-Dcdv/ix6srhkM25fgXiyOieFUkz+fOYkHlydWCtB0xMST6X9XYI3yPDKBZt1xuhOytONsIFJFB08xXYsxUwJLw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- '@next/swc-win32-arm64-msvc@15.2.3':
- resolution: {integrity: sha512-+G2FrDcfm2YDbhDiObDU/qPriWeiz/9cRR0yMWJeTLGGX6/x8oryO3tt7HhodA1vZ8r2ddJPCjtLcpaVl7TE2Q==}
+ '@next/swc-win32-arm64-msvc@15.2.4':
+ resolution: {integrity: sha512-dW0i7eukvDxtIhCYkMrZNQfNicPDExt2jPb9AZPpL7cfyUo7QSNl1DjsHjmmKp6qNAqUESyT8YFl/Aw91cNJJg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
- '@next/swc-win32-x64-msvc@15.2.3':
- resolution: {integrity: sha512-gHYS9tc+G2W0ZC8rBL+H6RdtXIyk40uLiaos0yj5US85FNhbFEndMA2nW3z47nzOWiSvXTZ5kBClc3rD0zJg0w==}
+ '@next/swc-win32-x64-msvc@15.2.4':
+ resolution: {integrity: sha512-SbnWkJmkS7Xl3kre8SdMF6F/XDh1DTFEhp0jRTj/uB8iPKoU2bb2NDfcu+iifv1+mxQEd1g2vvSxcZbXSKyWiQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
@@ -985,8 +982,8 @@ packages:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
- caniuse-lite@1.0.30001706:
- resolution: {integrity: sha512-3ZczoTApMAZwPKYWmwVbQMFpXBDds3/0VciVoUwPUbldlYyVLmRVuRs/PcUZtHpbLRpzzDvrvnFuREsGt6lUug==}
+ caniuse-lite@1.0.30001712:
+ resolution: {integrity: sha512-MBqPpGYYdQ7/hfKiet9SCI+nmN5/hp4ZzveOJubl5DTAMa5oggjAuoi0Z4onBpKPFI2ePGnQuQIzF3VxDjDJig==}
chalk@4.1.2:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
@@ -2085,8 +2082,8 @@ packages:
next: '>= 10.0.0'
react: '>= 16.8.0'
- next@15.2.3:
- resolution: {integrity: sha512-x6eDkZxk2rPpu46E1ZVUWIBhYCLszmUY6fvHBFcbzJ9dD+qRX6vcHusaqqDlnY+VngKzKbAiG2iRCkPbmi8f7w==}
+ next@15.2.4:
+ resolution: {integrity: sha512-VwL+LAaPSxEkd3lU2xWbgEOtrM8oedmyhBqaVNmgKB+GvZlCy9rgaEc+y2on0wv+l0oSFqLtYD6dcC1eAedUaQ==}
engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
hasBin: true
peerDependencies:
@@ -2918,11 +2915,6 @@ snapshots:
tslib: 2.8.1
optional: true
- '@emnapi/runtime@1.3.1':
- dependencies:
- tslib: 2.8.1
- optional: true
-
'@emnapi/runtime@1.4.0':
dependencies:
tslib: 2.8.1
@@ -3078,7 +3070,7 @@ snapshots:
'@img/sharp-wasm32@0.33.5':
dependencies:
- '@emnapi/runtime': 1.3.1
+ '@emnapi/runtime': 1.4.0
optional: true
'@img/sharp-win32-ia32@0.33.5':
@@ -3142,34 +3134,34 @@ snapshots:
'@tybys/wasm-util': 0.9.0
optional: true
- '@next/env@15.2.3': {}
+ '@next/env@15.2.4': {}
'@next/eslint-plugin-next@15.2.4':
dependencies:
fast-glob: 3.3.1
- '@next/swc-darwin-arm64@15.2.3':
+ '@next/swc-darwin-arm64@15.2.4':
optional: true
- '@next/swc-darwin-x64@15.2.3':
+ '@next/swc-darwin-x64@15.2.4':
optional: true
- '@next/swc-linux-arm64-gnu@15.2.3':
+ '@next/swc-linux-arm64-gnu@15.2.4':
optional: true
- '@next/swc-linux-arm64-musl@15.2.3':
+ '@next/swc-linux-arm64-musl@15.2.4':
optional: true
- '@next/swc-linux-x64-gnu@15.2.3':
+ '@next/swc-linux-x64-gnu@15.2.4':
optional: true
- '@next/swc-linux-x64-musl@15.2.3':
+ '@next/swc-linux-x64-musl@15.2.4':
optional: true
- '@next/swc-win32-arm64-msvc@15.2.3':
+ '@next/swc-win32-arm64-msvc@15.2.4':
optional: true
- '@next/swc-win32-x64-msvc@15.2.3':
+ '@next/swc-win32-x64-msvc@15.2.4':
optional: true
'@nodelib/fs.scandir@2.1.5':
@@ -3703,7 +3695,7 @@ snapshots:
callsites@3.1.0: {}
- caniuse-lite@1.0.30001706: {}
+ caniuse-lite@1.0.30001712: {}
chalk@4.1.2:
dependencies:
@@ -4913,7 +4905,7 @@ snapshots:
natural-compare@1.4.0: {}
- next-i18next@12.1.0(next@15.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ next-i18next@12.1.0(next@15.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
'@babel/runtime': 7.26.9
'@types/hoist-non-react-statics': 3.3.6
@@ -4921,33 +4913,33 @@ snapshots:
hoist-non-react-statics: 3.3.2
i18next: 21.10.0
i18next-fs-backend: 1.2.0
- next: 15.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ next: 15.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
react-i18next: 11.18.6(i18next@21.10.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
transitivePeerDependencies:
- react-dom
- react-native
- next@15.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ next@15.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@next/env': 15.2.3
+ '@next/env': 15.2.4
'@swc/counter': 0.1.3
'@swc/helpers': 0.5.15
busboy: 1.6.0
- caniuse-lite: 1.0.30001706
+ caniuse-lite: 1.0.30001712
postcss: 8.4.31
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
styled-jsx: 5.1.6(react@18.3.1)
optionalDependencies:
- '@next/swc-darwin-arm64': 15.2.3
- '@next/swc-darwin-x64': 15.2.3
- '@next/swc-linux-arm64-gnu': 15.2.3
- '@next/swc-linux-arm64-musl': 15.2.3
- '@next/swc-linux-x64-gnu': 15.2.3
- '@next/swc-linux-x64-musl': 15.2.3
- '@next/swc-win32-arm64-msvc': 15.2.3
- '@next/swc-win32-x64-msvc': 15.2.3
+ '@next/swc-darwin-arm64': 15.2.4
+ '@next/swc-darwin-x64': 15.2.4
+ '@next/swc-linux-arm64-gnu': 15.2.4
+ '@next/swc-linux-arm64-musl': 15.2.4
+ '@next/swc-linux-x64-gnu': 15.2.4
+ '@next/swc-linux-x64-musl': 15.2.4
+ '@next/swc-win32-arm64-msvc': 15.2.4
+ '@next/swc-win32-x64-msvc': 15.2.4
sharp: 0.33.5
transitivePeerDependencies:
- '@babel/core'
From 1fe4f4977127a3f58146e9fa39611e745d4a8eb0 Mon Sep 17 00:00:00 2001
From: Kevin Stone
Date: Sun, 20 Apr 2025 17:39:25 -0700
Subject: [PATCH 83/89] Fix: Longhorn still showing Total despite `total:
false` (#5200)
---
src/components/widgets/longhorn/longhorn.jsx | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/components/widgets/longhorn/longhorn.jsx b/src/components/widgets/longhorn/longhorn.jsx
index 235c77d0..db68cd7b 100644
--- a/src/components/widgets/longhorn/longhorn.jsx
+++ b/src/components/widgets/longhorn/longhorn.jsx
@@ -32,8 +32,8 @@ export default function Longhorn({ options }) {
{data.nodes
.filter((node) => {
- if (node.id === "total" && total) {
- return true;
+ if (node.id === "total") {
+ return total;
}
if (!nodes) {
return false;
From d99c3cb6915781ab162c053e43e6f691860669e1 Mon Sep 17 00:00:00 2001
From: xethlyx <46338199+xethlyx@users.noreply.github.com>
Date: Sun, 20 Apr 2025 20:39:56 -0400
Subject: [PATCH 84/89] Fix: kubernetes statistics not respecting selector
(#5199)
---
.../api/kubernetes/stats/[...service].js | 54 ++++++++-----------
1 file changed, 23 insertions(+), 31 deletions(-)
diff --git a/src/pages/api/kubernetes/stats/[...service].js b/src/pages/api/kubernetes/stats/[...service].js
index 3c89dc39..ab454183 100644
--- a/src/pages/api/kubernetes/stats/[...service].js
+++ b/src/pages/api/kubernetes/stats/[...service].js
@@ -53,9 +53,11 @@ export default async function handler(req, res) {
return;
}
+ const podNames = new Set();
let cpuLimit = 0;
let memLimit = 0;
pods.forEach((pod) => {
+ podNames.add(pod.metadata.name);
pod.spec.containers.forEach((container) => {
if (container?.resources?.limits?.cpu) {
cpuLimit += parseCpu(container?.resources?.limits?.cpu);
@@ -66,42 +68,32 @@ export default async function handler(req, res) {
});
});
- const podStatsList = await Promise.all(
- pods.map(async (pod) => {
- let depMem = 0;
- let depCpu = 0;
- const podMetrics = await metricsApi
- .getPodMetrics(namespace, pod.items)
- .then((response) => response.items)
- .catch((err) => {
- // 404 generally means that the metrics have not been populated yet
- if (err.statusCode !== 404) {
- logger.error("Error getting pod metrics: %d %s %s", err.statusCode, err.body, err.response);
- }
- return null;
- });
- if (podMetrics) {
- podMetrics.forEach((metrics) => {
- metrics.containers.forEach((container) => {
- depMem += parseMemory(container.usage.memory);
- depCpu += parseCpu(container.usage.cpu);
- });
- });
+ const namespaceMetrics = await metricsApi
+ .getPodMetrics(namespace)
+ .then((response) => response.items)
+ .catch((err) => {
+ // 404 generally means that the metrics have not been populated yet
+ if (err.statusCode !== 404) {
+ logger.error("Error getting pod metrics: %d %s %s", err.statusCode, err.body, err.response);
}
- return {
- mem: depMem,
- cpu: depCpu,
- };
- }),
- );
+ return null;
+ });
+
const stats = {
mem: 0,
cpu: 0,
};
- podStatsList.forEach((podStat) => {
- stats.mem += podStat.mem;
- stats.cpu += podStat.cpu;
- });
+
+ if (namespaceMetrics) {
+ const podMetrics = namespaceMetrics.filter((item) => podNames.has(item.metadata.name));
+ podMetrics.forEach((metrics) => {
+ metrics.containers.forEach((container) => {
+ stats.mem += parseMemory(container.usage.memory);
+ stats.cpu += parseCpu(container.usage.cpu);
+ });
+ });
+ }
+
stats.cpuLimit = cpuLimit;
stats.memLimit = memLimit;
stats.cpuUsage = cpuLimit ? 100 * (stats.cpu / cpuLimit) : 0;
From a35da39c0338b345a1eebf4d3ca1e7facf903a8a Mon Sep 17 00:00:00 2001
From: Rayan Mestiri
Date: Fri, 25 Apr 2025 10:11:03 +0200
Subject: [PATCH 85/89] Enhancement: add label formatting for dynamic-list
customapi widget (#5217)
---
docs/widgets/services/customapi.md | 1 +
src/widgets/customapi/component.jsx | 4 ++--
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/docs/widgets/services/customapi.md b/docs/widgets/services/customapi.md
index 70947a10..37a48fd8 100644
--- a/docs/widgets/services/customapi.md
+++ b/docs/widgets/services/customapi.md
@@ -189,6 +189,7 @@ widget:
name: id # required, field in each item to use as the item name (left side)
label: ip_address # required, field in each item to use as the item label (right side)
limit: 5 # optional, limit the number of items to display
+ format: text # optional - format of the label field
target: https://example.com/server/{id} # optional, makes items clickable with template support
```
diff --git a/src/widgets/customapi/component.jsx b/src/widgets/customapi/component.jsx
index 50a371ad..f537e8da 100644
--- a/src/widgets/customapi/component.jsx
+++ b/src/widgets/customapi/component.jsx
@@ -267,14 +267,14 @@ export default function Component({ service }) {
>
{itemName}
-
{itemLabel}
+
{formatValue(t, mappings, itemLabel)}
) : (
{itemName}
-
{itemLabel}
+
{formatValue(t, mappings, itemLabel)}
);
From 4a9ca62efde9d1613acce3f9b9750d8f0d7eb8fe Mon Sep 17 00:00:00 2001
From: choehn86 <42713647+choehn86@users.noreply.github.com>
Date: Mon, 28 Apr 2025 11:00:02 -0400
Subject: [PATCH 86/89] Enhancement: Add support for specifying a datastore to
PBS widget (#4614)
Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
---
src/utils/config/service-helpers.js | 6 ++++++
src/widgets/proxmoxbackupserver/component.jsx | 13 ++++++++++++-
2 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/src/utils/config/service-helpers.js b/src/utils/config/service-helpers.js
index c3df6579..297e55a7 100644
--- a/src/utils/config/service-helpers.js
+++ b/src/utils/config/service-helpers.js
@@ -362,6 +362,9 @@ export function cleanServiceGroups(groups) {
// proxmox
node,
+ // proxmoxbackupserver
+ datastore,
+
// speedtest
bitratePrecision,
@@ -437,6 +440,9 @@ export function cleanServiceGroups(groups) {
if (type === "proxmox") {
if (node) widget.node = node;
}
+ if (type === "proxmoxbackupserver") {
+ if (datastore) widget.datastore = datastore;
+ }
if (type === "kubernetes") {
if (namespace) widget.namespace = namespace;
if (app) widget.app = app;
diff --git a/src/widgets/proxmoxbackupserver/component.jsx b/src/widgets/proxmoxbackupserver/component.jsx
index efc71bbb..b13f8756 100644
--- a/src/widgets/proxmoxbackupserver/component.jsx
+++ b/src/widgets/proxmoxbackupserver/component.jsx
@@ -29,7 +29,18 @@ export default function Component({ service }) {
);
}
- const datastoreUsage = datastoreData.data ? (datastoreData.data[0].used / datastoreData.data[0].total) * 100 : 0;
+ const datastoreIndex = !!widget.datastore
+ ? datastoreData.data.findIndex(function (ds) {
+ return ds.store == widget.datastore;
+ })
+ : -1;
+ const datastoreUsage =
+ datastoreIndex > -1
+ ? (datastoreData.data[datastoreIndex].used / datastoreData.data[datastoreIndex].total) * 100
+ : (datastoreData.data.reduce((sum, datastore) => sum + datastore.used, 0) /
+ datastoreData.data.reduce((sum, datastore) => sum + datastore.total, 0)) *
+ 100;
+
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;
From 7272823d20de59a29d4bd2c515a7e49947e1a059 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Mon, 28 Apr 2025 08:23:41 -0700
Subject: [PATCH 87/89] New Crowdin translations by GitHub Action (#5092)
Co-authored-by: Crowdin Bot
---
public/locales/af/common.json | 2 +-
public/locales/ar/common.json | 2 +-
public/locales/bg/common.json | 6 +-
public/locales/ca/common.json | 2 +-
public/locales/cs/common.json | 382 ++++++++++++++---------------
public/locales/da/common.json | 2 +-
public/locales/de/common.json | 22 +-
public/locales/el/common.json | 2 +-
public/locales/eo/common.json | 2 +-
public/locales/es/common.json | 20 +-
public/locales/eu/common.json | 10 +-
public/locales/fi/common.json | 2 +-
public/locales/fr/common.json | 44 ++--
public/locales/he/common.json | 2 +-
public/locales/hi/common.json | 2 +-
public/locales/hr/common.json | 2 +-
public/locales/hu/common.json | 2 +-
public/locales/id/common.json | 12 +-
public/locales/it/common.json | 40 +--
public/locales/ja/common.json | 2 +-
public/locales/ko/common.json | 50 ++--
public/locales/lv/common.json | 2 +-
public/locales/ms/common.json | 2 +-
public/locales/nl/common.json | 2 +-
public/locales/no/common.json | 2 +-
public/locales/pl/common.json | 22 +-
public/locales/pt/common.json | 2 +-
public/locales/pt_BR/common.json | 8 +-
public/locales/ro/common.json | 2 +-
public/locales/ru/common.json | 6 +-
public/locales/sk/common.json | 2 +-
public/locales/sl/common.json | 2 +-
public/locales/sr/common.json | 2 +-
public/locales/sv/common.json | 2 +-
public/locales/te/common.json | 2 +-
public/locales/th/common.json | 2 +-
public/locales/tr/common.json | 2 +-
public/locales/uk/common.json | 48 ++--
public/locales/vi/common.json | 2 +-
public/locales/yue/common.json | 172 ++++++-------
public/locales/zh-Hans/common.json | 2 +-
public/locales/zh-Hant/common.json | 172 ++++++-------
42 files changed, 534 insertions(+), 534 deletions(-)
diff --git a/public/locales/af/common.json b/public/locales/af/common.json
index bf1e5f9c..fa71b238 100644
--- a/public/locales/af/common.json
+++ b/public/locales/af/common.json
@@ -1024,7 +1024,7 @@
"bcharge": "Batterylading",
"timeleft": "Oorblywende Tyd"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Boekmerke",
"favorites": "Gunstelinge",
"archived": "Geargiveer",
diff --git a/public/locales/ar/common.json b/public/locales/ar/common.json
index baa4d593..dbe892aa 100644
--- a/public/locales/ar/common.json
+++ b/public/locales/ar/common.json
@@ -1024,7 +1024,7 @@
"bcharge": "شحن البطارية",
"timeleft": "الوقت المتبقي"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/public/locales/bg/common.json b/public/locales/bg/common.json
index 3c721bce..ccb6f5bb 100644
--- a/public/locales/bg/common.json
+++ b/public/locales/bg/common.json
@@ -394,7 +394,7 @@
"strelaysrv": {
"numActiveSessions": "Сесии",
"numConnections": "Connections",
- "dataRelayed": "Relayed",
+ "dataRelayed": "",
"transferRate": "Скорост"
},
"mastodon": {
@@ -1002,7 +1002,7 @@
"argocd": {
"apps": "Приложения",
"synced": "Synced",
- "outOfSync": "Out Of Sync",
+ "outOfSync": "",
"healthy": "Здрав",
"degraded": "Деградирани",
"progressing": "Progressing",
@@ -1024,7 +1024,7 @@
"bcharge": "Заряд на батерията",
"timeleft": "Оставащо Време"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/public/locales/ca/common.json b/public/locales/ca/common.json
index 07b1f611..b70794b3 100644
--- a/public/locales/ca/common.json
+++ b/public/locales/ca/common.json
@@ -1024,7 +1024,7 @@
"bcharge": "Càrrega de la bateria",
"timeleft": "Temps restant"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/public/locales/cs/common.json b/public/locales/cs/common.json
index e9a8061d..1d99ec95 100644
--- a/public/locales/cs/common.json
+++ b/public/locales/cs/common.json
@@ -85,16 +85,16 @@
"ping": {
"error": "Chyba",
"ping": "Odezva",
- "down": "Down",
- "up": "Up",
+ "down": "Výpadek",
+ "up": "Běží",
"not_available": "Není k dispozici"
},
"siteMonitor": {
"http_status": "Stav HTTP",
"error": "Chyba",
"response": "Odpověď",
- "down": "Down",
- "up": "Up",
+ "down": "Výpadek",
+ "up": "Běží",
"not_available": "Není k dispozici"
},
"emby": {
@@ -144,13 +144,13 @@
"uptime": "Doba spuštění",
"maxDown": "Max. Down",
"maxUp": "Max. Up",
- "down": "Down",
- "up": "Up",
+ "down": "Výpadek",
+ "up": "Běží",
"received": "Přijaté",
"sent": "Odeslané",
"externalIPAddress": "Ext. IP",
- "externalIPv6Address": "Ext. IPv6",
- "externalIPv6Prefix": "Ext. IPv6-Prefix"
+ "externalIPv6Address": "Veřejná IPv6",
+ "externalIPv6Prefix": "Věřejná IPv6 prefix"
},
"caddy": {
"upstreams": "Odesílání dat",
@@ -178,7 +178,7 @@
"connectedAp": "Připojené APs",
"activeUser": "Aktivní zařízení",
"alerts": "Upozornění",
- "connectedGateways": "Connected gateways",
+ "connectedGateways": "Připojené brány",
"connectedSwitches": "Připojené přepínače"
},
"nzbget": {
@@ -229,8 +229,8 @@
"seed": "Seedované"
},
"develancacheui": {
- "cachehitbytes": "Cache Hit Bytes",
- "cachemissbytes": "Cache Miss Bytes"
+ "cachehitbytes": "Byty nalezené v mezipaměti",
+ "cachemissbytes": "Byty nenalezené v mezipaměti"
},
"downloadstation": {
"download": "Stahování",
@@ -287,7 +287,7 @@
"total": "Celkem",
"connected": "",
"new_devices": "",
- "down_alerts": "Down Alerts"
+ "down_alerts": "Upozornění na výpadek"
},
"pihole": {
"queries": "Dotazy",
@@ -313,13 +313,13 @@
},
"suwayomi": {
"download": "Staženo",
- "nondownload": "Non-Downloaded",
+ "nondownload": "Nestaženo",
"read": "Přečteno",
"unread": "Nepřečteno",
- "downloadedread": "Downloaded & Read",
- "downloadedunread": "Downloaded & Unread",
- "nondownloadedread": "Non-Downloaded & Read",
- "nondownloadedunread": "Non-Downloaded & Unread"
+ "downloadedread": "Staženo a přečteno",
+ "downloadedunread": "Staženo a nepřečteno",
+ "nondownloadedread": "Nestaženo a přečteno",
+ "nondownloadedunread": "Nestaženo a nepřečteno"
},
"tailscale": {
"address": "Adresa",
@@ -337,15 +337,15 @@
},
"technitium": {
"totalQueries": "Dotazy",
- "totalNoError": "Success",
- "totalServerFailure": "Failures",
- "totalNxDomain": "NX Domains",
- "totalRefused": "Refused",
- "totalAuthoritative": "Authoritative",
- "totalRecursive": "Recursive",
- "totalCached": "Cached",
+ "totalNoError": "Úspěšně",
+ "totalServerFailure": "Chyby",
+ "totalNxDomain": "NX domény",
+ "totalRefused": "Odmítnuto",
+ "totalAuthoritative": "Autoritativní",
+ "totalRecursive": "Rekurzivní",
+ "totalCached": "V mezipaměti",
"totalBlocked": "Blokováno",
- "totalDropped": "Dropped",
+ "totalDropped": "Vynecháno",
"totalClients": "Klienti"
},
"tdarr": {
@@ -434,7 +434,7 @@
"load": "Zatížení",
"wait": "Počkejte prosím",
"temp": "TEPLOTA",
- "_temp": "Temp",
+ "_temp": "Teplota",
"warn": "Varováni",
"uptime": "BĚŽÍ",
"total": "Celkem",
@@ -442,12 +442,12 @@
"used": "Využité",
"days": "d",
"hours": "h",
- "crit": "Crit",
+ "crit": "Kritické",
"read": "Přečteno",
- "write": "Write",
- "gpu": "GPU",
- "mem": "Mem",
- "swap": "Swap"
+ "write": "Zápis",
+ "gpu": "Grafická karta",
+ "mem": "Pamět RAM",
+ "swap": "Swap RAM"
},
"quicklaunch": {
"bookmark": "Záložka",
@@ -456,7 +456,7 @@
"custom": "Vlastní",
"visit": "Navštivte",
"url": "Odkaz",
- "searchsuggestion": "Suggestion"
+ "searchsuggestion": "Doporučení"
},
"wmo": {
"0-day": "Slunečno",
@@ -523,15 +523,15 @@
"up_to_date": "Žádné",
"child_bridges": "Podřízené můstky",
"child_bridges_status": "{{ok}}/{{total}}",
- "up": "Up",
+ "up": "Běží",
"pending": "Čeká",
- "down": "Down"
+ "down": "Výpadek"
},
"healthchecks": {
"new": "Nové",
- "up": "Up",
+ "up": "Běží",
"grace": "V období odkladu",
- "down": "Down",
+ "down": "Výpadek",
"paused": "Pozastaveno",
"status": "Stav",
"last_ping": "Poslední ping",
@@ -573,14 +573,14 @@
"hdhomerun": {
"channels": "Kanály",
"hd": "HD",
- "tunerCount": "Tuners",
- "channelNumber": "Channel",
- "channelNetwork": "Network",
- "signalStrength": "Strength",
- "signalQuality": "Quality",
- "symbolQuality": "Quality",
+ "tunerCount": "Tuner",
+ "channelNumber": "Kanál",
+ "channelNetwork": "Síť",
+ "signalStrength": "Síla",
+ "signalQuality": "Kvalita",
+ "symbolQuality": "Kvalita",
"networkRate": "Přenosová rychlost",
- "clientIP": "Client"
+ "clientIP": "Klient"
},
"scrutiny": {
"passed": "Úspěšné",
@@ -592,12 +592,12 @@
"total": "Celkem"
},
"peanut": {
- "battery_charge": "Battery Charge",
- "ups_load": "UPS Load",
- "ups_status": "UPS Status",
+ "battery_charge": "Úroveň baterie",
+ "ups_load": "Zítěž UPS",
+ "ups_status": "Stav UPS",
"online": "Online",
- "on_battery": "On Battery",
- "low_battery": "Low Battery"
+ "on_battery": "Na baterii",
+ "low_battery": "Nízký stav baterie"
},
"nextdns": {
"wait": "Čekejte prosím",
@@ -615,9 +615,9 @@
"streams_xepg": "Kanály XEPG"
},
"opendtu": {
- "yieldDay": "Today",
- "absolutePower": "Power",
- "relativePower": "Power %",
+ "yieldDay": "Dnes",
+ "absolutePower": "Výkon",
+ "relativePower": "Výkon %",
"limit": "Limit"
},
"opnsense": {
@@ -646,9 +646,9 @@
"load": "Prům. zatížení",
"memory": "Využití paměti",
"wanStatus": "Stav WAN",
- "up": "Up",
- "down": "Down",
- "temp": "Temp",
+ "up": "Běží",
+ "down": "Výpadek",
+ "temp": "Teplota",
"disk": "Využití disku",
"wanIP": "IP WAN"
},
@@ -668,14 +668,14 @@
"up": "Stránky Up",
"down": "Stránky Down",
"uptime": "Doba spuštění",
- "incident": "Incident",
+ "incident": "Událost",
"m": "m"
},
"atsumeru": {
"series": "Seriály",
- "archives": "Archives",
- "chapters": "Chapters",
- "categories": "Categories"
+ "archives": "Archivy",
+ "chapters": "Kapitoly",
+ "categories": "Kategorie"
},
"komga": {
"libraries": "Knihovny",
@@ -705,13 +705,13 @@
"time": "Čas"
},
"firefly": {
- "networth": "Net Worth",
- "budget": "Budget"
+ "networth": "Čisté jmění",
+ "budget": "Rozpočet"
},
"grafana": {
"dashboards": "Nástěnky",
"datasources": "Zdroje dat",
- "totalalerts": "Celkový počet upozornění",
+ "totalalerts": "Celkový počet upozornění2",
"alertstriggered": "Spuštěné výstrahy"
},
"nextcloud": {
@@ -749,7 +749,7 @@
"uptime": "Doba spuštění"
},
"ghostfolio": {
- "gross_percent_today": "Today",
+ "gross_percent_today": "Dnes",
"gross_percent_1y": "Jeden rok",
"gross_percent_max": "Za celou dobu"
},
@@ -770,8 +770,8 @@
},
"calibreweb": {
"books": "Knihy",
- "authors": "Authors",
- "categories": "Categories",
+ "authors": "Autoři",
+ "categories": "Kategorie",
"series": "Seriály"
},
"jdownloader": {
@@ -785,44 +785,44 @@
"totalFiles": "Soubory"
},
"azuredevops": {
- "result": "Result",
+ "result": "Výsledek",
"status": "Stav",
- "buildId": "Build ID",
- "succeeded": "Succeeded",
- "notStarted": "Not Started",
+ "buildId": "ID sestavení",
+ "succeeded": "Úspěšně",
+ "notStarted": "Nezahájeno",
"failed": "Selhalo",
- "canceled": "Canceled",
- "inProgress": "In Progress",
- "totalPrs": "Total PRs",
- "myPrs": "My PRs",
+ "canceled": "Zrušeno",
+ "inProgress": "Probíhá",
+ "totalPrs": "Celkem PR",
+ "myPrs": "Moje PR",
"approved": "Schváleno"
},
"gamedig": {
"status": "Stav",
"online": "Online",
"offline": "Offline",
- "name": "Name",
- "map": "Map",
- "currentPlayers": "Current players",
+ "name": "Jméno",
+ "map": "Mapa",
+ "currentPlayers": "Počet hráčů",
"players": "Hráči",
- "maxPlayers": "Max players",
- "bots": "Bots",
+ "maxPlayers": "Maximální počet hráčů",
+ "bots": "Boti",
"ping": "Odezva"
},
"urbackup": {
"ok": "Ok",
- "errored": "Errors",
- "noRecent": "Out of Date",
- "totalUsed": "Used Storage"
+ "errored": "Chyby",
+ "noRecent": "Zastaralý",
+ "totalUsed": "Využití úložiště"
},
"mealie": {
- "recipes": "Recipes",
+ "recipes": "Recepty",
"users": "Uživatelé",
- "categories": "Categories",
- "tags": "Tags"
+ "categories": "Kategorie",
+ "tags": "Štítky"
},
"openmediavault": {
- "downloading": "Downloading",
+ "downloading": "Stahování",
"total": "Celkem",
"running": "Běží",
"stopped": "Zastaveno",
@@ -831,95 +831,95 @@
},
"openwrt": {
"uptime": "Doba spuštění",
- "cpuLoad": "CPU Load Avg (5m)",
- "up": "Up",
- "down": "Down",
- "bytesTx": "Transmitted",
+ "cpuLoad": "Prům. zatížení procesoru (5m)",
+ "up": "Běží",
+ "down": "Výpadek",
+ "bytesTx": "Přeneseno",
"bytesRx": "Přijaté"
},
"uptimerobot": {
"status": "Stav",
"uptime": "Doba spuštění",
- "lastDown": "Last Downtime",
- "downDuration": "Downtime Duration",
+ "lastDown": "Poslední výpadek",
+ "downDuration": "Trvání výpadku",
"sitesUp": "Stránky Up",
"sitesDown": "Stránky Down",
"paused": "Pozastaveno",
- "notyetchecked": "Not Yet Checked",
- "up": "Up",
- "seemsdown": "Seems Down",
- "down": "Down",
+ "notyetchecked": "Zatím nezkontrolováno",
+ "up": "Běží",
+ "seemsdown": "Zdá se nedostupný",
+ "down": "Výpadek",
"unknown": "Neznámý"
},
"calendar": {
- "inCinemas": "In cinemas",
- "physicalRelease": "Physical release",
- "digitalRelease": "Digital release",
- "noEventsToday": "No events for today!",
- "noEventsFound": "No events found"
+ "inCinemas": "V kinech",
+ "physicalRelease": "Fyzické vydání",
+ "digitalRelease": "Digitální vydání",
+ "noEventsToday": "Pro dnešek žádné události!",
+ "noEventsFound": "Nemáte žádné události"
},
"romm": {
- "platforms": "Platforms",
- "totalRoms": "Games",
- "saves": "Saves",
- "states": "States",
- "screenshots": "Screenshots",
- "totalfilesize": "Total Size"
+ "platforms": "Platformy",
+ "totalRoms": "Hry",
+ "saves": "Uložené",
+ "states": "Stavy",
+ "screenshots": "Snímky obrazovky",
+ "totalfilesize": "Celková velikost"
},
"mailcow": {
"domains": "Domény",
- "mailboxes": "Mailboxes",
- "mails": "Mails",
+ "mailboxes": "E-mailové schránky",
+ "mails": "Maily",
"storage": "Úložiště"
},
"netdata": {
- "warnings": "Warnings",
- "criticals": "Criticals"
+ "warnings": "Upozornění",
+ "criticals": "Kritické"
},
"plantit": {
- "events": "Events",
- "plants": "Plants",
+ "events": "Události",
+ "plants": "Rostliny",
"photos": "Fotografie",
- "species": "Species"
+ "species": "Druhy"
},
"gitea": {
- "notifications": "Notifications",
+ "notifications": "Oznámení",
"issues": "Problémy",
"pulls": "Pull Requests",
- "repositories": "Repositories"
+ "repositories": "Repozitáře"
},
"stash": {
- "scenes": "Scenes",
- "scenesPlayed": "Scenes Played",
- "playCount": "Total Plays",
- "playDuration": "Time Watched",
- "sceneSize": "Scenes Size",
- "sceneDuration": "Scenes Duration",
- "images": "Images",
- "imageSize": "Images Size",
- "galleries": "Galleries",
- "performers": "Performers",
- "studios": "Studios",
+ "scenes": "Scény",
+ "scenesPlayed": "Přehrané scény",
+ "playCount": "Celkový počet přehrání",
+ "playDuration": "Čas sledování",
+ "sceneSize": "Velikost scén",
+ "sceneDuration": "Délka scény",
+ "images": "Obrázky",
+ "imageSize": "Velikost obrázků",
+ "galleries": "Galerie",
+ "performers": "Herci",
+ "studios": "Studia",
"movies": "Filmy",
- "tags": "Tags",
- "oCount": "O Count"
+ "tags": "Štítky",
+ "oCount": "Počet O"
},
"tandoor": {
"users": "Uživatelé",
- "recipes": "Recipes",
- "keywords": "Keywords"
+ "recipes": "Recepty",
+ "keywords": "Klíčová slova"
},
"homebox": {
- "items": "Items",
- "totalWithWarranty": "With Warranty",
- "locations": "Locations",
- "labels": "Labels",
+ "items": "Položky",
+ "totalWithWarranty": "Se zárukou",
+ "locations": "Lokality",
+ "labels": "Štítky",
"users": "Uživatelé",
- "totalValue": "Total Value"
+ "totalValue": "Celková hodnota"
},
"crowdsec": {
"alerts": "Upozornění",
- "bans": "Bans"
+ "bans": "Bany"
},
"wgeasy": {
"connected": "",
@@ -928,10 +928,10 @@
"total": "Celkem"
},
"swagdashboard": {
- "proxied": "Proxied",
- "auth": "With Auth",
- "outdated": "Outdated",
- "banned": "Banned"
+ "proxied": "Přes proxy",
+ "auth": "S ověřením",
+ "outdated": "Zastaralé",
+ "banned": "Zabanován"
},
"myspeed": {
"ping": "Odezva",
@@ -939,46 +939,46 @@
"upload": "Nahrávání"
},
"stocks": {
- "stocks": "Stocks",
- "loading": "Loading",
- "open": "Open - US Market",
- "closed": "Closed - US Market",
- "invalidConfiguration": "Invalid Configuration"
+ "stocks": "Akcie",
+ "loading": "Načítání",
+ "open": "Otevřeno - US trh",
+ "closed": "Uzavřeno - US trh",
+ "invalidConfiguration": "Neplatná konfigurace"
},
"frigate": {
- "cameras": "Cameras",
+ "cameras": "Kamery",
"uptime": "Doba spuštění",
"version": "Verze"
},
"linkwarden": {
- "links": "Links",
- "collections": "Collections",
- "tags": "Tags"
+ "links": "Linky",
+ "collections": "Sbírky",
+ "tags": "Štítky"
},
"zabbix": {
- "unclassified": "Not classified",
+ "unclassified": "Neklasifikováno",
"information": "Informace",
- "warning": "Warning",
- "average": "Average",
- "high": "High",
- "disaster": "Disaster"
+ "warning": "Upozornění",
+ "average": "Průměr",
+ "high": "Vysoký",
+ "disaster": "Katastrofa"
},
"lubelogger": {
- "vehicle": "Vehicle",
- "vehicles": "Vehicles",
- "serviceRecords": "Service Records",
- "reminders": "Reminders",
- "nextReminder": "Next Reminder",
- "none": "None"
+ "vehicle": "Vozidlo",
+ "vehicles": "Vozidla",
+ "serviceRecords": "Servisní záznamy",
+ "reminders": "Připomenutí",
+ "nextReminder": "Další připomenutí",
+ "none": "Žádné"
},
"vikunja": {
- "projects": "Active Projects",
- "tasks7d": "Tasks Due This Week",
- "tasksOverdue": "Overdue Tasks",
- "tasksInProgress": "Tasks In Progress"
+ "projects": "Aktivní projekty",
+ "tasks7d": "Úkoly k dokončení tento týden",
+ "tasksOverdue": "Zpožděné úkoly",
+ "tasksInProgress": "Probíhají úkoly"
},
"headscale": {
- "name": "Name",
+ "name": "Jméno",
"address": "Adresa",
"last_seen": "Naposledy viděno",
"status": "Stav",
@@ -986,10 +986,10 @@
"offline": "Offline"
},
"beszel": {
- "name": "Name",
- "systems": "Systems",
- "up": "Up",
- "down": "Down",
+ "name": "Jméno",
+ "systems": "Systém",
+ "up": "Běží",
+ "down": "Výpadek",
"paused": "Pozastaveno",
"pending": "Čeká",
"status": "Stav",
@@ -997,50 +997,50 @@
"cpu": "CPU",
"memory": "RAM",
"disk": "Disk",
- "network": "NET"
+ "network": "Síť"
},
"argocd": {
- "apps": "Apps",
- "synced": "Synced",
- "outOfSync": "Out Of Sync",
+ "apps": "Aplikace",
+ "synced": "Synchronizováno",
+ "outOfSync": "Nesynchronizováno",
"healthy": "Zdravý",
- "degraded": "Degraded",
- "progressing": "Progressing",
+ "degraded": "Degradováno",
+ "progressing": "Probíhá",
"missing": "Chybějící",
- "suspended": "Suspended"
+ "suspended": "Pozastaveno"
},
"spoolman": {
- "loading": "Loading"
+ "loading": "Načítání"
},
"gitlab": {
- "groups": "Groups",
+ "groups": "Skupiny",
"issues": "Problémy",
- "merges": "Merge Requests",
- "projects": "Projects"
+ "merges": "Žádosti o sloučení",
+ "projects": "Projekty"
},
"apcups": {
"status": "Stav",
"load": "Zatížení",
- "bcharge": "Battery Charge",
+ "bcharge": "Úroveň baterie",
"timeleft": "Zbývající čas"
},
- "hoarder": {
- "bookmarks": "Bookmarks",
- "favorites": "Favorites",
- "archived": "Archived",
- "highlights": "Highlights",
- "lists": "Lists",
- "tags": "Tags"
+ "karakeep": {
+ "bookmarks": "Záložky",
+ "favorites": "Oblíbené",
+ "archived": "Archivováno",
+ "highlights": "Zvýraznění",
+ "lists": "Seznamy",
+ "tags": "Štítky"
},
"slskd": {
- "slskStatus": "Network",
+ "slskStatus": "Síť",
"connected": "",
"disconnected": "Odpojeno",
- "updateStatus": "Update",
+ "updateStatus": "Aktualizace",
"update_yes": "Dostupné",
"update_no": "Žádné",
- "downloads": "Downloads",
- "uploads": "Uploads",
+ "downloads": "Stažení",
+ "uploads": "Nahrávání",
"sharedFiles": "Soubory"
}
}
diff --git a/public/locales/da/common.json b/public/locales/da/common.json
index 901d0ce4..c7115af3 100644
--- a/public/locales/da/common.json
+++ b/public/locales/da/common.json
@@ -1024,7 +1024,7 @@
"bcharge": "Batteriniveau",
"timeleft": "Resterende tid"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/public/locales/de/common.json b/public/locales/de/common.json
index 94fb91aa..6ea5a440 100644
--- a/public/locales/de/common.json
+++ b/public/locales/de/common.json
@@ -665,8 +665,8 @@
"storage": "Speicher"
},
"uptimekuma": {
- "up": "Seiten verfügbar",
- "down": "Seiten nicht verfügbar",
+ "up": "Up",
+ "down": "Down",
"uptime": "Betriebszeit",
"incident": "Vorfall",
"m": "min"
@@ -744,8 +744,8 @@
"targets_total": "Alle Ziele"
},
"gatus": {
- "up": "Seiten verfügbar",
- "down": "Seiten nicht verfügbar",
+ "up": "Up",
+ "down": "Down",
"uptime": "Betriebszeit"
},
"ghostfolio": {
@@ -842,8 +842,8 @@
"uptime": "Betriebszeit",
"lastDown": "Letzter Ausfall",
"downDuration": "Ausfalldauer",
- "sitesUp": "Seiten verfügbar",
- "sitesDown": "Seiten nicht verfügbar",
+ "sitesUp": "Up",
+ "sitesDown": "Down",
"paused": "Pausiert",
"notyetchecked": "Noch nicht geprüft",
"up": "Online",
@@ -1024,12 +1024,12 @@
"bcharge": "Akkuladung",
"timeleft": "Verbleibende Zeit"
},
- "hoarder": {
- "bookmarks": "Lesezeichen",
- "favorites": "Favoriten",
- "archived": "Archiviert",
+ "karakeep": {
+ "bookmarks": "Bookmarks",
+ "favorites": "Favorites",
+ "archived": "Archived",
"highlights": "Highlights",
- "lists": "Listen",
+ "lists": "Lists",
"tags": "Schlagwörter"
},
"slskd": {
diff --git a/public/locales/el/common.json b/public/locales/el/common.json
index b1cbe307..ea1539d9 100644
--- a/public/locales/el/common.json
+++ b/public/locales/el/common.json
@@ -1024,7 +1024,7 @@
"bcharge": "Battery Charge",
"timeleft": "Χρόνος που απομένει"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/public/locales/eo/common.json b/public/locales/eo/common.json
index 908bd124..f943d1c8 100644
--- a/public/locales/eo/common.json
+++ b/public/locales/eo/common.json
@@ -1024,7 +1024,7 @@
"bcharge": "Battery Charge",
"timeleft": "Time Left"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/public/locales/es/common.json b/public/locales/es/common.json
index a5ac67ed..76b03275 100644
--- a/public/locales/es/common.json
+++ b/public/locales/es/common.json
@@ -149,8 +149,8 @@
"received": "Recibido",
"sent": "Enviado",
"externalIPAddress": "IP ext.",
- "externalIPv6Address": "Ext. IPv6",
- "externalIPv6Prefix": "Ext. IPv6-Prefix"
+ "externalIPv6Address": "IPv6 ext.",
+ "externalIPv6Prefix": "Prefijo IPv6 ext."
},
"caddy": {
"upstreams": "Upstream (desarrollo de software)",
@@ -178,7 +178,7 @@
"connectedAp": "AP conectados",
"activeUser": "Dispositivos activos",
"alerts": "Alertas",
- "connectedGateways": "Connected gateways",
+ "connectedGateways": "Puertas de enlace conectadas",
"connectedSwitches": "Conmutadores conectados"
},
"nzbget": {
@@ -705,8 +705,8 @@
"time": "Tiempo"
},
"firefly": {
- "networth": "Net Worth",
- "budget": "Budget"
+ "networth": "Patrimonio neto",
+ "budget": "Presupuesto"
},
"grafana": {
"dashboards": "Tableros",
@@ -886,7 +886,7 @@
"notifications": "Notificaciones",
"issues": "Números",
"pulls": "Solicitudes de cambios",
- "repositories": "Repositories"
+ "repositories": "Repositorios"
},
"stash": {
"scenes": "Escenas",
@@ -1024,7 +1024,7 @@
"bcharge": "Carga de la batería",
"timeleft": "Tiempo restante"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
@@ -1036,11 +1036,11 @@
"slskStatus": "Red",
"connected": "Conectado",
"disconnected": "Desconectado",
- "updateStatus": "Update",
+ "updateStatus": "Actualización",
"update_yes": "Disponible",
"update_no": "Actualizado",
- "downloads": "Downloads",
- "uploads": "Uploads",
+ "downloads": "Descargas",
+ "uploads": "Subidas",
"sharedFiles": "Archivos"
}
}
diff --git a/public/locales/eu/common.json b/public/locales/eu/common.json
index f0654ebb..02d1150c 100644
--- a/public/locales/eu/common.json
+++ b/public/locales/eu/common.json
@@ -1024,12 +1024,12 @@
"bcharge": "Battery Charge",
"timeleft": "Time Left"
},
- "hoarder": {
- "bookmarks": "Laster-markak",
- "favorites": "Gogokoak",
- "archived": "Artxibatuta",
+ "karakeep": {
+ "bookmarks": "Bookmarks",
+ "favorites": "Favorites",
+ "archived": "Archived",
"highlights": "Highlights",
- "lists": "Zerrendak",
+ "lists": "Lists",
"tags": "Etiketak"
},
"slskd": {
diff --git a/public/locales/fi/common.json b/public/locales/fi/common.json
index b1ff23b4..6139aea6 100644
--- a/public/locales/fi/common.json
+++ b/public/locales/fi/common.json
@@ -1024,7 +1024,7 @@
"bcharge": "Battery Charge",
"timeleft": "Aikaa jäljellä"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json
index f0cd54f6..e7bc248a 100644
--- a/public/locales/fr/common.json
+++ b/public/locales/fr/common.json
@@ -85,16 +85,16 @@
"ping": {
"error": "Erreur",
"ping": "Latence",
- "down": "Bas",
- "up": "Haut",
+ "down": "Down",
+ "up": "Up",
"not_available": "Non disponible"
},
"siteMonitor": {
"http_status": "Statut HTTP",
"error": "Erreur",
"response": "Réponse",
- "down": "Bas",
- "up": "Haut",
+ "down": "Down",
+ "up": "Up",
"not_available": "Non disponible"
},
"emby": {
@@ -142,10 +142,10 @@
"connectionStatusDisconnected": "Déconnecté",
"connectionStatusConnected": "Connecté",
"uptime": "Démarré depuis",
- "maxDown": "Max. Bas",
- "maxUp": "Max. Haut",
- "down": "Bas",
- "up": "Haut",
+ "maxDown": "Max. Down",
+ "maxUp": "Max. Up",
+ "down": "Down",
+ "up": "Up",
"received": "Reçu",
"sent": "Envoyé",
"externalIPAddress": "IP externe",
@@ -523,15 +523,15 @@
"up_to_date": "À jour",
"child_bridges": "Child Bridges",
"child_bridges_status": "{{ok}}/{{total}}",
- "up": "Haut",
+ "up": "Up",
"pending": "En attente",
- "down": "Bas"
+ "down": "Down"
},
"healthchecks": {
"new": "Nouveau",
- "up": "Haut",
+ "up": "Up",
"grace": "En Période de Grâce",
- "down": "Bas",
+ "down": "Down",
"paused": "En Pause",
"status": "Statut",
"last_ping": "Dernier Ping",
@@ -646,8 +646,8 @@
"load": "Charge moy.",
"memory": "Util. Mém.",
"wanStatus": "Statut WAN",
- "up": "Haut",
- "down": "Bas",
+ "up": "Up",
+ "down": "Down",
"temp": "Température",
"disk": "Util. Disque",
"wanIP": "IP WAN"
@@ -832,8 +832,8 @@
"openwrt": {
"uptime": "Démarré depuis",
"cpuLoad": "Charge moyenne CPU (5 min)",
- "up": "Haut",
- "down": "Bas",
+ "up": "Up",
+ "down": "Down",
"bytesTx": "Transmis",
"bytesRx": "Reçu"
},
@@ -846,9 +846,9 @@
"sitesDown": "Hors ligne",
"paused": "En Pause",
"notyetchecked": "Non vérifié",
- "up": "Haut",
+ "up": "Up",
"seemsdown": "Semble hors ligne",
- "down": "Bas",
+ "down": "Down",
"unknown": "Inconnu"
},
"calendar": {
@@ -886,7 +886,7 @@
"notifications": "Notifications",
"issues": "Anomalies",
"pulls": "Demandes de tirage",
- "repositories": "Repositories"
+ "repositories": "Dépôts"
},
"stash": {
"scenes": "Scènes",
@@ -988,8 +988,8 @@
"beszel": {
"name": "Nom",
"systems": "Systèmes",
- "up": "Haut",
- "down": "Bas",
+ "up": "Up",
+ "down": "Down",
"paused": "En Pause",
"pending": "En attente",
"status": "Statut",
@@ -1024,7 +1024,7 @@
"bcharge": "Charge de la batterie",
"timeleft": "Temps restant"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Marque-pages",
"favorites": "Favoris",
"archived": "Archivé",
diff --git a/public/locales/he/common.json b/public/locales/he/common.json
index 2751430c..fb338931 100644
--- a/public/locales/he/common.json
+++ b/public/locales/he/common.json
@@ -1024,7 +1024,7 @@
"bcharge": "Battery Charge",
"timeleft": "זמן שנותר"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/public/locales/hi/common.json b/public/locales/hi/common.json
index 19f419cd..8897f217 100644
--- a/public/locales/hi/common.json
+++ b/public/locales/hi/common.json
@@ -1024,7 +1024,7 @@
"bcharge": "Battery Charge",
"timeleft": "Time Left"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/public/locales/hr/common.json b/public/locales/hr/common.json
index 2b1c013c..036f746b 100644
--- a/public/locales/hr/common.json
+++ b/public/locales/hr/common.json
@@ -1024,7 +1024,7 @@
"bcharge": "Napunjenost baterije",
"timeleft": "Preostalo vrijeme"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/public/locales/hu/common.json b/public/locales/hu/common.json
index f6b5e183..a3ab6bf8 100644
--- a/public/locales/hu/common.json
+++ b/public/locales/hu/common.json
@@ -1024,7 +1024,7 @@
"bcharge": "Akku töltöttsége",
"timeleft": "Hátralévő idő"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/public/locales/id/common.json b/public/locales/id/common.json
index fa4d6459..9babbe5a 100644
--- a/public/locales/id/common.json
+++ b/public/locales/id/common.json
@@ -1024,12 +1024,12 @@
"bcharge": "Sisa Baterai",
"timeleft": "Sisa Waktu"
},
- "hoarder": {
- "bookmarks": "Markah",
- "favorites": "Favorit",
- "archived": "Diarsipkan",
- "highlights": "Sorotan",
- "lists": "Daftar",
+ "karakeep": {
+ "bookmarks": "Bookmarks",
+ "favorites": "Favorites",
+ "archived": "Archived",
+ "highlights": "Highlights",
+ "lists": "Lists",
"tags": "Tag"
},
"slskd": {
diff --git a/public/locales/it/common.json b/public/locales/it/common.json
index 4b0672f9..6e870a09 100644
--- a/public/locales/it/common.json
+++ b/public/locales/it/common.json
@@ -149,8 +149,8 @@
"received": "Ricevuti",
"sent": "Inviati",
"externalIPAddress": "IP Esterno",
- "externalIPv6Address": "Ext. IPv6",
- "externalIPv6Prefix": "Ext. IPv6-Prefix"
+ "externalIPv6Address": "IPv6 Esterno",
+ "externalIPv6Prefix": "Prefisso IPv6 Esterno"
},
"caddy": {
"upstreams": "Upstream",
@@ -178,7 +178,7 @@
"connectedAp": "AP Connessi",
"activeUser": "Dispositivi attivi",
"alerts": "Allarmi",
- "connectedGateways": "Connected gateways",
+ "connectedGateways": "Gateway connessi",
"connectedSwitches": "Switch connessi"
},
"nzbget": {
@@ -338,7 +338,7 @@
"technitium": {
"totalQueries": "Richieste",
"totalNoError": "Successo",
- "totalServerFailure": "Failures",
+ "totalServerFailure": "Fallimenti",
"totalNxDomain": "NX Domains",
"totalRefused": "Refused",
"totalAuthoritative": "Authoritative",
@@ -943,7 +943,7 @@
"loading": "Caricamento",
"open": "Open - US Market",
"closed": "Closed - US Market",
- "invalidConfiguration": "Invalid Configuration"
+ "invalidConfiguration": "Configurazione non valida"
},
"frigate": {
"cameras": "Cameras",
@@ -959,7 +959,7 @@
"unclassified": "Not classified",
"information": "Informazioni",
"warning": "Warning",
- "average": "Average",
+ "average": "Media",
"high": "High",
"disaster": "Disaster"
},
@@ -987,7 +987,7 @@
},
"beszel": {
"name": "Nome",
- "systems": "Systems",
+ "systems": "Sistemi",
"up": "Up",
"down": "Down",
"paused": "In Pausa",
@@ -996,15 +996,15 @@
"updated": "Aggiornato",
"cpu": "CPU",
"memory": "MEM",
- "disk": "Disk",
+ "disk": "Disco",
"network": "NET"
},
"argocd": {
- "apps": "Apps",
- "synced": "Synced",
- "outOfSync": "Out Of Sync",
+ "apps": "Applicazioni",
+ "synced": "Sincronizzato",
+ "outOfSync": "Non Sincronizzato",
"healthy": "Sano",
- "degraded": "Degraded",
+ "degraded": "Degradato",
"progressing": "Progressing",
"missing": "Mancanti",
"suspended": "Suspended"
@@ -1013,10 +1013,10 @@
"loading": "Caricamento"
},
"gitlab": {
- "groups": "Groups",
+ "groups": "Gruppi",
"issues": "Problemi",
- "merges": "Merge Requests",
- "projects": "Projects"
+ "merges": "Richieste di merge",
+ "projects": "Progetti"
},
"apcups": {
"status": "Stato",
@@ -1024,12 +1024,12 @@
"bcharge": "Carica Batteria",
"timeleft": "Tempo Rimanente"
},
- "hoarder": {
- "bookmarks": "Bookmarks",
- "favorites": "Favorites",
+ "karakeep": {
+ "bookmarks": "Segnalibri",
+ "favorites": "Preferiti",
"archived": "Archived",
"highlights": "Highlights",
- "lists": "Lists",
+ "lists": "Liste",
"tags": "Tag"
},
"slskd": {
@@ -1039,7 +1039,7 @@
"updateStatus": "Update",
"update_yes": "Disponibili",
"update_no": "Aggiornato",
- "downloads": "Downloads",
+ "downloads": "Download",
"uploads": "Uploads",
"sharedFiles": "File"
}
diff --git a/public/locales/ja/common.json b/public/locales/ja/common.json
index 58869e84..5e963a77 100644
--- a/public/locales/ja/common.json
+++ b/public/locales/ja/common.json
@@ -1024,7 +1024,7 @@
"bcharge": "バッテリー充電",
"timeleft": "残り時間"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/public/locales/ko/common.json b/public/locales/ko/common.json
index 5f5523ff..8bfe4276 100644
--- a/public/locales/ko/common.json
+++ b/public/locales/ko/common.json
@@ -14,11 +14,11 @@
"date": "{{value, date}}",
"relativeDate": "{{value, relativeDate}}",
"duration": "{{value, duration}}",
- "months": "mo",
- "days": "d",
- "hours": "h",
- "minutes": "m",
- "seconds": "s"
+ "months": "달",
+ "days": "일",
+ "hours": "시",
+ "minutes": "분",
+ "seconds": "초"
},
"widget": {
"missing_type": "없는 위젯 유형: {{type}}",
@@ -51,7 +51,7 @@
},
"unifi": {
"users": "사용자",
- "uptime": "Uptime",
+ "uptime": "가동 시간",
"days": "일",
"wan": "WAN",
"lan": "LAN",
@@ -141,7 +141,7 @@
"connectionStatusDisconnecting": "연결을 끊는 중...",
"connectionStatusDisconnected": "연결 끊김",
"connectionStatusConnected": "연결됨",
- "uptime": "Uptime",
+ "uptime": "가동 시간",
"maxDown": "Max. Down",
"maxUp": "Max. Up",
"down": "Down",
@@ -188,7 +188,7 @@
},
"plex": {
"streams": "활성 스트림",
- "albums": "Albums",
+ "albums": "앨범",
"movies": "영화",
"tv": "TV 쇼"
},
@@ -440,8 +440,8 @@
"total": "총합",
"free": "남음",
"used": "사용",
- "days": "d",
- "hours": "h",
+ "days": "일",
+ "hours": "시",
"crit": "Crit",
"read": "읽음",
"write": "쓰기",
@@ -556,7 +556,7 @@
},
"truenas": {
"load": "System Load",
- "uptime": "Uptime",
+ "uptime": "가동 시간",
"alerts": "경고"
},
"pyload": {
@@ -606,7 +606,7 @@
"mikrotik": {
"cpuLoad": "CPU Load",
"memoryUsed": "메모리 사용량",
- "uptime": "Uptime",
+ "uptime": "가동 시간",
"numberOfLeases": "Leases"
},
"xteve": {
@@ -667,9 +667,9 @@
"uptimekuma": {
"up": "Sites Up",
"down": "Sites Down",
- "uptime": "Uptime",
+ "uptime": "가동 시간",
"incident": "Incident",
- "m": "m"
+ "m": "분"
},
"atsumeru": {
"series": "시리즈",
@@ -684,7 +684,7 @@
},
"diskstation": {
"days": "일",
- "uptime": "Uptime",
+ "uptime": "가동 시간",
"volumeAvailable": "이용 가능"
},
"mylar": {
@@ -693,7 +693,7 @@
"wanted": "요청"
},
"photoprism": {
- "albums": "Albums",
+ "albums": "앨범",
"photos": "사진",
"videos": "동영상",
"people": "People"
@@ -705,8 +705,8 @@
"time": "Time"
},
"firefly": {
- "networth": "Net Worth",
- "budget": "Budget"
+ "networth": "순자산",
+ "budget": "예산"
},
"grafana": {
"dashboards": "대시보드",
@@ -746,7 +746,7 @@
"gatus": {
"up": "Sites Up",
"down": "Sites Down",
- "uptime": "Uptime"
+ "uptime": "가동 시간"
},
"ghostfolio": {
"gross_percent_today": "오늘",
@@ -816,7 +816,7 @@
"totalUsed": "Used Storage"
},
"mealie": {
- "recipes": "Recipes",
+ "recipes": "레시피",
"users": "사용자",
"categories": "분류",
"tags": "태그"
@@ -830,7 +830,7 @@
"failed": "Failed"
},
"openwrt": {
- "uptime": "Uptime",
+ "uptime": "가동 시간",
"cpuLoad": "CPU Load Avg (5m)",
"up": "Up",
"down": "Down",
@@ -839,7 +839,7 @@
},
"uptimerobot": {
"status": "상태",
- "uptime": "Uptime",
+ "uptime": "가동 시간",
"lastDown": "Last Downtime",
"downDuration": "Downtime Duration",
"sitesUp": "Sites Up",
@@ -906,7 +906,7 @@
},
"tandoor": {
"users": "사용자",
- "recipes": "Recipes",
+ "recipes": "레시피",
"keywords": "키워드"
},
"homebox": {
@@ -947,7 +947,7 @@
},
"frigate": {
"cameras": "카메라",
- "uptime": "Uptime",
+ "uptime": "가동 시간",
"version": "버전"
},
"linkwarden": {
@@ -1024,7 +1024,7 @@
"bcharge": "배터리 충전 중",
"timeleft": "남은 시간"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/public/locales/lv/common.json b/public/locales/lv/common.json
index 85d9a359..0238d143 100644
--- a/public/locales/lv/common.json
+++ b/public/locales/lv/common.json
@@ -1024,7 +1024,7 @@
"bcharge": "Battery Charge",
"timeleft": "Atlikušais laiks"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/public/locales/ms/common.json b/public/locales/ms/common.json
index 4ebfd6d8..8c0e5509 100644
--- a/public/locales/ms/common.json
+++ b/public/locales/ms/common.json
@@ -1024,7 +1024,7 @@
"bcharge": "Bateri dicas",
"timeleft": "Masa Tinggal"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/public/locales/nl/common.json b/public/locales/nl/common.json
index e26ad05e..63a2d50e 100644
--- a/public/locales/nl/common.json
+++ b/public/locales/nl/common.json
@@ -1024,7 +1024,7 @@
"bcharge": "Batterij opladen",
"timeleft": "Resterende Tijd"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/public/locales/no/common.json b/public/locales/no/common.json
index 67710fe1..dee02141 100644
--- a/public/locales/no/common.json
+++ b/public/locales/no/common.json
@@ -1024,7 +1024,7 @@
"bcharge": "Batteriladning",
"timeleft": "Gjenstående tid"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/public/locales/pl/common.json b/public/locales/pl/common.json
index 1316d5c9..3a956aaf 100644
--- a/public/locales/pl/common.json
+++ b/public/locales/pl/common.json
@@ -149,8 +149,8 @@
"received": "Odebrane",
"sent": "Wysłane",
"externalIPAddress": "Pub. IP",
- "externalIPv6Address": "Ext. IPv6",
- "externalIPv6Prefix": "Ext. IPv6-Prefix"
+ "externalIPv6Address": "Zewn. IPv6",
+ "externalIPv6Prefix": "Zewn. prefiks IPv6"
},
"caddy": {
"upstreams": "Upstreams",
@@ -705,8 +705,8 @@
"time": "Czas"
},
"firefly": {
- "networth": "Net Worth",
- "budget": "Budget"
+ "networth": "Wartość netto",
+ "budget": "Budżet"
},
"grafana": {
"dashboards": "Panel główny",
@@ -886,7 +886,7 @@
"notifications": "Powiadomienia",
"issues": "Zgłoszenia",
"pulls": "Żądania Pull",
- "repositories": "Repositories"
+ "repositories": "Repozytoria"
},
"stash": {
"scenes": "Sceny",
@@ -1024,12 +1024,12 @@
"bcharge": "Stan baterii",
"timeleft": "Pozostało"
},
- "hoarder": {
- "bookmarks": "Bookmarks",
- "favorites": "Favorites",
- "archived": "Archived",
- "highlights": "Highlights",
- "lists": "Lists",
+ "karakeep": {
+ "bookmarks": "Zakładki",
+ "favorites": "Ulubione",
+ "archived": "Zarchiwizowane",
+ "highlights": "Wyróżnione",
+ "lists": "Listy",
"tags": "Tagi"
},
"slskd": {
diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json
index acbf2d96..c392c17d 100644
--- a/public/locales/pt/common.json
+++ b/public/locales/pt/common.json
@@ -1024,7 +1024,7 @@
"bcharge": "Carga da bateria",
"timeleft": "Tempo Restante"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/public/locales/pt_BR/common.json b/public/locales/pt_BR/common.json
index 92a1dfcf..ee426052 100644
--- a/public/locales/pt_BR/common.json
+++ b/public/locales/pt_BR/common.json
@@ -886,7 +886,7 @@
"notifications": "Notificações",
"issues": "Problemas",
"pulls": "Solicitações de Envio",
- "repositories": "Repositories"
+ "repositories": "Repositórios"
},
"stash": {
"scenes": "Cenas",
@@ -1024,8 +1024,8 @@
"bcharge": "Carga da bateria",
"timeleft": "Tempo restante"
},
- "hoarder": {
- "bookmarks": "Favoritos",
+ "karakeep": {
+ "bookmarks": "Marcadores",
"favorites": "Favoritos",
"archived": "Arquivados",
"highlights": "Destaques",
@@ -1036,7 +1036,7 @@
"slskStatus": "Rede",
"connected": "Conectado",
"disconnected": "Desconectado",
- "updateStatus": "Update",
+ "updateStatus": "Atualize",
"update_yes": "Disponível",
"update_no": "Atualizado",
"downloads": "Transferências",
diff --git a/public/locales/ro/common.json b/public/locales/ro/common.json
index b0eb7747..9dcd2921 100644
--- a/public/locales/ro/common.json
+++ b/public/locales/ro/common.json
@@ -1024,7 +1024,7 @@
"bcharge": "Battery Charge",
"timeleft": "Timp rămas"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json
index e1e1a94f..d6cabab4 100644
--- a/public/locales/ru/common.json
+++ b/public/locales/ru/common.json
@@ -886,7 +886,7 @@
"notifications": "Уведомления",
"issues": "Вопросы",
"pulls": "Запросы на слияние (Pull Request)",
- "repositories": "Repositories"
+ "repositories": "Репозитории"
},
"stash": {
"scenes": "Сцены",
@@ -1024,10 +1024,10 @@
"bcharge": "Заряд батареи",
"timeleft": "Осталось"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Закладки",
"favorites": "Избранное",
- "archived": "Архивированное",
+ "archived": "Архив",
"highlights": "События",
"lists": "Список",
"tags": "Теги"
diff --git a/public/locales/sk/common.json b/public/locales/sk/common.json
index 9c154cce..a267ad81 100644
--- a/public/locales/sk/common.json
+++ b/public/locales/sk/common.json
@@ -1024,7 +1024,7 @@
"bcharge": "Nabitie batérie",
"timeleft": "Zostávajúci čas"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/public/locales/sl/common.json b/public/locales/sl/common.json
index a32aa0dd..ba6f07b9 100644
--- a/public/locales/sl/common.json
+++ b/public/locales/sl/common.json
@@ -1024,7 +1024,7 @@
"bcharge": "Napolnjenost baterije",
"timeleft": "Preostali čas"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/public/locales/sr/common.json b/public/locales/sr/common.json
index 4e3f5fb0..5314dc2b 100644
--- a/public/locales/sr/common.json
+++ b/public/locales/sr/common.json
@@ -1024,7 +1024,7 @@
"bcharge": "Battery Charge",
"timeleft": "Time Left"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/public/locales/sv/common.json b/public/locales/sv/common.json
index caa18acd..d389a937 100644
--- a/public/locales/sv/common.json
+++ b/public/locales/sv/common.json
@@ -1024,7 +1024,7 @@
"bcharge": "Battery Charge",
"timeleft": "Tid kvar"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/public/locales/te/common.json b/public/locales/te/common.json
index e34d6fae..e980d4ba 100644
--- a/public/locales/te/common.json
+++ b/public/locales/te/common.json
@@ -1024,7 +1024,7 @@
"bcharge": "Battery Charge",
"timeleft": "మిగిలి వున్న సమయం"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/public/locales/th/common.json b/public/locales/th/common.json
index b37b662d..1d88948b 100644
--- a/public/locales/th/common.json
+++ b/public/locales/th/common.json
@@ -1024,7 +1024,7 @@
"bcharge": "Battery Charge",
"timeleft": "Time Left"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/public/locales/tr/common.json b/public/locales/tr/common.json
index 815b9150..19bd4540 100644
--- a/public/locales/tr/common.json
+++ b/public/locales/tr/common.json
@@ -1024,7 +1024,7 @@
"bcharge": "Pil Yüzdesi",
"timeleft": "Kalan Zaman"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/public/locales/uk/common.json b/public/locales/uk/common.json
index 3412d591..419d77c0 100644
--- a/public/locales/uk/common.json
+++ b/public/locales/uk/common.json
@@ -120,7 +120,7 @@
"grid_power": "Сітка",
"home_power": "Споживання",
"charge_power": "Зарядний пристрій",
- "kilowatt": "kW"
+ "kilowatt": "кВт"
},
"flood": {
"download": "Завантажено",
@@ -149,8 +149,8 @@
"received": "Отримано",
"sent": "Надіслано",
"externalIPAddress": "Зовнішній IP",
- "externalIPv6Address": "Ext. IPv6",
- "externalIPv6Prefix": "Ext. IPv6-Prefix"
+ "externalIPv6Address": "Зовнішній IPv6",
+ "externalIPv6Prefix": "Зовнішній Префікс IPv6-"
},
"caddy": {
"upstreams": "Потоки",
@@ -178,7 +178,7 @@
"connectedAp": "Підключені точки доступу",
"activeUser": "Активні пристрої",
"alerts": "Оповіщення",
- "connectedGateways": "Connected gateways",
+ "connectedGateways": "Підключені шлюзи",
"connectedSwitches": "Підключені перемикачі"
},
"nzbget": {
@@ -420,8 +420,8 @@
},
"authentik": {
"users": "Користувачі",
- "loginsLast24H": "Вхід (24 години)",
- "failedLoginsLast24H": "Невдалі входи (24 години)"
+ "loginsLast24H": "Вхід (протягом доби)",
+ "failedLoginsLast24H": "Невдалі входи (протягом доби)"
},
"proxmox": {
"mem": "ОЗП",
@@ -434,7 +434,7 @@
"load": "Завантаження",
"wait": "Будь ласка, зачекайте",
"temp": "Температура",
- "_temp": "Темп.",
+ "_temp": "Температура",
"warn": "Увага",
"uptime": "Онлайн",
"total": "Усього",
@@ -616,7 +616,7 @@
},
"opendtu": {
"yieldDay": "Сьогодні",
- "absolutePower": "Абс. потуж.",
+ "absolutePower": "Потужність",
"relativePower": "Заряд %",
"limit": "Ліміт"
},
@@ -648,13 +648,13 @@
"wanStatus": "Статус WAN",
"up": "Онлайн",
"down": "Офлайн",
- "temp": "Темп.",
+ "temp": "Температура",
"disk": "Використання диска",
"wanIP": "WAN IP"
},
"proxmoxbackupserver": {
"datastore_usage": "Сховище даних",
- "failed_tasks_24h": "Невиконані завдання 24 години",
+ "failed_tasks_24h": "Невиконані завдання за останню добу",
"cpu_usage": "ЦП",
"memory_usage": "Пам'ять"
},
@@ -705,8 +705,8 @@
"time": "Час"
},
"firefly": {
- "networth": "Net Worth",
- "budget": "Budget"
+ "networth": "Чисті Активи",
+ "budget": "Бюджет"
},
"grafana": {
"dashboards": "Інформаційні панелі",
@@ -831,7 +831,7 @@
},
"openwrt": {
"uptime": "Час роботи",
- "cpuLoad": "Сер. навантаження ЦП (5 хв)",
+ "cpuLoad": "Сер. навантаження ЦП (\"5\" хв)",
"up": "Онлайн",
"down": "Офлайн",
"bytesTx": "Передано",
@@ -855,7 +855,7 @@
"inCinemas": "У кінотеатрах",
"physicalRelease": "Фізичний реліз",
"digitalRelease": "Цифровий реліз",
- "noEventsToday": "Події на сьогодні відсутні",
+ "noEventsToday": "Події на сьогодні відсутні!",
"noEventsFound": "Події не знайдено"
},
"romm": {
@@ -886,7 +886,7 @@
"notifications": "Сповіщення",
"issues": "Питання",
"pulls": "Pull-запити",
- "repositories": "Repositories"
+ "repositories": "Репозиторії"
},
"stash": {
"scenes": "Сцени",
@@ -1024,23 +1024,23 @@
"bcharge": "Заряд батареї",
"timeleft": "Залишилось"
},
- "hoarder": {
- "bookmarks": "Bookmarks",
- "favorites": "Favorites",
- "archived": "Archived",
- "highlights": "Highlights",
- "lists": "Lists",
+ "karakeep": {
+ "bookmarks": "Закладки",
+ "favorites": "Обране",
+ "archived": "Заархівовані",
+ "highlights": "Основні моменти",
+ "lists": "Списки",
"tags": "Теги"
},
"slskd": {
"slskStatus": "Мережа",
"connected": "З'єднано",
"disconnected": "Відключено",
- "updateStatus": "Update",
+ "updateStatus": "Оновити",
"update_yes": "Доступно",
"update_no": "Актуально",
- "downloads": "Downloads",
- "uploads": "Uploads",
+ "downloads": "Завантаження",
+ "uploads": "Вивантаження",
"sharedFiles": "Файли"
}
}
diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json
index 7e8974f8..efe0c9ab 100644
--- a/public/locales/vi/common.json
+++ b/public/locales/vi/common.json
@@ -1024,7 +1024,7 @@
"bcharge": "Battery Charge",
"timeleft": "Thời gian còn lại"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/public/locales/yue/common.json b/public/locales/yue/common.json
index dfe604dd..9dd81cfd 100644
--- a/public/locales/yue/common.json
+++ b/public/locales/yue/common.json
@@ -5,9 +5,9 @@
"bbytes": "{{value, bytes(binary: true)}}",
"bbits": "{{value, bytes(bits: true; binary: true)}}",
"byterate": "{{value, rate(bits: false)}}",
- "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+ "bibyterate": "{{value, bytes(bits: true; binary: true)}}",
"bitrate": "{{value, rate(bits: true)}}",
- "bibitrate": "{{value, rate(bits: true; binary: true)}}",
+ "bibitrate": "{{value, bytes(bits: true; binary: true)}}",
"percent": "{{value, percent}}",
"number": "{{value, number}}",
"ms": "{{value, number}}",
@@ -120,7 +120,7 @@
"grid_power": "電網",
"home_power": "電源使用率",
"charge_power": "充電",
- "kilowatt": "kW"
+ "kilowatt": "千瓦"
},
"flood": {
"download": "下載速率",
@@ -140,7 +140,7 @@
"connectionStatusPendingDisconnect": "待辦的斷開",
"connectionStatusDisconnecting": "正在中斷連線",
"connectionStatusDisconnected": "連接已中斷",
- "connectionStatusConnected": "Connected",
+ "connectionStatusConnected": "已連線",
"uptime": "運行時間",
"maxDown": "最大下載速率",
"maxUp": "最大上傳速率",
@@ -149,8 +149,8 @@
"received": "已接收",
"sent": "已送出",
"externalIPAddress": "外部 IP",
- "externalIPv6Address": "Ext. IPv6",
- "externalIPv6Prefix": "Ext. IPv6-Prefix"
+ "externalIPv6Address": "外部 IP",
+ "externalIPv6Prefix": "擴展 IPv-前綴"
},
"caddy": {
"upstreams": "上行",
@@ -178,7 +178,7 @@
"connectedAp": "已連接的存取點",
"activeUser": "在線裝置",
"alerts": "警示",
- "connectedGateways": "Connected gateways",
+ "connectedGateways": "已連繫的網關",
"connectedSwitches": "已連接的交換器"
},
"nzbget": {
@@ -229,8 +229,8 @@
"seed": "已完成下載"
},
"develancacheui": {
- "cachehitbytes": "Cache Hit Bytes",
- "cachemissbytes": "Cache Miss Bytes"
+ "cachehitbytes": "快取未命中位元組",
+ "cachemissbytes": "快取未命中位元組"
},
"downloadstation": {
"download": "下載速率",
@@ -285,9 +285,9 @@
},
"netalertx": {
"total": "全部",
- "connected": "Connected",
- "new_devices": "New Devices",
- "down_alerts": "Down Alerts"
+ "connected": "已連線",
+ "new_devices": "新裝置",
+ "down_alerts": "離線警告"
},
"pihole": {
"queries": "查詢",
@@ -313,13 +313,13 @@
},
"suwayomi": {
"download": "下載咗",
- "nondownload": "Non-Downloaded",
+ "nondownload": "已下載",
"read": "已讀",
"unread": "未讀",
- "downloadedread": "Downloaded & Read",
- "downloadedunread": "Downloaded & Unread",
- "nondownloadedread": "Non-Downloaded & Read",
- "nondownloadedunread": "Non-Downloaded & Unread"
+ "downloadedread": "已下載且已閱讀",
+ "downloadedunread": "已下載且未閱讀",
+ "nondownloadedread": "未下載但已閱讀",
+ "nondownloadedunread": "未下載且未閱讀"
},
"tailscale": {
"address": "位址",
@@ -337,15 +337,15 @@
},
"technitium": {
"totalQueries": "查詢",
- "totalNoError": "Success",
- "totalServerFailure": "Failures",
- "totalNxDomain": "NX Domains",
- "totalRefused": "Refused",
- "totalAuthoritative": "Authoritative",
- "totalRecursive": "Recursive",
- "totalCached": "Cached",
+ "totalNoError": "成功",
+ "totalServerFailure": "失敗",
+ "totalNxDomain": "網域",
+ "totalRefused": "對方拒投誠信",
+ "totalAuthoritative": "權威的",
+ "totalRecursive": "遞迴",
+ "totalCached": "快取",
"totalBlocked": "封鎖",
- "totalDropped": "Dropped",
+ "totalDropped": "丟棄",
"totalClients": "客戶端"
},
"tdarr": {
@@ -705,8 +705,8 @@
"time": "時間"
},
"firefly": {
- "networth": "Net Worth",
- "budget": "Budget"
+ "networth": "淨值",
+ "budget": "預算"
},
"grafana": {
"dashboards": "控制面板",
@@ -860,16 +860,16 @@
},
"romm": {
"platforms": "平台",
- "totalRoms": "Games",
- "saves": "Saves",
- "states": "States",
- "screenshots": "Screenshots",
- "totalfilesize": "Total Size"
+ "totalRoms": "遊戲",
+ "saves": "已儲存",
+ "states": "州",
+ "screenshots": "螢幕截圖",
+ "totalfilesize": "大小總計"
},
"mailcow": {
"domains": "域",
- "mailboxes": "Mailboxes",
- "mails": "Mails",
+ "mailboxes": "信箱",
+ "mails": "郵件數",
"storage": "儲存空間"
},
"netdata": {
@@ -886,7 +886,7 @@
"notifications": "信息",
"issues": "出版",
"pulls": "提取請求",
- "repositories": "Repositories"
+ "repositories": "套件來源"
},
"stash": {
"scenes": "場景",
@@ -922,16 +922,16 @@
"bans": "禁止"
},
"wgeasy": {
- "connected": "Connected",
+ "connected": "已連線",
"enabled": "啟用",
"disabled": "停用咗",
"total": "全部"
},
"swagdashboard": {
- "proxied": "Proxied",
- "auth": "With Auth",
- "outdated": "Outdated",
- "banned": "Banned"
+ "proxied": "已代理",
+ "auth": "已授權",
+ "outdated": "須更新",
+ "banned": "已封鎖"
},
"myspeed": {
"ping": "延遲",
@@ -939,43 +939,43 @@
"upload": "上傳速率"
},
"stocks": {
- "stocks": "Stocks",
- "loading": "Loading",
- "open": "Open - US Market",
- "closed": "Closed - US Market",
- "invalidConfiguration": "Invalid Configuration"
+ "stocks": "股票",
+ "loading": "載入中 ",
+ "open": "美國市場已開放",
+ "closed": "美國市場已關閉",
+ "invalidConfiguration": "無效的設定"
},
"frigate": {
- "cameras": "Cameras",
+ "cameras": " ",
"uptime": "運行時間",
"version": "版本"
},
"linkwarden": {
- "links": "Links",
- "collections": "Collections",
+ "links": " ",
+ "collections": "收藏庫",
"tags": "標籤"
},
"zabbix": {
- "unclassified": "Not classified",
+ "unclassified": "未分類",
"information": "資訊",
- "warning": "Warning",
- "average": "Average",
- "high": "High",
- "disaster": "Disaster"
+ "warning": "警告",
+ "average": "平均",
+ "high": "高優先權",
+ "disaster": "災難"
},
"lubelogger": {
- "vehicle": "Vehicle",
- "vehicles": "Vehicles",
- "serviceRecords": "Service Records",
- "reminders": "Reminders",
- "nextReminder": "Next Reminder",
- "none": "None"
+ "vehicle": "車輛",
+ "vehicles": "車輛",
+ "serviceRecords": "保養記錄",
+ "reminders": "提醒",
+ "nextReminder": "下一個提醒",
+ "none": "沒有"
},
"vikunja": {
- "projects": "Active Projects",
- "tasks7d": "Tasks Due This Week",
- "tasksOverdue": "Overdue Tasks",
- "tasksInProgress": "Tasks In Progress"
+ "projects": "正在應用的項目",
+ "tasks7d": "本週到期任務",
+ "tasksOverdue": "逾期處理",
+ "tasksInProgress": "正在執行的任務"
},
"headscale": {
"name": "名稱",
@@ -987,7 +987,7 @@
},
"beszel": {
"name": "名稱",
- "systems": "Systems",
+ "systems": "系統",
"up": "在線",
"down": "離線",
"paused": "擱置中",
@@ -996,27 +996,27 @@
"updated": "已更新",
"cpu": "CPU",
"memory": "記憶體",
- "disk": "Disk",
- "network": "NET"
+ "disk": "儲存空間",
+ "network": "網路"
},
"argocd": {
- "apps": "Apps",
- "synced": "Synced",
- "outOfSync": "Out Of Sync",
+ "apps": "應用程式",
+ "synced": "已同步",
+ "outOfSync": "不同步",
"healthy": "健康",
- "degraded": "Degraded",
- "progressing": "Progressing",
+ "degraded": "已降級",
+ "progressing": "進度",
"missing": "缺少",
- "suspended": "Suspended"
+ "suspended": "暫停"
},
"spoolman": {
- "loading": "Loading"
+ "loading": "載入中 "
},
"gitlab": {
- "groups": "Groups",
+ "groups": "群組",
"issues": "出版",
- "merges": "Merge Requests",
- "projects": "Projects"
+ "merges": "合併請求",
+ "projects": "專"
},
"apcups": {
"status": "狀況",
@@ -1024,23 +1024,23 @@
"bcharge": "充電",
"timeleft": "用時"
},
- "hoarder": {
- "bookmarks": "Bookmarks",
- "favorites": "Favorites",
- "archived": "Archived",
- "highlights": "Highlights",
- "lists": "Lists",
+ "karakeep": {
+ "bookmarks": "書籤",
+ "favorites": "我的最愛",
+ "archived": "已存檔",
+ "highlights": "標記",
+ "lists": "列表",
"tags": "標籤"
},
"slskd": {
"slskStatus": "網絡",
- "connected": "Connected",
+ "connected": "已連線",
"disconnected": "連接已中斷",
- "updateStatus": "Update",
+ "updateStatus": "更新",
"update_yes": "可用",
"update_no": "已更新至最新",
- "downloads": "Downloads",
- "uploads": "Uploads",
+ "downloads": "下載",
+ "uploads": "上傳",
"sharedFiles": "檔案"
}
}
diff --git a/public/locales/zh-Hans/common.json b/public/locales/zh-Hans/common.json
index 064e2c1c..be53b16b 100644
--- a/public/locales/zh-Hans/common.json
+++ b/public/locales/zh-Hans/common.json
@@ -1024,7 +1024,7 @@
"bcharge": "充电中",
"timeleft": "剩余时间"
},
- "hoarder": {
+ "karakeep": {
"bookmarks": "Bookmarks",
"favorites": "Favorites",
"archived": "Archived",
diff --git a/public/locales/zh-Hant/common.json b/public/locales/zh-Hant/common.json
index eb1f7423..7abcd3a2 100644
--- a/public/locales/zh-Hant/common.json
+++ b/public/locales/zh-Hant/common.json
@@ -5,9 +5,9 @@
"bbytes": "{{value, bytes(binary: true)}}",
"bbits": "{{value, bytes(bits: true; binary: true)}}",
"byterate": "{{value, rate(bits: false)}}",
- "bibyterate": "{{value, rate(bits: false; binary: true)}}",
+ "bibyterate": "{{value, bytes(bits: true; binary: true)}}",
"bitrate": "{{value, rate(bits: true)}}",
- "bibitrate": "{{value, rate(bits: true; binary: true)}}",
+ "bibitrate": "{{value, bytes(bits: true; binary: true)}}",
"percent": "{{value, percent}}",
"number": "{{value, number}}",
"ms": "{{value, number}}",
@@ -120,7 +120,7 @@
"grid_power": "電網",
"home_power": "電源使用率",
"charge_power": "充電",
- "kilowatt": "kW"
+ "kilowatt": "千瓦"
},
"flood": {
"download": "下載速率",
@@ -140,7 +140,7 @@
"connectionStatusPendingDisconnect": "待辦的斷開",
"connectionStatusDisconnecting": "正在中斷連線",
"connectionStatusDisconnected": "連接已中斷",
- "connectionStatusConnected": "Connected",
+ "connectionStatusConnected": "已連線",
"uptime": "運行時間",
"maxDown": "最大下載速率",
"maxUp": "最大上傳速率",
@@ -149,8 +149,8 @@
"received": "已接收",
"sent": "已送出",
"externalIPAddress": "外部 IP",
- "externalIPv6Address": "Ext. IPv6",
- "externalIPv6Prefix": "Ext. IPv6-Prefix"
+ "externalIPv6Address": "外部 IP",
+ "externalIPv6Prefix": "擴展 IPv-前綴"
},
"caddy": {
"upstreams": "上行",
@@ -178,7 +178,7 @@
"connectedAp": "已連接的存取點",
"activeUser": "在線裝置",
"alerts": "警示",
- "connectedGateways": "Connected gateways",
+ "connectedGateways": "已連繫的網關",
"connectedSwitches": "已連接的交換器"
},
"nzbget": {
@@ -229,8 +229,8 @@
"seed": "已完成下載"
},
"develancacheui": {
- "cachehitbytes": "Cache Hit Bytes",
- "cachemissbytes": "Cache Miss Bytes"
+ "cachehitbytes": "快取未命中位元組",
+ "cachemissbytes": "快取未命中位元組"
},
"downloadstation": {
"download": "下載速率",
@@ -285,9 +285,9 @@
},
"netalertx": {
"total": "全部",
- "connected": "Connected",
- "new_devices": "New Devices",
- "down_alerts": "Down Alerts"
+ "connected": "已連線",
+ "new_devices": "新裝置",
+ "down_alerts": "離線警告"
},
"pihole": {
"queries": "查詢",
@@ -313,13 +313,13 @@
},
"suwayomi": {
"download": "已下載",
- "nondownload": "Non-Downloaded",
+ "nondownload": "已下載",
"read": "已讀",
"unread": "未讀",
- "downloadedread": "Downloaded & Read",
- "downloadedunread": "Downloaded & Unread",
- "nondownloadedread": "Non-Downloaded & Read",
- "nondownloadedunread": "Non-Downloaded & Unread"
+ "downloadedread": "已下載且已閱讀",
+ "downloadedunread": "已下載且未閱讀",
+ "nondownloadedread": "未下載但已閱讀",
+ "nondownloadedunread": "未下載且未閱讀"
},
"tailscale": {
"address": "位址",
@@ -337,15 +337,15 @@
},
"technitium": {
"totalQueries": "查詢",
- "totalNoError": "Success",
- "totalServerFailure": "Failures",
- "totalNxDomain": "NX Domains",
- "totalRefused": "Refused",
- "totalAuthoritative": "Authoritative",
- "totalRecursive": "Recursive",
- "totalCached": "Cached",
+ "totalNoError": "成功",
+ "totalServerFailure": "失敗",
+ "totalNxDomain": "網域",
+ "totalRefused": "對方拒投誠信",
+ "totalAuthoritative": "權威的",
+ "totalRecursive": "遞迴",
+ "totalCached": "快取",
"totalBlocked": "已阻擋",
- "totalDropped": "Dropped",
+ "totalDropped": "丟棄",
"totalClients": "客戶端"
},
"tdarr": {
@@ -705,8 +705,8 @@
"time": "時間"
},
"firefly": {
- "networth": "Net Worth",
- "budget": "Budget"
+ "networth": "淨值",
+ "budget": "預算"
},
"grafana": {
"dashboards": "控制面板",
@@ -860,16 +860,16 @@
},
"romm": {
"platforms": "平台",
- "totalRoms": "Games",
- "saves": "Saves",
- "states": "States",
- "screenshots": "Screenshots",
- "totalfilesize": "Total Size"
+ "totalRoms": "遊戲",
+ "saves": "已儲存",
+ "states": "州",
+ "screenshots": "螢幕截圖",
+ "totalfilesize": "大小總計"
},
"mailcow": {
"domains": "網域",
- "mailboxes": "Mailboxes",
- "mails": "Mails",
+ "mailboxes": "信箱",
+ "mails": "郵件數",
"storage": "儲存空間"
},
"netdata": {
@@ -886,7 +886,7 @@
"notifications": "信息",
"issues": "出版",
"pulls": "提取請求",
- "repositories": "Repositories"
+ "repositories": "套件來源"
},
"stash": {
"scenes": "場景",
@@ -922,16 +922,16 @@
"bans": "禁止"
},
"wgeasy": {
- "connected": "Connected",
+ "connected": "已連線",
"enabled": "已啟用",
"disabled": "已停用",
"total": "全部"
},
"swagdashboard": {
- "proxied": "Proxied",
- "auth": "With Auth",
- "outdated": "Outdated",
- "banned": "Banned"
+ "proxied": "已代理",
+ "auth": "已授權",
+ "outdated": "須更新",
+ "banned": "已封鎖"
},
"myspeed": {
"ping": "延遲",
@@ -939,43 +939,43 @@
"upload": "上傳速率"
},
"stocks": {
- "stocks": "Stocks",
- "loading": "Loading",
- "open": "Open - US Market",
- "closed": "Closed - US Market",
- "invalidConfiguration": "Invalid Configuration"
+ "stocks": "股票",
+ "loading": "載入中 ",
+ "open": "美國市場已開放",
+ "closed": "美國市場已關閉",
+ "invalidConfiguration": "無效的設定"
},
"frigate": {
- "cameras": "Cameras",
+ "cameras": " ",
"uptime": "運行時間",
"version": "版本"
},
"linkwarden": {
- "links": "Links",
- "collections": "Collections",
+ "links": " ",
+ "collections": "收藏庫",
"tags": "標籤"
},
"zabbix": {
- "unclassified": "Not classified",
+ "unclassified": "未分類",
"information": "資訊",
- "warning": "Warning",
- "average": "Average",
- "high": "High",
- "disaster": "Disaster"
+ "warning": "警告",
+ "average": "平均",
+ "high": "高優先權",
+ "disaster": "災難"
},
"lubelogger": {
- "vehicle": "Vehicle",
- "vehicles": "Vehicles",
- "serviceRecords": "Service Records",
- "reminders": "Reminders",
- "nextReminder": "Next Reminder",
- "none": "None"
+ "vehicle": "車輛",
+ "vehicles": "車輛",
+ "serviceRecords": "保養記錄",
+ "reminders": "提醒",
+ "nextReminder": "下一個提醒",
+ "none": "沒有"
},
"vikunja": {
- "projects": "Active Projects",
- "tasks7d": "Tasks Due This Week",
- "tasksOverdue": "Overdue Tasks",
- "tasksInProgress": "Tasks In Progress"
+ "projects": "正在應用的項目",
+ "tasks7d": "本週到期任務",
+ "tasksOverdue": "逾期處理",
+ "tasksInProgress": "正在執行的任務"
},
"headscale": {
"name": "名稱",
@@ -987,7 +987,7 @@
},
"beszel": {
"name": "名稱",
- "systems": "Systems",
+ "systems": "系統",
"up": "在線",
"down": "離線",
"paused": "擱置中",
@@ -996,27 +996,27 @@
"updated": "已更新",
"cpu": "CPU",
"memory": "記憶體",
- "disk": "Disk",
- "network": "NET"
+ "disk": "儲存空間",
+ "network": "網路"
},
"argocd": {
- "apps": "Apps",
- "synced": "Synced",
- "outOfSync": "Out Of Sync",
+ "apps": "應用程式",
+ "synced": "已同步",
+ "outOfSync": "不同步",
"healthy": "健康",
- "degraded": "Degraded",
- "progressing": "Progressing",
+ "degraded": "已降級",
+ "progressing": "進度",
"missing": "缺少",
- "suspended": "Suspended"
+ "suspended": "暫停"
},
"spoolman": {
- "loading": "Loading"
+ "loading": "載入中 "
},
"gitlab": {
- "groups": "Groups",
+ "groups": "群組",
"issues": "出版",
- "merges": "Merge Requests",
- "projects": "Projects"
+ "merges": "合併請求",
+ "projects": "專"
},
"apcups": {
"status": "狀態",
@@ -1024,23 +1024,23 @@
"bcharge": "充電",
"timeleft": "剩餘時間"
},
- "hoarder": {
- "bookmarks": "Bookmarks",
- "favorites": "Favorites",
- "archived": "Archived",
- "highlights": "Highlights",
- "lists": "Lists",
+ "karakeep": {
+ "bookmarks": "書籤",
+ "favorites": "我的最愛",
+ "archived": "已存檔",
+ "highlights": "標記",
+ "lists": "列表",
"tags": "標籤"
},
"slskd": {
"slskStatus": "網絡",
- "connected": "Connected",
+ "connected": "已連線",
"disconnected": "連接已中斷",
- "updateStatus": "Update",
+ "updateStatus": "更新",
"update_yes": "可觀看",
"update_no": "已更新至最新",
- "downloads": "Downloads",
- "uploads": "Uploads",
+ "downloads": "下載",
+ "uploads": "上傳",
"sharedFiles": "檔案"
}
}
From 2376184b144ffe47b73c18683e8170f148212ba3 Mon Sep 17 00:00:00 2001
From: shamoon <4887959+shamoon@users.noreply.github.com>
Date: Mon, 28 Apr 2025 08:20:50 -0700
Subject: [PATCH 88/89] Bump version to 1.2.0
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 0c3afd92..9ac85840 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "homepage",
- "version": "1.1.1",
+ "version": "1.2.0",
"private": true,
"scripts": {
"preinstall": "npx only-allow pnpm",
From 1370cd195a6f5a43f08409245bf94a5766784cab Mon Sep 17 00:00:00 2001
From: DI0IK
Date: Thu, 12 Dec 2024 15:15:24 +0100
Subject: [PATCH 89/89] homepage-plus
---
.github/workflows/crowdin.yml | 4 +-
.github/workflows/docker-publish.yml | 16 +++---
Dockerfile | 4 +-
docs/configs/settings.md | 39 +++++++++++++
mkdocs.yml | 6 +-
src/components/quicklaunch.jsx | 2 +-
src/pages/api/auth.js | 17 ++++++
src/pages/api/bookmarks.js | 5 +-
src/pages/api/services/index.js | 5 +-
src/pages/api/widgets/index.js | 5 +-
src/pages/index.jsx | 47 +++++++++-------
src/utils/config/api-response.js | 35 +++++++-----
src/utils/identity/identity-helpers.js | 70 ++++++++++++++++++++++++
src/utils/identity/null.js | 21 +++++++
src/utils/identity/proxy.js | 34 ++++++++++++
src/utils/kubernetes/resource-helpers.js | 6 ++
16 files changed, 265 insertions(+), 51 deletions(-)
create mode 100644 src/pages/api/auth.js
create mode 100644 src/utils/identity/identity-helpers.js
create mode 100644 src/utils/identity/null.js
create mode 100644 src/utils/identity/proxy.js
diff --git a/.github/workflows/crowdin.yml b/.github/workflows/crowdin.yml
index f3c90cf3..7edb1b10 100644
--- a/.github/workflows/crowdin.yml
+++ b/.github/workflows/crowdin.yml
@@ -2,8 +2,8 @@ name: Crowdin Action
on:
workflow_dispatch:
- schedule:
- - cron: '2 */12 * * *'
+ # schedule:
+ # - cron: '2 */12 * * *'
push:
paths: [
'/public/locales/en/**',
diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml
index 7a133c1d..855f7af3 100644
--- a/.github/workflows/docker-publish.yml
+++ b/.github/workflows/docker-publish.yml
@@ -1,14 +1,16 @@
name: Docker CI
on:
- schedule:
- - cron: '20 0 * * *'
+ # schedule:
+ # - cron: '20 0 * * *'
push:
branches:
- main
- feature/**
- dev
- tags: [ 'v*.*.*' ]
+ - homepage-plus
+ # Publish semver tags as releases.
+ tags: [ 'v*.*.*-plus' ]
paths-ignore:
- 'docs/**'
- 'mkdocs.yml'
@@ -18,6 +20,7 @@ on:
- 'docs/**'
- 'mkdocs.yml'
merge_group:
+ workflow_dispatch:
env:
IMAGE_NAME: ${{ github.repository }}
@@ -58,13 +61,12 @@ jobs:
build:
name: Docker Build & Push
- if: github.repository == 'gethomepage/homepage'
- runs-on: self-hosted
- needs: [ pre-commit ]
+ runs-on: ubuntu-latest
+ needs:
+ - pre-commit
permissions:
contents: read
packages: write
- id-token: write
steps:
- name: Checkout repository
diff --git a/Dockerfile b/Dockerfile
index cac7623e..76008113 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -33,9 +33,9 @@ RUN if [ "$CI" != "true" ]; then \
FROM node:22-alpine AS runner
LABEL org.opencontainers.image.title="Homepage"
LABEL org.opencontainers.image.description="A self-hosted services landing page, with docker and service integrations."
-LABEL org.opencontainers.image.url="https://github.com/gethomepage/homepage"
+LABEL org.opencontainers.image.url="https://github.com/di0ik/homepage-plus"
LABEL org.opencontainers.image.documentation='https://github.com/gethomepage/homepage/wiki'
-LABEL org.opencontainers.image.source='https://github.com/gethomepage/homepage'
+LABEL org.opencontainers.image.source='https://github.com/di0ik/homepage-plus'
LABEL org.opencontainers.image.licenses='Apache-2.0'
# Setup
diff --git a/docs/configs/settings.md b/docs/configs/settings.md
index c1605f4d..513597b6 100644
--- a/docs/configs/settings.md
+++ b/docs/configs/settings.md
@@ -556,3 +556,42 @@ or per service widget (`services.yaml`) with:
```
If either value is set to true, the error message will be hidden.
+
+## Identity Based Visibiltiy
+
+Basic user identity integration is implemeted via an `identity` section. An identity provider can be configured using the `provider` section with the given type. Currently the only provider supported is `proxy`, where the users identification and group membership are passed via HTTP Request headers (in plaintext). The expectation is that the application will be accessed only via an authenticating proxy (i.e traefik or nginx).
+
+The group and user headers are both configurable like so:
+
+```yaml
+identity:
+ provider:
+ type: proxy
+ groupHeader: "X-group-header"
+ userHeader: "X-user-header"
+```
+
+Identity based visibility can be configured on the service, bookmark, and widget level using the `allowUsers` and `allowGroups` list. The default is to allow all users and groups.
+
+```yaml
+- Example Servie:
+ allowGroups:
+ - Group1
+ - Group2
+ - Group3
+ allowUsers:
+ - User1
+ - User2
+ - User3
+```
+
+Identity visibility for groups can be set in the `groups` under `identity`. In general the `groups` tag follows the format of the `layout` section. For example:
+
+```yaml
+identity:
+ groups:
+ - My Service Group:
+ allowGroups: ["Group1", "Group2"]
+ - My Other Group:
+ allowGroups: ["Group1"]
+```
diff --git a/mkdocs.yml b/mkdocs.yml
index 8bb19e43..04b888c6 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -4,9 +4,9 @@ site_name: Homepage
site_url: https://gethomepage.dev/
# Repository
-repo_name: gethomepage/homepage
-repo_url: https://github.com/gethomepage/homepage
-edit_uri: https://github.com/gethomepage/homepage/tree/main/docs/
+repo_name: di0ik/homepage-plus
+repo_url: https://github.com/di0ik/homepage-plus
+edit_uri: https://github.com/di0ik/homepage-plus/tree/main/docs/
nav:
- "Home":
diff --git a/src/components/quicklaunch.jsx b/src/components/quicklaunch.jsx
index a9827659..5ed9ace7 100644
--- a/src/components/quicklaunch.jsx
+++ b/src/components/quicklaunch.jsx
@@ -21,7 +21,7 @@ export default function QuickLaunch({ servicesAndBookmarks, searchString, setSea
const [searchSuggestions, setSearchSuggestions] = useState([]);
const { data: widgets } = useSWR("/api/widgets");
- const searchWidget = Object.values(widgets).find((w) => w.type === "search");
+ const searchWidget = widgets && Object.values(widgets).find((w) => w.type === "search");
let searchProvider;
diff --git a/src/pages/api/auth.js b/src/pages/api/auth.js
new file mode 100644
index 00000000..9f79c930
--- /dev/null
+++ b/src/pages/api/auth.js
@@ -0,0 +1,17 @@
+import { checkAllowedGroup, readIdentitySettings } from "utils/identity/identity-helpers";
+import { getSettings } from "utils/config/config";
+
+export default async function handler(req, res) {
+ const { group } = req.query;
+ const { provider, groups } = readIdentitySettings(getSettings().identity);
+
+ try {
+ if (checkAllowedGroup(provider.getIdentity(req), groups, group)) {
+ res.json({ group });
+ } else {
+ res.status(401).json({ message: "Group unathorized" });
+ }
+ } catch (err) {
+ res.status(500).send("Error getting user identity");
+ }
+}
diff --git a/src/pages/api/bookmarks.js b/src/pages/api/bookmarks.js
index 63d1e29e..cf8bc09d 100644
--- a/src/pages/api/bookmarks.js
+++ b/src/pages/api/bookmarks.js
@@ -1,5 +1,8 @@
+import { readIdentitySettings } from "utils/identity/identity-helpers";
import { bookmarksResponse } from "utils/config/api-response";
+import { getSettings } from "utils/config/config";
export default async function handler(req, res) {
- res.send(await bookmarksResponse());
+ const { provider, groups } = readIdentitySettings(getSettings().identity);
+ res.send(await bookmarksResponse(provider.getIdentity(req), groups));
}
diff --git a/src/pages/api/services/index.js b/src/pages/api/services/index.js
index 46d0a721..f6ba54c8 100644
--- a/src/pages/api/services/index.js
+++ b/src/pages/api/services/index.js
@@ -1,5 +1,8 @@
+import { readIdentitySettings } from "utils/identity/identity-helpers";
import { servicesResponse } from "utils/config/api-response";
+import { getSettings } from "utils/config/config";
export default async function handler(req, res) {
- res.send(await servicesResponse());
+ const { provider, groups } = readIdentitySettings(getSettings().identity);
+ res.send(await servicesResponse(provider.getIdentity(req), groups));
}
diff --git a/src/pages/api/widgets/index.js b/src/pages/api/widgets/index.js
index 513e02e9..447ef340 100644
--- a/src/pages/api/widgets/index.js
+++ b/src/pages/api/widgets/index.js
@@ -1,5 +1,8 @@
+import { readIdentitySettings } from "utils/identity/identity-helpers";
import { widgetsResponse } from "utils/config/api-response";
+import { getSettings } from "utils/config/config";
export default async function handler(req, res) {
- res.send(await widgetsResponse());
+ const { provider } = readIdentitySettings(getSettings().identity);
+ res.send(await widgetsResponse(provider.getIdentity(req)));
}
diff --git a/src/pages/index.jsx b/src/pages/index.jsx
index f8d48fdf..95c19dd3 100644
--- a/src/pages/index.jsx
+++ b/src/pages/index.jsx
@@ -15,12 +15,14 @@ import { useRouter } from "next/router";
import Script from "next/script";
import { useContext, useEffect, useMemo, useState } from "react";
import { BiError } from "react-icons/bi";
-import useSWR, { SWRConfig } from "swr";
+import useSWR, { SWRConfig, unstable_serialize as unstableSerialize } from "swr";
import { ColorContext } from "utils/contexts/color";
import { SettingsContext } from "utils/contexts/settings";
import { TabContext } from "utils/contexts/tab";
import { ThemeContext } from "utils/contexts/theme";
+import { fetchWithIdentity, readIdentitySettings } from "utils/identity/identity-helpers";
+import NullIdentityProvider from "utils/identity/null";
import { bookmarksResponse, servicesResponse, widgetsResponse } from "utils/config/api-response";
import { getSettings } from "utils/config/config";
import useWindowFocus from "utils/hooks/window-focus";
@@ -41,25 +43,28 @@ const Version = dynamic(() => import("components/version"), {
const rightAlignedWidgets = ["weatherapi", "openweathermap", "weather", "openmeteo", "search", "datetime"];
-export async function getStaticProps() {
+export async function getServerSideProps({ req }) {
let logger;
try {
logger = createLogger("index");
- const { providers, ...settings } = getSettings();
+ const { providers, identity, ...settings } = getSettings();
+ const { provider, groups } = readIdentitySettings(identity);
- const services = await servicesResponse();
- const bookmarks = await bookmarksResponse();
- const widgets = await widgetsResponse();
+ const services = await servicesResponse(provider.getIdentity(req), groups);
+ const bookmarks = await bookmarksResponse(provider.getIdentity(req), groups);
+ const widgets = await widgetsResponse(provider.getIdentity(req));
+ const identityContext = provider.getContext(req);
return {
props: {
initialSettings: settings,
fallback: {
- "/api/services": services,
- "/api/bookmarks": bookmarks,
- "/api/widgets": widgets,
+ [unstableSerialize(["/api/services", identityContext])]: services,
+ [unstableSerialize(["/api/bookmarks", identityContext])]: bookmarks,
+ [unstableSerialize(["/api/widgets", identityContext])]: widgets,
"/api/hash": false,
},
+ identityContext,
...(await serverSideTranslations(settings.language ?? "en")),
},
};
@@ -67,22 +72,24 @@ export async function getStaticProps() {
if (logger && e) {
logger.error(e);
}
+ const identityContext = NullIdentityProvider.create().getContext(req);
return {
props: {
initialSettings: {},
fallback: {
- "/api/services": [],
- "/api/bookmarks": [],
- "/api/widgets": [],
+ [unstableSerialize(["/api/services", identityContext])]: [],
+ [unstableSerialize(["/api/bookmarks", identityContext])]: [],
+ [unstableSerialize(["/api/widgets", identityContext])]: [],
"/api/hash": false,
},
+ identityContext,
...(await serverSideTranslations("en")),
},
};
}
}
-function Index({ initialSettings, fallback }) {
+function Index({ initialSettings, fallback, identityContext }) {
const windowFocused = useWindowFocus();
const [stale, setStale] = useState(false);
const { data: errorsData } = useSWR("/api/validate");
@@ -171,7 +178,7 @@ function Index({ initialSettings, fallback }) {
return (
fetch(resource, init).then((res) => res.json()) }}>
-
+
);
@@ -197,7 +204,7 @@ function getAllServices(services) {
return [...services.map(getServices).flat()];
}
-function Home({ initialSettings }) {
+function Home({ initialSettings, identityContext }) {
const { i18n } = useTranslation();
const { theme, setTheme } = useContext(ThemeContext);
const { color, setColor } = useContext(ColorContext);
@@ -209,9 +216,9 @@ function Home({ initialSettings }) {
setSettings(initialSettings);
}, [initialSettings, setSettings]);
- const { data: services } = useSWR("/api/services");
- const { data: bookmarks } = useSWR("/api/bookmarks");
- const { data: widgets } = useSWR("/api/widgets");
+ const { data: services } = useSWR(["/api/services", identityContext], fetchWithIdentity);
+ const { data: bookmarks } = useSWR(["/api/bookmarks", identityContext], fetchWithIdentity);
+ const { data: widgets } = useSWR(["/api/widgets", identityContext], fetchWithIdentity);
const servicesAndBookmarks = [...bookmarks.map((bg) => bg.bookmarks).flat(), ...getAllServices(services)].filter(
(i) => i?.href,
@@ -497,7 +504,7 @@ function Home({ initialSettings }) {
);
}
-export default function Wrapper({ initialSettings, fallback }) {
+export default function Wrapper({ initialSettings, fallback, identityContext }) {
const { themeContext } = useContext(ThemeContext);
const wrappedStyle = {};
let backgroundBlur = false;
@@ -550,7 +557,7 @@ export default function Wrapper({ initialSettings, fallback }) {
backgroundBrightness && `backdrop-brightness-${initialSettings.background.brightness}`,
)}
>
-
+
diff --git a/src/utils/config/api-response.js b/src/utils/config/api-response.js
index 4691f9bc..4ceb525f 100644
--- a/src/utils/config/api-response.js
+++ b/src/utils/config/api-response.js
@@ -13,6 +13,7 @@ import {
servicesFromKubernetes,
} from "utils/config/service-helpers";
import { cleanWidgetGroups, widgetsFromConfig } from "utils/config/widget-helpers";
+import { filterAllowedBookmarks, filterAllowedServices, filterAllowedWidgets } from "utils/identity/identity-helpers";
/**
* Compares services by weight then by name.
@@ -25,7 +26,7 @@ function compareServices(service1, service2) {
return service1.name.localeCompare(service2.name);
}
-export async function bookmarksResponse() {
+export async function bookmarksResponse(perms, idGroups) {
checkAndCopyConfig("bookmarks.yaml");
const bookmarksYaml = path.join(CONF_DIR, "bookmarks.yaml");
@@ -46,13 +47,17 @@ export async function bookmarksResponse() {
}
// map easy to write YAML objects into easy to consume JS arrays
- const bookmarksArray = bookmarks.map((group) => ({
- name: Object.keys(group)[0],
- bookmarks: group[Object.keys(group)[0]].map((entries) => ({
- name: Object.keys(entries)[0],
- ...entries[Object.keys(entries)[0]][0],
+ const bookmarksArray = filterAllowedBookmarks(
+ perms,
+ idGroups,
+ bookmarks.map((group) => ({
+ name: Object.keys(group)[0],
+ bookmarks: group[Object.keys(group)[0]].map((entries) => ({
+ name: Object.keys(entries)[0],
+ ...entries[Object.keys(entries)[0]][0],
+ })),
})),
- }));
+ );
const sortedGroups = [];
const unsortedGroups = [];
@@ -71,11 +76,11 @@ export async function bookmarksResponse() {
return [...sortedGroups.filter((g) => g), ...unsortedGroups];
}
-export async function widgetsResponse() {
+export async function widgetsResponse(perms) {
let configuredWidgets;
try {
- configuredWidgets = cleanWidgetGroups(await widgetsFromConfig());
+ configuredWidgets = filterAllowedWidgets(perms, await cleanWidgetGroups(await widgetsFromConfig()));
} catch (e) {
console.error("Failed to load widgets, please check widgets.yaml for errors or remove example entries.");
if (e) console.error(e);
@@ -135,14 +140,14 @@ function pruneEmptyGroups(groups) {
});
}
-export async function servicesResponse() {
+export async function servicesResponse(perms, idGroups) {
let discoveredDockerServices;
let discoveredKubernetesServices;
let configuredServices;
let initialSettings;
try {
- discoveredDockerServices = cleanServiceGroups(await servicesFromDocker());
+ discoveredDockerServices = filterAllowedServices(perms, idGroups, cleanServiceGroups(await servicesFromDocker()));
if (discoveredDockerServices?.length === 0) {
console.debug("No containers were found with homepage labels.");
}
@@ -153,7 +158,11 @@ export async function servicesResponse() {
}
try {
- discoveredKubernetesServices = cleanServiceGroups(await servicesFromKubernetes());
+ discoveredKubernetesServices = filterAllowedServices(
+ perms,
+ idGroups,
+ cleanServiceGroups(await servicesFromKubernetes()),
+ );
} catch (e) {
console.error("Failed to discover services, please check kubernetes.yaml for errors or remove example entries.");
if (e) console.error(e.toString());
@@ -161,7 +170,7 @@ export async function servicesResponse() {
}
try {
- configuredServices = cleanServiceGroups(await servicesFromConfig());
+ configuredServices = filterAllowedServices(perms, idGroups, cleanServiceGroups(await servicesFromConfig()));
} catch (e) {
console.error("Failed to load services.yaml, please check for errors");
if (e) console.error(e.toString());
diff --git a/src/utils/identity/identity-helpers.js b/src/utils/identity/identity-helpers.js
new file mode 100644
index 00000000..e50f83c5
--- /dev/null
+++ b/src/utils/identity/identity-helpers.js
@@ -0,0 +1,70 @@
+import ProxyIdentityProvider from "./proxy";
+import NullIdentityProvider from "./null";
+
+const IdentityProviders = {
+ null: NullIdentityProvider,
+ proxy: ProxyIdentityProvider,
+};
+
+function getProviderByKey(key) {
+ return IdentityProviders[key] || NullIdentityProvider;
+}
+
+function identityAllow({ user, groups }, item) {
+ const groupAllow =
+ "allowGroups" in item && item.allowGroups && groups.some((group) => item.allowGroups.includes(group));
+ const userAllow = "allowUsers" in item && item.allowUsers && item.allowUsers.includes(user);
+ const allowAll = !("allowGroups" in item && item.allowGroups) && !("allowUsers" in item && item.allowUsers);
+
+ return userAllow || groupAllow || allowAll;
+}
+
+export function checkAllowedGroup(perms, idGroups, groupName) {
+ const testGroup = idGroups.find((group) => group.name === groupName);
+ return testGroup ? identityAllow(perms, testGroup) : true;
+}
+
+function filterAllowedItems(perms, idGroups, groups, groupKey) {
+ return groups
+ .filter((group) => checkAllowedGroup(perms, idGroups, group.name))
+ .map((group) => ({
+ name: group.name,
+ [groupKey]: group[groupKey].filter((item) => identityAllow(perms, item)),
+ }))
+ .filter((group) => group[groupKey].length);
+}
+
+export function readIdentitySettings({ provider, groups } = {}) {
+ let groupArray = [];
+ if (groups) {
+ if (Array.isArray(groups)) {
+ groupArray = groups.map((group) => ({
+ name: Object.keys(group)[0],
+ allowUsers: group.allowUsers,
+ allowGroups: group.allowGroups,
+ }));
+ } else {
+ groupArray = Object.keys(groups).map((group) => ({
+ name: group,
+ allowUsers: groups[group].allowUsers,
+ allowGroups: groups[group].allowGroups,
+ }));
+ }
+ }
+
+ return {
+ provider: provider ? getProviderByKey(provider.type).create(provider) : NullIdentityProvider.create(),
+ groups: groupArray,
+ };
+}
+
+export async function fetchWithIdentity(key, context) {
+ return getProviderByKey(context.provider).fetch([key, context]);
+}
+
+export const filterAllowedServices = (perms, idGroups, services) =>
+ filterAllowedItems(perms, idGroups, services, "services");
+export const filterAllowedBookmarks = (perms, idGroups, bookmarks) =>
+ filterAllowedItems(perms, idGroups, bookmarks, "bookmarks");
+export const filterAllowedWidgets = (perms, widgets) =>
+ widgets.filter((widget) => identityAllow(perms, widget.options));
diff --git a/src/utils/identity/null.js b/src/utils/identity/null.js
new file mode 100644
index 00000000..476946f1
--- /dev/null
+++ b/src/utils/identity/null.js
@@ -0,0 +1,21 @@
+const NullIdentity = { user: null, groups: [] };
+
+function createNullIdentity() {
+ return {
+ getIdentity: () => NullIdentity,
+ getContext: () => ({
+ provider: "null",
+ }),
+ };
+}
+
+async function fetchNullIdentity([key]) {
+ return fetch(key).then((res) => res.json());
+}
+
+const NullIdentityProvider = {
+ create: createNullIdentity,
+ fetch: fetchNullIdentity,
+};
+
+export default NullIdentityProvider;
diff --git a/src/utils/identity/proxy.js b/src/utils/identity/proxy.js
new file mode 100644
index 00000000..7159a658
--- /dev/null
+++ b/src/utils/identity/proxy.js
@@ -0,0 +1,34 @@
+// 'proxy' identity provider is meant to be used by a reverse proxy that injects permission headers into the origin
+// request. In this case we are relying on our proxy to authenitcate our users and validate their identity.
+function getProxyPermissions(userHeader, groupHeader, groupSeparator, request) {
+ const user =
+ userHeader && request.headers[userHeader.toLowerCase()] ? request.headers[userHeader.toLowerCase()] : null;
+ const groupsString =
+ groupHeader && request.headers[groupHeader.toLowerCase()] ? request.headers[groupHeader.toLowerCase()] : "";
+
+ return { user, groups: groupsString ? groupsString.split(groupSeparator ?? "|").map((v) => v.trim()) : [] };
+}
+
+function createProxyIdentity({ groupHeader, groupSeparator, userHeader }) {
+ return {
+ getContext: (request) => ({
+ provider: "proxy",
+ ...(userHeader &&
+ request.headers[userHeader] && { [userHeader.toLowerCase()]: request.headers[userHeader.toLowerCase()] }),
+ ...(groupHeader &&
+ request.headers[groupHeader] && { [groupHeader.toLowerCase()]: request.headers[groupHeader.toLowerCase()] }),
+ }),
+ getIdentity: (request) => getProxyPermissions(userHeader, groupHeader, groupSeparator, request),
+ };
+}
+
+async function fetchProxyIdentity([key, context]) {
+ return fetch(key, { headers: context.headers }).then((res) => res.json());
+}
+
+const ProxyIdentityProvider = {
+ create: createProxyIdentity,
+ fetch: fetchProxyIdentity,
+};
+
+export default ProxyIdentityProvider;
diff --git a/src/utils/kubernetes/resource-helpers.js b/src/utils/kubernetes/resource-helpers.js
index 0ac143ac..c7d69751 100644
--- a/src/utils/kubernetes/resource-helpers.js
+++ b/src/utils/kubernetes/resource-helpers.js
@@ -115,6 +115,12 @@ export async function constructedServiceFromResource(resource) {
if (resource.metadata.annotations[`${ANNOTATION_BASE}/statusStyle`]) {
constructedService.statusStyle = resource.metadata.annotations[`${ANNOTATION_BASE}/statusStyle`];
}
+ if (resource.metadata.annotations[`${ANNOTATION_BASE}/allowUsers`]) {
+ constructedService.allowUsers = resource.metadata.annotations[`${ANNOTATION_BASE}/allowUsers`].split(",");
+ }
+ if (resource.metadata.annotations[`${ANNOTATION_BASE}/allowGroups`]) {
+ constructedService.allowGroups = resource.metadata.annotations[`${ANNOTATION_BASE}/allowGroups`].split(",");
+ }
Object.keys(resource.metadata.annotations).forEach((annotation) => {
if (annotation.startsWith(ANNOTATION_WIDGET_BASE)) {