Skip to content

RapidReady v0.6.1

Choose a tag to compare

@on370 on370 released this 06 Nov 15:57
· 8 commits to main since this release

RapidReady v0.6.1: Loupe Deletion Hotfix, Non-Blocking macOS Trash, Fail-Safe Error Recovery, and Navigation Ergonomics

RapidReady 0.6.1 is an immediate maintenance and stability release following the major 0.6.0 milestone. It resolves a critical macOS black-screen/freeze issue during Loupe View deletion, introduces lightning-fast non-blocking trash deletion via Cocoa's native NSFileManager, adds a fail-safe React error boundary to eliminate app unmounts, refines keyboard navigation ergonomics by locking folder tree scrolling, and hardens post-import scan and badge state.

Key Achievements

  • Fast non-blocking asynchronous trash deletion on macOS via native NSFileManager without AppleScript Finder freezes.
  • Comprehensive companion sidecar deletion removing both .rrdata and .xmp files when deleting photos.
  • Fail-safe React <AppErrorBoundary> preventing black-screen crashes with instant 1-click diagnostic interface recovery.
  • Bulletproof Loupe View deletion stability eliminating TypeError: undefined preloader crashes via safe index clamping.
  • Derived safeActiveIndex and dynamic forward index shifts preventing selection drift during batch deletion.
  • Navigation key scroll lock (↑, ↓, ←, →) preventing unintended browser default scrolling on the folder tree.
  • File-watcher ghost event suppression for .rrdata/.xmp sidecars and hidden system file filtering.
  • Universal Adobe XMP (.xmp) sidecar engine with non-destructive read-modify-write and 3 configurable sync modes (v0.6.0).
  • Conflict resolution via filesystem modification timestamps (mtime) as Single Source of Truth (SSoT) (v0.6.0).
  • Dual XMP naming convention support: Adobe Standard STD and darktable DT with companion JPEG collision protection (v0.6.0).
  • Native bidirectional compatibility for darktable color labels and hierarchical tags (v0.6.0).
  • Configurable external RAW developer launcher (R / Shift+R) supporting RapidRAW, darktable, Lightroom Classic, System Default, or Custom Applications (v0.6.0).
  • Zero-I/O lazy on-demand import duplicate detection recognizing pre-existing archive files during SD card scanning (v0.6.0).
  • Full rendering and EXIF metadata extraction for reverse-layout Capture One DNGs lacking embedded JPEGs (v0.6.0).
  • Archive catalog deletion reconciliation eliminating ghost directories in folder trees upon sync (v0.6.0).

Fast Non-Blocking macOS Trash Deletion & Sidecar Cleanup

  • Native NSFileManager Integration (system_cmds.rs): Replaced synchronous AppleScript Finder events (DeleteMethod::Finder) with Cocoa's NSFileManager.trashItemAtURL (DeleteMethod::NsFileManager). Bypasses /usr/bin/osascript sub-process overhead, executing batch deletions in milliseconds.
  • Tokio Thread Protection: All heavy filesystem and SQLite catalog pruning tasks run inside tauri::async_runtime::spawn_blocking, ensuring Tokio worker threads remain entirely free to serve rr-image:// tile requests and UI events.
  • Complete Sidecar Purging: When photos are deleted, RapidReady now automatically locates and removes both .rrdata (get_sidecar_path) and .xmp (find_existing_xmp_path) companion files from disk.

Fail-Safe React Error Recovery (<AppErrorBoundary>)

  • App-Wide Error Protection: Added <AppErrorBoundary> wrapping <App /> in main.tsx and <LoupeViewer /> in LibraryCenter.tsx.
  • Diagnostic Error Card: If an unhandled DOM or lifecycle error occurs, the window never turns black. Instead, it surfaces a dark diagnostic card with the exact error message and component stack trace.
  • One-Click Recovery: Includes an „Oberfläche wiederherstellen“ button that switches view mode safely back to Grid, clears selections, and restores the UI without restarting the application.

Loupe View Deletion Stability & Safe Index Synchronization

  • Preloader Null-Check & Clamping: Eliminated TypeError: undefined is not an object (evaluating 'i[s-1].path') in LoupeViewer.tsx by clamping index lookups (idx0 = Math.min(activeImageIndex, displayedImages.length - 1)) and verifying element existence across all lookahead and buffer lookups.
  • Derived safeActiveIndex: Introduced an always-valid derived index in LibraryCenter.tsx (Math.min(Math.max(activeImageIndex, 0), displayedImages.length - 1)) passed synchronously to LibraryGrid, LoupeViewer, FullscreenViewer, and keyboard shortcuts.
  • Dynamic Forward Shift: Updated removeImages in libraryStore.ts to shift activeImageIndex forward by the exact number of deleted preceding images (deletedBeforeActive), allowing the selection safeguard to smoothly track the next surviving photo.
  • Immediate Grid Fallback: If all images in the active view or last import are deleted, RapidReady immediately returns to the Grid View (setViewMode('grid')).

Folder Tree & Keyboard Navigation Ergonomics

  • Scroll Lock via e.preventDefault(): Added e.preventDefault() across all navigation shortcut branches (↑, ↓, ←, →, J, K) in useLibraryShortcuts.ts. Prevents the browser from defaulting to scrolling the folder tree sidebar if it was previously focused.
  • Calm Tree View: Removed disruptive scrollIntoView auto-scrolling from TreeView in LibraryLeftSidebar.tsx during photo navigation, keeping the sidebar tree stable while retaining visual camera indicators and auto-expand branch logic.

