[object Object]

← back to Dw Photo Capture

Photo capture: installable PWA — DW-branded home-screen icon (iPad/iPhone)

b99e4d9a7ddd7926dd45b45614f79b9990e94352 · 2026-09-18 14:14:58 -0700 · steve

- New DW-branded icons (gold camera glyph + DW wordmark on dark) at 180/192/512
- Add /icon-192.png route + PUBLIC allowlist entry (iOS fetches icons uncredentialed)
- Manifest: name 'DW Photo Capture', short_name 'DW Photo', start_url '/', standalone,
  192/512 icons (any + maskable), theme/bg #0f0e0c, portrait
- Head: apple-mobile-web-app-title 'DW Photo' + mobile-web-app-capable + sized icon links

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DCq3132eTmJESAKqJBM8FN

Files touched

Diff

commit b99e4d9a7ddd7926dd45b45614f79b9990e94352
Author: steve <steve@designerwallcoverings.com>
Date:   Fri Sep 18 14:14:58 2026 -0700

    Photo capture: installable PWA — DW-branded home-screen icon (iPad/iPhone)
    
    - New DW-branded icons (gold camera glyph + DW wordmark on dark) at 180/192/512
    - Add /icon-192.png route + PUBLIC allowlist entry (iOS fetches icons uncredentialed)
    - Manifest: name 'DW Photo Capture', short_name 'DW Photo', start_url '/', standalone,
      192/512 icons (any + maskable), theme/bg #0f0e0c, portrait
    - Head: apple-mobile-web-app-title 'DW Photo' + mobile-web-app-capable + sized icon links
    
    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01DCq3132eTmJESAKqJBM8FN
---
 public/icon-180.png | Bin 4386 -> 7558 bytes
 public/icon-192.png | Bin 0 -> 7691 bytes
 public/icon-512.png | Bin 12871 -> 23358 bytes
 public/index.html   |   8 +++++---
 server.js           |  16 ++++++++++------
 5 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/public/icon-180.png b/public/icon-180.png
index 1148fc6..3e32efa 100644
Binary files a/public/icon-180.png and b/public/icon-180.png differ
diff --git a/public/icon-192.png b/public/icon-192.png
new file mode 100644
index 0000000..268d9a4
Binary files /dev/null and b/public/icon-192.png differ
diff --git a/public/icon-512.png b/public/icon-512.png
index aa6134a..674b7bb 100644
Binary files a/public/icon-512.png and b/public/icon-512.png differ
diff --git a/public/index.html b/public/index.html
index 548c58a..8d93e95 100644
--- a/public/index.html
+++ b/public/index.html
@@ -29,10 +29,12 @@
 <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover, maximum-scale=1">
 <meta name="apple-mobile-web-app-capable" content="yes">
 <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
-<meta name="apple-mobile-web-app-title" content="DW SKU Photos">
+<meta name="apple-mobile-web-app-title" content="DW Photo">
+<meta name="mobile-web-app-capable" content="yes">
 <meta name="theme-color" content="#0f0e0c">
-<link rel="apple-touch-icon" href="/apple-touch-icon.png">
-<link rel="icon" type="image/png" href="/icon-180.png">
+<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
+<link rel="icon" type="image/png" sizes="192x192" href="/icon-192.png">
+<link rel="icon" type="image/png" sizes="512x512" href="/icon-512.png">
 <link rel="manifest" href="/manifest.webmanifest">
 <title>Mobile DW SKU Photos</title>
 <style>
diff --git a/server.js b/server.js
index 5855cd3..5c07408 100644
--- a/server.js
+++ b/server.js
@@ -921,7 +921,7 @@ function pipeUpstreamImage(src, res, headers) {
 
 const appHandler = (req, res) => {
   // public (no-auth) paths: health + the home-screen-install assets iOS fetches without creds
-  const PUBLIC = ['/healthz', '/icon-180.png', '/icon-512.png', '/apple-touch-icon.png', '/manifest.webmanifest', '/apps/similar', '/apps/color-index', '/apps/color-widen', '/apps/color-dots'];
+  const PUBLIC = ['/healthz', '/icon-180.png', '/icon-192.png', '/icon-512.png', '/apple-touch-icon.png', '/manifest.webmanifest', '/apps/similar', '/apps/color-index', '/apps/color-widen', '/apps/color-dots'];
   const _p = req.url.split('?')[0];
   if (!PUBLIC.includes(_p) && !_p.startsWith('/marketing/') && !checkAuth(req)) {
     res.writeHead(401, { 'WWW-Authenticate': 'Basic realm="DW Photo Capture"' });
@@ -2068,8 +2068,8 @@ load();
     return send(res, 404, { err: 'not found' });
   }
 
-  // App icons + PWA manifest — make "Add to Home Screen" a real app (clean icon, fullscreen).
-  if (u.pathname === '/icon-180.png' || u.pathname === '/icon-512.png' || u.pathname === '/apple-touch-icon.png') {
+  // App icons + PWA manifest — make "Add to Home Screen" a real app (clean DW icon, fullscreen).
+  if (u.pathname === '/icon-180.png' || u.pathname === '/icon-192.png' || u.pathname === '/icon-512.png' || u.pathname === '/apple-touch-icon.png') {
     const f = path.join(ROOT, 'public', u.pathname === '/apple-touch-icon.png' ? 'icon-180.png' : path.basename(u.pathname));
     if (fs.existsSync(f)) { res.writeHead(200, { 'Content-Type': 'image/png', 'Cache-Control': 'max-age=86400' }); return res.end(fs.readFileSync(f)); }
     return send(res, 404, { err: 'not found' });
@@ -2077,9 +2077,13 @@ load();
   if (u.pathname === '/manifest.webmanifest') {
     res.writeHead(200, { 'Content-Type': 'application/manifest+json' });
     return res.end(JSON.stringify({
-      name: 'Mobile DW SKU Photos', short_name: 'DW SKU Photos', start_url: '/?app=1', display: 'standalone',
-      background_color: '#0f0e0c', theme_color: '#0f0e0c',
-      icons: [{ src: '/icon-180.png', sizes: '180x180', type: 'image/png' }, { src: '/icon-512.png', sizes: '512x512', type: 'image/png', purpose: 'any maskable' }]
+      name: 'DW Photo Capture', short_name: 'DW Photo', start_url: '/', scope: '/', display: 'standalone',
+      background_color: '#0f0e0c', theme_color: '#0f0e0c', orientation: 'portrait',
+      icons: [
+        { src: '/icon-192.png', sizes: '192x192', type: 'image/png', purpose: 'any' },
+        { src: '/icon-512.png', sizes: '512x512', type: 'image/png', purpose: 'any' },
+        { src: '/icon-512.png', sizes: '512x512', type: 'image/png', purpose: 'maskable' }
+      ]
     }));
   }
 

← 4cbb39e Photo capture: two-photo capture + mfr# identity gate (front  ·  back to Dw Photo Capture  ·  auto-data-snapshot: 2026-09-18T14:19:46 (2 data files) — dat bad2f48 →