tia/public
Mannu ccae6d85d2 Fix broken memories count + silent upload failures
Memories "count 2 but no images" root cause:
- DB rows exist with processing_status='failed'/'uploading' from aborted uploads
  whose R2 objects never actually landed. The img onError fires and hides the
  tile, but the count still includes these orphaned rows.
- Fix: GET /api/memories now excludes failed rows and uploading rows older than
  30 min from both the SELECT and the count. Also fires a background DELETE to
  clean up orphaned rows so they stop accumulating.

Profile / memories upload silent failures:
- Some Android cameras return file.type="" which caused the avatar API to reject
  the upload with a 400 error. Error was caught but shown in a small text node
  buried below the form — invisible when looking at the avatar area.
- Fix: added resolveContentType() helper (used in profile, memories, home) that
  falls back to extension-based detection when file.type is empty/octet-stream.
- Fix: profile page now uses a separate uploadMsg state rendered immediately
  below the avatar so errors/success are always visible on mobile without scroll.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-28 10:48:28 +05:30
..
icons feat(pwa): add Serwist service worker, manifest, icons, install prompt 2026-05-27 23:20:48 +05:30
file.svg chore: initial setup 2026-05-10 03:33:32 +05:30
globe.svg chore: initial setup 2026-05-10 03:33:32 +05:30
icon.svg polish(marketing): favicon, scroll-reveal nav, Google button, font + hovers 2026-05-26 00:05:10 +05:30
next.svg chore: initial setup 2026-05-10 03:33:32 +05:30
sw.js Fix broken memories count + silent upload failures 2026-05-28 10:48:28 +05:30
vercel.svg chore: initial setup 2026-05-10 03:33:32 +05:30
window.svg chore: initial setup 2026-05-10 03:33:32 +05:30