Skip to content

WABS - v1.0.0-beta.8

Choose a tag to compare

@wizwin wizwin released this 13 Jun 21:23
· 65 commits to main since this release

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 Doe or object: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 float32 byte arrays, reducing backup file size by ~72%.
  • Memory-Safe Frontend Downloads: Replaced browser data-URIs with native Blob and 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_sensitivity is set to high (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 FileIndex model 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_DOWN state monitoring to instantly terminate loops on application exit.
  • Background AI Race Condition Fix: Prevented a KeyError crash in EXEMPLAR_CACHE invalidation and added gracefully handled 404 warnings 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_logging preference.
  • Untagged Media Count Fix: Solved a SQL query bug where NULL evaluations returned near-zero counts for untagged photos.
  • Tags Export NameError: Fixed a NameError crash inside /system/export-tags by adding the missing load_config import.
  • 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