From 667d99e2e94b3479458dd0ef5e6dd4528b163e93 Mon Sep 17 00:00:00 2001
From: notohh <github@notohh.dev>
Date: Mon, 17 Mar 2025 05:31:42 -0400
Subject: [PATCH] yuki: remove homepage, add glance + komga

fmt jellyfin
update traefik

sops: remove homepage
---
 .sops.yaml                                |   4 -
 hosts/yuki/services/default.nix           |   3 +-
 hosts/yuki/services/glance.nix            | 399 ++++++++++++++++++++++
 hosts/yuki/services/homepage/default.nix  |  88 -----
 hosts/yuki/services/homepage/services.nix | 366 --------------------
 hosts/yuki/services/homepage/widgets.nix  |  30 --
 hosts/yuki/services/jellyfin.nix          |  16 +-
 hosts/yuki/services/komga.nix             |  11 +
 hosts/yuki/services/traefik.nix           |  20 +-
 secrets/homepage/secrets.yaml             |  21 --
 10 files changed, 435 insertions(+), 523 deletions(-)
 create mode 100644 hosts/yuki/services/glance.nix
 delete mode 100644 hosts/yuki/services/homepage/default.nix
 delete mode 100644 hosts/yuki/services/homepage/services.nix
 delete mode 100644 hosts/yuki/services/homepage/widgets.nix
 create mode 100644 hosts/yuki/services/komga.nix
 delete mode 100644 secrets/homepage/secrets.yaml

diff --git a/.sops.yaml b/.sops.yaml
index b5b20a5..054de22 100644
--- a/.sops.yaml
+++ b/.sops.yaml
@@ -19,7 +19,3 @@ creation_rules:
     key_groups:
       - age:
           - *notoh
-  - path_regex: secrets/homepage/[^/]+\.yaml$
-    key_groups:
-      - age:
-          - *notoh
diff --git a/hosts/yuki/services/default.nix b/hosts/yuki/services/default.nix
index 760a480..840cbc6 100644
--- a/hosts/yuki/services/default.nix
+++ b/hosts/yuki/services/default.nix
@@ -1,7 +1,6 @@
 {...}: {
   imports = [
     ./hass
-    ./homepage
     ./restic.nix
     ./traefik.nix
     ./stash.nix
@@ -10,6 +9,8 @@
     ./anki-sync-server.nix
     ./hoarder.nix
     ./immich.nix
+    ./komga.nix
+    ./glance.nix
     # ./botoh.nix
   ];
 }
