This is a big milestone release — LibrePhotos has moved to a monorepo! Here is an overview of all the new features, improvements, and bug fixes since the last release.
Upstream:
🚀 Monorepo: One Repository for Everything
The backend, frontend, mobile app, documentation, and Docker deployment now all live in a single repository at LibrePhotos/librephotos, with the full git history of each project preserved. The code is organised under apps/backend, apps/frontend, apps/mobile, apps/docs, and deploy/. This comes with a unified set of GitHub Actions workflows, Dockerfiles and compose files rewritten for the new build context, a single Renovate configuration, and a fresh root README and contribution guide. One place to file issues, one place to open pull requests.
🚀 LibrePhotos: New Face Recognition Engine (InsightFace / ArcFace)
Face recognition has been migrated from dlib to an InsightFace / ArcFace stack running on ONNX Runtime. The new engine produces 512-dimensional ArcFace embeddings (up from the old 128-dim dlib encodings) for more accurate face matching, ships onnxruntime-gpu in the backend-gpu image for GPU-capable setups, and lets you choose the face recognition model from Site Settings (buffalo_sc by default). A migration clears the old 128-dim encodings and stale clusters — just re-run a face scan to regenerate them with the new model. The rollout also includes a batch of robustness fixes: RGBA→RGB conversion before recognition, proper JSON error responses from the face service, and several clustering and encoding fixes.
🚀 Frontend: Subdirectory Deployment Support
LibrePhotos can now be hosted under a subpath (e.g. https://example.com/photos/) thanks to new PUBLIC_URL support in the frontend build. (Implemented by dashitongzhi)
- ✨ LibrePhotos: The search API can now filter results by media type, returning only photos or only videos (Implemented by dotanm)
- ✨ LibrePhotos: Re-adopt files that reappear after being flagged as missing (Implemented by dotanm)
- ✨ LibrePhotos: Bump geocode timeout to 10s and rate-limit reverse geocoding per provider (Implemented by dotanm)
- ✨ LibrePhotos: Add timeouts to sidecar HTTP calls so background jobs can't wedge forever (Implemented by dotanm)
- ✨ LibrePhotos: Only mark a job as failed once its error rate crosses a threshold, so transient errors no longer fail the whole job (Implemented by dotanm)
- ✨ LibrePhotos: Collapse the AlbumThing photo-count refresh into a single sweep for faster missing-photo deletion (Implemented by dotanm)
- ✨ LibrePhotos: Finish migrating the map provider off the retired Photon service
- ✨ Frontend: Select All now works for the Download action (Implemented by dotanm)
- ✨ Frontend: Clearer scan feedback — the scan button is guarded when no scan directory is set, plus a worker activity indicator (Implemented by dotanm)
- ✨ Backend: Python 3.14, Django 5.x, ExifTool 13.57 and dependency updates; ruff formatting adopted across the backend
- 🔨 LibrePhotos: Keep emptying the trash when a single photo fails to delete (#873) (Implemented by dotanm)
- 🔨 LibrePhotos: Keep zero-valued GPS, rating and burst-index values in metadata instead of dropping them as falsy (Implemented by dotanm)
- 🔨 LibrePhotos: Fix
median_valuecrash on even counts and off-by-one on odd counts (Implemented by dotanm) - 🔨 LibrePhotos: Guard album-date geolocation against missing or short place data (#1268) (Implemented by dotanm)
- 🔨 LibrePhotos: Run delete-missing-photos asynchronously and fix its correctness (#1405) (Implemented by dotanm)
- 🔨 LibrePhotos: Deduplicate AlbumThing cover photos (Implemented by dotanm)
- 🔨 LibrePhotos: Pad short returns from metadata extraction (Implemented by dotanm)
- 🔨 Docs: Document non-destructive photo rotation in the lightbox
- 🔒 LibrePhotos: Security — fix SSRF in Nextcloud server address validation (CWE-918) (#1863) (Implemented by alanturing881)
- 🔒 LibrePhotos: Security — pytest updated to v9.0.3 and a Django security update applied
- ✨ LibrePhotos: Updated dependencies and updated language strings from the community
If you are interested in how I develop this application, you can watch me develop features live on my channel
Sponsoring development:
My work is sponsored by 1 awesome person!
If you like the work I do, then you can support me via GitHub sponsors or via PayPal