From 02adfd0dbed493e79f5f778ac87ebeceb1404f1b Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 11 Jun 2026 08:00:22 +0000 Subject: [PATCH] feat: installable PWA (manifest, icons, minimal service worker) - public/manifest.webmanifest with any + maskable icons (192/512) - generated inbox-glyph icons in app palette, apple-touch-icon - minimal no-cache service worker for installability; registered via client plugin - head: manifest/icon links, mobile-web-app-capable Co-Authored-By: Claude Fable 5 --- .gitignore | 1 + app/plugins/pwa.client.ts | 6 ++++++ nuxt.config.ts | 4 ++++ public/icons/apple-touch-icon.png | Bin 0 -> 1841 bytes public/icons/icon-192.png | Bin 0 -> 3186 bytes public/icons/icon-512.png | Bin 0 -> 12687 bytes public/icons/icon-maskable-192.png | Bin 0 -> 1941 bytes public/icons/icon-maskable-512.png | Bin 0 -> 9292 bytes public/manifest.webmanifest | 17 +++++++++++++++++ public/sw.js | 6 ++++++ 10 files changed, 34 insertions(+) create mode 100644 app/plugins/pwa.client.ts create mode 100644 public/icons/apple-touch-icon.png create mode 100644 public/icons/icon-192.png create mode 100644 public/icons/icon-512.png create mode 100644 public/icons/icon-maskable-192.png create mode 100644 public/icons/icon-maskable-512.png create mode 100644 public/manifest.webmanifest create mode 100644 public/sw.js diff --git a/.gitignore b/.gitignore index 657dc48..5dd051f 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ node_modules/ .DS_Store .playwright-mcp/ *.png +!public/icons/*.png .claude/ diff --git a/app/plugins/pwa.client.ts b/app/plugins/pwa.client.ts new file mode 100644 index 0000000..990a1a2 --- /dev/null +++ b/app/plugins/pwa.client.ts @@ -0,0 +1,6 @@ +export default defineNuxtPlugin(() => { + if (!("serviceWorker" in navigator)) return; + window.addEventListener("load", () => { + navigator.serviceWorker.register("/sw.js").catch(() => {}); + }); +}); diff --git a/nuxt.config.ts b/nuxt.config.ts index 9423ce5..87f694b 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -23,11 +23,15 @@ export default defineNuxtConfig({ { name: "color-scheme", content: "light dark" }, { name: "theme-color", media: "(prefers-color-scheme: light)", content: "#f4f1ea" }, { name: "theme-color", media: "(prefers-color-scheme: dark)", content: "#181410" }, + { name: "mobile-web-app-capable", content: "yes" }, { name: "apple-mobile-web-app-capable", content: "yes" }, { name: "apple-mobile-web-app-status-bar-style", content: "default" }, { name: "apple-mobile-web-app-title", content: "ClaudeDo" }, ], link: [ + { rel: "manifest", href: "/manifest.webmanifest" }, + { rel: "apple-touch-icon", href: "/icons/apple-touch-icon.png" }, + { rel: "icon", type: "image/png", sizes: "192x192", href: "/icons/icon-192.png" }, { rel: "preconnect", href: "https://fonts.googleapis.com" }, { rel: "preconnect", href: "https://fonts.gstatic.com", crossorigin: "" }, { diff --git a/public/icons/apple-touch-icon.png b/public/icons/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..59b90f7d0724f6208ea9c23f84671627ff37b690 GIT binary patch literal 1841 zcmeAS@N?(olHy`uVBq!ia0vp^TR@nD4M^IaWitX&oCO|{#S9GG!XV7ZFl&wk0|VP* zPZ!6KiaBrR-p`&|Ds%k1dd-%_wcBQ0P;4qVefEycjw33Iem5yC`PaJ3!)Vr_RjMnR zB2^bxzz`r7zi*4HLx-9Ic8=k1U#2Bu;giJU;!H88~`-p%Fdx~ z#Ou}tcW%o4s@mmLpI`31a{Y4c>hEEeQrCIsvi&;xTsg6<%IM0w(CDbmmnT2Ga#C3G z!Ny|77goL*_cv+Q{QCHC!xjU1S(WUls2Ti+ottO6Z+w{Da>umf__ebSZ?E6q#n)Fl z*Sh+a>Xmm5ezPsjbX+ffxRCH=55uo|ACK=3m5i0I7~B6Uw-c8=Wb<^@!pr;(8>81} zNcr};pXXf=ZrGS_ysDJh*4R`~)~O-xV9Td%eJ^suL#E2s`rm!_()#($}qmPM)~sn3* z`WRX=%xW_$=rGyxOU9Mi|_ja>id&*ZA|H(*M@9=!-yY%^aKYqWt@z3Y-z2%3_ z|H{i<5Pxs~_J{93pYs0Auq$MLzOJd|r%Mz0`OW^+w(;%fzo6QX$Hfv}Czow;VSmg{ z9ti)x&RxFWY`>)0KK~Qfy1D;g+q7MKlZ(~}zv>o0XU_A&TYP`M)EQGdky|0g=3h45 ztNOh4&i%)4nb({DwbiOQEhwMB?QnnR&-8VdlNWrd+41+gJVR{M{&t@}UZ>jHETcDf zH)kI#_?%!N7)1x$RBJmS+Qm1O!=$r4t}zK>!@I2vAuzwa?#V^GbQ?FdV zJaun%&IN{B4VE5U&l_K#Y+Ulxh9P65m#2t|;XhN*>$Gzlw&%+N>p%uiS3j3^P6HiS^ literal 0 HcmV?d00001 diff --git a/public/icons/icon-192.png b/public/icons/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..6e85e8ba62bf5af2bfe5a5a53f742d894f56ea4c GIT binary patch literal 3186 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 literal 0 HcmV?d00001 diff --git a/public/icons/icon-512.png b/public/icons/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..59fd7e1ecc95a9d322c191035f70522b1331bb8a GIT binary patch literal 12687 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 P+_Ola?;f9OPL$~X*PIup literal 0 HcmV?d00001 diff --git a/public/icons/icon-maskable-512.png b/public/icons/icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..883932f5d23b322d82f765c796ff4e881d72abd0 GIT binary patch literal 9292 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 IdqDEP0W~oI*#H0l literal 0 HcmV?d00001 diff --git a/public/manifest.webmanifest b/public/manifest.webmanifest new file mode 100644 index 0000000..18ba159 --- /dev/null +++ b/public/manifest.webmanifest @@ -0,0 +1,17 @@ +{ + "id": "/", + "name": "ClaudeDo Inbox", + "short_name": "ClaudeDo", + "description": "Task inbox for the ClaudeDo backlog", + "start_url": "/", + "scope": "/", + "display": "standalone", + "background_color": "#181410", + "theme_color": "#181410", + "icons": [ + { "src": "/icons/icon-192.png", "sizes": "192x192", "type": "image/png", "purpose": "any" }, + { "src": "/icons/icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "any" }, + { "src": "/icons/icon-maskable-192.png", "sizes": "192x192", "type": "image/png", "purpose": "maskable" }, + { "src": "/icons/icon-maskable-512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" } + ] +} diff --git a/public/sw.js b/public/sw.js new file mode 100644 index 0000000..e96ef74 --- /dev/null +++ b/public/sw.js @@ -0,0 +1,6 @@ +// Minimal service worker: enables PWA installability across browsers. +// Intentionally no caching — the app is a private, auth-gated SPA and stale +// assets after a deploy are worse than requiring a connection. +self.addEventListener("install", () => self.skipWaiting()); +self.addEventListener("activate", (event) => event.waitUntil(self.clients.claim())); +self.addEventListener("fetch", () => {});