# Requirements backlog (complete) Status: โœ… done ยท ๐Ÿšง in progress ยท โฌœ planned ยท ๐Ÿ”‘ needs key/creds. Cross-ref `/docs/ROADMAP.md`. ## Done (Phases 1โ€“3) - โœ… macOS-Photos UI: sidebar, toolbar, Library (Years/Months/All), Collections, Map (map/satellite/grid), People, Recently Deleted (locked), lightbox, light/dark/**semi-dark**, responsive to 280px, a11y, nonce CSP. - โœ… Albums (CRUD/nested/smart), source auto-classify, recycle bin, duplicates, multi-select, import (file+drag), export, **EXIF** (GPS/date/camera) on import. - โœ… Object detection (TF.js, free) โ†’ tags/search/find-similar/**Objects browser**/object focus. - โœ… Annotations (rect/oval/line/arrow/**double-arrow measurement**/text/freehand + colors) in editor + lightbox. - โœ… Info panel (full metadata + **mini-map**). Themes menu + `accentColor`/`borderRadius` props. - โœ… Gemini generative editor (Remove BG/Restore/Colorize/Replace Sky/prompt) โ€” ๐Ÿ”‘ needs billed key (free=429). ## Now / next (in user's priority order) 1. ๐Ÿšง **Custom camera** (#1): getUserMedia preview; capture photo; record video; switch front/back; grid; **live annotation + measurement**; geolocation on capture (permission); auto object-detect after capture. 2. โฌœ **Supabase backend + storage** (#last, ๐Ÿ”‘): Postgres data + Supabase Storage. **No localStorage reliance** โ€” backend is the source of truth. Ask user for creds (URL, anon key, service-role key, bucket) with steps. 3. โฌœ Face clustering โ†’ People; OCR (tesseract.js) โ†’ document search; semantic "show me beach photos" (transformers.js / Hugging Face CLIP) โ€” all free, in-browser. 4. โฌœ Video editor + annotations; macOS-parity player polish. ## New requests (this session โ€” must add) - โฌœ **Editor: straighten / tilt** (angle slider) โ€” rotate by arbitrary degrees. - โฌœ **Crop: free-form AND fixed-ratio** โ€” when a ratio (e.g. 1:1 square) is selected, dragging/stretching the crop box keeps that aspect ratio; also free crop. - โฌœ **Import sync of existing metadata**: if an imported/mobile image already has tags (IPTC/XMP keywords) + location + details, read and apply them (exifr supports XMP/IPTC). Keep object detection + object albums. - ๐Ÿšง **Web-meaningful UI** (deep pass): "All Projects" โ†’ **"All Albums"** (this is a web gallery, not iOS); remove "Open App Store" (meaningless on web); review sidebar tabs, **corner radius**, touch-ups so everything is meaningful for a web gallery and matches macOS more closely. - โฌœ **Search dropdown defaults**: show quick filters **Recently Viewed**, **Recently Edited** (+ Recently Shared) when the search field is focused. - โฌœ **Info โ†’ map click opens full Map** centered on that photo's location. - โฌœ **Map parity w/ macOS**: locations + images + tags; latest image shown for a tag; **click a tag โ†’ open that tag's images grouped by date** (date-wise). Tag = album-like view, date-grouped. - โฌœ **Local-model fallback**: if Gemini key missing/invalid, use a local model. Concretely wire `@imgly/background-removal` (free, in-browser) for Remove Background so it always works without a key. - โฌœ **Everything free**; build our own if no free option. - โœ… **Memory in project `.claude/` folder** (this folder) โ€” done. - โฌœ More **advanced features** (open-ended; user will add more later). ## Notes - getUserMedia needs HTTPS or localhost (dev OK). Permissions-Policy already allows camera/mic/geolocation=self. - When Supabase is wired, switch the demo adapter from localStorage โ†’ Supabase and drop localStorage reliance.