This point release repairs SQLite databases. SQLite is the database of the unified Docker image and of the standalone Windows build, so if you run either of them, please upgrade. PostgreSQL installs are not affected by the repair.
Before you upgrade (SQLite only): two one-time migrations rebuild some tables. They copy each table before dropping the old one, so make sure you have free disk space of roughly the size of your database. On a test library with 1.6 million album entries and 160,000 faces they took about 30 seconds, and the database file grew by about 650 MB; SQLite reuses that space for later writes, and VACUUM hands it back to the file system. If your library already had photos when you upgraded past the switch to UUID photo IDs in early 2026, run "Rescan All Photos" (Settings, Library) after upgrading so camera, lens, and image size details are read from your files again (see below).
Upstream:
🚀 LibrePhotos: SQLite Databases Repaired
When photos moved from content hashes to UUID primary keys in early 2026, the SQLite version of that migration stored every existing photo's new ID with dashes, while Django stores and looks up UUIDs on SQLite without them. Those photos kept showing up in lists, but anything that looks a photo up by its ID missed them: their faces, thumbnails, captions, and metadata were not found, adding one to a new album left the album empty, and tagging or sharing one failed with "FOREIGN KEY constraint failed". The same migration also rebuilt twelve tables (album contents, faces, thumbnails, captions, search, files, and sharing) without their foreign keys and other constraints, on every SQLite install, fresh ones included. This release rewrites the stored IDs into the form Django reads, removes entries that pointed at photos, albums, or people that no longer exist, and rebuilds those tables with their foreign keys, so SQLite now enforces what PostgreSQL always did (#2121).
On the affected installs, the migration that moved camera, lens, and image size details into their own table also skipped the old photos, and the old columns were removed after it. "Rescan All Photos" reads those details from your files again.
- 🔨 LibrePhotos: The standalone Windows build pins
lazy_loader0.5, which Nuitka needs to compile scikit-image; 0.6 broke the build (#2120) - 🔨 Docs: The landing page links the standalone Windows download (#2119)
Full changelog: 1.2.0...1.2.1
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