All notable changes to Local Lens will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- LocalLens AI Agent: LocalLens now talks to Claude Desktop, so you can organize your photos by asking in plain English — sort by who's in them, pull every shot from a place and year, find duplicates, or set a folder to sort itself. Nothing uploads: the agent runs on your machine and only ever reaches LocalLens at 127.0.0.1. Set it up from the bell icon, or from the panel on first launch.
- Privacy panel: a new "what we store" view lists every file LocalLens keeps on your machine and what (if anything) ever leaves it, with one-click buttons to erase the photo index or your AI profile.
- Every Pro feature is unlocked for everyone while the agent is in free preview — install now and it stays free for you.
- Face recognition accuracy: enrollment and sorting used to process photos differently, which could silently file photos of enrolled people under "Unknown Faces." Both now share one pipeline and detect sideways or tilted photos — People sorts are also considerably faster, running in parallel with results cached across re-sorts.
- Ignored subfolders: a subfolder marked "ignore" was not fully excluded if it contained its own subfolders — nested content could still be scanned and sorted. Ignored folders are now excluded completely, contents included.
- Permanent deletions: duplicate-photo deletion always permanently removed files — the code to send them to the Trash/Recycle Bin instead already existed but the required package was never bundled. It's now included, so deletions are safe by default.
- People sorts on macOS now share disk blocks between copies of the same photo instead of duplicating it for every matched person, freeing up real space on nearly-full drives.
- Enrollment now accepts every photo format LocalLens can already sort (HEIC, RAW, etc.), not just JPG/PNG.
- The scheduler dashboard's Start/Stop/Restart controls are disabled for now — manage the background scheduler from the LocalLens Agent tray app instead. This also fixes duplicate backend processes piling up over time.
- Windows Console Bug: Fixed PyInstaller one-file spec configuration setting
console=False. This eliminates the visible console window when starting the backend server on Windows, and prevents the backend from dying when the terminal is closed.
- MCP Backend Discovery: On first launch, Local Lens now writes
install_info.jsonto the platform app-data directory (~/Library/Application Support/LocalLens/on macOS,%APPDATA%\LocalLens\on Windows). This lets companion tools such as the LocalLens MCP agent tray app locate and start thebackend_serversidecar directly — without a Python environment or hardcoded install paths. - MCP Agent Groundwork (Internal): Scaffolded a standalone MCP server inside
locallens_mcp_agent/to enable future local chat tooling. Added/api/statsdiagnostics endpoint and port-file export toAPP_DATA_DIR/port.txtfor local tool clients.
- Critical Data Loss: Fixed cross-drive MOVE permanently deleting ignored subfolders. When a MOVE was performed across different drives with a non-empty ignore list, ignored folders were correctly skipped during the copy but then destroyed by a blanket
shutil.rmtree()when the source was removed — bypassing the Recycle Bin with no undo. The deletion is now ignore-aware and only removes what was actually copied. - Fixed silent fallthrough bug where sort method names sent in lowercase by the frontend (e.g.
location,people) did not match the expected title-case values, causing files to be sorted by the default method instead of the one selected.
- Fixed critical backend crash on macOS Apple Silicon (M-series) caused by
numpydependency incompatibility. - Resolved Tauri auto-updater code signing failures during the build process.
- Hardened PyInstaller build spec to properly bundle native C-extensions.
- Added background backend smoke tests in CI/CD pipeline to verify build integrity prior to packaging.
- Homebrew Cask Support: macOS users can now install via
brew install ashesbloom/locallens/local-lens- Homebrew automatically handles Gatekeeper - no manual steps needed
- Auto-generated cask formula included in each release
- macOS Gatekeeper Fix Script:
Fix_Local_Lens.commandincluded in releases- Double-click to automatically remove quarantine, apply ad-hoc signature, and set permissions
- Supports both
/Applicationsand~/Applicationsinstall locations
- Improved release notes with clear macOS installation instructions
- Updated README with Quick Install section for all platforms
- Release workflow now generates Homebrew cask formula automatically
- Enhanced macOS installation documentation with multiple fix options
- Fixed macOS "App is damaged" error by providing proper workarounds
- Fixed path escaping issues in terminal commands (use quotes instead of backslashes)
- macOS Support (Apple Silicon): Full native support for M1/M2/M3 Macs
- DMG installer for easy installation
- Auto-updater support for macOS
- Cross-Platform GitHub Actions: Automated CI/CD builds for both Windows and macOS
- Custom save preset modal dialog (replaces browser prompt that didn't work on macOS)
- Health check endpoint for reliable backend startup detection
- macOS Build Architecture:
- PyInstaller now uses one-folder mode on macOS for faster startup (avoids extracting 140MB on every launch)
- Smart wrapper script detects development vs production environment
- Backend bundle stored in app Resources folder
- RAW image processing now uses ImageMagick (Wand) on macOS/Linux instead of rawpy
- Improved backend startup with retry logic and health checks
- Updated Tauri configuration for cross-platform resource handling
- Fixed "With Others" folder incorrectly created when photos only contained unknown faces
- Fixed face enrollment not loading on app startup
- Fixed save preset dialog not appearing on macOS (Tauri doesn't support browser
prompt()) - Fixed multiprocessing freeze issue in PyInstaller builds (added
freeze_support()) - Fixed sidecar executable not found in macOS .app bundle
- Python 3.11 required (dlib compatibility)
- macOS users: First launch requires right-click → Open to bypass Gatekeeper
- Windows build process unchanged - existing installations will auto-update normally
- Tutorial and walkthrough for new users.
- Support for more RAW image formats on macOS and Linux via ImageMagick.
- Dynamic logic in the build process to handle backend executables for different OS and architectures.
- Replaced deprecated
pkg_resourceswithsetuptools<81forface_recognition_models.
- Critical bug with 'Find and Group' dialog not showing correct information.
- App crash when selecting a preset with a missing folder path.
- Delete button for saved presets in the preset manager
- Fixed crash when selecting a preset with deleted/missing folder paths (now shows error dialog)
- Fixed 'Find & Group' result dialog showing incorrect information after operation completion
- 'Find & Group' mode now always copies files (removed Copy/Move toggle to prevent data loss)
- Fixed code signing configuration for auto-updates (regenerated keys)
- Fixed incorrect version number displayed in update notification panel
- In-app auto-update notifications with release notes display
- 'Find and Group' operation now always copies files (removed copy/move toggle to prevent confusion)
- Backend now uses consistent port instead of random port selection for reliable Tauri frontend connection
- Optimized package dependencies for better performance and reduced size
- Added detailed production build instructions to documentation
- Fixed 'Find and Group' dialog/terminal not displaying correct information after operation completion