From 4236621c7a6a93bf390c9c1db44e2defb4330bc4 Mon Sep 17 00:00:00 2001 From: Jared Vititoe Date: Tue, 7 Jul 2026 20:28:40 -0400 Subject: [PATCH] fix(build): serve favicon + all res/ icons at their referenced /public paths MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The static-copy step landed the android icons at dist/public/android/ (stripBase dropped the res/ segment), never copied public/res/apple/ or public/favicon.ico at all, and the manifest pointed at /res/android/ — so every PWA icon, apple-touch icon, og:image, and the favicon 404'd on the live server. Copy all of public/res -> dist/public/res and public/favicon.ico -> dist/public/, and point manifest.json icons at ./public/res/android/ — matching the /public/res and /public/favicon.ico paths index.html already uses. Verified in dist/. Co-Authored-By: Claude Opus 4.8 --- public/manifest.json | 24 ++++++++++++------------ vite.config.js | 13 +++++++++++-- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/public/manifest.json b/public/manifest.json index f97e82eb5..46897b2b2 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -11,58 +11,58 @@ "theme_color": "#980000", "icons": [ { - "src": "./res/android/android-chrome-36x36.png", + "src": "./public/res/android/android-chrome-36x36.png", "sizes": "36x36", "type": "image/png" }, { - "src": "./res/android/android-chrome-48x48.png", + "src": "./public/res/android/android-chrome-48x48.png", "sizes": "48x48", "type": "image/png" }, { - "src": "./res/android/android-chrome-72x72.png", + "src": "./public/res/android/android-chrome-72x72.png", "sizes": "72x72", "type": "image/png" }, { - "src": "./res/android/android-chrome-96x96.png", + "src": "./public/res/android/android-chrome-96x96.png", "sizes": "96x96", "type": "image/png" }, { - "src": "./res/android/android-chrome-144x144.png", + "src": "./public/res/android/android-chrome-144x144.png", "sizes": "144x144", "type": "image/png" }, { - "src": "./res/android/android-chrome-192x192.png", + "src": "./public/res/android/android-chrome-192x192.png", "sizes": "192x192", "type": "image/png" }, { - "src": "./res/android/android-chrome-256x256.png", + "src": "./public/res/android/android-chrome-256x256.png", "sizes": "256x256", "type": "image/png" }, { - "src": "./res/android/android-chrome-384x384.png", + "src": "./public/res/android/android-chrome-384x384.png", "sizes": "384x384", "type": "image/png" }, { - "src": "./res/android/android-chrome-512x512.png", + "src": "./public/res/android/android-chrome-512x512.png", "sizes": "512x512", "type": "image/png" }, { - "src": "./res/android/maskable-192x192.png", + "src": "./public/res/android/maskable-192x192.png", "sizes": "192x192", "type": "image/png", "purpose": "maskable" }, { - "src": "./res/android/maskable-512x512.png", + "src": "./public/res/android/maskable-512x512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" @@ -77,7 +77,7 @@ "url": "/", "icons": [ { - "src": "res/android/android-chrome-96x96.png", + "src": "public/res/android/android-chrome-96x96.png", "sizes": "96x96" } ] diff --git a/vite.config.js b/vite.config.js index 0f75a35d0..faa37921d 100644 --- a/vite.config.js +++ b/vite.config.js @@ -38,9 +38,18 @@ const copyFiles = { rename: { stripBase: true }, }, { - src: 'public/res/android', + // All of public/res/ (android + apple icons, logos, svg) → dist/public/res/, + // matching the /public/res/... paths used by index.html and manifest.json. + // (The old android-only target stripped `res/` and landed at /public/android/, + // so every icon 404'd — apple/ + favicon weren't copied at all.) + src: 'public/res', dest: 'public/', - rename: { stripBase: 2 }, + rename: { stripBase: 1 }, + }, + { + src: 'public/favicon.ico', + dest: 'public/', + rename: { stripBase: 1 }, }, { src: 'public/locales',