diff --git a/hosts/yuki/services/glance.nix b/hosts/yuki/services/glance.nix
new file mode 100644
index 0000000..8706187
--- /dev/null
+++ b/hosts/yuki/services/glance.nix
@@ -0,0 +1,399 @@
+_: {
+  services.glance = {
+    enable = true;
+    openFirewall = true;
+    settings = {
+      asset-path = "";
+      server = {
+        host = "0.0.0.0";
+        port = 7676;
+      };
+      branding = {
+        custom-footer = ''<b><p>ᓚᘏᗢ</p></b>'';
+      };
+      pages = [
+        ### home
+        {
+          name = "home";
+          columns = [
+            # left column
+            {
+              size = "small";
+              widgets = [
+                {
+                  type = "clock";
+                  hour-format = "24h";
+                  timezones = [
+                    {
+                      timezone = "America/Los_Angeles";
+                      label = "Los Angeles";
+                    }
+                    {
+                      timezone = "Asia/Tokyo";
+                      label = "Tokyo";
+                    }
+                    {
+                      timezone = "Europe/London";
+                      label = "London";
+                    }
+                  ];
+                }
+                {
+                  type = "weather";
+                  location = "New York, USA";
+                }
+                {
+                  type = "twitch-channels";
+                  collapse-after = 10;
+                  sort-by = "viewers";
+                  channels = [
+                    "forsen"
+                    "marisnot12"
+                    "elis"
+                    "elistard"
+                    "fallenshadow"
+                    "gamergirl"
+                    "sinder"
+                  ];
+                }
+              ];
+            }
+            # middle column
+            {
+              size = "full";
+              widgets = [
+                {
+                  type = "search";
+                  search-engine = "google";
+                  bangs = [
+                    {
+                      title = "youtube";
+                      shortcut = "!yt";
+                      url = "https://www.youtube.com/results?search_query={QUERY}";
+                    }
+                    {
+                      title = "nixpkgs";
+                      shortcut = "!np";
+                      url = "https://search.nixos.org/packages?channel=unstable&query={QUERY}";
+                    }
+                    {
+                      title = "nixos";
+                      shortcut = "!no";
+                      url = "https://search.nixos.org/options?channel=unstable&query={QUERY}";
+                    }
+                  ];
+                }
+                {
+                  type = "split-column";
+                  widgets = [
+                    {
+                      type = "group";
+                      collapse-after = 5;
+                      widgets = [
+                        {
+                          type = "reddit";
+                          subreddit = "hatsune";
+                          collapse-after = 6;
+                          show-thumbnails = true;
+                        }
+                        {
+                          type = "reddit";
+                          subreddit = "2007scape";
+                          collapse-after = 6;
+                          show-thumbnails = true;
+                        }
+                        {
+                          type = "reddit";
+                          subreddit = "osugame";
+                          collapse-after = 6;
+                          show-thumbnails = true;
+                        }
+                        {
+                          type = "reddit";
+                          subreddit = "hololive";
+                          collapse-after = 6;
+                          show-thumbnails = true;
+                        }
+                      ];
+                    }
+                  ];
+                }
+                {
+                  type = "videos";
+                  include-shorts = false;
+                  channels = [
+                    "UC3n5uGu18FoCy23ggWWp8tA" # Mumei
+                    "UCIfAvpeIWGHb0duCkMkmm2Q" # Nimi
+                    "UCNa9i8ifGJRlK2yWgM9DcOA" # dnsl
+                    "UCSveVd5CV6-c5Qz64QVw91A" # 1dnsl
+                    "UCkwy4YhSUdXyv1JhuhjRFOw" # 2dnsl
+                    "UCfbnTUxUech4P1XgYUwYuKA" # Cold Ones
+                    "UCJWKjrrUh2KL1d3zXQW79cQ" # EWU
+                    "UCRmnt09hfWo6hD574tLVVDQ" # EWU Bodycam
+                    "UCBNG0osIBAprVcZZ3ic84vw" # Jim Browning
+                    "UCRcgy6GzDeccI7dkbbBna3Q" # LEMMiNO
+                    "UC31msahuXK0g6Keb27d1wog" # Nanobaiter
+                    "UCpFFItkfZz1qz5PpHpqzYBw" # Nexpo
+                    "UCMeRgqzTfC5ja40B6kM6pdg" # osu!
+                    "UC3Vuq4Q1bKFtAiKYlwRv3oA" # Peter Santenello
+                    "UCV_w9-UYod7bPbazMW7Zp4A" # Scambaiter
+                    "UCDKJdFer1phQI95UinPZehw" # Turkey Tom
+                    "UCCAfRoTJrKPbSrh_Eg3i4vg" # TomDark
+                    "UCZ4HyRUXSg62i9dWT6oIGIQ" # The Tape Library
+                    "UCFQMnBA3CS502aghlcr0_aw" # Coffezilla
+                    "UC28n0tlcNSa1iPe5mettocg" # voidzilla
+                    "UCjw9YUv4UoA3d0V_Pc6zLTQ" # Brick Immortar
+                    "UCODHrzPMGbNv67e84WDZhQQ" # fern
+                    "UCYO_jab_esuFRV4b17AJtAw" # 3Blue1Brown
+                    "UCsBjURrPoezykLs9EqgamOA" # Fireship
+                    "UCS0N5baNlQWJCUrhCEo8WlA" # Ben Eater
+                    "UCKGe7fZ_S788Jaspxg-_5Sg" # PC Security Channel
+                  ];
+                }
+              ];
+            }
+            # right column
+            {
+              size = "small";
+              widgets = [
+                {
+                  type = "calendar";
+                }
+                {
+                  type = "bookmarks";
+                  groups = [
+                    {
+                      title = "media";
+                      links = [
+                        {
+                          title = "youtube";
+                          url = "https://www.youtube.com";
+                        }
+                        {
+                          title = "twitch";
+                          url = "https://www.twitch.tv";
+                        }
+                        {
+                          title = "reddit";
+                          url = "https://www.reddit.com";
+                        }
+                        {
+                          title = "lastfm";
+                          url = "https://www.last.fm/user/notoh";
+                        }
+                        {
+                          title = "anilist";
+                          url = "https://anilist.co/user/notoh/animelist";
+                        }
+                      ];
+                    }
+                  ];
+                }
+              ];
+            }
+          ];
+        }
+        ### dev
+        {
+          name = "dev";
+          columns = [
+            # left column
+            {
+              size = "small";
+              widgets = [
+                {
+                  type = "clock";
+                  hour-format = "24h";
+                  timezones = [
+                    {
+                      timezone = "America/Los_Angeles";
+                      label = "Los Angeles";
+                    }
+                    {
+                      timezone = "Asia/Tokyo";
+                      label = "Tokyo";
+                    }
+                    {
+                      timezone = "Europe/London";
+                      label = "London";
+                    }
+                  ];
+                }
+              ];
+            }
+            # middle column
+            {
+              size = "full";
+              widgets = [
+                {
+                  type = "split-column";
+                  widgets = [
+                    {
+                      type = "group";
+                      collapse-after = 5;
+                      widgets = [
+                        {
+                          type = "reddit";
+                          subreddit = "nixos";
+                          collapse-after = 3;
+                          show-thumbnails = true;
+                        }
+                        {
+                          type = "reddit";
+                          subreddit = "selfhosted";
+                          collapse-after = 3;
+                          show-thumbnails = true;
+                        }
+                        {
+                          type = "reddit";
+                          subreddit = "linux";
+                          collapse-after = 3;
+                          show-thumbnails = true;
+                        }
+                      ];
+                    }
+                    {
+                      type = "group";
+                      collapse-after = 5;
+                      widgets = [
+                        {
+                          type = "repository";
+                          repository = "nixos/nixpkgs";
+                        }
+                        {
+                          type = "releases";
+                          collapse-after = 5;
+                          show-source-icon = true;
+                          repositories = [
+                            "hyprwm/hyprland"
+                            "Vencord/Vesktop"
+                            "dani-garcia/vaultwarden"
+                            "Kesomannen/gale"
+                            "immich-app/immich"
+                            "LizardByte/Sunshine "
+                          ];
+                        }
+                      ];
+                    }
+                  ];
+                }
+                {
+                  type = "group";
+                  widgets = [
+                    {
+                      type = "monitor";
+                      title = "infra";
+                      sites = [
+                        {
+                          title = "proxmox";
+                          url = "https://pve.internal.flake.sh:8006";
+                          allow-insecure = true;
+                        }
+                        {
+                          title = "truenas";
+                          url = "https://truenas.internal.flake.sh/";
+                          allow-insecure = true;
+                        }
+                        {
+                          title = "ubiquiti";
+                          url = "https://udm.internal.flake.sh/network/default";
+                          allow-insecure = true;
+                        }
+                        {
+                          title = "uptime-kuma";
+                          url = "https://status.flake.sh";
+                        }
+                        {
+                          title = "grafana";
+                          url = "https://metrics.flake.sh";
+                        }
+                      ];
+                    }
+                    {
+                      type = "monitor";
+                      title = "media";
+                      sites = [
+                        {
+                          title = "jellyfin";
+                          url = "https://jellyfin.internal.flake.sh";
+                          allow-insecure = true;
+                        }
+                        {
+                          title = "jellyseerr";
+                          url = "https://jellyseerr.internal.flake.sh";
+                          allow-insecure = true;
+                        }
+                        {
+                          title = "sonarr";
+                          url = "https://sonarr.internal.flake.sh";
+                          allow-insecure = true;
+                        }
+                        {
+                          title = "radarr";
+                          url = "https://radarr.internal.flake.sh";
+                          allow-insecure = true;
+                        }
+                        {
+                          title = "prowlarr";
+                          url = "https://prowlarr.internal.flake.sh";
+                          allow-insecure = true;
+                        }
+                        {
+                          title = "qbittorrent";
+                          url = "http://192.168.1.54:8080/";
+                          allow-insecure = true;
+                        }
+                        {
+                          title = "immich";
+                          url = "https://immich.internal.flake.sh";
+                          allow-insecure = true;
+                        }
+                        {
+                          title = "komga";
+                          url = "https://komga.internal.flake.sh";
+                          allow-insecure = true;
+                        }
+                        {
+                          title = "stash";
+                          url = "https://stash.internal.flake.sh";
+                          allow-insecure = true;
+                        }
+                      ];
+                    }
+                    {
+                      type = "monitor";
+                      title = "misc";
+                      sites = [
+                        {
+                          title = "wallos";
+                          url = "https://wallos.internal.flake.sh";
+                          allow-insecure = true;
+                        }
+
+                        {
+                          title = "hoarder";
+                          url = "https://hoarder.internal.flake.sh";
+                          allow-insecure = true;
+                        }
+                      ];
+                    }
+                  ];
+                }
+              ];
+            }
+            # right column
+            {
+              size = "small";
+              widgets = [
+                {
+                  type = "weather";
+                  location = "New York, USA";
+                }
+              ];
+            }
+          ];
+        }
+      ];
+    };
+  };
+}
diff --git a/hosts/yuki/services/homepage/default.nix b/hosts/yuki/services/homepage/default.nix
deleted file mode 100644
index 074d3df..0000000
--- a/hosts/yuki/services/homepage/default.nix
+++ /dev/null
@@ -1,88 +0,0 @@
-{config, ...}: {
-  imports = [
-    ./widgets.nix
-    ./services.nix
-  ];
-
-  sops.secrets.homepage-secrets = {
-    sopsFile = ../../../../secrets/homepage/secrets.yaml;
-  };
-
-  services.homepage-dashboard = {
-    enable = true;
-    listenPort = 7676;
-    openFirewall = true;
-    environmentFile = config.sops.secrets.homepage-secrets.path;
-    settings = {
-      base = "https://dashboard.internal.flake.sh/";
-      title = "kumo";
-      language = "en";
-      headerStyle = "boxedWidgets";
-      disableCollape = true;
-      favicon = "https://em-content.zobj.net/source/twitter/376/cloud_2601-fe0f.png";
-      cardBlur = "md";
-      theme = "dark";
-      color = "gray";
-      fiveColumns = true;
-      statusStyle = "dot";
-      hideVersion = true;
-      background = {
-        image = "https://git.flake.sh/notohh/assets/raw/branch/main/wallpapers/miku/miku.png";
-        brightness = 75;
-      };
-      providers = {
-        openweathermap = "{{HOMEPAGE_VAR_OPENWEATHERMAP}}";
-      };
-      layout = [
-        {
-          "Sora" = {
-            style = "row";
-            columns = 3;
-          };
-        }
-        {
-          "News" = {
-            style = "row";
-            columns = 1;
-          };
-        }
-        {
-          "Infra" = {
-            style = "row";
-            columns = 4;
-          };
-        }
-        {
-          "Networking" = {
-            style = "row";
-            columns = 1;
-          };
-        }
-        {
-          "Monitoring" = {
-            style = "row";
-            columns = 2;
-          };
-        }
-        {
-          "Media" = {
-            style = "row";
-            columns = 2;
-          };
-        }
-        {
-          "Misc apps" = {
-            style = "row";
-            columns = 2;
-          };
-        }
-        {
-          "Misc" = {
-            style = "row";
-            columns = 5;
-          };
-        }
-      ];
-    };
-  };
-}
diff --git a/hosts/yuki/services/homepage/services.nix b/hosts/yuki/services/homepage/services.nix
deleted file mode 100644
index 39f3161..0000000
--- a/hosts/yuki/services/homepage/services.nix
+++ /dev/null
@@ -1,366 +0,0 @@
-_: {
-  services.homepage-dashboard.services = [
-    {
-      "Sora" = let
-        glancesUrl = "http://100.104.42.96:61208";
-      in [
-        {
-          "INF" = {
-            widget = {
-              type = "glances";
-              url = glancesUrl;
-              metric = "info";
-            };
-          };
-        }
-        {
-          "CPU" = {
-            widget = {
-              type = "glances";
-              url = glancesUrl;
-              metric = "cpu";
-            };
-          };
-        }
-        {
-          "RAM" = {
-            widget = {
-              type = "glances";
-              url = glancesUrl;
-              metric = "memory";
-            };
-          };
-        }
-        {
-          "PROC" = {
-            widget = {
-              type = "glances";
-              url = glancesUrl;
-              metric = "process";
-            };
-          };
-        }
-        {
-          "NET" = {
-            widget = {
-              type = "glances";
-              url = glancesUrl;
-              metric = "network:eth0";
-            };
-          };
-        }
-        {
-          "FS" = {
-            widget = {
-              type = "glances";
-              url = glancesUrl;
-              metric = "fs:/etc/hosts";
-            };
-          };
-        }
-      ];
-    }
-    {
-      "Infra" = [
-        {
-          "Proxmox" = {
-            icon = "proxmox";
-            href = "https://pve.internal.flake.sh:8006";
-            widget = {
-              type = "proxmox";
-              url = "https://192.168.1.36:8006";
-              username = "{{HOMEPAGE_VAR_PROXMOX_USER}}";
-              password = "{{HOMEPAGE_VAR_PROXMOX_PWD}}";
-            };
-          };
-        }
-        {
-          "Proxmox Backup Server" = {
-            icon = "proxmox";
-            href = "https://pbs.internal.flake.sh:8007";
-            widget = {
-              type = "proxmoxbackupserver";
-              url = "https://192.168.1.38:8007";
-              username = "{{HOMEPAGE_VAR_PBS_USER}}";
-              password = "{{HOMEPAGE_VAR_PBS_PWD}}";
-            };
-          };
-        }
-        {
-          "TrueNAS" = {
-            icon = "truenas-scale";
-            href = "https://truenas.internal.flake.sh";
-            widget = {
-              type = "truenas";
-              url = "https://192.168.1.199";
-              key = "{{HOMEPAGE_VAR_TRUENAS_KEY}}";
-            };
-          };
-        }
-        {
-          "Home Assistant" = {
-            icon = "home-assistant";
-            href = "http://hass.internal.flake.sh:8123";
-            widget = {
-              type = "homeassistant";
-              url = "http://192.168.1.98:8123";
-              key = "{{HOMEPAGE_VAR_HASS_KEY}}";
-            };
-          };
-        }
-      ];
-    }
-    {
-      "Networking" = [
-        {
-          "Ubiquiti" = {
-            icon = "ubiquiti";
-            href = "https://udm.internal.flake.sh";
-            widget = {
-              type = "unifi";
-              url = "https://192.168.1.1";
-              username = "api";
-              password = "{{HOMEPAGE_VAR_UBIQUITI_PWD}}";
-            };
-          };
-        }
-        {
-          "Traefik" = {
-            icon = "traefik";
-            href = "http://192.168.1.98:8080/dashboard";
-            widget = {
-              type = "traefik";
-              url = "http://192.168.1.98:8080";
-            };
-          };
-        }
-        {
-          "Gluetun" = {
-            icon = "gluetun";
-            href = "http://192.168.1.54:8000";
-            widget = {
-              type = "gluetun";
-              url = "http://192.168.1.54:8000";
-            };
-          };
-        }
-        {
-          "Tailscale" = {
-            icon = "tailscale";
-            href = "https://login.tailscale.com/admin/machines";
-            widget = {
-              type = "tailscale";
-              deviceid = "{{HOMEPAGE_VAR_TAILSCALE_DEVICE_ID}}";
-              key = "{{HOMEPAGE_VAR_TAILSCALE_KEY}}";
-            };
-          };
-        }
-        {
-          "Blocky" = {
-            icon = "blocky";
-            href = "http://192.168.1.103:4000";
-          };
-        }
-      ];
-    }
-    {
-      "Monitoring" = [
-        {
-          "Grafana" = {
-            icon = "grafana";
-            href = "https://metrics.flake.sh";
-            widget = {
-              type = "grafana";
-              url = "https://metrics.flake.sh";
-              username = "{{HOMEPAGE_VAR_GRAFANA_USER}}";
-              password = "{{HOMEPAGE_VAR_GRAFANA_PWD}}";
-            };
-          };
-        }
-        {
-          "Prometheus" = {
-            icon = "prometheus";
-            widget = {
-              type = "prometheus";
-              url = "http://100.104.42.96:9090";
-            };
-          };
-        }
-        {
-          "Uptime Kuma" = {
-            icon = "uptime-kuma";
-            href = "https://status.flake.sh/dashboard";
-            widget = {
-              type = "uptimekuma";
-              url = "https://status.flake.sh";
-              slug = "kumo";
-            };
-          };
-        }
-        {
-          "ntfy" = {
-            icon = "ntfy";
-            href = "https://ntfy.flake.sh";
-          };
-        }
-      ];
-    }
-    {
-      "Media" = let
-        kariruIp = "http://192.168.1.54:";
-      in [
-        {
-          "Jellyfin" = {
-            icon = "jellyfin";
-            href = "https://jellyfin.internal.flake.sh/";
-            widget = {
-              type = "jellyfin";
-              url = "http://192.168.1.98:8096";
-              key = "{{HOMEPAGE_VAR_JELLYFIN_KEY}}";
-              enableBlocks = true;
-              enableNowPlaying = false;
-            };
-          };
-        }
-        {
-          "Jellyseerr" = {
-            icon = "jellyseerr";
-            href = "https://jellyseerr.internal.flake.sh";
-            widget = {
-              type = "jellyseerr";
-              url = "http://192.168.1.98:5055";
-              key = "{{HOMEPAGE_VAR_JELLYSEERR_KEY}}";
-            };
-          };
-        }
-        {
-          "Sonarr" = {
-            icon = "sonarr";
-            href = "https://sonarr.internal.flake.sh";
-            widget = {
-              type = "sonarr";
-              url = "${kariruIp}8989";
-              key = "{{HOMEPAGE_VAR_SONARR_KEY}}";
-            };
-          };
-        }
-        {
-          "Radarr" = {
-            icon = "radarr";
-            href = "https://radarr.internal.flake.sh";
-            widget = {
-              type = "radarr";
-              url = "${kariruIp}7878";
-              key = "{{HOMEPAGE_VAR_RADARR_KEY}}";
-            };
-          };
-        }
-        {
-          "Prowlarr" = {
-            icon = "prowlarr";
-            href = "https://prowlarr.internal.flake.sh";
-            widget = {
-              type = "prowlarr";
-              url = "${kariruIp}9696";
-              key = "{{HOMEPAGE_VAR_PROWLARR_KEY}}";
-            };
-          };
-        }
-        {
-          "qBittorrent" = {
-            icon = "qbittorrent";
-            href = "http://192.168.1.54:8080";
-            widget = {
-              type = "qbittorrent";
-              url = "http://192.168.1.54:8080";
-              username = "notoh";
-              password = "{{HOMEPAGE_VAR_QBIT_PWD}}";
-            };
-          };
-        }
-        {
-          "Stash" = {
-            icon = "stash";
-            href = "https://stash.internal.flake.sh";
-            widget = {
-              type = "stash";
-              url = "https://stash.internal.flake.sh";
-              key = "{{HOMEPAGE_VAR_STASH_KEY}}";
-              fields = ["scenes" "sceneSize" "performers"];
-            };
-          };
-        }
-        {
-          "Immich" = {
-            icon = "immich";
-            href = "https://immich.internal.flake.sh";
-            widget = {
-              type = "immich";
-              url = "https://immich.internal.flake.sh";
-              key = "{{HOMEPAGE_VAR_IMMICH_KEY}}";
-              version = 2;
-            };
-          };
-        }
-        {
-          "Whisparr" = {
-            icon = "whisparr";
-            href = "http://whisparr.internal.flake.sh/";
-          };
-        }
-        {
-          "Servarr" = {
-            icon = "servarr";
-            href = "https://wiki.servarr.com/";
-          };
-        }
-      ];
-    }
-    {
-      "Misc" = [
-        {
-          "Forgejo" = {
-            icon = "forgejo";
-            href = "https://git.flake.sh/explore/repos";
-          };
-        }
-        {
-          "Hetzner" = {
-            icon = "hetzner";
-            href = "https://accounts.hetzner.com/login";
-          };
-        }
-        {
-          "Cloudflare" = {
-            icon = "cloudflare";
-            href = "https://dash.cloudflare.com";
-          };
-        }
-        {
-          "Tailscale" = {
-            icon = "tailscale";
-            href = "https://login.tailscale.com/admin/machines";
-          };
-        }
-        {
-          "Hoarder" = {
-            icon = "hoarder";
-            href = "https://hoarder.internal.flake.sh";
-          };
-        }
-        {
-          "Wallos" = {
-            icon = null;
-            href = "https://wallos.internal.flake.sh";
-          };
-        }
-        {
-          "Ganymede" = {
-            icon = null;
-            href = "https://ganymede.internal.flake.sh";
-          };
-        }
-      ];
-    }
-  ];
-}
diff --git a/hosts/yuki/services/homepage/widgets.nix b/hosts/yuki/services/homepage/widgets.nix
deleted file mode 100644
index 4e72b3b..0000000
--- a/hosts/yuki/services/homepage/widgets.nix
+++ /dev/null
@@ -1,30 +0,0 @@
-_: {
-  services.homepage-dashboard.widgets = [
-    {
-      greeting = {
-        text_size = "l";
-        text = "おかえりなさい!";
-      };
-    }
-    {
-      datetime = {
-        text_size = "l";
-        format = {
-          timeStyle = "short";
-          dateStyle = "short";
-          hourCycle = "h23";
-        };
-      };
-    }
-    {
-      openweathermap = {
-        label = "New York";
-        latitude = "40.730610";
-        longitude = "-73.935242";
-        units = "metric";
-        provider = "openweathermap";
-        cache = 5;
-      };
-    }
-  ];
-}
diff --git a/hosts/yuki/services/jellyfin.nix b/hosts/yuki/services/jellyfin.nix
index 428c334..37bf797 100644
--- a/hosts/yuki/services/jellyfin.nix
+++ b/hosts/yuki/services/jellyfin.nix
@@ -1,10 +1,12 @@
 _: {
-  services.jellyfin = {
-    enable = true;
-    openFirewall = true;
-  };
-  services.jellyseerr = {
-    enable = true;
-    openFirewall = true;
+  services = {
+    jellyfin = {
+      enable = true;
+      openFirewall = true;
+    };
+    jellyseerr = {
+      enable = true;
+      openFirewall = true;
+    };
   };
 }
diff --git a/hosts/yuki/services/komga.nix b/hosts/yuki/services/komga.nix
new file mode 100644
index 0000000..6eb359d
--- /dev/null
+++ b/hosts/yuki/services/komga.nix
@@ -0,0 +1,11 @@
+_: {
+  services.komga = {
+    enable = true;
+    openFirewall = true;
+    settings = {
+      server = {
+        port = 8081;
+      };
+    };
+  };
+}
diff --git a/hosts/yuki/services/traefik.nix b/hosts/yuki/services/traefik.nix
index fd0eced..1662a9c 100644
--- a/hosts/yuki/services/traefik.nix
+++ b/hosts/yuki/services/traefik.nix
@@ -1,5 +1,5 @@
 {config, ...}: {
-  networking.firewall.allowedTCPPorts = [80 443 8080];
+  networking.firewall.allowedTCPPorts = [80 443];
   sops.secrets.cloudflare-api-key = {};
   systemd.services.traefik = {
     environment = {
@@ -22,10 +22,10 @@
             entryPoints = ["websecure"];
             service = "api@internal";
           };
-          homepage = {
+          glance = {
             rule = "Host(`dashboard.${fqdn}`)";
             entrypoints = ["websecure"];
-            service = "homepage";
+            service = "glance";
             tls.domains = [{main = "*.${fqdn}";}];
             tls.certresolver = "production";
           };
@@ -128,13 +128,20 @@
             tls.domains = [{main = "*.${fqdn}";}];
             tls.certresolver = "production";
           };
+          komga = {
+            rule = "Host(`komga.${fqdn}`)";
+            entrypoints = ["websecure"];
+            service = "komga";
+            tls.domains = [{main = "*.${fqdn}";}];
+            tls.certresolver = "production";
+          };
         };
         services = let
           kariruHost = "192.168.1.54:";
         in {
           # local
           stash.loadBalancer.servers = [{url = "http://localhost:9999";}];
-          homepage.loadBalancer.servers = [{url = "http://localhost:7676";}];
+          glance.loadBalancer.servers = [{url = "http://localhost:7676";}];
           jellyfin.loadBalancer.servers = [{url = "http://localhost:8096";}];
           jellyseerr.loadBalancer.servers = [{url = "http://localhost:5055";}];
           wallos.loadBalancer.servers = [{url = "http://localhost:8282";}];
@@ -143,6 +150,7 @@
           miniflux.loadBalancer.servers = [{url = "http://localhost:9000";}];
           hoarder.loadBalancer.servers = [{url = "http://localhost:3000";}];
           immich.loadBalancer.servers = [{url = "http://localhost:2283";}];
+          komga.loadBalancer.servers = [{url = "http://localhost:8081";}];
           # kariru
           sonarr.loadBalancer.servers = [{url = "http://${kariruHost}8989";}];
           radarr.loadBalancer.servers = [{url = "http://${kariruHost}7878";}];
@@ -155,8 +163,8 @@
     };
     staticConfigOptions = {
       log.level = "DEBUG";
-      api.dashboard = true;
-      api.insecure = true;
+      api.dashboard = false;
+      api.insecure = false;
       global = {
         checkNewVersion = false;
         sendAnonymousUsage = false;
diff --git a/secrets/homepage/secrets.yaml b/secrets/homepage/secrets.yaml
deleted file mode 100644
index 1c1f927..0000000
--- a/secrets/homepage/secrets.yaml
+++ /dev/null
@@ -1,21 +0,0 @@
-homepage-secrets: ENC[AES256_GCM,data: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,iv:a+cySZfyNn1u8sOos9VPV/owgUD0lIb3P8JGkjbTLX8=,tag:GF1G4g6jAN+1fwmDdZvO+g==,type:str]
-sops:
-    kms: []
-    gcp_kms: []
-    azure_kv: []
-    hc_vault: []
-    age:
-        - recipient: age1ckvmyqkwk69j64ev3fmckytz6k2dv79z4gn5qf6gxqyevp5yjfesdfkxmn
-          enc: |
-            -----BEGIN AGE ENCRYPTED FILE-----
-            YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB6dkVBejE1bHZqVkRZRmFo
-            SStUSjBSbmZLdXpVZUt5L1kwK1pEM3pGL0VZCmFsQ2xkaHIxV2lxbzZzWnM3ZDE1
-            bm44L25RTnRFVzl1cGQ3Q3g1THFXTkEKLS0tIFViRmN0anF5SmNBVWd5N2h0NElF
-            bGM5b1BLMTVlUDBDY0Z3L2dRbVZrb00Kj641oh4R7VfmWFmCaq5aRWcDTvzJvZBR
-            aIJdMFJEB4B43dlv2/bLYsoFs8LJJ2CHu1my9/BlNI+345ZlrFpQgQ==
-            -----END AGE ENCRYPTED FILE-----
-    lastmodified: "2025-03-04T01:42:21Z"
-    mac: ENC[AES256_GCM,data:MCLnZfiwXqrz4uy2ywTYqe2WxrfKDk2o05wJIccNtmp4WXUBoIu/xuHuY7+OG1LzB3KiisnSt68TVy32AcuMY0NlsZB968Bhm1WLgWbbAfqS3nR84j7uurHxHKfBqjxwRj0MjujhuOqrZD6TPfQiELIP7ysUEzEKz/PQC0WC2rI=,iv:hkwFEy/5L2VVddgMZ5tbPp64AJbH8qLTAJQtU4tHBFk=,tag:PJ0TelFYse27BapThwXm4A==,type:str]
-    pgp: []
-    unencrypted_suffix: _unencrypted
-    version: 3.9.4