From 75a9fef18a44774c3e951e3d16ed4d05d7588670 Mon Sep 17 00:00:00 2001 From: Nicolas Date: Wed, 16 Sep 2026 14:07:28 +0200 Subject: [PATCH] Make the app installable as a PWA Manifest + hand-authored icons (any + maskable) + iOS meta tags, so it can be added to a phone's home screen and opened without browser chrome. No service worker - explored as a possible route to automatic Picture-in-Picture on backgrounding, but confirmed (by actually calling requestPictureInPicture() from a real visibilitychange listener) that install state doesn't change that API's fresh-gesture requirement, so this is a standalone feature rather than a fix for that limitation. Co-Authored-By: Claude Sonnet 5 --- README.md | 3 + client/build.mjs | 7 +- client/src/index.html | 18 ++++ client/src/public/icons/apple-touch-icon.png | Bin 0 -> 6740 bytes client/src/public/icons/favicon.png | Bin 0 -> 1003 bytes client/src/public/icons/icon-192.png | Bin 0 -> 6917 bytes client/src/public/icons/icon-512-maskable.png | Bin 0 -> 17363 bytes client/src/public/icons/icon-512.png | Bin 0 -> 23316 bytes client/src/public/manifest.webmanifest | 16 ++++ docs/architecture.md | 81 ++++++++++++++++++ 10 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 client/src/public/icons/apple-touch-icon.png create mode 100644 client/src/public/icons/favicon.png create mode 100644 client/src/public/icons/icon-192.png create mode 100644 client/src/public/icons/icon-512-maskable.png create mode 100644 client/src/public/icons/icon-512.png create mode 100644 client/src/public/manifest.webmanifest diff --git a/README.md b/README.md index 9024002..5bf6a04 100644 --- a/README.md +++ b/README.md @@ -344,6 +344,9 @@ Then put it behind your existing reverse proxy like everything else action — resolved server-side (one atomic operation, not one request per track) the same way launching a playlist already expands into everything it contains — see docs/architecture.md +- [x] Installable as a PWA (manifest + icons, standalone display, + no service worker — this app has nothing worth caching offline) + — see docs/architecture.md - [ ] Try a full party end-to-end with two real accounts (still the main gap) - [ ] Try casting to a real Chromecast (only the SDK's own bootstrap is confirmed here — no real device/session) diff --git a/client/build.mjs b/client/build.mjs index 0290eef..55fb725 100644 --- a/client/build.mjs +++ b/client/build.mjs @@ -11,7 +11,7 @@ // npm run watch -> rebuilds on save, for local dev (see README's // Running locally section) import * as esbuild from 'esbuild'; -import { copyFileSync, mkdirSync } from 'fs'; +import { copyFileSync, cpSync, mkdirSync } from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; @@ -20,6 +20,11 @@ const outdir = path.join(here, 'dist'); mkdirSync(outdir, { recursive: true }); copyFileSync(path.join(here, 'src', 'index.html'), path.join(outdir, 'index.html')); +// PWA manifest + icons (manifest.webmanifest, icons/*) - see +// docs/architecture.md's "Progressive Web App" section. Copied wholesale +// rather than named file-by-file like index.html above, so adding another +// icon later needs no build.mjs change. +cpSync(path.join(here, 'src', 'public'), outdir, { recursive: true }); const buildOptions = { entryPoints: [path.join(here, 'src', 'app.ts')], diff --git a/client/src/index.html b/client/src/index.html index e57676f..ecb359c 100644 --- a/client/src/index.html +++ b/client/src/index.html @@ -4,6 +4,24 @@ Watch Party + + + + + + + + + + + + diff --git a/client/src/public/icons/apple-touch-icon.png b/client/src/public/icons/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c8262c7582a0bde2fd6b726919eb4329f0975e75 GIT binary patch literal 6740 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 literal 0 HcmV?d00001 diff --git a/client/src/public/icons/icon-512-maskable.png b/client/src/public/icons/icon-512-maskable.png new file mode 100644 index 0000000000000000000000000000000000000000..b20de6ef442b213835f03f31044d4dca93ceaa95 GIT binary patch literal 17363 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 literal 0 HcmV?d00001 diff --git a/client/src/public/icons/icon-512.png b/client/src/public/icons/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..983626f132cdedd3e630be410b2c91155e19dbac GIT binary patch literal 23316 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 z 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 go!|#QZ(+&@`5ws`. No + `service worker` - confirmed against MDN's own installability + requirements that Chrome does not require one for the install + prompt, and this app has no real use for one: every page is either + live party/socket state or a proxied Emby catalog, and caching either + offline would mean showing stale library data or a stale party that's + already gone, not a working offline mode - so skipping it avoids a + whole stale-cache-invalidation problem this app doesn't need to + solve. +- **Icons** - hand-authored SVG (this project has no existing + logo/brand asset), rasterized to PNG at the sizes each consumer + needs (192/512 for the manifest, 180 for `apple-touch-icon`, 32 for + the browser-tab favicon) via a `` in a real browser rather + than an image-editing tool, since that's what was available here. + Two source SVGs, not one: `icon.svg` fills the canvas (used for the + manifest's `"any"` purpose, the favicon, and `apple-touch-icon` - + none of those get OS-mask-cropped) and `icon-maskable.svg` scales + the same design down (~75%) so its farthest content point sits + inside Android's adaptive-icon safe zone (a circle of ~30.5% of the + icon's radius from center) - checked by computing the actual + farthest-point distance for both versions, not just eyeballed, + since a maskable icon that ignores that zone gets silently clipped + by circular-mask launchers. +- **`index.html`** - ``, a `theme-color` meta + (Chrome/Android chrome), and the separate iOS-only tags Safari needs + instead of reading the manifest for the equivalent behavior + (`apple-touch-icon` link, `apple-mobile-web-app-capable`, + `apple-mobile-web-app-status-bar-style`, `apple-mobile-web-app-title`). + +`build.mjs` gained one `cpSync(src/public, dist, { recursive: true })` +call alongside its existing `index.html` copy, rather than naming the +manifest and every icon individually - adding another icon later needs +no build.mjs change. `express.static` (already serving all of +`client/dist` unconditionally) picks up `manifest.webmanifest` and +`icons/*` with no server-side change at all. + +Verified: full `typecheck`/`build` (client only). Confirmed directly +against a real running instance of this server, not just assumed: +`manifest.webmanifest` and all three manifest icons resolve `200` with +the correct `application/manifest+json`/`image/png` content types +(express's static middleware infers both from the file extension +correctly on its own), the `apple-touch-icon` link resolves `200`, the +generated PNGs are genuinely the declared dimensions (32/180/192/512), +and the page's own console shows no manifest-related warnings after +loading it. **Not verified**: an actual "Add to Home Screen"/install +prompt, or the installed app's standalone window, on a real device - +no device reachable from this sandbox, same standing gap as every +other browser-native integration in this project (casting, PiP, the +intro-skip buttons). + ## Known limitations - Playback always goes through `hls.js` against whatever Emby's