.gitignore | 4 + config/Service.pkl | 184 +++ config/identities.json | 10 + config/policies/dashboard.hcl | 7 + config/policies/router.hcl | 3 + config/site.pkl | 17 + dashboard/.gitignore | 5 + dashboard/Cargo.lock | 2544 ++++++++++++++++++++++++++++++++ dashboard/Cargo.toml | 33 + dashboard/dev.ts | 37 + dashboard/package.json | 25 + dashboard/pnpm-lock.yaml | 1654 +++++++++++++++++++++ dashboard/server/icons/victoria-logs/icon.svg | 5 + dashboard/server/youtube-worker.py | 727 +++++++++ dashboard/src/apps.rs | 438 ++++++ dashboard/src/cache.rs | 288 ++++ dashboard/src/core.rs | 803 ++++++++++ dashboard/src/deploys.rs | 534 +++++++ dashboard/src/files.rs | 1157 +++++++++++++++ dashboard/src/host.rs | 74 + dashboard/src/index.rs | 1026 +++++++++++++ dashboard/src/main.rs | 539 +++++++ dashboard/src/mcp.rs | 1224 +++++++++++++++ dashboard/src/observability.rs | 190 +++ dashboard/src/relay.rs | 1065 +++++++++++++ dashboard/src/shale.rs | 847 +++++++++++ dashboard/src/storage.rs | 255 ++++ dashboard/src/telemetry.rs | 929 ++++++++++++ dashboard/src/users.rs | 588 ++++++++ dashboard/src/youtube.rs | 344 +++++ dashboard/tests/index-cases.json | 403 +++++ dashboard/tsconfig.json | 30 + dashboard/vite.config.ts | 20 + dashboard/web/api.contract.ts | 305 ++++ dashboard/web/api.ts | 89 ++ dashboard/web/components/Ago.tsx | 6 + dashboard/web/components/AppIcon.tsx | 26 + dashboard/web/components/Checkbox.tsx | 37 + dashboard/web/components/Copy.tsx | 22 + dashboard/web/components/Dialog.tsx | 131 ++ dashboard/web/components/Donut.tsx | 49 + dashboard/web/components/Explorer.css | 215 +++ dashboard/web/components/Explorer.tsx | 1073 ++++++++++++++ dashboard/web/components/ListPage.tsx | 39 + dashboard/web/components/Loaded.tsx | 70 + dashboard/web/components/LogView.css | 31 + dashboard/web/components/LogView.tsx | 160 ++ dashboard/web/components/Meter.tsx | 12 + dashboard/web/components/Metric.tsx | 95 ++ dashboard/web/components/OpenApp.tsx | 27 + dashboard/web/components/PaperCloverMark.tsx | 11 + dashboard/web/components/PirateFlag.tsx | 19 + dashboard/web/components/Reveal.tsx | 14 + dashboard/web/components/Sidebar.tsx | 288 ++++ dashboard/web/components/SortHeader.tsx | 29 + dashboard/web/components/Spark.tsx | 61 + dashboard/web/components/Status.tsx | 36 + dashboard/web/components/Strip.tsx | 59 + dashboard/web/components/TabBar.tsx | 40 + dashboard/web/components/TimeChart.tsx | 219 +++ dashboard/web/components/Toast.tsx | 61 + dashboard/web/components/Tooltip.tsx | 96 ++ dashboard/web/components/VirtualList.tsx | 163 ++ dashboard/web/format.ts | 51 + dashboard/web/index.html | 16 + dashboard/web/live.ts | 83 ++ dashboard/web/main.tsx | 87 ++ dashboard/web/pages/Account.css | 24 + dashboard/web/pages/Account.tsx | 233 +++ dashboard/web/pages/Deploy.css | 100 ++ dashboard/web/pages/Deploy.tsx | 695 +++++++++ dashboard/web/pages/Deploys.css | 63 + dashboard/web/pages/Deploys.tsx | 221 +++ dashboard/web/pages/MCP.css | 12 + dashboard/web/pages/MCP.tsx | 133 ++ dashboard/web/pages/Media.tsx | 53 + dashboard/web/pages/Overview.css | 99 ++ dashboard/web/pages/Overview.tsx | 527 +++++++ dashboard/web/pages/PaperClover.css | 152 ++ dashboard/web/pages/PaperClover.tsx | 523 +++++++ dashboard/web/pages/Seedbox.css | 80 + dashboard/web/pages/Seedbox.tsx | 423 ++++++ dashboard/web/pages/Service.css | 215 +++ dashboard/web/pages/Service.definition.tsx | 305 ++++ dashboard/web/pages/Service.flame.tsx | 481 ++++++ dashboard/web/pages/Service.tsx | 745 ++++++++++ dashboard/web/pages/Storage.css | 133 ++ dashboard/web/pages/Storage.map.tsx | 299 ++++ dashboard/web/pages/Storage.tsx | 623 ++++++++ dashboard/web/pages/Users.css | 96 ++ dashboard/web/pages/Users.tsx | 697 +++++++++ dashboard/web/pages/VMs.css | 79 + dashboard/web/pages/VMs.tsx | 535 +++++++ dashboard/web/pages/YouTube.css | 128 ++ dashboard/web/pages/YouTube.tsx | 705 +++++++++ dashboard/web/public/fonts/font.css | 42 + dashboard/web/public/fonts/nm.woff2 | Bin 0 -> 47928 bytes dashboard/web/public/fonts/nmb.woff2 | Bin 0 -> 50184 bytes dashboard/web/public/fonts/nmi.woff2 | Bin 0 -> 53284 bytes dashboard/web/public/fonts/nsv.woff2 | Bin 0 -> 302252 bytes dashboard/web/public/fonts/nsvi.woff2 | Bin 0 -> 322612 bytes dashboard/web/snowflake.svg | 15 + dashboard/web/styles.css | 1047 +++++++++++++ dashboard/web/types/mcp.ts | 12 + dashboard/web/types/model.ts | 261 ++++ dashboard/web/types/paperClover.ts | 66 + dashboard/web/types/search.test.ts | 26 + dashboard/web/types/search.ts | 58 + dashboard/web/types/seedbox.ts | 53 + dashboard/web/types/storage.index.ts | 4 + dashboard/web/types/storage.ts | 85 ++ dashboard/web/types/users.ts | 36 + dashboard/web/types/vms.ts | 70 + dashboard/web/types/youtube.ts | 74 + flake.lock | 27 + flake.nix | 22 + nixos/configuration.nix | 262 ++++ nixos/dashboard.nix | 66 + nixos/hardware-configuration.nix | 1 + nixos/nomad-podman-stats.patch | 234 +++ nixos/pkl.nix | 15 + nixos/vm.nix | 123 ++ nixos/zenith.nix | 55 + readme.md | 117 ++ service/clover-source-of-truth/build-source.json | 15 + service/clover-source-of-truth/icon-dark.svg | 4 + service/clover-source-of-truth/icon-light.svg | 4 + service/clover-source-of-truth/service.pkl | 36 + service/copyparty/copyparty.conf | 57 + service/copyparty/icon.svg | 210 +++ service/copyparty/prepare.py | 39 + service/copyparty/reject-apple-cruft.py | 14 + service/copyparty/service.pkl | 41 + service/copyparty/static/copyparty.css | 9 + service/copyparty/static/font.css | 45 + service/copyparty/static/nm.woff2 | Bin 0 -> 47928 bytes service/copyparty/static/nmb.woff2 | Bin 0 -> 50184 bytes service/copyparty/static/nmi.woff2 | Bin 0 -> 53284 bytes service/copyparty/static/nsv.woff2 | Bin 0 -> 302252 bytes service/copyparty/static/nsvi.woff2 | Bin 0 -> 322612 bytes service/dawarich/icon.svg | 1 + service/dawarich/redis-insight.pkl | 36 + service/dawarich/redis-insight/icon.svg | 1 + service/dawarich/service.pkl | 130 ++ service/ddns-updater/icon.svg | 1 + service/ddns-updater/service.pkl | 27 + service/evil-forgejo/api.py | 33 + service/evil-forgejo/app.ini | 115 ++ service/evil-forgejo/icon.svg | 1 + service/evil-forgejo/provide.py | 67 + service/evil-forgejo/public/assets/css/theme-evil-dark.css | 118 ++ service/evil-forgejo/public/assets/css/theme-evil-light.css | 175 +++ service/evil-forgejo/public/assets/css/theme-evil.css | 189 +++ service/evil-forgejo/public/assets/img/apple-touch-icon.png | Bin 0 -> 11471 bytes service/evil-forgejo/public/assets/img/avatar_default.png | Bin 0 -> 8704 bytes service/evil-forgejo/public/assets/img/favicon.png | Bin 0 -> 192968 bytes service/evil-forgejo/public/assets/img/favicon.svg | 14 + service/evil-forgejo/public/assets/img/logo.png | Bin 0 -> 30360 bytes service/evil-forgejo/public/assets/img/logo.svg | 14 + service/evil-forgejo/service.pkl | 114 ++ service/evil-forgejo/setup.py | 70 + service/evil-forgejo/start.sh | 10 + service/evil-hedgedoc/icon.svg | 1 + service/evil-hedgedoc/service.pkl | 66 + service/flaresolverr/icon.svg | 1 + service/flaresolverr/service.pkl | 20 + service/forward-auth/icon.svg | 1 + service/forward-auth/service.pkl | 59 + service/intake/build/Dockerfile | 5 + service/intake/build/app.py | 99 ++ service/intake/build/requirements.txt | 7 + service/intake/icon.svg | 1 + service/intake/service.pkl | 28 + service/jackett/icon.svg | 1 + service/jackett/service.pkl | 30 + service/jellyfin/branding.xml | 43 + service/jellyfin/configure.py | 73 + service/jellyfin/icon.svg | 1 + service/jellyfin/prepare.py | 87 ++ service/jellyfin/service.pkl | 55 + service/jellyfin/sso-authentication_4.0.0.4.zip | Bin 0 -> 180786 bytes service/jellyfin/sso.xml | 41 + service/jellyfin/theme/cloverfin-banner-light.png | Bin 0 -> 189840 bytes service/jellyfin/theme/cloverfin-banner.png | Bin 0 -> 190686 bytes service/jellyfin/theme/cloverfin-icon-light.png | Bin 0 -> 135645 bytes service/jellyfin/theme/cloverfin-icon.png | Bin 0 -> 135971 bytes service/jellyfin/theme/theme.css | 62 + service/jellyfin/update-plugin.py | 15 + service/keycloak/api.py | 83 ++ service/keycloak/configure.py | 67 + service/keycloak/icon.svg | 1 + service/keycloak/provide.py | 61 + service/keycloak/service.pkl | 70 + service/keycloak/theme/login/resources/css/styles.css | 345 +++++ service/keycloak/theme/login/resources/font/.gitignore | 0 service/keycloak/theme/login/resources/img/license.txt | 2 + service/keycloak/theme/login/resources/img/miku-dark.png | Bin 0 -> 2771673 bytes service/keycloak/theme/login/resources/img/miku-light.png | Bin 0 -> 2051540 bytes service/keycloak/theme/login/resources/js/stars.js | 105 ++ service/keycloak/theme/login/resources/js/webauthnRegister.js | 159 ++ service/keycloak/theme/login/template.ftl | 209 +++ service/keycloak/theme/login/theme.properties | 128 ++ service/keycloak/theme/login/webauthn-error.ftl | 36 + service/keycloak/theme/login/webauthn-register.ftl | 72 + service/navidrome/icon.svg | 29 + service/navidrome/service.pkl | 33 + service/openspeedtest/icon.svg | 1 + service/openspeedtest/service.pkl | 18 + service/pds/icon.svg | 1 + service/pds/service.pkl | 83 ++ service/pds/start.sh | 11 + service/postgres/icon.svg | 1 + service/postgres/pgadmin.pkl | 48 + service/postgres/pgadmin/icon.svg | 1 + service/postgres/pgadmin/start.sh | 11 + service/postgres/provide.py | 108 ++ service/postgres/service.pkl | 46 + service/qbittorrent/icon.svg | 1 + service/qbittorrent/openvpn/profile.ovpn | 53 + service/qbittorrent/prepare.py | 42 + service/qbittorrent/service.pkl | 60 + service/radarr/icon.svg | 1 + service/radarr/service.pkl | 33 + service/samba/icon.svg | 15 + service/samba/service.pkl | 44 + service/shale/icon-dark.svg | 5 + service/shale/icon-light.svg | 5 + service/shale/icons/discord-name-painter.png | Bin 0 -> 16645 bytes service/shale/icons/home-infra.png | Bin 0 -> 22090 bytes service/shale/icons/markodown.png | Bin 0 -> 15396 bytes service/shale/icons/react-mutation.png | Bin 0 -> 64208 bytes service/shale/icons/sitegen.png | Bin 0 -> 73219 bytes service/shale/icons/snowbound.png | Bin 0 -> 235761 bytes service/shale/icons/toolkit.png | Bin 0 -> 48920 bytes service/shale/readme/LICENSE.dompurify | 202 +++ service/shale/readme/LICENSE.markdown-it | 22 + service/shale/readme/markdown-it.min.js | 3 + service/shale/readme/purify.min.js | 3 + service/shale/readme/readme.js | 39 + service/shale/service.pkl | 65 + service/shale/theme.css | 418 ++++++ service/sonarr/icon.svg | 1 + service/sonarr/service.pkl | 33 + service/tailscale/icon-dark.svg | 1 + service/tailscale/icon-light.svg | 1 + service/tailscale/service.pkl | 29 + service/victoria/victoria-logs.pkl | 21 + service/victoria/victoria-metrics.pkl | 22 + service/victoria/victoria-metrics/icon-dark.svg | 1 + service/victoria/victoria-metrics/icon-light.svg | 1 + service/victoria/victoria-traces.pkl | 22 + service/victoria/victoria-traces/icon.svg | 1 + service/youtube/yt-feed.pkl | 33 + service/youtube/yt-feed/icon.svg | 1 + service/youtube/yt-feed/upscaler/Dockerfile | 5 + service/youtube/yt-feed/upscaler/upscale.py | 216 +++ service/youtube/ytdl-sub.pkl | 42 + service/youtube/ytdl-sub/config/archive-loop.sh | 19 + service/youtube/ytdl-sub/config/config.yaml | 42 + service/youtube/ytdl-sub/icon.svg | 1 + tools/check-legacy-handoff.sh | 14 + tools/configure-arr.py | 113 ++ tools/dashboard-bench.py | 67 + tools/dashboard-browser-test.py | 71 + tools/dashboard-container-test.py | 94 ++ tools/dashboard-deploy-test.py | 300 ++++ tools/dashboard-deploy-vm-test.py | 303 ++++ tools/dashboard-file-boundary-test.py | 280 ++++ tools/dashboard-files-test.py | 83 ++ tools/dashboard-host-test.py | 142 ++ tools/dashboard-host-vm-test.py | 144 ++ tools/dashboard-host.py | 347 +++++ tools/dashboard-iam-test.py | 156 ++ tools/dashboard-mcp-test.py | 235 +++ tools/dashboard-metrics-test.py | 110 ++ tools/dashboard-package-test.py | 202 +++ tools/dashboard-public-load-test.py | 141 ++ tools/dashboard-relay-test.py | 452 ++++++ tools/dashboard-routing-test.py | 234 +++ tools/dashboard-run.py | 566 +++++++ tools/dashboard-shale-link-test.py | 420 ++++++ tools/dashboard-shale-test.py | 468 ++++++ tools/dashboard-unit-test.py | 303 ++++ tools/dashboard-vm-boundary-test.py | 164 ++ tools/data-restore.md | 27 + tools/data.py | 302 ++++ tools/dawarich-migration.md | 17 + tools/ddns-migration.md | 9 + tools/deploy-test.py | 71 + tools/deploy.py | 224 +++ tools/evil-forgejo-migration.md | 27 + tools/export-legacy-postgres.sh | 80 + tools/hedgedoc-migration.md | 9 + tools/import-arr.sh | 127 ++ tools/import-dawarich.sh | 73 + tools/import-evil-forgejo.sh | 77 + tools/import-hedgedoc.sh | 123 ++ tools/import-jackett.sh | 100 ++ tools/import-jellyfin.sh | 103 ++ tools/import-legacy-secrets.sh | 54 + tools/import-navidrome.sh | 102 ++ tools/import-pds-secrets.py | 44 + tools/import-pds.sh | 127 ++ tools/import-qbittorrent.sh | 66 + tools/import-shale.sh | 106 ++ tools/import-source-data.sh | 68 + tools/import-source-index.sh | 68 + tools/import-yt-feed.sh | 109 ++ tools/intake-migration.md | 7 + tools/jellyfin-migration.md | 11 + tools/legacy-handoff.md | 11 + tools/local-vm.sh | 55 + tools/log-shipper.py | 117 ++ tools/mac-domains.py | 248 ++++ tools/media-cutover.md | 75 + tools/pds-migration.md | 7 + tools/release.py | 274 ++++ tools/router.py | 323 ++++ tools/service-dependencies.md | 37 + tools/shale-migration.md | 7 + tools/source-of-truth-migration.md | 19 + tools/storage-acl-cutover.md | 33 + tools/studio.py | 1241 ++++++++++++++++ tools/tree-hash.py | 48 + tools/verify-legacy-dump.py | 37 + tools/vms.py | 366 +++++ tools/yt-feed-migration.md | 9 + tools/zenith-hardware.md | 25 + 328 files changed, 46869 insertions(+)