---
slug: 2026w25
title: "Development: April - June 2026"
authors: [niaz]
tags: [release]
---

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](https://github.com/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](https://github.com/dashitongzhi))

- ✨ LibrePhotos: The search API can now filter results by media type, returning only photos or only videos (Implemented by [dotanm](https://github.com/dotanm))
- ✨ LibrePhotos: Re-adopt files that reappear after being flagged as missing (Implemented by [dotanm](https://github.com/dotanm))
- ✨ LibrePhotos: Bump geocode timeout to 10s and rate-limit reverse geocoding per provider (Implemented by [dotanm](https://github.com/dotanm))
- ✨ LibrePhotos: Add timeouts to sidecar HTTP calls so background jobs can't wedge forever (Implemented by [dotanm](https://github.com/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](https://github.com/dotanm))
- ✨ LibrePhotos: Collapse the AlbumThing photo-count refresh into a single sweep for faster missing-photo deletion (Implemented by [dotanm](https://github.com/dotanm))
- ✨ LibrePhotos: Finish migrating the map provider off the retired Photon service
- ✨ Frontend: Select All now works for the Download action (Implemented by [dotanm](https://github.com/dotanm))
- ✨ Frontend: Clearer scan feedback — the scan button is guarded when no scan directory is set, plus a worker activity indicator (Implemented by [dotanm](https://github.com/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](https://github.com/LibrePhotos/librephotos/issues/873)) (Implemented by [dotanm](https://github.com/dotanm))
- 🔨 LibrePhotos: Keep zero-valued GPS, rating and burst-index values in metadata instead of dropping them as falsy (Implemented by [dotanm](https://github.com/dotanm))
- 🔨 LibrePhotos: Fix `median_value` crash on even counts and off-by-one on odd counts (Implemented by [dotanm](https://github.com/dotanm))
- 🔨 LibrePhotos: Guard album-date geolocation against missing or short place data ([#1268](https://github.com/LibrePhotos/librephotos/issues/1268)) (Implemented by [dotanm](https://github.com/dotanm))
- 🔨 LibrePhotos: Run delete-missing-photos asynchronously and fix its correctness ([#1405](https://github.com/LibrePhotos/librephotos/issues/1405)) (Implemented by [dotanm](https://github.com/dotanm))
- 🔨 LibrePhotos: Deduplicate AlbumThing cover photos (Implemented by [dotanm](https://github.com/dotanm))
- 🔨 LibrePhotos: Pad short returns from metadata extraction (Implemented by [dotanm](https://github.com/dotanm))
- 🔨 Docs: Document non-destructive photo rotation in the lightbox
- 🔒 LibrePhotos: Security — fix SSRF in Nextcloud server address validation (CWE-918) ([#1863](https://github.com/LibrePhotos/librephotos/pull/1863)) (Implemented by [alanturing881](https://github.com/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](https://www.youtube.com/channel/UCZJ2pk2BPKxwbuCV9LWDR0w)**

---

**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](https://github.com/sponsors/derneuere)** or via **[PayPal](https://www.paypal.com/donate/?hosted_button_id=5JWVM2UR4LM96)**
