A narrow (asset.read, asset.view) key was insufficient for the
heatmap's /api/search/metadata call — the server returned an error.
Request ['all'] so the key covers every endpoint the heatmap touches.
Also add a Reset button next to the Collapse toggle so a stale or
under-permissioned cached key can be regenerated without site-data
surgery.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
On map view the body container now shows the Leaflet map on one half
and a photo grid on the other half. The grid renders only photos
whose GPS falls inside the map's current bounds, and re-renders on
moveend/zoomend so panning and zooming filters the visible photo set
live. Stacks vertically on narrow viewports.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The heatmap iframe now requests an Immich API key via /api/api-keys
(asset.read, asset.view) on first load, caches it in localStorage,
and passes it via ?apiKey= so the user doesn't have to paste one.
Banner moved to the bottom of the /explore scroll container, below
People and Places.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Enable native mobile pinch-zoom by rewriting the viewport meta.
- Strip Content-Security-Policy / X-Frame-Options from HTML responses
so heatmap.jeffemmett.com can be iframed in.
- On /explore: inject a collapsible heatmap iframe at the top, and
replace People + Places sections (truncated grid with 'view more')
with horizontally-scrollable strips fetched from /api/people and
/api/search/cities.
- Re-run injection on history pushState + MutationObserver to cover
Svelte SPA route changes.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
server.js: hash live-search.js into INJECT_VERSION, expose
/api/custom/inject-version, set no-store on HTML so inline version
tag stays fresh.
live-search.js: compare baked window.__LS_VERSION vs server version
every 2 min + on visibility change; show banner, auto-unregister
service worker, clear caches, and reload when a new version ships.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Hijacks #location-selection in Immich's search filter modal: hides
country/state/city comboboxes, injects a text input that opens the
live-search overlay directly in map view for pan/zoom exploration.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds immich-proxy (search-app) with live search injection, WebSocket
proxying for socket.io, and 10GB upload buffering via Traefik middleware.
Moves Traefik routing from immich-server to proxy. Updates valkey 8→9.
Adds backlog tasks for drone sync and Syncthing reconnection.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
CLAUDE.md may contain project context with credentials and is now
covered by global gitignore to prevent accidental secret commits.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add heatmap-app with Node.js server and Leaflet.js frontend
- Implement API proxy to handle CORS for internal Immich server
- Add pagination support for fetching all geotagged photos (84k+)
- Support click-to-view photos in selected area with gallery sidebar
- Integrate with docker-compose and Traefik for heatmap.jeffemmett.com
- Add backlog tasks for heatmap work and Power Tools v2.4 tracking
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Uploaded 272GB of photos/videos to Immich:
- 100,205 images + 5,238 videos
- 89,188 metadata updates
- Used direct connection (bypass Cloudflare 100MB limit)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
All 3 zip files (51GB each) successfully uploaded to Immich with 0 errors.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add docker-compose.yml with Immich v2 configuration
- Include all required services (server, ML, postgres, redis)
- Add .env.example with secure defaults
- Create comprehensive README with setup instructions
- Add backup and health check scripts
- Configure .gitignore for data directories
Deployed and tested on Netcup VPS at photos.jeffemmett.com
Generated with Claude Code (https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>