diff --git a/src/utils/proxy/handlers/credentialed.js b/src/utils/proxy/handlers/credentialed.js
index 56bbb151..76f0eba8 100644
--- a/src/utils/proxy/handlers/credentialed.js
+++ b/src/utils/proxy/handlers/credentialed.js
@@ -39,9 +39,9 @@ export default async function credentialedProxyHandler(req, res, map) {
headers.Authorization = `Bearer ${widget.key}`;
} else if (widget.type === "proxmox") {
headers.Authorization = `PVEAPIToken=${widget.username}=${widget.password}`;
- } else if (widget.type === "proxmoxbackupserver") {
- delete headers["Content-Type"];
- headers.Authorization = `PBSAPIToken=${widget.username}:${widget.password}`;
+ } else if (widget.type === "ngrok") {
+ headers.Authorization = `Bearer ${widget.key}`;
+ headers["Ngrok-Version"] = 2;
} else if (widget.type === "autobrr") {
headers["X-API-Token"] = `${widget.key}`;
} else if (widget.type === "tubearchivist") {
diff --git a/src/widgets/components.js b/src/widgets/components.js
index aa54e246..f101baf0 100644
--- a/src/widgets/components.js
+++ b/src/widgets/components.js
@@ -41,6 +41,7 @@ const components = {
navidrome: dynamic(() => import("./navidrome/component")),
nextcloud: dynamic(() => import("./nextcloud/component")),
nextdns: dynamic(() => import("./nextdns/component")),
+ ngrok: dynamic(() => import("./ngrok/component")),
npm: dynamic(() => import("./npm/component")),
nzbget: dynamic(() => import("./nzbget/component")),
octoprint: dynamic(() => import("./octoprint/component")),
diff --git a/src/widgets/ngrok/component.jsx b/src/widgets/ngrok/component.jsx
new file mode 100755
index 00000000..cf0c3676
--- /dev/null
+++ b/src/widgets/ngrok/component.jsx
@@ -0,0 +1,50 @@
+import { useTranslation } from "next-i18next";
+
+import Container from "components/services/widget/container";
+import useWidgetAPI from "utils/proxy/use-widget-api";
+
+
+function displayUrl(url , index){
+ return (
+
+