diff --git a/docs/widgets/services/develancacheui.md b/docs/widgets/services/develancacheui.md
new file mode 100644
index 00000000..d385fe78
--- /dev/null
+++ b/docs/widgets/services/develancacheui.md
@@ -0,0 +1,14 @@
+---
+title: DeveLanCacheUI
+description: DeveLanCacheUI Widget Configuration
+---
+
+Learn more about [DeveLanCacheUI](https://github.com/devedse/DeveLanCacheUI_Backend).
+
+```yaml
+widget:
+ type: develancacheui
+ url: http://your.develancacheui_backend.host:port
+```
+
+The url should point to the DeveLanCacheUI Backend (API)
diff --git a/docs/widgets/services/index.md b/docs/widgets/services/index.md
index c2c80ddb..c39ac0f0 100644
--- a/docs/widgets/services/index.md
+++ b/docs/widgets/services/index.md
@@ -22,6 +22,7 @@ You can also find a list of all available service widgets in the sidebar navigat
- [CrowdSec](crowdsec.md)
- [Custom API](customapi.md)
- [Deluge](deluge.md)
+- [DeveLanCacheUI](develancacheui.md)
- [DiskStation](diskstation.md)
- [DownloadStation](downloadstation.md)
- [Emby](emby.md)
diff --git a/public/locales/en/common.json b/public/locales/en/common.json
index cd9b2c14..1ac41f90 100644
--- a/public/locales/en/common.json
+++ b/public/locales/en/common.json
@@ -226,6 +226,10 @@
"leech": "Leech",
"seed": "Seed"
},
+ "develancacheui": {
+ "cachehitbytes": "Cache Hit Bytes",
+ "cachemissbytes": "Cache Miss Bytes"
+ },
"downloadstation": {
"download": "Download",
"upload": "Upload",
diff --git a/src/widgets/components.js b/src/widgets/components.js
index 15920242..b2d6659e 100644
--- a/src/widgets/components.js
+++ b/src/widgets/components.js
@@ -19,6 +19,7 @@ const components = {
iframe: dynamic(() => import("./iframe/component")),
customapi: dynamic(() => import("./customapi/component")),
deluge: dynamic(() => import("./deluge/component")),
+ develancacheui: dynamic(() => import("./develancacheui/component")),
diskstation: dynamic(() => import("./diskstation/component")),
downloadstation: dynamic(() => import("./downloadstation/component")),
docker: dynamic(() => import("./docker/component")),
diff --git a/src/widgets/develancacheui/component.jsx b/src/widgets/develancacheui/component.jsx
new file mode 100644
index 00000000..b13852c6
--- /dev/null
+++ b/src/widgets/develancacheui/component.jsx
@@ -0,0 +1,39 @@
+import { useTranslation } from "next-i18next";
+
+import Container from "components/services/widget/container";
+import Block from "components/services/widget/block";
+import useWidgetAPI from "utils/proxy/use-widget-api";
+
+export default function Component({ service }) {
+ const { t } = useTranslation();
+
+ const { widget } = service;
+
+ const { data: downloadStatsData, error: downloadStatsError } = useWidgetAPI(widget, "stats");
+
+ if (downloadStatsError) {
+ return ;
+ }
+
+ if (!downloadStatsData) {
+ return (
+
+
+
+
+ );
+ }
+
+ return (
+
+
+
+
+ );
+}
diff --git a/src/widgets/develancacheui/widget.js b/src/widgets/develancacheui/widget.js
new file mode 100644
index 00000000..e84b9d44
--- /dev/null
+++ b/src/widgets/develancacheui/widget.js
@@ -0,0 +1,14 @@
+import genericProxyHandler from "utils/proxy/handlers/generic";
+
+const widget = {
+ api: "{url}/{endpoint}",
+ proxyHandler: genericProxyHandler,
+
+ mappings: {
+ stats: {
+ endpoint: "DownloadStats/GetTotalDownloadStats",
+ },
+ },
+};
+
+export default widget;
diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js
index 684e2b7f..f4e55d57 100644
--- a/src/widgets/widgets.js
+++ b/src/widgets/widgets.js
@@ -15,6 +15,7 @@ import coinmarketcap from "./coinmarketcap/widget";
import crowdsec from "./crowdsec/widget";
import customapi from "./customapi/widget";
import deluge from "./deluge/widget";
+import develancacheui from "./develancacheui/widget";
import diskstation from "./diskstation/widget";
import downloadstation from "./downloadstation/widget";
import emby from "./emby/widget";
@@ -135,6 +136,7 @@ const widgets = {
crowdsec,
customapi,
deluge,
+ develancacheui,
diskstation,
downloadstation,
emby,