From 077640d9bb8cd2e2e393f5d4c0b1e0d1100760a3 Mon Sep 17 00:00:00 2001 From: kisfenyo Date: Wed, 25 Feb 2026 09:34:38 +0100 Subject: [PATCH] feat: dynamic logo from synced assets + SVG favicon Logo handler now checks Hub-synced assets first, falling back to embedded SVG. Added SVG favicon to layout and catchall templates. Co-Authored-By: Claude Opus 4.6 --- CHANGELOG.md | 8 ++++++++ controller/README.md | 4 +++- controller/internal/web/server.go | 10 ++++++++++ controller/internal/web/templates/catchall.html | 1 + controller/internal/web/templates/layout.html | 1 + 5 files changed, 23 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ace2d17..4fb57fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ ## Changelog +### v0.29.2 — Dynamic Logo & Favicon (2026-02-25) + +#### Changed +- **Logo served from synced assets** (`internal/web/server.go`) — `serveLogoHandler` now checks the Hub-synced assets directory for `felhom-logo.svg` first, falling back to the embedded SVG constant if not found. This allows logo updates via Hub without a controller rebuild. + +#### Added +- **SVG favicon** (`templates/layout.html`, `templates/catchall.html`) — Added `` pointing to `/static/felhom-logo.svg` so browsers display the Felhom logo as a tab icon. + ### v0.29.1 — Fix Git Lock File Stale After Interrupted Sync (2026-02-24) #### Fixed diff --git a/controller/README.md b/controller/README.md index 237cfc8..0536d90 100644 --- a/controller/README.md +++ b/controller/README.md @@ -4,7 +4,7 @@ A single, lightweight Go container that replaces Portainer + scattered systemd scripts with a unified, Hungarian-language web dashboard for managing Docker Compose stacks, backups, storage, monitoring, and notifications on customer hardware. -**Current version: v0.28.1** +**Current version: v0.29.2** --- @@ -1023,6 +1023,8 @@ App assets (logos, screenshots) are managed centrally by the Hub and downloaded The `Resolve(filename)` method checks the synced cache first, then falls back to the baked-in directory. This ensures assets are always available even before the first sync. +The Felhom logo (`/static/felhom-logo.svg`) also uses this two-tier resolution: the logo handler checks synced assets first, then falls back to the embedded SVG constant. This allows logo updates via Hub without a controller rebuild. The logo is also used as an SVG favicon. + #### Configuration ```yaml diff --git a/controller/internal/web/server.go b/controller/internal/web/server.go index 2f1056c..9a40198 100644 --- a/controller/internal/web/server.go +++ b/controller/internal/web/server.go @@ -431,6 +431,16 @@ func (s *Server) serveChartJSHandler(w http.ResponseWriter, r *http.Request) { } func (s *Server) serveLogoHandler(w http.ResponseWriter, r *http.Request) { + // Try synced asset first (allows logo updates via Hub without rebuild) + if s.assetsSyncer != nil { + path := s.assetsSyncer.Resolve("felhom-logo.svg") + if _, err := os.Stat(path); err == nil { + w.Header().Set("Cache-Control", "public, max-age=86400") + http.ServeFile(w, r, path) + return + } + } + // Fallback to embedded logo w.Header().Set("Content-Type", "image/svg+xml") w.Header().Set("Cache-Control", "public, max-age=86400") fmt.Fprint(w, FelhomLogoSVG) diff --git a/controller/internal/web/templates/catchall.html b/controller/internal/web/templates/catchall.html index e44c72b..d226926 100644 --- a/controller/internal/web/templates/catchall.html +++ b/controller/internal/web/templates/catchall.html @@ -5,6 +5,7 @@ {{if .AppName}}{{.AppName}} — {{end}}felhom.eu +