- Favorites use PhotoPrism's own like/unlike endpoint (not a mule-only
mark) so they sync to third-party gallery apps, with heart controls
in the tile, sidebar, and an `f` shortcut.
- Lightbox: wheel-zoom around cursor, double-click to 2.5x, drag-to-pan,
auto-upgrades to the fit_2048 tile past 1.25x zoom.
- Sidebar: copy-EXIF button, clickable Camera/Lens values that jump to
a filtered timeline (camera:/lens: DSL), matching the existing
Country link.
- Fix filtersToQ() quoting the entire search string whenever it
contained a colon, which silently turned any raw DSL operator
(camera:, taken:2024, etc.) into a literal phrase search — discovered
while verifying the new jump-links against production.
- Disable TanStack Query's refetchOnWindowFocus: the indexer WebSocket
already invalidates photo queries on real changes, so the focus
refetch was just a redundant full-timeline re-render on tab-switch.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Replace the legacy mule-image backend with PhotoPrism plus a thin
SvelteKit client and a Node sidecar for endpoints PhotoPrism doesn't
expose (file rename), and add a two-phase migrator (metadata via PUT,
heaps → albums) for the existing Postgres library.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>