RawCull version release notes and changelogs.
Version 1.8.9
RawCull Changelog — v1.8.5 → 1.8.9
To be updated on Apple App Store.
✋ Manual Burst Winner Override
You can now override the algorithm’s automatic burst winner and pick the keeper yourself.
- A “Set Manual Winner” button appears in the Comparison view’s burst evidence panel when reviewing a burst group. Select a frame, then click the button to save it as the winner.
- The burst group header in the culling grid now shows “Manual winner: …” instead of “Best: …” when a manual choice is active.
- The candidate badge on thumbnails changes to orange (“MANUAL”) for the manually chosen frame, and green “AUTO BEST” continues to mark what the algorithm would have picked — so you can always see both at a glance.
- A “Manual winner active” notice appears in the comparison panel when a manual override is in effect.
- Manual selections are persisted in
savedfiles.jsonalongside ratings, so they survive app restarts and catalog reloads. Stale overrides (for files that no longer exist) are pruned automatically. - When “Keep Best in Group” is run on a burst that has a manual winner, the manual selection takes precedence over the algorithm.
🔄 Burst Re-index
A new “Reanalyze Bursts” button appears in the similarity/burst grouping toolbar.
- Clicking it deletes the saved burst analysis cache for the current catalog and runs a fresh analysis from scratch — useful after changing grouping settings or when results look stale.
- The button is disabled while grouping or analysis is already in progress.
🎭 Focus Mask — On-demand Generation
The focus mask is now generated only when you actually toggle it on, instead of being computed for every image as it loads.
- This reduces idle CPU and memory usage when the focus mask overlay is not in use.
- Mask generation is properly cancelled when you toggle the overlay off mid-compute.
- The mask state resets cleanly when you navigate to a different file.
- The focus mask toggle button is now enabled as soon as the image is available (previously required the mask to already be computed before the button was active).
🔍 Zoom — Preserve Scale While Navigating
When navigating between images in the zoom view (arrow keys or navigation buttons), the zoom level is now preserved across images. Previously the view would reset to fit-to-screen on every navigation step; now only the pan offset is recentered, keeping your chosen zoom level intact.
🗂️ Culling Grid — Burst Analysis State Included in Cache Key
The burst analysis recommendation and review state (including manual winner status) are now factored into the culling grid’s layout cache key. This ensures the grid re-renders correctly whenever the burst analysis result changes, fixing a subtle stale-display issue.
🩺 RAW Diagnostics — Refactored to ViewModel
The RAW diagnostics sheet trigger (⌘I) has been refactored: presentation state is now owned by RawCullViewModel via a dedicated presentRawDiagnostics() method, rather than living as local @State in FileDetailView. This improves state management and makes the diagnostics flow easier to extend.
🐛 Bug Fixes & Internal Improvements
- Logging: Fixed incorrect logger identifiers in
RequestThumbnail— log messages previously misidentified themselves as coming fromSharedMemoryCache. - Burst cache deletion:
BurstAnalysisCachenow exposes adelete(catalog:)method used by the new re-index flow. - Burst review states: Two new
BurstReviewStatevalues —.algorithmReviewedand.manualWinnerOverride— provide finer-grained tracking of how each burst group’s decision was reached.
🧪 Tests
BurstAnalysisTests: New comprehensive test suite covering burst grouping, ranking, manual winner overrides, and re-index logic.CullingModelTests: New tests for burst winner override persistence, pruning, and catalog reset behaviour.ReviewQueueTests: New tests for the review queue builder.
Version 1.8.5
RawCull Changelog — v1.8.1 → 1.8.5
To be updated on Apple App Store.
✨ Smarter Burst Culling
RawCull now includes an intelligent burst analysis workflow to help identify the best frames in fast sequences.
- Groups visually similar burst shots automatically.
- Recommends the best frame using sharpness, subject/saliency, AF evidence, and metadata stability.
- Shows confidence levels: High, Medium, or Low.
- Adds burst evidence and caution notes so you can understand why a frame was recommended.
- Adds quick actions to Keep Best, Keep Top 2, Compare, or Undo.
🔍 Improved Burst Comparison
The comparison view now supports burst-specific review.
- Compare top burst candidates directly.
- See analysis evidence while reviewing.
- Use keyboard shortcuts for faster decisions.
- Escape returns from burst comparison back to the active burst group.
- Added keyboard controls for zoom, ratings, thumbnail source, focus mask, and focus points.
🛠 RAW Diagnostics
A new RAW diagnostics view helps troubleshoot camera-file parsing issues.
- Opens diagnostics for the selected RAW file with Command-I.
- Shows file identity, scan metadata, ImageIO details, parser traces, and embedded JPEG offsets.
- Reports Sony and Nikon AF focus parser stages with explicit error messages.
- Helps diagnose unsupported RAW layouts without relying on external tools.
📷 Better Support for Newer Sony RAW Files
RAW preview and JPEG extraction are more reliable for newer Sony ARW files.
- Improved support for ARW 6.0 / RA16-backed files such as A7V and A7R VI / ILCE-7RM6.
- Reads embedded JPEGs directly before ImageIO attempts unsupported RAW decoding.
- Detects full-size JpgFromRaw images stored in Sony SubIFD layouts.
- Uses the largest embedded JPEG for zoom/extraction when available.
- Bumped the full-size JPEG cache key to avoid stale cached results from older extraction logic.
🔎 Improved Nikon and Sony Parser Tracing
RAW parser internals are now easier to inspect and verify.
- Added diagnostic parser paths for Sony embedded JPEG locations and AF focus location.
- Added diagnostic parser paths for Nikon NEF embedded JPEG locations and AF focus location.
- Nikon AFInfo parsing now reports accepted/unsupported AFInfo versions and failed parsing stages.
- Parser location models are now Sendable-friendly for Swift 6 concurrency.
🏷 Better Thumbnail Labels
Sharpness badges are now easier to read.
- Replaced numeric-only sharpness scores with friendly labels: Sharp, Good, Check, Soft.
- Added burst recommendation badges such as BEST, BEST?, 2ND, Keeper, Top 2, and Rejected.
- Added accessibility labels and clearer help text.
⚡ Faster Repeat Analysis
Burst analysis results are now cached.
- Reopening the same catalog can reuse valid burst analysis data.
- Cached results include similarity data, sharpness scores, saliency info, burst groups, and recommendations.
- Cache validation checks catalog path, file count, file size, modification date, and analysis settings.
🧭 Zoom Overlay Improvements
The zoom overlay now better matches the current browsing mode.
- Shows sharpness and saliency badges inside the zoom overlay.
- Adds an in-overlay rating action bar.
- Adds keyboard shortcuts for ratings, zoom, JPEG/RAW source toggle, focus mask, and focus points.
- Uses horizontal navigation in grid-style views.
- Uses vertical navigation in loupe-style viewing.
- Navigation icons and help text now reflect the active direction.
📁 Safer Saved State Location
RawCull now stores saved culling state in Application Support instead of the user’s Documents folder.
savedfiles.jsonnow lives under~/Library/Application Support/RawCull/.- This keeps app state out of the user’s document workspace and avoids unnecessary document/iCloud clutter.
📤 More Reliable Copy Operations
Copy/export handling is more robust.
- Security-scoped folder access is now cleaned up reliably.
- Copy cancellation and sheet dismissal now close active rsync work properly.
- Progress callbacks now hop safely back to the main actor.
- Removed an invalid empty environment entry from rsync process setup.
🧪 Test Suite Cleanup and Coverage
The test suite was reorganized and expanded around current app behavior.
- Added tests for burst analysis.
- Added tests for culling model behavior.
- Added tests for disk cache and scan admission.
- Added tests for file sorting and EXIF formatting.
- Added more Sony MakerNote parser coverage.
- Added Nikon MakerNote parser diagnostics coverage.
- Added RAW diagnostics tests.
- Added A7R VI-style Sony embedded JPEG extraction tests.
- Added zoom overlay and comparison grid keyboard shortcut tests.
- Added thumbnail cancellation coverage.
- Removed older duplicated or obsolete verification/test documents.
Version 1.8.1
RawCull Changelog — v1.8.0 → 1.8.1
Updated on Apple App Store.
A stability and resource-hygiene release. Focus is on eliminating main-thread hangs in the zoom preview, tightening security-scoped resource lifecycles, and fixing actor-isolation gaps in the rsync copy path.
🔒 Security-Scoped Resource Lifecycle
- Catalog access is now scoped to the active catalog, not every catalog ever opened in the sidebar. Long sessions no longer accumulate stale security-scoped accesses.
- Added explicit
startSecurityScopedAccess(for:),stopSecurityScopedAccess(for:), andstopActiveSecurityScopedAccess()onRawCullViewModel. - Catalog cancellation and app shutdown both route through the same cleanup path;
deinitis now a last-resort fallback rather than the primary stop point. - Picker flow simplified — view no longer manually pairs start/stop calls.
⚡ Zoom Preview — No More Main-Thread Hangs
ZoomPreviewHandlersidecar JPG decode moved off the MainActor into aTask.detached(priority: .userInitiated).- Opening the zoom overlay on a large Sony JPEG no longer blocks the UI while ImageIO opens and decodes the file.
- Cancellation is now checked between every async step, so dismissing the overlay early stops in-flight work cleanly.
loadCGImage(from:)and the disk-cache accessor are markednonisolatedto make the off-main path explicit.
🛠️ Rsync Copy Path (ExecuteCopyFiles)
- Security-scoped URLs for source and destination are now paired with a single, idempotent
cleanup()call covering: rsync success, launch failure, user close/cancel, sheet dismissal, anddeinit. - Progress streaming callback hops to
@MainActorbefore touchingprogressContinuation, removing a latent actor-isolation race that strict concurrency would flag. - Progress continuations and streaming handler state are finished/cleared exactly once.
🧵 Catalog Loading & Cancellation
startCatalogLoad(for:)short-circuits cleanly when the active catalog already has live security-scoped access — no redundant cancel/restart cycles.cancelCatalogLoad()now also clearscurrentselectedSourceand stops active security-scoped access, preventing a new load from racing previous cleanup.
🧪 Tests
- New
RawCullViewModelSecurityScopeTestscovering start/stop pairing, re-selection no-op behavior, and cancellation cleanup. ThumbnailProvider*tests updated for the refreshed memory and cancellation surface.
🧹 Cleanup
- Removed legacy
documents/ver176.md; addeddocuments/ver181.mdcapturing the v1.8.0 review findings actually shipped in this release. - Minor follow-ups in
RawCullViewModel+Catalog,SharpnessScoringModel, and project settings.
Version 1.8.0
RawCull Changelog — v1.7.4 → 1.8.0
RawCull has received improvements to image comparison, zoom review, rating workflow, thumbnail responsiveness, cache reliability, sharpness/similarity behavior, and release/test tooling. Version 1.8.0 is submitted for update on Apple App Store.
🚀 v1.8.0
🖼️ New Comparison View
- Added a dedicated comparison view for reviewing selected images side by side.
- Supports comparing up to four selected thumbnails.
- Added keyboard navigation inside the comparison view.
- Added zoom and pan controls for closer inspection.
- Added focus mask and focus point overlays while comparing images.
- Added support for switching between thumbnail preview and extracted JPEG source.
- Added rating controls directly inside comparison mode.
🔍 Improved Zoom Review
- Improved the full-window zoom overlay experience.
- Added previous/next image navigation in zoom view.
- Added visible rating badge for the current image.
- Added keyboard shortcuts for zooming and switching image source.
- Added tests for zoom overlay navigation and behavior.
⚡ Faster and More Responsive Thumbnail Handling
- Improved cancellation of thumbnail and JPEG extraction work.
- Switching or cancelling catalogs should now feel more responsive because old ImageIO work is cancelled earlier.
- Sony and Nikon thumbnail/JPEG extraction now check for cancellation before expensive decode work.
- Improved thumbnail loader slot accounting so cancelled requests do not consume concurrency capacity.
- Added regression tests for thumbnail loader cancellation and concurrency behavior.
🎯 Sharpness and Similarity Reliability
- Similarity and burst actions now wait for in-progress sharpness scoring when needed.
- Prevents similarity/burst workflows from running before required sharpness scores are ready.
- Added test coverage for concurrent sharpness scoring behavior.
🧠 Cache and Memory Improvements
- Improved cache replacement accounting for memory and grid thumbnail caches.
- Improved test isolation around shared cache state.
- Added memory diagnostics checklist for validating large-catalog behavior.
- Improved cache-related concurrency tests.
⭐ Rating Workflow Improvements
- Added reusable rating controls and rating badge UI.
- Rating actions are now available in more review contexts, including comparison and zoom workflows.
- Ratings support reject, keeper, and 2-5 star values.
🛠️ Build and Test Tooling
- Added shared Xcode scheme.
- Added dedicated test plans:
- Smoke
- Full test suite
- Performance
- Updated Makefile test commands.
- Improved documentation for test architecture and release validation.
- Pinned Swift Package dependencies to exact versions for more predictable builds.
📷 Camera and Image Extraction Notes
- Continued improvements to Sony ARW thumbnail extraction.
- Added cancellation-aware extraction paths for Sony and Nikon raw/JPEG preview handling.
- Nikon support remains experimental.
📝 Latest Commit After v1.8.0
📚 Documentation
- Updated README release information and project description.
Version 1.7.4
RawCull Changelog — v1.7.0 → 1.7.4
Version 1.7.4 is submitted for update on Apple App Store. RawCull 1.7.0 focuses on faster zoom previews, better cache management, and more reliable culling-data saving.
✨New
- Full-size JPG disk cache. The zoom view now caches the full-resolution embedded JPEG to disk (
~/Library/Caches/no.blogspot.RawCull/FullsizeJPGs/), so re-opening a previously zoomed photo is instant instead of re-extracting from the ARW. - “Cache JPGs” button in the catalog sidebar lets you pre-warm the full-size JPG cache for an entire catalog in one go (uses a new
ScanAndExtractJPGsactor with progress + ETA). - JPG cache controls in Settings → Cache. A new section shows the on-disk size of the full-size JPG cache and adds a Prune action (with confirmation).
🔄 Changed
- Unified culling grid. The standard grid and the Similarity/Burst grid now share one
CullingGridView. Selection, scroll-to-selection, rating filter, the “N selected” status, and the three progress overlays now behave identically in both views. - Redesigned Scan Stats sheet — clearer layout for the per-catalog statistics.
- Smoother progress ETA. The “Estimated time to completion” label is now “Estimated time left”, and the countdown no longer jitters upward when a slow file briefly inflates the average.
- Cleaner toolbar mode switching. Loupe / Grid / Similarity / Rated buttons go through a single
selectMainViewMode(...)helper for consistent state reset. - Saved-files persistence moved out of the main view model into a dedicated
CullingModel, with debounced JSON writes (350 ms) to avoid hammering disk on rapid rating changes.
📦 Under the hood
- New concurrency tests for
SharedMemoryCacheandFocusMaskModel; revisions to thumbnail-cache eviction (CacheDelegate,CachedThumbnail) for safer cross-actor access. - Catalog load/cancel path reworked — switching catalogs now reliably cancels in-flight scan, thumbnail, JPG-extract, and sharpness/similarity work.
- Image extractors (
SaveJPGImage,JPGSonyARWExtractor,JPGNikonNEFExtractor) tightened.
Version 1.7.0
RawCull Changelog — v1.6.9 → 1.7.0
Version 1.7.0 is submitted for update on Apple App Store. RawCull 1.7.0 focuses on faster zoom previews, better cache management, and more reliable culling-data saving.
✨ Highlights
- Faster zoom preview loading with a new full-size JPG disk cache.
- Better cache controls in Settings, including cache size visibility and manual JPG cache pruning.
- More reliable culling persistence when rating, batch-rating, and saving sharpness results.
- Improved diagnostics for understanding memory pressure and cache evictions.
✨ What’s new
Full-size JPG disk cache for zoom previews
RawCull now caches extracted full-size JPEG previews on disk. Reopening zoomed images is faster, and the app avoids repeating the same extraction work for files you have already inspected.
JPG cache controls in Settings
The Cache settings screen now shows the size of the full-size JPG cache and adds a dedicated Prune JPG Cache action, making it easier to reclaim disk space when needed.
🔄 Improvements
More accurate cache estimates
Cache estimates in Settings are now based on live cache usage when available, giving a more realistic idea of how many images fit in memory and in the grid cache.
More consistent culling grid behavior
The standard grid and similarity grid now share the same core grid implementation. This improves consistency across:
- multi-selection
- keyboard-driven rating
- burst-group display
- progress overlays
- scroll-to-selection behavior
More reliable rating and scoring saves
Rating updates, batch rating changes, threshold-based culling, and persisted sharpness/saliency results now go through a centralized culling model with coalesced saves. This reduces the risk of stale or out-of-order writes during fast culling sessions.
Safer persistence pipeline
Saved-file models are now concurrency-safe, and JSON writes are serialized through a shared writer to improve stability.
⚡ Diagnostics and Cache Monitoring
Richer memory diagnostics
Memory diagnostics now break out evictions by cache type, making it easier to see whether pressure is coming from the main memory cache or the grid cache.
Better cache visibility
RawCull now exposes more current cache usage details in Settings, including memory cache and grid cache counts and sizes.
📦 Under the Hood
- Internal cache-management cleanup to support the new zoom-preview cache.
- Concurrency and isolation fixes in supporting code paths.
- Documentation and internal review notes updated during the 1.7.0 cycle.