# 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) โ€” all โœ… done 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** (๐Ÿ”‘): Postgres data + Supabase Storage adapter (run `docs/supabase-setup.sql` once). Backend is the source of truth on load. The CRM host supplies its own **incremental** data-door adapter (`applyChanges` + `putMedia`); localStorage remains the zero-config dev default. 3. โœ… Face clustering โ†’ People; OCR (tesseract.js) โ†’ Documents + searchable text; semantic search (transformers.js / CLIP) โ€” all free, in-browser. 4. โœ… Full video editor + annotations (timeline engine, no ffmpeg); โœ… macOS-parity **custom video player**. ## New requests (early sessions โ€” now all done) - โœ… **Editor: straighten / tilt** (angle slider) โ€” rotate by arbitrary degrees. - โœ… **Crop: free-form AND fixed-ratio** โ€” a selected ratio (e.g. 1:1) is kept while dragging; also free crop. - โœ… **Import sync of existing metadata**: IPTC/XMP keywords + location read on import (exifr) alongside object detection. - โœ… **Web-meaningful UI** (deep pass): "All Projects" โ†’ **"All Albums"**; removed "App Store"; sidebar tabs / corner radius / touch-ups reviewed for a web gallery matching macOS. - โœ… **Search dropdown defaults**: Recently Viewed / Recently Edited / Recently Added when the search field is focused. - โœ… **Info โ†’ map click opens full Map** centered on that photo's location. - โœ… **Map parity w/ macOS**: click a tag โ†’ that tag's images grouped by date; thumbnail pins; location sheets. - โœ… **Local-model fallback**: `@imgly/background-removal` (free, in-browser) wired for Remove Background โ€” no key needed. - โœ… **Everything free**; build our own where no free option (analysis/OCR/faces/semantic/bg-remove all run in-browser). - โœ… **Memory in project `.claude/` folder** (this folder) โ€” done. - โœ… More **advanced features** โ€” versioning + audit log, comments, advanced video editor, sharing, password lock, glass design polish, custom video player (open-ended; new requests continue below). ## Host-app embedding & CRM integration (2026-07-23) โ€” done > The SDK now embeds into a host product (LynkedUp CRM), not only the standalone demo. All of it is opt-in. - โœ… **Embedded layout** (`embedded`) + **chrome suppression** (`chrome`, `DEFAULT_CHROME`) + **`hiddenViews`** + **`keyboardShortcuts`** flag; live `setConfig` re-applies theme/tokens/identity/chrome without remount. - โœ… **Host identity** (`currentUser: GalleryUser`) โ†’ identity-stamped **comments** (`authorId/author/authorAvatar`, delete only own), **uploads** (`MediaItem.uploadedBy`, never overwritten), **versions** (author on each). Info panel shows "Uploaded by" + per-version author. `be-crm` still owns `owner_principal_id` (display-only here). - โœ… **`shareBaseUrl`** (host owns share-link base) + **full-screen** (`defaultFullscreen`, `.apg--fullscreen`, `setFullscreen`/`toggleFullscreen`). - โœ… **Full `ThemeTokens` map (52 keys)** โ†’ CSS vars (sanitized); floating glass toolbar + `.apg-scalemenu` dropdown. - โœ… **Incremental adapter**: `applyChanges(StateChanges)` (diff-based, serialized, rollback-on-reject) + `putMedia(id, blob, meta) โ†’ StoredBlob {ref,url}`; `MediaItem.storageRef`. Types `StateChanges`/`StoredBlob` exported. - โœ… **Server-backed Recently-Deleted lock** (`lockProvider { status, set, verify }`) replaces the device-local hash; `lockConfigured` = UI truth; `lockError` = wrong-password vs unavailable. - โœ… **Editable caption + multi-line `note`** in Info (searchable); **full-address reverse geocoding** (Nominatim, persisted); **map** fly-to / count badge / hover mini-slider / date-range location filter. - โœ… **UI fixes**: Info-panel inline `