diff --git a/src/widgets/grafana/component.jsx b/src/widgets/grafana/component.jsx
new file mode 100755
index 00000000..2aba23ba
--- /dev/null
+++ b/src/widgets/grafana/component.jsx
@@ -0,0 +1,40 @@
+import { useTranslation } from "next-i18next";
+
+import Container from "components/services/widget/container";
+import Block from "components/services/widget/block";
+import useWidgetAPI from "utils/proxy/use-widget-api";
+
+export default function Component({ service }) {
+ const { t } = useTranslation();
+
+ const { widget } = service;
+ const { data: alertsData, error: alertsError } = useWidgetAPI(widget, "alerts");
+
+ if (alertsError) {
+ return ;
+ }
+
+ if (!alertsData) {
+ return (
+
+
+
+
+ );
+ }
+
+ const totalAlerts = Object.keys(alertsData).length;
+ let alertsTriggered = 0;
+ Object.keys(alertsData).forEach((key) => {
+ if (alertsData[key].state === "alerting") {
+ alertsTriggered += 1;
+ }
+ });
+
+ return (
+
+
+
+
+ );
+}
diff --git a/src/widgets/grafana/widget.js b/src/widgets/grafana/widget.js
new file mode 100755
index 00000000..6ab53db0
--- /dev/null
+++ b/src/widgets/grafana/widget.js
@@ -0,0 +1,14 @@
+import genericProxyHandler from "utils/proxy/handlers/generic";
+
+const widget = {
+ api: "{url}/api/{endpoint}",
+ proxyHandler: genericProxyHandler,
+
+ mappings: {
+ alerts: {
+ endpoint: "alerts",
+ },
+ },
+};
+
+export default widget;
\ No newline at end of file
diff --git a/src/widgets/strelaysrv/components.js b/src/widgets/strelaysrv/components.js
new file mode 100755
index 00000000..ba94b3b5
--- /dev/null
+++ b/src/widgets/strelaysrv/components.js
@@ -0,0 +1,76 @@
+import dynamic from "next/dynamic";
+
+const components = {
+ adguard: dynamic(() => import("./adguard/component")),
+ authentik: dynamic(() => import("./authentik/component")),
+ autobrr: dynamic(() => import("./autobrr/component")),
+ bazarr: dynamic(() => import("./bazarr/component")),
+ changedetectionio: dynamic(() => import("./changedetectionio/component")),
+ cloudflared: dynamic(() => import("./cloudflared/component")),
+ coinmarketcap: dynamic(() => import("./coinmarketcap/component")),
+ deluge: dynamic(() => import("./deluge/component")),
+ diskstation: dynamic(() => import("./diskstation/component")),
+ downloadstation: dynamic(() => import("./downloadstation/component")),
+ docker: dynamic(() => import("./docker/component")),
+ kubernetes: dynamic(() => import("./kubernetes/component")),
+ emby: dynamic(() => import("./emby/component")),
+ fileflows: dynamic(() => import("./fileflows/component")),
+ flood: dynamic(() => import("./flood/component")),
+ gluetun: dynamic(() => import("./gluetun/component")),
+ gotify: dynamic(() => import("./gotify/component")),
+ grafana: dynamic(() => import("./grafana/component")),
+ hdhomerun: dynamic(() => import("./hdhomerun/component")),
+ homebridge: dynamic(() => import("./homebridge/component")),
+ jackett: dynamic(() => import("./jackett/component")),
+ jellyfin: dynamic(() => import("./emby/component")),
+ jellyseerr: dynamic(() => import("./jellyseerr/component")),
+ komga: dynamic(() => import("./komga/component")),
+ kopia: dynamic(() => import("./kopia/component")),
+ lidarr: dynamic(() => import("./lidarr/component")),
+ mastodon: dynamic(() => import("./mastodon/component")),
+ medusa: dynamic(() => import("./medusa/component")),
+ miniflux: dynamic(() => import("./miniflux/component")),
+ mikrotik: dynamic(() => import("./mikrotik/component")),
+ moonraker: dynamic(() => import("./moonraker/component")),
+ mylar: dynamic(() => import("./mylar/component")),
+ navidrome: dynamic(() => import("./navidrome/component")),
+ nextdns: dynamic(() => import("./nextdns/component")),
+ npm: dynamic(() => import("./npm/component")),
+ nzbget: dynamic(() => import("./nzbget/component")),
+ octoprint: dynamic(() => import("./octoprint/component")),
+ omada: dynamic(() => import("./omada/component")),
+ ombi: dynamic(() => import("./ombi/component")),
+ opnsense: dynamic(() => import("./opnsense/component")),
+ overseerr: dynamic(() => import("./overseerr/component")),
+ paperlessngx: dynamic(() => import("./paperlessngx/component")),
+ photoprism: dynamic(() => import("./photoprism/component")),
+ proxmoxbackupserver: dynamic(() => import("./proxmoxbackupserver/component")),
+ pihole: dynamic(() => import("./pihole/component")),
+ plex: dynamic(() => import("./plex/component")),
+ portainer: dynamic(() => import("./portainer/component")),
+ prowlarr: dynamic(() => import("./prowlarr/component")),
+ proxmox: dynamic(() => import("./proxmox/component")),
+ pyload: dynamic(() => import("./pyload/component")),
+ qbittorrent: dynamic(() => import("./qbittorrent/component")),
+ radarr: dynamic(() => import("./radarr/component")),
+ readarr: dynamic(() => import("./readarr/component")),
+ rutorrent: dynamic(() => import("./rutorrent/component")),
+ sabnzbd: dynamic(() => import("./sabnzbd/component")),
+ scrutiny: dynamic(() => import("./scrutiny/component")),
+ sonarr: dynamic(() => import("./sonarr/component")),
+ speedtest: dynamic(() => import("./speedtest/component")),
+ strelaysrv: dynamic(() => import("./strelaysrv/component")),
+ tautulli: dynamic(() => import("./tautulli/component")),
+ tdarr: dynamic(() => import("./tdarr/component")),
+ traefik: dynamic(() => import("./traefik/component")),
+ transmission: dynamic(() => import("./transmission/component")),
+ tubearchivist: dynamic(() => import("./tubearchivist/component")),
+ truenas: dynamic(() => import("./truenas/component")),
+ unifi: dynamic(() => import("./unifi/component")),
+ watchtower: dynamic(() => import("./watchtower/component")),
+ xteve: dynamic(() => import("./xteve/component")),
+ immich: dynamic(() => import("./immich/component")),
+ uptimekuma: dynamic(() => import("./uptimekuma/component")),
+};
+
+export default components;
\ No newline at end of file
diff --git a/src/widgets/strelaysrv/widgets.js b/src/widgets/strelaysrv/widgets.js
new file mode 100755
index 00000000..00cb75fc
--- /dev/null
+++ b/src/widgets/strelaysrv/widgets.js
@@ -0,0 +1,141 @@
+import adguard from "./adguard/widget";
+import authentik from "./authentik/widget";
+import autobrr from "./autobrr/widget";
+import bazarr from "./bazarr/widget";
+import changedetectionio from "./changedetectionio/widget";
+import cloudflared from "./cloudflared/widget";
+import coinmarketcap from "./coinmarketcap/widget";
+import deluge from "./deluge/widget";
+import diskstation from "./diskstation/widget";
+import downloadstation from "./downloadstation/widget";
+import emby from "./emby/widget";
+import fileflows from "./fileflows/widget";
+import flood from "./flood/widget";
+import gluetun from "./gluetun/widget";
+import gotify from "./gotify/widget";
+import grafana from "./grafana/widget";
+import hdhomerun from "./hdhomerun/widget";
+import homebridge from "./homebridge/widget";
+import jackett from "./jackett/widget";
+import jellyseerr from "./jellyseerr/widget";
+import komga from "./komga/widget";
+import kopia from "./kopia/widget";
+import lidarr from "./lidarr/widget";
+import mastodon from "./mastodon/widget";
+import medusa from "./medusa/widget";
+import miniflux from "./miniflux/widget";
+import mikrotik from "./mikrotik/widget";
+import moonraker from "./moonraker/widget";
+import mylar from "./mylar/widget";
+import navidrome from "./navidrome/widget";
+import nextdns from "./nextdns/widget";
+import npm from "./npm/widget";
+import nzbget from "./nzbget/widget";
+import octoprint from "./octoprint/widget";
+import omada from "./omada/widget";
+import ombi from "./ombi/widget";
+import opnsense from "./opnsense/widget";
+import overseerr from "./overseerr/widget";
+import paperlessngx from "./paperlessngx/widget";
+import photoprism from "./photoprism/widget";
+import proxmoxbackupserver from "./proxmoxbackupserver/widget";
+import pihole from "./pihole/widget";
+import plex from "./plex/widget";
+import portainer from "./portainer/widget";
+import prowlarr from "./prowlarr/widget";
+import proxmox from "./proxmox/widget";
+import pyload from "./pyload/widget";
+import qbittorrent from "./qbittorrent/widget";
+import radarr from "./radarr/widget";
+import readarr from "./readarr/widget";
+import rutorrent from "./rutorrent/widget";
+import sabnzbd from "./sabnzbd/widget";
+import scrutiny from "./scrutiny/widget";
+import sonarr from "./sonarr/widget";
+import speedtest from "./speedtest/widget";
+import strelaysrv from "./strelaysrv/widget";
+import tautulli from "./tautulli/widget";
+import tdarr from "./tdarr/widget";
+import traefik from "./traefik/widget";
+import transmission from "./transmission/widget";
+import tubearchivist from "./tubearchivist/widget";
+import truenas from "./truenas/widget";
+import unifi from "./unifi/widget";
+import watchtower from "./watchtower/widget";
+import xteve from "./xteve/widget";
+import immich from "./immich/widget";
+import uptimekuma from "./uptimekuma/widget";
+
+const widgets = {
+ adguard,
+ authentik,
+ autobrr,
+ bazarr,
+ changedetectionio,
+ cloudflared,
+ coinmarketcap,
+ deluge,
+ diskstation,
+ downloadstation,
+ emby,
+ fileflows,
+ flood,
+ gluetun,
+ gotify,
+ grafana,
+ hdhomerun,
+ homebridge,
+ jackett,
+ jellyfin: emby,
+ jellyseerr,
+ komga,
+ kopia,
+ lidarr,
+ mastodon,
+ medusa,
+ miniflux,
+ mikrotik,
+ moonraker,
+ mylar,
+ navidrome,
+ nextdns,
+ npm,
+ nzbget,
+ octoprint,
+ omada,
+ ombi,
+ opnsense,
+ overseerr,
+ paperlessngx,
+ photoprism,
+ proxmoxbackupserver,
+ pihole,
+ plex,
+ portainer,
+ prowlarr,
+ proxmox,
+ pyload,
+ qbittorrent,
+ radarr,
+ readarr,
+ rutorrent,
+ sabnzbd,
+ scrutiny,
+ sonarr,
+ speedtest,
+ strelaysrv,
+ tautulli,
+ tdarr,
+ traefik,
+ transmission,
+ tubearchivist,
+ truenas,
+ unifi,
+ unifi_console: unifi,
+ watchtower,
+ xteve,
+ immich,
+ uptimekuma,
+};
+
+export default widgets;
\ No newline at end of file