diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..51511d1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+test-results/
diff --git a/CLAUDE.md b/CLAUDE.md
index ace31a5..b78b69b 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -11,13 +11,24 @@ Custom CSS + JS theme for Unraid 7.2.3 WebGUI. B&W mountain wallpaper with frost
| File | Purpose | Deploy path (persistent) | Deploy path (live) |
|------|---------|--------------------------|---------------------|
| `style.css` | Main CSS theme | `/boot/config/plugins/custom.css/style.css` | `/usr/local/emhttp/plugins/custom.css/style.css` |
-| `sidebar.js` | Sidebar toggle + search overlay | `/boot/config/plugins/custom.css/assets/sidebar.js` | `/usr/local/emhttp/plugins/custom.css/assets/sidebar.js` |
-| `update-icons.sh` | Replace Docker/VM icons with selfh.st CDN icons | `/boot/config/plugins/custom.css/assets/update-icons.sh` | `/usr/local/emhttp/plugins/custom.css/assets/update-icons.sh` |
+| `sidebar.js` | Sidebar toggle + search overlay + icon replacement | `/boot/config/plugins/custom.css/assets/sidebar.js` | `/usr/local/emhttp/plugins/custom.css/assets/sidebar.js` |
+| `update-icons.sh` | Replace Docker/VM cached icons with selfh.st icons | `/boot/config/plugins/custom.css/assets/update-icons.sh` | `/usr/local/emhttp/plugins/custom.css/assets/update-icons.sh` |
| `vm-icons.conf` | VM name → icon name mapping | `/boot/config/plugins/custom.css/assets/vm-icons.conf` | — |
+| `assets/icons/` | Self-hosted selfh.st icons (34 PNG + 34 light SVG + unraid.svg) | `/boot/config/plugins/custom.css/assets/icons/` | `/usr/local/emhttp/custom/assets/icons/` |
+| `assets/wallpaper.jpg` | Mountain wallpaper background | `/boot/config/plugins/custom.css/assets/wallpaper.jpg` | `/usr/local/emhttp/custom/assets/wallpaper.jpg` |
+
+## Web-Accessible Paths
+
+Unraid nginx serves `/usr/local/emhttp/` as document root. Key mapping:
+- `/custom/` → `/usr/local/emhttp/custom/` (NOT `plugins/custom.css/`!)
+- `/plugins/custom.css/` → `/usr/local/emhttp/plugins/custom.css/`
+
+Static assets (icons, wallpaper) that need HTTP access go to `/usr/local/emhttp/custom/assets/`.
+JS/CSS loaded via plugin pages go to `/usr/local/emhttp/plugins/custom.css/`.
## Deployment
-Both files must be deployed to TWO paths — persistent (survives reboot) and live (active now):
+Code files deploy to TWO paths — persistent (survives reboot) and live (active now):
```bash
scp -i ~/.ssh/id_ed25519_unraid -P 422 style.css root@192.168.10.20:/boot/config/plugins/custom.css/style.css
scp -i ~/.ssh/id_ed25519_unraid -P 422 style.css root@192.168.10.20:/usr/local/emhttp/plugins/custom.css/style.css
@@ -28,6 +39,18 @@ scp -i ~/.ssh/id_ed25519_unraid -P 422 update-icons.sh root@192.168.10.20:/usr/l
scp -i ~/.ssh/id_ed25519_unraid -P 422 vm-icons.conf root@192.168.10.20:/boot/config/plugins/custom.css/assets/vm-icons.conf
```
+Static assets deploy to persistent + web-accessible paths:
+```bash
+# Icons
+scp -i ~/.ssh/id_ed25519_unraid -P 422 -r assets/icons/ root@192.168.10.20:/boot/config/plugins/custom.css/assets/icons/
+ssh -i ~/.ssh/id_ed25519_unraid root@192.168.10.20 -p 422 'mkdir -p /usr/local/emhttp/custom/assets && cp -r /boot/config/plugins/custom.css/assets/icons /usr/local/emhttp/custom/assets/'
+# Wallpaper
+scp -i ~/.ssh/id_ed25519_unraid -P 422 assets/wallpaper.jpg root@192.168.10.20:/boot/config/plugins/custom.css/assets/wallpaper.jpg
+ssh -i ~/.ssh/id_ed25519_unraid root@192.168.10.20 -p 422 'cp /boot/config/plugins/custom.css/assets/wallpaper.jpg /usr/local/emhttp/custom/assets/'
+```
+
+Boot persistence is handled by `/boot/config/go` which copies icons/wallpaper to `/usr/local/emhttp/custom/assets/` on startup.
+
JS injection is handled by `CustomJS_Loader.page` on the server (persisted via `/boot/config/go`).
## Unraid Sidebar DOM Structure
@@ -113,7 +136,7 @@ The `dynamix.gui.search` plugin uses hover-trigger in sidebar theme. We replace
## Custom Docker/VM Icons
-Icons are sourced from [selfh.st/icons](https://selfh.st/icons/) via jsDelivr CDN.
+Icons are sourced from [selfh.st/icons](https://selfh.st/icons/) and self-hosted locally in `assets/icons/` (no CDN dependency).
### How it works
`update-icons.sh` reads a `glass.icon` Docker label from each container, downloads the matching PNG from `https://cdn.jsdelivr.net/gh/selfhst/icons@main/png/{name}.png`, and replaces Unraid's cached icon files. This works on Docker page, VM page, and Dashboard — no client-side JS needed.
@@ -144,4 +167,6 @@ ssh -i ~/.ssh/id_ed25519_unraid root@192.168.10.20 -p 422 'bash /boot/config/plu
## Wallpaper
-Place wallpaper at `/boot/config/plugins/custom.css/assets/wallpaper.jpg` — accessible at `/custom/wallpaper.jpg`.
+Source: Unsplash NuBvAE6VfSM (B&W mountains). Tracked in repo as `assets/wallpaper.jpg`.
+- Persistent: `/boot/config/plugins/custom.css/assets/wallpaper.jpg`
+- Web-accessible: `/usr/local/emhttp/custom/assets/wallpaper.jpg` → `/custom/assets/wallpaper.jpg`
diff --git a/assets/icons/actual-budget-light.svg b/assets/icons/actual-budget-light.svg
new file mode 100644
index 0000000..e2dc22b
--- /dev/null
+++ b/assets/icons/actual-budget-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/actual-budget.png b/assets/icons/actual-budget.png
new file mode 100644
index 0000000..c16f3c6
Binary files /dev/null and b/assets/icons/actual-budget.png differ
diff --git a/assets/icons/adguard-home-light.svg b/assets/icons/adguard-home-light.svg
new file mode 100644
index 0000000..f7b85d1
--- /dev/null
+++ b/assets/icons/adguard-home-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/adguard-home.png b/assets/icons/adguard-home.png
new file mode 100644
index 0000000..54770f6
Binary files /dev/null and b/assets/icons/adguard-home.png differ
diff --git a/assets/icons/apple-light.svg b/assets/icons/apple-light.svg
new file mode 100644
index 0000000..5289452
--- /dev/null
+++ b/assets/icons/apple-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/apple.png b/assets/icons/apple.png
new file mode 100644
index 0000000..655a42e
Binary files /dev/null and b/assets/icons/apple.png differ
diff --git a/assets/icons/audible-light.svg b/assets/icons/audible-light.svg
new file mode 100644
index 0000000..fc09b89
--- /dev/null
+++ b/assets/icons/audible-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/audible.png b/assets/icons/audible.png
new file mode 100644
index 0000000..9e1160c
Binary files /dev/null and b/assets/icons/audible.png differ
diff --git a/assets/icons/authentik-light.svg b/assets/icons/authentik-light.svg
new file mode 100644
index 0000000..01de461
--- /dev/null
+++ b/assets/icons/authentik-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/authentik.png b/assets/icons/authentik.png
new file mode 100644
index 0000000..98de0bb
Binary files /dev/null and b/assets/icons/authentik.png differ
diff --git a/assets/icons/databasement-light.svg b/assets/icons/databasement-light.svg
new file mode 100644
index 0000000..a75ec0e
--- /dev/null
+++ b/assets/icons/databasement-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/databasement.png b/assets/icons/databasement.png
new file mode 100644
index 0000000..cac156e
Binary files /dev/null and b/assets/icons/databasement.png differ
diff --git a/assets/icons/docker-light.svg b/assets/icons/docker-light.svg
new file mode 100644
index 0000000..d09597c
--- /dev/null
+++ b/assets/icons/docker-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/docker.png b/assets/icons/docker.png
new file mode 100644
index 0000000..08dc032
Binary files /dev/null and b/assets/icons/docker.png differ
diff --git a/assets/icons/dockge-light.svg b/assets/icons/dockge-light.svg
new file mode 100644
index 0000000..32a52e9
--- /dev/null
+++ b/assets/icons/dockge-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/dockge.png b/assets/icons/dockge.png
new file mode 100644
index 0000000..049d636
Binary files /dev/null and b/assets/icons/dockge.png differ
diff --git a/assets/icons/gitea-light.svg b/assets/icons/gitea-light.svg
new file mode 100644
index 0000000..677bff8
--- /dev/null
+++ b/assets/icons/gitea-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/gitea.png b/assets/icons/gitea.png
new file mode 100644
index 0000000..9c90c6f
Binary files /dev/null and b/assets/icons/gitea.png differ
diff --git a/assets/icons/homarr-light.svg b/assets/icons/homarr-light.svg
new file mode 100644
index 0000000..7e6c2b3
--- /dev/null
+++ b/assets/icons/homarr-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/homarr.png b/assets/icons/homarr.png
new file mode 100644
index 0000000..9cdb5d4
Binary files /dev/null and b/assets/icons/homarr.png differ
diff --git a/assets/icons/home-assistant-light.svg b/assets/icons/home-assistant-light.svg
new file mode 100644
index 0000000..7ef8b1b
--- /dev/null
+++ b/assets/icons/home-assistant-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/home-assistant.png b/assets/icons/home-assistant.png
new file mode 100644
index 0000000..fc6b190
Binary files /dev/null and b/assets/icons/home-assistant.png differ
diff --git a/assets/icons/karakeep-light.svg b/assets/icons/karakeep-light.svg
new file mode 100644
index 0000000..7820a99
--- /dev/null
+++ b/assets/icons/karakeep-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/karakeep.png b/assets/icons/karakeep.png
new file mode 100644
index 0000000..7508127
Binary files /dev/null and b/assets/icons/karakeep.png differ
diff --git a/assets/icons/n8n-light.svg b/assets/icons/n8n-light.svg
new file mode 100644
index 0000000..4b1e3a7
--- /dev/null
+++ b/assets/icons/n8n-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/n8n.png b/assets/icons/n8n.png
new file mode 100644
index 0000000..a6e9673
Binary files /dev/null and b/assets/icons/n8n.png differ
diff --git a/assets/icons/netalertx-light.svg b/assets/icons/netalertx-light.svg
new file mode 100644
index 0000000..991dfae
--- /dev/null
+++ b/assets/icons/netalertx-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/netalertx.png b/assets/icons/netalertx.png
new file mode 100644
index 0000000..77ea6f8
Binary files /dev/null and b/assets/icons/netalertx.png differ
diff --git a/assets/icons/netbox-light.svg b/assets/icons/netbox-light.svg
new file mode 100644
index 0000000..df1f01d
--- /dev/null
+++ b/assets/icons/netbox-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/netbox.png b/assets/icons/netbox.png
new file mode 100644
index 0000000..11b1408
Binary files /dev/null and b/assets/icons/netbox.png differ
diff --git a/assets/icons/networking-toolbox-light.svg b/assets/icons/networking-toolbox-light.svg
new file mode 100644
index 0000000..533bdcf
--- /dev/null
+++ b/assets/icons/networking-toolbox-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/networking-toolbox.png b/assets/icons/networking-toolbox.png
new file mode 100644
index 0000000..4f07486
Binary files /dev/null and b/assets/icons/networking-toolbox.png differ
diff --git a/assets/icons/nextcloud-light.svg b/assets/icons/nextcloud-light.svg
new file mode 100644
index 0000000..fa2adc7
--- /dev/null
+++ b/assets/icons/nextcloud-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/nextcloud.png b/assets/icons/nextcloud.png
new file mode 100644
index 0000000..65a8df1
Binary files /dev/null and b/assets/icons/nextcloud.png differ
diff --git a/assets/icons/ntfy-light.svg b/assets/icons/ntfy-light.svg
new file mode 100644
index 0000000..991bc32
--- /dev/null
+++ b/assets/icons/ntfy-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/ntfy.png b/assets/icons/ntfy.png
new file mode 100644
index 0000000..1ab64e1
Binary files /dev/null and b/assets/icons/ntfy.png differ
diff --git a/assets/icons/ollama-light.svg b/assets/icons/ollama-light.svg
new file mode 100644
index 0000000..aced617
--- /dev/null
+++ b/assets/icons/ollama-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/ollama.png b/assets/icons/ollama.png
new file mode 100644
index 0000000..54c1c2b
Binary files /dev/null and b/assets/icons/ollama.png differ
diff --git a/assets/icons/open-webui-light.svg b/assets/icons/open-webui-light.svg
new file mode 100644
index 0000000..f61d92f
--- /dev/null
+++ b/assets/icons/open-webui-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/open-webui.png b/assets/icons/open-webui.png
new file mode 100644
index 0000000..8afc439
Binary files /dev/null and b/assets/icons/open-webui.png differ
diff --git a/assets/icons/pgadmin-light.svg b/assets/icons/pgadmin-light.svg
new file mode 100644
index 0000000..f6e85f3
--- /dev/null
+++ b/assets/icons/pgadmin-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/pgadmin.png b/assets/icons/pgadmin.png
new file mode 100644
index 0000000..95fdf14
Binary files /dev/null and b/assets/icons/pgadmin.png differ
diff --git a/assets/icons/plex-light.svg b/assets/icons/plex-light.svg
new file mode 100644
index 0000000..ba9da99
--- /dev/null
+++ b/assets/icons/plex-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/plex.png b/assets/icons/plex.png
new file mode 100644
index 0000000..0e8377d
Binary files /dev/null and b/assets/icons/plex.png differ
diff --git a/assets/icons/postgresql-light.svg b/assets/icons/postgresql-light.svg
new file mode 100644
index 0000000..df20cd6
--- /dev/null
+++ b/assets/icons/postgresql-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/postgresql.png b/assets/icons/postgresql.png
new file mode 100644
index 0000000..5cad371
Binary files /dev/null and b/assets/icons/postgresql.png differ
diff --git a/assets/icons/redis-light.svg b/assets/icons/redis-light.svg
new file mode 100644
index 0000000..ec49fea
--- /dev/null
+++ b/assets/icons/redis-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/redis.png b/assets/icons/redis.png
new file mode 100644
index 0000000..723bd57
Binary files /dev/null and b/assets/icons/redis.png differ
diff --git a/assets/icons/rustdesk-light.svg b/assets/icons/rustdesk-light.svg
new file mode 100644
index 0000000..5d62d5f
--- /dev/null
+++ b/assets/icons/rustdesk-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/rustdesk.png b/assets/icons/rustdesk.png
new file mode 100644
index 0000000..aebc525
Binary files /dev/null and b/assets/icons/rustdesk.png differ
diff --git a/assets/icons/speedtest-tracker-light.svg b/assets/icons/speedtest-tracker-light.svg
new file mode 100644
index 0000000..f90dc9a
--- /dev/null
+++ b/assets/icons/speedtest-tracker-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/speedtest-tracker.png b/assets/icons/speedtest-tracker.png
new file mode 100644
index 0000000..c8fd0e2
Binary files /dev/null and b/assets/icons/speedtest-tracker.png differ
diff --git a/assets/icons/tailscale-light.svg b/assets/icons/tailscale-light.svg
new file mode 100644
index 0000000..64dd14c
--- /dev/null
+++ b/assets/icons/tailscale-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/tailscale.png b/assets/icons/tailscale.png
new file mode 100644
index 0000000..f93f967
Binary files /dev/null and b/assets/icons/tailscale.png differ
diff --git a/assets/icons/traefik-light.svg b/assets/icons/traefik-light.svg
new file mode 100644
index 0000000..52713b7
--- /dev/null
+++ b/assets/icons/traefik-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/traefik.png b/assets/icons/traefik.png
new file mode 100644
index 0000000..3efe3da
Binary files /dev/null and b/assets/icons/traefik.png differ
diff --git a/assets/icons/transmission-light.svg b/assets/icons/transmission-light.svg
new file mode 100644
index 0000000..e5513f9
--- /dev/null
+++ b/assets/icons/transmission-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/transmission.png b/assets/icons/transmission.png
new file mode 100644
index 0000000..b7e955f
Binary files /dev/null and b/assets/icons/transmission.png differ
diff --git a/assets/icons/unimus-light.svg b/assets/icons/unimus-light.svg
new file mode 100644
index 0000000..ff33c66
--- /dev/null
+++ b/assets/icons/unimus-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/unimus.png b/assets/icons/unimus.png
new file mode 100644
index 0000000..ea1923a
Binary files /dev/null and b/assets/icons/unimus.png differ
diff --git a/assets/icons/unraid-light.svg b/assets/icons/unraid-light.svg
new file mode 100644
index 0000000..ba87cf1
--- /dev/null
+++ b/assets/icons/unraid-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/unraid.png b/assets/icons/unraid.png
new file mode 100644
index 0000000..7676f5d
Binary files /dev/null and b/assets/icons/unraid.png differ
diff --git a/assets/icons/unraid.svg b/assets/icons/unraid.svg
new file mode 100644
index 0000000..6287894
--- /dev/null
+++ b/assets/icons/unraid.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/uptime-kuma-light.svg b/assets/icons/uptime-kuma-light.svg
new file mode 100644
index 0000000..88f26a7
--- /dev/null
+++ b/assets/icons/uptime-kuma-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/uptime-kuma.png b/assets/icons/uptime-kuma.png
new file mode 100644
index 0000000..eb4fc9e
Binary files /dev/null and b/assets/icons/uptime-kuma.png differ
diff --git a/assets/icons/vaultwarden-light.svg b/assets/icons/vaultwarden-light.svg
new file mode 100644
index 0000000..6a88fba
--- /dev/null
+++ b/assets/icons/vaultwarden-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/vaultwarden.png b/assets/icons/vaultwarden.png
new file mode 100644
index 0000000..b0b64ea
Binary files /dev/null and b/assets/icons/vaultwarden.png differ
diff --git a/assets/icons/woodpecker-ci-light.svg b/assets/icons/woodpecker-ci-light.svg
new file mode 100644
index 0000000..a3b5e4b
--- /dev/null
+++ b/assets/icons/woodpecker-ci-light.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/icons/woodpecker-ci.png b/assets/icons/woodpecker-ci.png
new file mode 100644
index 0000000..8ec0eb3
Binary files /dev/null and b/assets/icons/woodpecker-ci.png differ
diff --git a/assets/wallpaper.jpg b/assets/wallpaper.jpg
new file mode 100644
index 0000000..4a43153
Binary files /dev/null and b/assets/wallpaper.jpg differ
diff --git a/sidebar.js b/sidebar.js
index 4d3df04..9560204 100644
--- a/sidebar.js
+++ b/sidebar.js
@@ -15,7 +15,7 @@
if (!document.getElementById('sidebar-logo')) {
var logo = document.createElement('img');
logo.id = 'sidebar-logo';
- logo.src = 'https://cdn.jsdelivr.net/gh/selfhst/icons@main/svg/unraid.svg';
+ logo.src = '/custom/assets/icons/unraid.svg';
logo.alt = '';
menu.appendChild(logo);
}
@@ -152,8 +152,8 @@
(function() {
'use strict';
- var CDN_PNG = 'https://cdn.jsdelivr.net/gh/selfhst/icons@main/png';
- var CDN_SVG = 'https://cdn.jsdelivr.net/gh/selfhst/icons@main/svg';
+ var CDN_PNG = '/custom/assets/icons';
+ var CDN_SVG = '/custom/assets/icons';
// Container name → selfh.st icon name (lowercase)
// Only needed for names that don't auto-match.
diff --git a/style.css b/style.css
index a7a26a1..2a9ce46 100644
--- a/style.css
+++ b/style.css
@@ -51,7 +51,7 @@
============================================ */
body {
background: #0a0a0f !important;
- background-image: url('/custom/wallpaper.jpg') !important;
+ background-image: url('/custom/assets/wallpaper.jpg') !important;
background-size: cover !important;
background-position: center center !important;
background-attachment: fixed !important;