---
slug: 2026w09
title: "Development: 2025 - November to February"
authors: [niaz]
tags: [release]
---

This is a big one! A lot has changed since the last release. Here is an overview of all the new features, improvements and bug fixes.

**Upstream:**

🚀 LibrePhotos: Photo Stacks & File Variants

Inspired by PhotoPrism, RAW+JPEG pairs and Live Photos are now treated as a single photo entity with multiple file variants, instead of creating separate entries. The scanner now uses a two-phase architecture: first grouping files by directory and basename, then processing each group together. A new repair job automatically merges any previously ungrouped file variants after each scan. This comes with a completely new UI for viewing and managing stacks, file variants in the lightbox sidebar, RAW badge overlays, and a unified organizing page for stacks and duplicates.

🚀 LibrePhotos: Duplicate Detection

A brand-new duplicate detection system using perceptual hashing! It detects exact copies via hash comparison and visual duplicates using a memory-efficient two-pass algorithm that works well even with very large collections. The API supports a batch_size parameter to fine-tune performance for your hardware.

🚀 LibrePhotos: Photo UUID Primary Key & Structured Metadata

The Photo model's primary key has been changed from image_hash to UUID, which is a massive internal refactor touching models, APIs, serializers, background tasks, and tests. Alongside this, a new structured PhotoMetadata model with edit history has been added, enabling richer metadata management.

🚀 Frontend: Public Album Sharing Options

Public album sharing now supports fine-grained per-album settings. You can control the visibility of location, camera info, timestamps, captions, and faces for each shared album. Default sharing preferences can be configured in user settings, and individual albums can override them.

🚀 Frontend: Slideshow Mode

A new slideshow mode has been added to the lightbox with a configurable slide interval. Sit back and enjoy your photos!

🚀 Frontend: Explore Page

The navigation dropdown has been replaced with a dedicated explore page, giving you a much better overview of your albums, people, places, things and events at a glance.

🚀 Frontend: Redesigned Album & Statistics Pages

The album page and all statistics/data visualization pages (face clusters, social graph, word clouds, timeline, place tree) have been completely redesigned with a fresh new look.

🚀 Frontend: Spotlight Search

A new spotlight search powered by Mantine replaces the old search bar, providing a faster and more intuitive search experience with keyboard navigation.

🚀 Frontend: Select All

You can now select all photos in a view for bulk operations like deleting, sharing, or adding to albums.

- ✨ LibrePhotos: Switch from Photon to Nominatim as default reverse geocoding provider
- ✨ LibrePhotos: New endpoint for getting all albums for a photo
- ✨ LibrePhotos: Improved scan error handling and stack detection
- ✨ LibrePhotos: Split directory_watcher into a well-structured package with two-phase scan
- ✨ LibrePhotos: Social graph error logging improvements
- ✨ LibrePhotos: ARM CPU instruction set detection refactored and fixed
- ✨ LibrePhotos: Add SQLite support for UUID primary key migration
- ✨ Frontend: Fullscreen mode in lightbox
- ✨ Frontend: Switched to MapLibre GL with PhotoPrism tile server for all map views
- ✨ Frontend: Improved UX for setting photo location with geocode search
- ✨ Frontend: Improved UX for albums with cover picker and better album list view
- ✨ Frontend: New languages added to the UI
- ✨ Frontend: Improved first time setup experience and default empty state messages
- ✨ Frontend: File variants UI in photo details sidebar
- ✨ Frontend: Metadata section component in lightbox
- ✨ Frontend: Download options now include stacked/variant photos
- ✨ Frontend: Improved scrolling behavior
- ✨ Frontend: Extract inline styles into CSS modules (Implemented by [sickelap](https://github.com/sickelap))
- ✨ Frontend: Replaced airbnb ESLint config with eslint:recommended + prettier; removed unused dependencies (react-spring, react-vis, react-d3-graph)
- ✨ Frontend: Major dependency updates (jwt-decode v4, i18next v25, react-i18next v15, @tabler/icons-react v3, react-cookie v7, and more)
- ✨ Frontend: Replaced ReactPlayer with native video element for better video playback
- ✨ Docker: Remove SQLite data dir creation from entrypoint
- 🔨 LibrePhotos: Fix scan progress stuck below 100% when files are skipped or invalid (Implemented by [Nikoh77](https://github.com/Nikoh77))
- 🔨 LibrePhotos: Fix scan job not being marked as finished when no files need processing (Implemented by [Nikoh77](https://github.com/Nikoh77))
- 🔨 LibrePhotos: Fix bugs when not having any data
- 🔨 LibrePhotos: Fix big thumbnail content type for proxied responses ([#1271](https://github.com/LibrePhotos/librephotos/issues/1271))
- 🔨 LibrePhotos: Fix social graph SQL query to work with UUID primary key
- 🔨 LibrePhotos: Fix UnboundLocalError in face extraction from dlib
- 🔨 LibrePhotos: Fix pagination crash with negative page_size
- 🔨 Frontend: Fix video playback issues in lightbox
- 🔨 Frontend: Fix photo list flickering
- 🔨 Frontend: Fix server stats parsing for CPU info fields
- 🔨 Frontend: Fix upload issues with sequential file uploads and query invalidation
- 🔨 Frontend: Fix number of deleted images when selecting all
- 🔨 Frontend: Fix face dashboard issues and face mutation hooks
- 🔨 Frontend: Fix issues with shared by me albums view
- 🔨 Frontend: Fix memory hog issue
- 🔨 Frontend: Fix login popup messages
- ✨ Frontend: Fix ESLint errors (Implemented by [sickelap](https://github.com/sickelap))
- ✨ LibrePhotos: Updated dependencies and updated language strings from the community

---

If you are interested on 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 **3** awesome people!

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)**
