WABS - v1.0.0-beta.8
WABS v1.0.0-beta.8 Release Notes
WABS v1.0.0-beta.8 introduces major architectural improvements, randomized auto-pick cover selection, instant indexer start/stop performance optimizations, in-memory face exemplar curation with chronological and scale diversity, standardized comma-separated tag delimiters, DNG RAW photo support, graceful background task shutdown, fast JPEG scale-on-decode, multi-scale face detection fusion, smart offline drive cleanup protection, and modular frontend/backend routing.
What's New in v1.0.0-beta.8
🚀 Major Features & Architectural Enhancements
- Randomized Auto-Pick Cover: Refactored the "Auto-Pick Cover" feature to dynamically select random photos from the top candidate covers (within 50% of the best score, up to 5 candidates). It excludes the current cover photo (if others exist) to rotate covers and prevent getting stuck on the same image.
- Indexer Start/Stop & Lazy Preloading: Added stop/shutdown checks inside directory walking (
os.walk) loops in both the main indexer and unified scanners. Replaced full table metadata preloading on startup with dynamic chunked lazy preloading (1,000 files at a time) during runs. Bypasses completion delays on manual stop, making start/stop instant even on massive databases. - Smart Cleanup Safety Filter: Protects configured backup paths that are currently offline (e.g. unplugged external USB drives or network shares) from being accidentally purged during database cleanup operations. Compares directories using a drive-letter-invariant matching method.
- Standardized Tag Delimiter: Standardized all database file tags to be comma-separated
,instead of space-separated, enabling correct indexing, display, and search for multi-word tags (e.g.,person:John Doeorobject:cell phone). Implemented robust synchronization and backward compatibility in parsing. - DNG RAW Photo Support: Added full raw DNG photo indexing, face/object scanning, and browser-compatible JPEG preview rendering fallbacks.
- Modular Codebase: Refactored the monolithic backend (
main.py) and frontend (App.jsx) into clean, modular routes, pages, hooks, and helpers. - Unified Document Scanning Depth: User-configurable scanning depth (
low,medium,high) dynamically scales limits across PDF, Word, Excel, PowerPoint, and plain-text files. - Memory-Optimized Hybrid Document Scanning: Tokenizes text within configured limits and switches to regex matching for strong identifiers (emails, URLs, hashtags) beyond limits using 128KB chunks and a 1,000-identifier early breakout.
- Global Background Task Indicator: Added a persistent, globally visible pulsing LED indicator to the bottom-left of the application. It dynamically changes colors and text to track active background tasks (face scanning, clustering, file indexing, purging) across all pages.
- Context-Preserving Capping: Limits unique boosted identifiers (top 50 strong entities, top 100 proper nouns) to prevent log files or link directories from crowding out core context keywords.
- High-Efficiency Face Export & Import: Serializes 128D embeddings as compact Base64
float32byte arrays, reducing backup file size by ~72%. - Memory-Safe Frontend Downloads: Replaced browser data-URIs with native
Bloband object URL streams to prevent browser freezes when exporting large databases.
⚡ Performance & Caching
- Fast JPEG Scale-on-Decode: Integrates header-only dimension reads (via Pillow) and leverages OpenCV's native scale-on-decode capabilities (
cv2.IMREAD_REDUCED_COLOR_*) to decode large images at 1/2 or 1/4 size directly, reducing image load times by 5x-10x. - Multi-Scale Face Detection Fusion: Runs two concurrent detection passes when
face_sensitivityis set tohigh(1024px for small/distant background faces, and 320px for large foreground close-ups) and fuses overlapping boxes using Non-Maximum Suppression (NMS) to capture both background and foreground faces accurately. - Dynamic Chronological & Size Curation: Implemented a central curation helper (
get_or_create_exemplars) that curates up to 15 exemplars. For profiles > 15 faces, it samples 50 timeline-distributed files, filters out the bottom 25% blurriest using Laplacian variance, and selects the oldest, newest, middle, smallest, and largest faces before backfilling. Includes a 0ms SQL bypass for small profiles (<= 15 faces). - In-Memory Caching on Import: Caches full SQLAlchemy
FileIndexmodel objects by path during import, eliminating redundant database queries.
🐞 Bug Fixes & Refinements
- Scanner Graceful Shutdown: Spawns scanner threads as daemon threads and integrates
APP_SHUTTING_DOWNstate monitoring to instantly terminate loops on application exit. - Background AI Race Condition Fix: Prevented a
KeyErrorcrash inEXEMPLAR_CACHEinvalidation and added gracefully handled404warnings when the UI attempts to interact with profiles actively being merged or deleted by background clustering. - Persistent Cover Photo Cache Busting: Fixed aggressive browser caching preventing UI updates after changing a profile's cover photo by injecting dynamic
?v=fingerprints into thumbnail URLs. - UI State Preservation: Prevented AI bulk operations menus from collapsing when navigating away from and returning to the People page while tasks are running.
- Manual Tagging Logs: Added logging coverage for manual tagging/untagging operations under the backend
enable_loggingpreference. - Untagged Media Count Fix: Solved a SQL query bug where NULL evaluations returned near-zero counts for untagged photos.
- Tags Export NameError: Fixed a
NameErrorcrash inside/system/export-tagsby adding the missingload_configimport. - Transaction Safe Imports: Wrapped the import routines in database transactions to roll back sessions on failure.
Full Changelog: v1.0.0-beta.7...v1.0.0-beta.8