From f21c91527ca8758e69241f7028d9d557477a8e67 Mon Sep 17 00:00:00 2001 From: Nate Emmert Date: Thu, 15 Oct 2026 14:22:05 -0400 Subject: [PATCH] Serve PWA icons from fresh /icons/v2/ URLs with every iOS size iOS showed a letter tile ('N') when adding to the Home Screen. The live files were fine, but a reverse proxy in front of the app serves static files with a long cache lifetime (live icon.svg and sw.js were stale) and iOS remembers a failed icon per URL. - New versioned URLs no proxy/phone has cached; old paths kept for existing installs - apple-touch-icon declared at 180/167/152/120 (opaque 8-bit RGB PNGs) for app and dashboard - 180px icon also listed in both manifests; notification icons and root fallbacks use v2 - Service worker cache bumped Co-Authored-By: Claude Sonnet 5.5 --- app/public/app.js | 6 ++--- app/public/dashboard-account.html | 9 ++++--- app/public/dashboard-login.html | 7 ++++-- app/public/dashboard-recover.html | 7 ++++-- app/public/dashboard-settings.html | 7 ++++-- app/public/dashboard-setup.html | 7 ++++-- app/public/dashboard.html | 7 ++++-- app/public/dashboard.webmanifest | 12 +++++++--- app/public/icons/v2/apple-touch-icon-120.png | Bin 0 -> 8748 bytes app/public/icons/v2/apple-touch-icon-152.png | Bin 0 -> 12081 bytes app/public/icons/v2/apple-touch-icon-167.png | Bin 0 -> 13719 bytes app/public/icons/v2/apple-touch-icon-180.png | Bin 0 -> 15276 bytes app/public/icons/v2/apple-touch-icon.png | Bin 0 -> 15276 bytes .../v2/dashboard-apple-touch-icon-120.png | Bin 0 -> 7461 bytes .../v2/dashboard-apple-touch-icon-152.png | Bin 0 -> 10164 bytes .../v2/dashboard-apple-touch-icon-167.png | Bin 0 -> 11177 bytes .../v2/dashboard-apple-touch-icon-180.png | Bin 0 -> 12401 bytes .../icons/v2/dashboard-apple-touch-icon.png | Bin 0 -> 12401 bytes app/public/icons/v2/dashboard-icon-192.png | Bin 0 -> 13494 bytes app/public/icons/v2/dashboard-icon-512.png | Bin 0 -> 41769 bytes .../icons/v2/dashboard-icon-maskable-512.png | Bin 0 -> 41769 bytes app/public/icons/v2/icon-192.png | Bin 0 -> 16791 bytes app/public/icons/v2/icon-512.png | Bin 0 -> 64719 bytes app/public/icons/v2/icon-maskable-512.png | Bin 0 -> 64719 bytes app/public/icons/v2/icon.svg | 22 ++++++++++++++++++ app/public/index.html | 9 ++++--- app/public/manifest.json | 22 +++++++++++------- app/public/sw.js | 8 +++---- app/server.js | 2 +- 29 files changed, 90 insertions(+), 35 deletions(-) create mode 100644 app/public/icons/v2/apple-touch-icon-120.png create mode 100644 app/public/icons/v2/apple-touch-icon-152.png create mode 100644 app/public/icons/v2/apple-touch-icon-167.png create mode 100644 app/public/icons/v2/apple-touch-icon-180.png create mode 100644 app/public/icons/v2/apple-touch-icon.png create mode 100644 app/public/icons/v2/dashboard-apple-touch-icon-120.png create mode 100644 app/public/icons/v2/dashboard-apple-touch-icon-152.png create mode 100644 app/public/icons/v2/dashboard-apple-touch-icon-167.png create mode 100644 app/public/icons/v2/dashboard-apple-touch-icon-180.png create mode 100644 app/public/icons/v2/dashboard-apple-touch-icon.png create mode 100644 app/public/icons/v2/dashboard-icon-192.png create mode 100644 app/public/icons/v2/dashboard-icon-512.png create mode 100644 app/public/icons/v2/dashboard-icon-maskable-512.png create mode 100644 app/public/icons/v2/icon-192.png create mode 100644 app/public/icons/v2/icon-512.png create mode 100644 app/public/icons/v2/icon-maskable-512.png create mode 100644 app/public/icons/v2/icon.svg diff --git a/app/public/app.js b/app/public/app.js index 28da076..47631cd 100644 --- a/app/public/app.js +++ b/app/public/app.js @@ -2083,10 +2083,10 @@ function renderAlerts(data) { if (typeof Notification !== 'undefined' && Notification.permission === 'granted') { if ('serviceWorker' in navigator && navigator.serviceWorker.controller) { navigator.serviceWorker.ready.then(reg => - reg.showNotification(title, { body, icon: '/icons/icon-192.png', badge: '/icons/icon-192.png', tag: id, data: { url: '/?tab=alerts' } }) - ).catch(() => new Notification(title, { body, icon: '/icons/icon-192.png' })); + reg.showNotification(title, { body, icon: '/icons/v2/icon-192.png', badge: '/icons/v2/icon-192.png', tag: id, data: { url: '/?tab=alerts' } }) + ).catch(() => new Notification(title, { body, icon: '/icons/v2/icon-192.png' })); } else { - new Notification(title, { body, icon: '/icons/icon-192.png', badge: '/icons/icon-192.png' }); + new Notification(title, { body, icon: '/icons/v2/icon-192.png', badge: '/icons/v2/icon-192.png' }); } } if (state.ntfyTopic) { diff --git a/app/public/dashboard-account.html b/app/public/dashboard-account.html index 1c1d3a2..d1a06f1 100644 --- a/app/public/dashboard-account.html +++ b/app/public/dashboard-account.html @@ -5,10 +5,13 @@ - - + + + + + - + diff --git a/app/public/dashboard-login.html b/app/public/dashboard-login.html index 3e03586..4902c33 100644 --- a/app/public/dashboard-login.html +++ b/app/public/dashboard-login.html @@ -8,8 +8,11 @@ - - + + + + + Station Dashboard — Sign In