File Watcher Ghost Event Suppression & Post-Import Hardening

  • Existence Verification: In archive_cmds.rs, file-watcher events for .rrdata and .xmp verify that both the sidecar (p.exists()) and image file (img_path.exists()) exist before dispatching sidecar-updated events, preventing phantom updates during rapid deletions.
  • System File Filtering: Watcher ignores .DS_Store and AppleDouble ._* files, and requires deleted files to lack extensions before recording them as removed_dirs, preventing non-archive files from triggering directory deletion.
  • Accurate Source Badges: Only displays the removable media badge (isRemovableSource) when the import source directory strictly matches a detected drive root.
  • Post-Import Navigation: Switching to the library or collections after import guarantees scanState: 'idle' and isLoading: false.

Universal Adobe XMP (.xmp) & RapidRAW (.rrdata) Architecture

  • Non-Destructive Read-Modify-Write: Atomically updates ratings, picks, rejects, color labels, tags, GPS coordinates, and orientations via temporary file replacement (.tmp → rename). Preserves all foreign XML tags, attributes, and development blocks (such as Lightroom crs:* parameters, darktable history stacks, and RapidRAW adjustments).
  • Three Configurable Sidecar Modes:
    • RapidRAW Native (.rrdata) (Default): Writes native .rrdata with automatic fallback to .xmp if only an XMP exists.
    • Dual-Sync (.rrdata + .xmp) (Hybrid): Writes changes synchronously to both formats for friction-free switching between RapidRAW, Lightroom, and darktable.
    • Standard XMP (.xmp): Writes directly to .xmp (updating existing .rrdata if present) with read fallback to .rrdata.
  • Filesystem mtime SSoT Resolution: When both .rrdata and .xmp exist for an image, RapidReady automatically resolves conflicts in favor of the file with the most recent modification timestamp (mtime).
  • Dual XMP Naming Conventions: Choose between Adobe Standard STD (<stem>.xmp, e.g. DSC001.xmp) and darktable DT (<file>.<ext>.xmp, e.g. DSC001.ARW.xmp), with automatic per-extension naming whenever companion JPEGs exist.
  • Inspector Sidecar Badges: Compact header indicators ([ .rrdata ], [ .xmp ], [ .rrdata · .xmp ]) with interactive tooltips clarifying the authoritative SSoT source based on mtime.
  • NAS-Safe Bulk Sidecar Sync: On-demand synchronization tool in Settings to reconcile existing archives (20k+ files) between .rrdata and .xmp with a live progress bar and pause/resume/cancel controls (ScanController).

Configurable External RAW Developer Launcher

  • Target Application Selector: Choose between RapidRAW (Default), darktable, Adobe Lightroom Classic, System Default, or a Custom Application (.app on macOS, .exe on Windows).
  • Dynamic UI Labels & Shortcuts: Context menus, toolbar popovers, import completion buttons, and shortcut references dynamically display the target app name and key combination (e.g. „In darktable öffnen (Shift+R)“ vs. „In RapidRAW öffnen (R)“).
  • Truncate & Layout Protection: 5-column button grid in Settings with hover tooltips and dynamic explanation text. All UI labels and shortcut badges use text truncation and flex protection (min-w-0 truncate + shrink-0) to ensure long custom application names never obscure shortcut badges.
  • Dedicated In-App Help Chapter (HelpRawDevelopers.tsx): Comprehensive guide in the Help modal covering end-to-end integration, recommended sidecar modes per tool, darktable library.db XMP refresh tips, and guidance on darktable's default 1-star import behavior.

Lazy On-Demand Import Duplicate Detection

  • Zero-I/O Archive Duplicate Detection: Photos already existing in a photo archive (e.g. imported prior to RapidReady) are automatically recognized as already_imported = true when scanning an SD card or source directory.
  • 100% CTSP Compliance: Eliminates background disk hashing during library browsing. During source scanning, pre-filters files by exact byte size and lazily computes 64 KB head hashes only for matching candidates, caching results permanently in import_index.db.
  • Special thanks to community contributor @DanieGu for suggesting the import duplicate detection backfill mechanism!

Capture One & Reverse-Layout DNG Support

  • Reverse TIFF Layout Support: Added decoding for DNG files where IFD0 sits near the end of the file (e.g. exported from Capture One 23 Windows from Sony ILCE-6700).
  • ImageIO RAW Fallback: Enabled Apple ImageIO RAW decoding fallback for uncompressed sensor CFA files lacking embedded JPEGs.
  • Letterbox Border Filtering: Filtered transparent letterbox borders in thumb_rs to prevent false 404 preview errors.

Archive Deletion Reconciliation

  • Ghost Directory Cleanup: Added removed_dirs tracking to ArchiveDeltaResult and reconcile_directory_files.
  • Automatically identifies and purges externally deleted folders and orphaned photos upon folder refresh or archive delta sync, eliminating ghost folders in the directory tree.

Download & Installation

macOS (Apple Silicon & Intel)

  1. Download RapidReady_0.6.1_universal.dmg.
  2. Open the .dmg and drag RapidReady into your Applications folder.
  3. First Launch Note: If macOS Gatekeeper shows a warning because RapidReady is an open-source project without a paid developer certificate, run this command once in Terminal:
    xattr -cr /Applications/RapidReady.app
    (Or right-click RapidReady.app in Applications and select Open).

Windows (x64)

  1. Download RapidReady_0.6.1_x64-setup.exe.
  2. Run the installer (no administrator privileges required).
  3. SmartScreen Note: Click More info and then Run anyway if prompted by Windows SmartScreen.