RawCull version release notes and changelogs.
This is the multi-page printable view of this section. Click here to print.
Release Notes
- Version 3.1.1 beta
- Version 2.3.5
- Version 2.3.3
- Version 2.3.2
- Version 2.3.0
- Version 2.2.6
- Version 2.2.4
- Version 2.2.1
- Version 2.1.8
- Version 2.0.5
- Version 2.0.2
- Version 1.9.6
- Version 1.9.4
- Version 1.8.5
- Version 1.8.1
- Version 1.8.0
- Version 1.7.4
- Version 1.7.0
Version 3.1.1 beta
RawCull Changelog: v2.3.5 β Latest Commits
The version 3.1.1 beta requiere macOS 27 (Golden Gate) latest beta either public or developer.
Commit range: 3b1c41d..ef34c7a
Current version: RawCull 3.1.1 (Build 307)
π Major Features
- Introduced the RawCull 3 local AI workflow.
- Added natural-language semantic photo search using CLIP models.
- Added CLIP-powered visual similarity analysis and burst grouping.
- Added SAM 3 Deep Review with subject isolation, detailed scoring, and burst-winner recommendations.
- Added automatic fallback to Apple Vision similarity when the selected CLIP model is unavailable.
- Added persistent storage for AI embeddings, masks, scores, signatures, and burst-review decisions.
π§ AI Models
- Added dedicated AI model settings and model-management views.
- Added model bundle discovery, validation, and resource management.
- Added support for selecting CLIP, SAM 3, and EfficientSAM models.
- Added model-location controls and validation feedback.
- Added model-download and Managed Background Assets infrastructure.
- Added license-acceptance handling for externally distributed models.
- Added model provenance, license notices, manifests, and installation documentation.
- Improved model-download validation, error handling, and test coverage.
π Grid and Similarity View
- Added clearer sharpness-scoring controls with scoring, re-scoring, sorting, and cancellation actions.
- Added contextual scoring targets for selected images, filtered images, or the complete catalog.
- Added combined Index & Find Similar behavior when CLIP index entries are missing.
- Improved similarity backend status and progress presentation.
- Improved selection coordination and keyboard navigation.
- Refined grid controls, button styling, and rating interactions.
π Loupe View
- Added a redesigned metadata panel for the selected image.
- Added expandable and collapsible metadata sections.
- Added keyboard control for showing or hiding metadata.
- Added filename, folder, camera, exposure, rating, and culling information.
- Improved source-image switching and one-to-one zoom rendering.
- Fixed one-to-one zoom so it displays actual image pixels.
- Improved thumbnail and image navigation while using Loupe View.
ποΈ Burst View
- Redesigned the burst-culling workspace.
- Added clearer burst numbering and frame-position indicators.
- Added navigation back to the burst list.
- Added reviewed and unreviewed burst controls.
- Added keyboard-action guidance for navigation, zoom, source selection, focus, rating, picks, and rejection.
- Added burst-aware metadata to the zoomed image view.
- Added culling status, rating, sharpness, focus, review, and recommendation information.
- Improved comparison-grid navigation and selected-frame handling.
ποΈ Sidebar and Navigation
- Refined the main catalog sidebar and file presentation.
- Added clearer empty, filtered, and missing-file states.
- Added image-sorting progress and status indicators.
- Moved additional navigation actions into application menu commands.
- Improved toolbar organization and reduced duplicate controls.
- Refined rating controls, filters, and rating-pin behavior.
β‘ Performance and Reliability
- Added replacement-safe thumbnail cache identities.
- Prevented stale cached thumbnails from being reused after files are replaced.
- Added bounded thumbnail preloading to reduce CPU and memory contention.
- Improved thumbnail loading, scanning, and disk-cache coordination.
- Added contention and memory diagnostics.
- Made histogram loading use the latest request when selections change quickly.
- Improved AI artifact persistence and cache-boundary handling.
- Improved catalog loading, sorting, saved-file persistence, and culling-state restoration.
- Improved similarity, sharpness, focus, and burst-analysis consistency.
βΏ Accessibility
- Added bounded accessibility labels, values, and hints across major workflows.
- Improved accessibility for ratings, image controls, focus controls, model management, and comparison views.
- Added accessible descriptions for image sorting and metadata controls.
- Improved keyboard-accessible culling and navigation actions.
π§ͺ Testing and Quality
- Added tests for semantic search, Deep Review, and AI integration.
- Added model-download and model-validation test coverage.
- Added thumbnail cache identity and contention tests.
- Added histogram request-ordering tests.
- Added typed AI persistence and cache-boundary tests.
- Added accessibility presentation tests.
- Added Loupe and Burst metadata tests.
- Added smoke-test and performance-test manifests.
- Expanded release metadata and package migration verification.
- Improved concurrency and Thread Sanitizer stability.
π οΈ Build and Documentation
- Updated the project for RawCull 3.0.0, 3.1.0, and 3.1.1.
- Added a dedicated model-downloader target and supporting entitlements.
- Updated Swift package dependencies and project configuration.
- Added model installation, provenance, and licensing documentation.
- Added Copy Engine design documentation.
- Updated the README with the RawCull 3 architecture, AI workflow, requirements, and build instructions.
- Updated export, release, smoke-test, and performance-test configuration.
π¦ Version Progression
- Released the initial RawCull 3.0.0 implementation.
- Stabilized AI persistence, thumbnail loading, accessibility, and release validation.
- Advanced the project to RawCull 3.1.0.
- Updated the current release to RawCull 3.1.1, Build 307.
Version 2.3.5
RawCull Changelog: v2.3.5 β Latest Commits
Updated on Apple App Store.
Important: This release is the final version for macOS 26. The next version, 3.0.0, will introduce AI features exclusively available on macOS 27 upon its release. Version 2.3.5 will remain available on GitHub for an extended period following the release of macOS 27. The Apple App Store version will only support macOS 27 once version 3.0.0 is released.
Version 2.3.5 on the Apple App Store is built and uploaded to App Store Connect for release on the App Store by utilizing Xcode Cloud. I have installed macOS 27 developer beta on both my Macs and cannot build and upload a release version directly from Xcode 27 beta. The version 2.3.5 on GitHub is built by Xcode 27 beta, and if you have some doubts about it, please install this version from the Apple App Store.
πΈ RawCull 2.3.5 Changelog
RawCull 2.3.5 is a maintenance and stabilization update for macOS 26. It improves Actual Pixels inspection, histogram reliability, thumbnail-cache correctness, catalog-loading behavior, persistence testing, accessibility, and release validation.
This release introduces no new AI requirements.
β¨ Highlights
- Corrected Actual Pixels inspection to provide genuine 1:1 image inspection.
- Removed a possible histogram conversion crash.
- Prevented older histogram calculations from replacing newer results.
- Added source-aware and size-aware thumbnail-cache identities.
- Prevented thumbnail grids from competing with catalog preloading.
- Expanded similarity-artifact persistence and cancellation coverage.
- Improved accessibility throughout saved files and culling controls.
- Strengthened smoke, Thread Sanitizer, stress, and Release build gates.
π Actual Pixels Inspection
- Defined Actual Pixels as one source-image pixel per display point before backing-scale conversion.
- Removed the previous additional 60% scaling factor.
- Changed the fit-relative scale calculation to
1.0 / fitScale. - Added validation for:
- Non-positive image and viewport dimensions.
- Non-finite dimensions and scale values.
- Non-finite autofocus coordinates.
- Missing autofocus metadata.
- Invalid geometry now produces a finite, centered fallback instead of an invalid transform.
- Added focused coverage for:
- Landscape and portrait images.
- Fit-upscaled images.
- Mismatched aspect ratios.
- All four clamped viewport edges.
- Missing and invalid focus coordinates.
- Invalid image and viewport dimensions.
- Preserved the existing
Zkeyboard shortcut and Actual Pixels terminology.
π Histogram Reliability
- Replaced separate histogram-loading paths with one task lifecycle tied to the selected image.
- Histogram bins are cleared immediately when:
- The selected image changes.
- The selected image becomes unavailable.
- Image conversion fails.
- Removed the reachable
fatalErrorfrom histogram image conversion. - Conversion failures are now logged as recoverable display errors.
- Histogram calculation runs through structured concurrent work.
- Added generation checking so an older calculation cannot replace results for a newer image.
- Added cancellation checks before publishing histogram data.
- Improved
FileInspectorViewimage handling:- Image state is now private.
- Stale images are cleared when file identity changes.
- Cancelled thumbnail requests cannot publish late results.
- Added deterministic tests for:
- Nil-image clearing.
- Conversion failure.
- Successful histogram generation.
- Slow-old-image versus fast-new-image supersession.
πΌοΈ Thumbnail Cache Correctness
- Introduced schema-v3 thumbnail request identities.
- Thumbnail identities now include:
- Standardized source path.
- Source file size.
- Source modification time.
- Thumbnail purpose.
- Requested maximum pixel size.
- Thumbnail-cache schema version.
- Separated grid thumbnails from preview thumbnails.
- A small grid thumbnail can no longer satisfy a larger preview request.
- Cached images must have sufficient decoded dimensions for the request.
- Applied the same complete identity across:
- Disk cache.
- Memory cache.
- Catalog scanning.
- Grid loading.
- Preview loading.
- Comparison loading.
- Zoom-preview paths.
- URL-only requests read source metadata before attempting reuse.
- Requests without reliable source metadata bypass cache reuse instead of accepting potentially stale path-only entries.
- Replacing a file at the same path now produces a different thumbnail identity.
- Retained atomic JPEG writes.
- Cancelled writes no longer leave incomplete cache artifacts.
- Old schema-v2 cache files remain removable but cannot be loaded as schema-v3 results.
- Cache clearing removes both old and current thumbnail schemas.
- Added coverage for:
- Stable request keys.
- Same-path source replacement.
- Missing source metadata.
- Grid and preview separation.
- Decoded-size suitability.
- Old-schema rejection.
- Cross-schema clearing.
- Cancellation during disk writes.
- Corrupt cached JPEG recovery.
β‘ Catalog Loading and Grid Contention
- Added a low-risk catalog-preload grid gate.
- Normal, rated, and similarity thumbnail grids are not constructed while the selected catalog is actively preloading.
- This prevents grid requests from competing with the batch thumbnail preload for the same catalog.
- The grid automatically becomes available when preload:
- Completes.
- Is cancelled.
- Is superseded.
- No longer belongs to the selected catalog.
- Catalog progress and cancellation controls remain available while the grid is gated.
- Removed the obsolete grid-contention TODO from
ThumbnailLoader. - Added process-wide thumbnail extraction diagnostics for:
- Extraction starts.
- Extraction completions.
- Cancellations.
- Concurrent duplicate starts.
- Coalesced waiters.
- Currently active work.
- Peak active work.
- Exposed the new counters in Memory Diagnostics and exported TSV reports.
- Added deterministic tests for active, inactive, mismatched, cancelled, and superseded catalog states.
πΎ Similarity Persistence Verification
- Expanded regression coverage for per-file similarity artifacts.
- Added verification that a persistence write failure:
- Keeps successfully generated session results available in memory.
- Leaves the failure diagnosable.
- Added deterministic partial-commit cancellation coverage:
- Already committed records remain valid.
- Later records are not committed after cancellation.
- Verified that clearing analysis artifacts does not modify:
- Ratings.
- Settings.
- Independent user-data files.
- Verified progress and phase state reset after:
- Successful indexing.
- Partial generation failure.
- Persistence failure.
- Cancellation.
- Superseded indexing.
- Added an actor-isolated test hook for deterministic partial-commit cancellation.
- The hook is disabled in production and does not change production commit ordering.
- Added explicit proof that thumbnail purpose, size, and schema changes do not alter similarity-artifact identity.
- Existing coverage continues to verify:
- Artifact round trips.
- Corrupt-record isolation.
- Incompatible-record rejection.
- Pruning and clearing.
- Changed and added sources.
- Legacy migration.
- Partial generation failure.
- Structured cancellation.
- Latest-generation-wins behavior.
βΏ Accessibility and Interaction
- Converted saved catalog and file-record rows from gesture-only containers to native plain buttons.
- Preserved:
- Row-wide click targets.
- Hover rendering.
- Selection behavior.
- Split-view navigation.
- Added explicit accessibility names, values, selected traits, and actions to:
- Normal thumbnails.
- Rated thumbnails.
- Comparison thumbnails.
- Rating and reject controls.
- Image-source controls.
- Focus-mask controls.
- Focus-point controls.
- Burst-review controls.
- Added selected accessibility traits to reviewed and deferred burst controls.
- Added named actions for selecting and opening images.
- Added accessible file and rating descriptions.
- Hid decorative selection marks, rating strips, glyphs, and dividers when they duplicated spoken information.
- Preserved intentional single-click and double-click behavior in:
- Normal image tiles.
- Rated image tiles.
- Comparison panes.
- File details.
- Zoom overlays.
π§ͺ Test and Release Gates
- Made
Smoke.xctestplanthe sole smoke-test selector. - Smoke membership is now controlled by Swift Testingβs
.smoketag. - Removed the duplicate Makefile smoke-suite allow-list.
- New smoke tests only need the
.smoketag; the Makefile no longer needs to be edited. - Proved that a deliberately failing smoke-tagged test makes the smoke command fail.
- Removed all temporary failure-proof code after validation.
- Kept smoke tests parallel for fast feedback.
- Serialized the complete Thread Sanitizer plan because it deliberately exercises process-wide cache, settings, and singleton state.
- Replaced a scheduler-speed-dependent persistence test with deterministic actor synchronization.
- Clarified that the performance command is an extreme-concurrency stress gate rather than a timing benchmark.
- Updated the README and test architecture documentation to describe:
- Smoke-test selection.
- Full Thread Sanitizer coverage.
- Dedicated stress testing.
- Test isolation expectations.
β Automated Validation Results
The final automated validation completed successfully:
- Smoke tests:
- 93 unique tests.
- 101 concrete parameterized cases.
- Full Thread Sanitizer suite:
- 270 unique tests.
- 295 concrete parameterized cases.
- No Thread Sanitizer diagnostics.
- Extreme-concurrency stress gate:
- 1 selected test passed.
- Exact-
Package.resolvedRelease build:- arm64 build passed.
- No new RawCull compiler or concurrency warnings.
- The only observed build warning was the existing App Intents metadata notice caused by the absence of an
AppIntents.frameworkdependency.
π§° Version and Build Metadata
Verified in both Debug and Release configurations:
- Marketing version:
2.3.5 - Proposed build number:
335 - Minimum system version:
macOS 26.2 - Supported architecture: Apple Silicon
arm64 - Bundle identifier:
no.blogspot.RawCull
Built application inspection confirmed:
CFBundleShortVersionString:2.3.5CFBundleVersion:335LSMinimumSystemVersion:26.2- Executable format: arm64 Mach-O
The About window reads version and build information directly from the application bundle.
π¦ Package Documentation
Updated the README package table to match Package.resolved:
- RawParserKit
1.2.8 - RawCullCore
1.1.2
All seven directly documented package names and versions now agree with the resolved package file.
π§ RawCull 3.0.0 Handoff
- Added a separate AI-preserving stabilization plan for RawCull 3.0.0.
- The plan was based on read-only inspection of the current
mainandversion-3.0.0implementation. - Every 2.3.5 requirement is classified for 3.0.0 as:
- Apply unchanged in behavior.
- Adapt to the AI architecture.
- Already resolved and requiring verification.
- Superseded by a 3.0.0 implementation.
- Not applicable to macOS 27.
- The plan protects:
- PhotoAIKit.
- Core AI model resources.
- CLIP similarity.
- Semantic search.
- Vision fallback.
- SAM 3 Deep Review.
- Typed similarity artifacts.
- Model downloads and licence acceptance.
- AI settings and diagnostics.
- The 3.0.0 plan explicitly prohibits:
- Merging the 2.3.5 branch into the AI code line.
- Cherry-picking the maintenance implementation.
- Mechanically transplanting 2.3.5 code.
- Replacing AI implementations with older Vision-only implementations.
- No 3.0.0 production code, tests, dependencies, project settings, model resources, or branch pointers were changed.
β οΈ Known Limitation
During selected-catalog preload, thumbnail grids are temporarily gated instead of coalescing scan and UI extraction tasks through a shared request registry.
The grid resumes automatically when preload completes, is cancelled, or is superseded.
π₯οΈ Compatibility
- Requires macOS 26.2 or later.
- Requires an Apple Silicon Mac.
- Adds no new AI or model-download requirement.
- Continues to use the macOS 26/Vision-based application architecture.
π¦Release Status
The implementation and automated gates are complete, but distribution remains pending the final manual release matrix.
Before publishing, the release still requires:
- Physical-display Actual Pixels verification.
- VoiceOver and keyboard-only verification.
- Real RAW replacement testing.
- Real-catalog scan-contention measurements.
- Upgrade and restart testing using copied RawCull 2.3.3 data.
- Testing on minimum-supported macOS 26.2.
- Testing on the latest available macOS 26 update.
- Clean-account installation and launch testing.
- Confirmation that App Store Connect build
231is unused. - Developer ID signing and hardened-runtime verification.
- Notarization and stapling.
- Gatekeeper assessment.
- DMG generation and SHA-256 publication.
- App Store upload.
- Creation of the final
2.3.5tag at the exact tested commit.
π Implementation Commits
5da6ff4β Record RawCull 2.3.5 stabilization baseline53c3057β Fix actual-pixel viewport behavior and tests7ba0a32β Make histogram loading cancellation safe5e802e6β Make release test gates authoritative2f9b033β Make thumbnail cache identity source aware4874fa1β Gate thumbnail grids during catalog preloaddea2b9bβ Close similarity persistence regression gaps36157c9β Improve bounded accessibility semanticsab711dfβ Update RawCull 2.3.5 metadata documentationde58ca3β Stabilize integrated release verificationf2f86b6β Prepare release and AI-safe 3.0.0 handoff
Version 2.3.3
RawCull Changelog: v2.3.3 β Latest Commits
πΈ RawCull 2.3.3
Updated on Apple App Store.
Changes since version 2.3.2 through commit e576ca0.
π Highlights
- Added durable per-file similarity artifacts, allowing Vision feature prints to be reused between sessions.
- Improved the Burst Groups workflow and similarity-threshold controls.
- Made the About window context-sensitive across special views.
π§ Similarity Analysis
- Persist Vision feature prints individually instead of regenerating them for every burst analysis.
- Reuse compatible artifacts when reopening or rescanning a catalog.
- Generate only missing, outdated, or incompatible artifacts.
- Validate artifacts against the source path, file size, modification date, Vision revision, representation version, preview size, and pipeline version.
- Automatically migrate compatible artifacts from the previous catalog-wide cache.
- Store artifacts atomically and prune obsolete entries.
- Track generation and persistence failures separately.
- Distinguish between similarity generation and artifact-saving progress.
π₯ Burst Groups
- Added an interactive similarity-threshold slider to the Burst Groups home view.
- Automatically regroup bursts after the threshold changes.
- Improved burst-analysis progress messages.
- Added guidance explaining that extracted thumbnails are shown by default and
Jswitches to the embedded JPEG. - Simplified the Burst Groups home interface and status presentation.
- Improved validation of cached burst results using the current similarity-artifact set.
β¨οΈ Context-Sensitive Shortcuts
- Made the About window observe the active RawCull workspace.
- Show only the relevant shortcut card when About is opened from:
- Zoom Preview
- Burst Groups
- Burst Review
- Manual Comparison
- Continue showing the complete shortcut reference in normal views.
- Added explanatory text describing the context-sensitive behavior.
βοΈ Cache Management
- Added a dedicated Similarity Artifact Cache entry to Settings.
- Display the cache size, artifact count, and storage location.
- Added an option to purge saved similarity artifacts independently.
- Kept derived burst-analysis results in their own cache.
π§ͺ Reliability and Documentation
- Added extensive tests for similarity-artifact persistence, invalidation, migration, cancellation, corruption handling, pruning, and concurrent access.
- Updated test-isolation support for disk-backed artifacts.
- Updated the README with the new similarity-analysis and caching architecture.
- Removed an obsolete merge document.
π Version
- Updated the marketing version from
2.3.2to2.3.3. - Updated the build number from
229to230.
Version 2.3.2
RawCull Changelog: v2.3.2 β Latest Commits
πΈ RawCull 2.3.2
Updated on Apple App Store.
Changes since version 2.3.0.
ποΈ Improved Burst Review
- Burst frames are now consistently ordered by analysis rank, placing the strongest candidates first.
- Added detailed candidate information directly to the burst-review inspector.
- Sharpness, saliency, autofocus, rating, and recommendation evidence are easier to compare.
- Simplified the burst-review sidebar by removing redundant actions.
- Improved navigation between burst frames and back to the burst group.
- Added clearer review and rating controls.
β‘ Faster Frame Navigation
- The selected burst frame and its neighboring frames are now preloaded.
- Decoded images and focus-analysis results are cached separately for each preview source.
- Switching between thumbnail, embedded JPEG, and developed RAW sources is more efficient.
- Focus masks are regenerated only when the focus configuration changes.
- Improved cancellation handling when rapidly navigating between images.
π Find Similar Images
- Added a new βFind Similarβ control to the grid toolbar.
- Select an image to rank the catalog by visual similarity.
- Similarity sorting becomes available after burst analysis is complete.
- Sharpness and similarity sorting are now mutually exclusive for clearer results.
π Capture-Time Metadata
- Added support for the original RAW capture date and timezone offset.
- Burst analysis now orders images by their actual capture time instead of filename.
- File modification time is used automatically when capture metadata is unavailable.
- Added the capture date to the File Inspector.
- Added exposure-compensation information to the File Inspector.
- Burst grouping now uses richer exposure and focal-length metadata when evaluating group boundaries.
π οΈ Reliability and Maintenance
- Updated RawParserKit to version 1.2.8.
- Updated RawCullCore to version 1.1.2.
- Improved RAW metadata diagnostics.
- Expanded tests for capture metadata, burst ordering, frame caching, and navigation.
- Updated the application version to 2.3.1.
Version 2.3.0
RawCull Changelog: v2.3.0 β Latest Commits
π Version 2.3.0
Updated on Apple App Store.
π§ Photo Analysis
- Migrated focus masks, sharpness scoring, calibration, saliency analysis, and Vision feature prints to PhotoAnalysisKit.
- Added a RawCull adapter supporting embedded previews and demosaiced RAW inputs.
- Focus analysis now incorporates EXIF ISO, aperture, and autofocus-point information.
- Replaced RawCullβs local focus-analysis engine and Metal kernels with the reusable package implementation.
- Updated photo-type presets and quality settings to use PhotoAnalysisKit configurations.
π Similarity Analysis
- Migrated similarity embeddings and distance calculations to PhotoAnalysisKitβs Vision feature-print backend.
- Replaced archived Vision observations with portable, Codable feature-print data.
- Updated the embedding pipeline to version 2.
- Continued applying subject-mismatch weighting when ranking visually similar images.
πΎ Cache Management
- Redesigned Cache Settings with separate In Memory and On Disk sections.
- Added live cache sizes, item counts, configured limits, available memory, and storage paths.
- Added independent purge controls for:
- Thumbnail cache
- Full-size JPEG preview cache
- Burst analysis cache
- Added confirmation dialogs and progress indicators while clearing caches.
- Added disk-usage reporting and full clearing support for burst-analysis snapshots.
πΈ Burst Review
- Added an animated progress counter during sharpness scoring and similarity indexing.
- Added estimated time remaining for burst analysis.
- Integrated progress directly into the Burst Home status banner.
- Improved progress accessibility with completed and total counts plus ETA descriptions.
- Moving to the next burst now automatically defers the current group when it has no explicit rating.
- Explicit ratingsβincluding rejected and zero-star ratingsβprevent automatic deferral.
- Removed the separate Set pick action from the burst workspace.
π§ͺ Testing and Reliability
- Added PhotoAnalysisKit integration coverage.
- Expanded sharpness, calibration, cache-purging, cancellation, and burst-navigation tests.
- Added tests ensuring only genuinely unrated burst groups are automatically deferred.
- Updated the test target for Swift 6 with complete strict-concurrency checking.
- Applied SwiftLint cleanup across the new integration.
π Documentation
- Reworked the README with updated architecture, dependency responsibilities, analysis pipelines, caching, testing, and build information.
- Added documentation covering the PhotoAnalysisKit integration and future AI architecture.
- Removed obsolete documentation and legacy README images.
β οΈ Upgrade Notes
- Existing similarity embeddings use the previous pipeline format and must be regenerated.
- Legacy sharpness-cache signatures remain readable but are treated as stale, causing analysis to be rebuilt.
- The project identifies itself as 2.3.0, but a
v2.3.0Git tag has not yet been created.
Version 2.2.6
RawCull Changelog: v2.2.4 β Latest Commits
π Version 2.2.6
Updated on Apple App Store.
ποΈ Redesigned Burst Groups
- Added a dedicated Burst Groups home screen.
- Organized burst tools and review categories into a clearer workflow.
- Added compact burst cards with improved visual separation.
- Added Clean View, showing only the highest-ranked frames from each burst.
- Added inline expand and collapse controls with hidden-frame counts.
- Improved Reviewed and Deferred state handling.
- Reviewed bursts now collapse automatically while deferred bursts remain available.
π Dedicated Burst Review Workspace
- Added a focused workspace for reviewing one burst at a time.
- Added a large image stage, filmstrip navigation, file information, ratings, tags, and burst actions.
- Added controls for marking bursts reviewed, deferring decisions, comparing candidates, and setting a manual pick.
- Added quick navigation between frames and burst groups.
- Improved JPEG, RAW, focus-mask, and AF-point inspection during burst review.
β¨οΈ Expanded Keyboard Controls
- Added
PandNfor previous and next burst frames. - Added
Gto advance to the next burst group. - Added arrow-key navigation throughout burst review.
- Added keyboard access to zoom, image sources, focus overlays, ratings, picks, and rejection.
- Added
Bfor keeping the best candidate on the burst comparison screen. - Clarified that
Pmeans previous frame during burst review; use0to keep a frame neutral.
πΌοΈ Improved Culling Grid
- Improved burst-group presentation inside the main culling grid.
- Added clearer burst headers and direct group actions.
- Improved selection behavior while working with grouped images.
- Improved transitions between the burst home, grouped grid, review workspace, and comparison screen.
- Simplified toolbar controls for burst-oriented workflows.
βΉοΈ New About and Shortcut Guide
- Redesigned the About window with adaptive, color-coded cards.
- Grouped shortcuts by Browse, Burst Groups, Image Preview, Zoom Preview, Manual Comparison, Burst Review, and App Commands.
- Added visual keycaps and contextual shortcut descriptions.
- Added accessibility labels for shortcut sections and commands.
- Made the About window scrollable and resizable.
π§ͺ Reliability and Testing
- Added tests for burst keyboard navigation.
- Added tests for grouped-grid selection and burst actions.
- Added coverage for rating behavior and burst-review state transitions.
π οΈ Version 2.2.5
π‘οΈ Safer File Copying
- Prevented failed folder selections from silently reusing an older security-scoped bookmark.
- Added stronger source and destination validation before starting a copy.
- Replaced the shared include-list file with a unique file for each copy operation.
- Prevented rsync from starting when the selected-file list cannot be created.
- Improved handling of filenames containing rsync filter characters.
- Added cleanup for temporary copy-operation files.
- Improved error reporting when copy preparation fails.
πΌοΈ Culling and Burst Workflow Improvements
- Improved grouped-image presentation in the culling grid.
- Added clearer separation between individual burst groups.
- Added collapsible burst groups and compact ranked-frame presentation.
- Improved Reviewed, Deferred, and manual burst-decision state handling.
- Improved multi-selection and primary-selection consistency.
- Improved rating-filter consistency between the toolbar, visible grid, and keyboard navigation.
π¬ Comparison and Focus Analysis
- Added per-photo zoom, pan, focus-mask, and AF-point state in comparison views.
- Prevented interaction state from leaking between comparison candidates.
- Improved comparison scrolling and selection synchronization.
- Debounced comparison selection updates during horizontal scrolling.
- Improved protection against stale comparison image refreshes.
- Corrected sharpness sampling around expanded Gaussian blur boundaries.
- Updated RawParserKit integration and RAW diagnostic handling.
β‘ Performance and Concurrency
- Added culling-grid render caching to reduce repeated grouping and lookup work.
- Improved cancellation and stale-result protection for asynchronous operations.
- Improved thumbnail and embedded-JPEG extraction task handling.
- Improved similarity-ranking and catalog-state synchronization.
- Added additional cancellation checks around focus-mask and sharpness processing.
- Improved progress-state ownership for extraction and cache-warming operations.
πΎ Ratings and Persistence
- Improved saved-rating lookup and update performance.
- Corrected rating persistence during multi-photo operations.
- Improved extraction selection based on tagged and rated photos.
- Improved state restoration when reopening catalogs.
- Improved JSON persistence behavior and reduced unnecessary work on the main actor.
π§° Settings and Diagnostics
- Improved settings reset and save behavior.
- Improved cache-setting validation.
- Moved additional RAW diagnostic work away from the main UI path.
- Improved memory and progress diagnostics.
π§ͺ Expanded Test Coverage
- Added copy-startup and file-list safety tests.
- Added comparison display-state tests.
- Added culling-grid selection and coordination tests.
- Added extraction-selection tests.
- Expanded rating, cache, RAW loading, and sharpness-scoring tests.
Version 2.2.4
RawCull Changelog: v2.2.1 β Latest Commits
Updated on Apple App Store.
πΌοΈ JPG Export Improvements
- Added a new Extract JPGs sheet.
- JPG extraction now works from the current selection:
- multiple selected thumbnails
- or the single active image when no multi-selection exists
- Added destination folder selection for JPG export.
- Added export mode picker:
- Embedded JPG
- Demosaiced RAW
- Demosaiced exports are saved with a
_demosaic.jpgsuffix. - Added extraction progress overlay in the main view.
π· RAW Loading Refactor
- Introduced a shared
RawImageLoadingabstraction. - Centralized metadata, thumbnail, and preview loading through
RawParserKit. - Added
FullSizePreviewLoaderfor reusable full-size embedded preview loading. - Sidecar
.jpgfiles are preferred before extracting from RAW. - Full-size preview extraction now reuses disk cache when possible.
- Removed older local thumbnail and preview loading paths.
β‘ Performance and Concurrency
- Added a shared batch extraction concurrency limit based on CPU count.
- Thumbnail creation, JPG extraction, and full-size preview loading now share more consistent loading paths.
- Improved cancellation checks during preview and extraction work.
- Reduced duplicated image-loading logic across zoom, comparison, thumbnail, and scan flows.
π§© RawParserKit Update
- Updated
RawParserKitfrom 1.1.0 to 1.2.5. - Migrated RawCull code to use newer RawParserKit APIs for:
- EXIF metadata
- focus point metadata
- thumbnail generation
- embedded preview extraction
- full-size JPEG and demosaic export support
π Scanning and Metadata
ScanFilesnow uses the shared raw loader for EXIF and Sony focus-point metadata.- Removed local EXIF parsing helpers from RawCull.
- Focus point normalization now comes from RawParserKit metadata.
- Security-scoped folder access handling was made more tolerant by only stopping access when it was actually started.
π§ͺ Tests
- Added tests for JPG extraction selection behavior.
- Added tests for JPG output naming.
- Added integration-style tests for:
- thumbnail request cache promotion
- full-size preview disk caching
- sidecar JPG preference
- cancellation behavior
- scan metadata loading through
RawImageLoading
- Updated existing tests for current MainActor isolation needs.
π οΈ Tooling and Maintenance
- Added a dedicated
RawCullPeripheryXcode scheme. - Updated
.periphery.ymlto use the new scheme and exclude tests. - Removed obsolete local helper files:
SupportedFileType.swiftThumbnailError.swiftOrientationNormalizedImageLoader.swift
π Documentation and Review Notes
- Moved issue tracking into
doc/issues.md. - Added a deep code review report and later re-verification notes.
- Updated README latest-release text to show
v2.2.1as the App Store release.
π¦ Commit Range Summary
- From:
v2.2.1 - To: latest commit
e46f76donversion-2.2.5 - Total: 17 commits
- Diff size: 47 files changed, 1352 insertions, 1122 deletions
Version 2.2.1
RawCull Changelog β v2.1.8 β 2.2.1
To be submitted for update on Apple App Store.
β¨ Added
- Added native parsing and display of rsync itemized output.
- Added categorized output rows for added, updated, deleted, metadata-only, and unknown rsync changes.
- Added support for both rsync and openrsync itemized output formats.
- Added burst-analysis regression documentation in
issues.md.
π§ Burst Grouping
- Reworked burst-analysis task ownership so cancellation now controls the full analysis pipeline.
- Added generation and catalog checks to prevent old burst-analysis work from publishing stale results.
- Added completed-analysis scope tracking so review-state saves use the same file set that produced the analysis.
- Added a complete burst similarity cache signature including sensitivity, Vision revision, thumbnail size, embedding pipeline version, and grouping config.
- Incremented burst-analysis cache schema to invalidate incompatible older cache files.
- Restored burst review states by exact group membership instead of transient group IDs.
- Excluded singleton groups from burst review queues and review counts while keeping them visible in the grid.
- Simplified burst group headers to focus on opening, reviewing, and deferring groups.
- Simplified burst comparison overlay with a lighter back/inspector hint control.
β‘ Performance & Reliability
- Moved burst cache JSON encoding and decoding off
MainActor. - Added cancellation checks around cache load/save operations.
- Reworked similarity embedding generation to stay within structured concurrency.
- Prevented cancelled or superseded similarity indexing jobs from committing stale embeddings.
- Added score revision tracking to sharpness scoring.
- Improved culling grid cache invalidation by tracking full group membership, visible file identity, score revision, and max score.
π Fixed
- Fixed cancelled burst analysis applying late cache results.
- Fixed catalog cancellation leaving burst-analysis state behind.
- Fixed cache reuse after changing burst sensitivity or embedding configuration.
- Fixed review states moving to the wrong burst after regrouping.
- Fixed singleton images appearing as reviewable burst work.
- Fixed stale culling grid render cache results when middle files, group membership, or sharpness scores changed.
- Fixed review-state persistence overwriting cache snapshots with the wrong analysis scope.
- Fixed main-thread stalls from large burst cache serialization.
π§Ή Maintenance
- Removed the
RsyncAnalysepackage dependency. - Updated app version/build settings to
2.2.1/ build221. - Updated README release information for
v2.1.8.
Version 2.1.8
RawCull Changelog β v2.0.5 β 2.1.8
Updated on Apple App Store.
π Actual-Pixels Inspection
- Added
Zas a fast inspection shortcut from grid, loupe, and comparison views. - Opens the zoom overlay directly on the embedded JPEG at an actual-pixels zoom level.
- Centers the view around the AF focus point when one is available.
- Shows the focus-point marker on open for faster sharpness checking.
β Faster Culling Flow
- Rating, reject, keep, and tag actions now advance automatically to the next image.
- The same advance behavior is available in thumbnail navigation, zoom overlay, and comparison grid workflows.
- Catalog loading now preselects the first visible file by name, so keyboard culling can begin immediately.
π§ Orientation-Correct Previews
- Normalized source orientation for thumbnails, embedded previews, sharpened previews, comparison images, and zoom previews.
- Improved handling for Sony embedded previews that do not carry their own orientation metadata.
- Added corrected transform handling for EXIF orientation values, including rotated and mirrored images.
π§ Adaptive Memory Handling
- Added adaptive preview and grid cache recommendations based on installed memory, current system memory use, and macOS memory pressure.
- Reduced cache budgets automatically when memory pressure is warning or critical.
- Updated default cache settings for different memory tiers.
- Simplified the memory warning banner and added a close button.
πͺ About Window
- Added a native About RawCull window.
- Replaced the standard app info command with RawCull’s custom About window.
- Included app version/build information and a compact keystroke reference.
ποΈ Saved Files View Cleanup
- Split saved-files UI into smaller focused components for catalog rows, file rows, detail rows, section headers, and star ratings.
- Kept the saved-file detail presentation while making the view easier to maintain.
- Added a
FileRecordconvenience initializer for previews and tests.
π§ͺ Tests
- Added and expanded Swift Testing coverage for culling auto-advance, thumbnail/cache admission, zoom overlay key actions, comparison navigation, and thumbnail provider behavior.
- Added coverage for
Zactual-pixels inspection in comparison navigation.
π οΈ Maintenance
- Aligned project versioning across build settings and release branches.
- Added a
test-performanceMakefile target. - Performed cleanup in scoring parameter UI and cache-related code.
Version 2.0.5
RawCull Changelog β v2.0.2 β 2.0.5
Submitted for update on Apple App Store.
- πΌοΈ Fixed orientation handling for embedded JPEG previews, sidecar JPEGs, cached previews, comparison view, and zoom previews.
- π― Improved sharpness scoring and burst analysis so they can run on selected files or active star-rating filters instead of always processing the full catalog.
- β‘ Refreshed full-size JPEG cache keys to avoid reusing older non-orientation-normalized previews.
- π§Ή Fixed empty catalog handling so loading state and security-scoped access are cleaned up correctly.
- β¨ Added an βAdd Catalogβ action when a selected folder contains no RAW files.
- π§ͺ Added regression tests for orientation decoding, scoped sharpness/burst analysis, cache behavior, and empty catalog cleanup.
Version 2.0.2
RawCull Changelog β v1.9.6 β 2.0.2
Updated on Apple App Store.
β¨ New β Image source toggle in zoom / loupe view
Switch between the embedded JPEG preview and a full-size JPEG created from the RAW file while inspecting an image:
- New
ImageSourceToggleViewwith keyboard shortcut support ZoomPreviewHandlersignificantly expanded to manage source switchingZoomOverlayViewupdated with key-action routingFullSizeJPGDiskCacheextended to support the toggle flow- New
DiskCacheAndScanAdmissionTestscovering the cache admission logic
β¨ New β Burst Review Queue
A structured review-queue workflow for burst groups:
- New
BurstReviewQueueFilter(.all,.needsReview,.deferred,.reviewed) β filter the culling grid to a specific review state - New
BurstReviewQueuePolicyβ stateless logic that derives each group’s effective state (high-confidence, no cautions β auto-reviewed; low confidence or open cautions β needs review) - New
BurstReviewQueueCountsvalue type exposed onRawCullViewModel - Review-state action buttons in
BurstGroupHeaderView: Reviewed, Needs Review, Defer β rendered contextually per current state - State badge overlay on burst group headers (purple = Needs Review, blue = Reviewed, gray = Deferred)
- Filter buttons added to
SimilarityGridSelectionViewtoolbar β live counts shown inline; filter resets to.allon Exit Groups - Auto-sharpness scoring toggle removed from toolbar; scoring now triggered automatically via
runWithAutoScoringbefore burst analysis runs - Review states persisted to the burst analysis disk cache on every state change
ποΈ Refactored β CullingGridView decomposed
The monolithic CullingGridView split into focused, independently testable objects:
CullingGridSelectionCoordinatorβ selection state & keyboard navigationCullingGridRenderCacheβ per-cell image caching (keyed byCullingGridRenderCacheKey)CullingGridProgressOverlayβ loading progress overlay- Cell data flow cleaned up:
isSelected,ratingValue,ratingDisplay,ratingColornow passed directly toImageItemView, removing ViewModel look-ups inside the cell
ποΈ Refactored β ComparisonGridView decomposed and redesigned
ComparisonGridDisplayStateβ display/layout state extracted from the viewComparisonGridImageCoordinatorβ per-pane image loading coordination extracted from the view- Background changed to near-black (
Color.black.opacity(0.97)) for a cinema-style comparison experience BurstComparisonEvidenceViewpromoted to a floating overlay (ZStack+.zIndex(2)) so it no longer pushes image panes down- Image panes fill the full viewport height instead of being constrained to a fixed 3:2 ratio
- Scroll indicators hidden; viewport transform resets automatically when the comparison group or active burst group changes
π¦ New β RawParserKit SPM package (rsyncOSX/RawParserKit v1.1.0)
All raw-file parsing logic extracted from RawCull into a standalone, reusable Swift package:
- Sony:
SonyMakerNoteParser,SonyThumbnailExtractor,SonyRawFormat,JPGSonyARWExtractor - Nikon:
NikonMakerNoteParser,NikonThumbnailExtractor,NikonRawFormat,JPGNikonNEFExtractor - Shared:
RawFormat,RawFormatRegistry,RawParserDiagnostics,CancellableImageIOWork,ThumbnailSharpener - β¨ New in package:
SonyRAWJPEGCreatorβ Sony-specific embedded JPEG creator;ThumbnailErrortyped errors
π¦ New β RawCullCore SPM package (rsyncOSX/RawCullCore v1.0.0)
Core data models and domain logic extracted into a standalone package:
- Burst:
BurstGroupingEngine,BurstRankingEngine,BurstAnalysisModels - File model:
RawCullFileItem(replaces the internalFileItem) - Histogram:
HistogramCalculator(replaces the internalCalculateHistogram) - β¨ New in package:
ExifMetadata,FocusPointParser,RawCullSourceCatalog,SaliencyInfoβ new shared data types
ποΈ Refactored β ScanStatsSheetView expanded
- Layout widened from 460 β 800 pt; content reorganised into a two-column
HStack - Left column: Culling Status, Catalog Summary, Sharpness Summary, and a new Burst Review section (total groups, needs-review / deferred / reviewed counts)
- Right column: new Burst Label Guide β caption-sized reference grid explaining every confidence and state badge
π§Ή Cleanup & dead-code removal
FocusPeakingControlsViewand relatedBurstAnalysisModelsdisplay-only properties removed (moved to package / no longer needed)CacheSettingsTabsimplified β removed staleshowResetConfirmation,showSaveSettingsConfirmation, andcacheConfigstate variablesSharedMemoryCacheβ 34 lines of redundant code removedSettingsViewModelβ dead state and unused helpers prunedImageItemViewβ substantial simplification following the cell data-flow refactorSharedMainToolbarContentβ stale toolbar items removed
π§ͺ Tests β Cleaned up & extended
Tests for code that moved to SPM packages removed from the main test target; new and expanded tests added:
- β
CullingGridCoordinatorTestsβ coordinator selection and keyboard-navigation logic - β
ZoomOverlayKeyActionTests(expanded) β image-source toggle key actions - β
DiskCacheAndScanAdmissionTestsβ full-size JPG disk-cache admission coverage - β
CullingModelTests(expanded) βBurstWinnerOverrideexact-membership matching; upsert with differing member sets - β
RawCullVerifyTestsConcurrencyTests(expanded) β burst review-state concurrency coverage - β Removed (now tested inside their respective SPM packages):
BurstAnalysisTests,NikonMakerNoteParserTests,SonyMakerNoteParserTests,SimilarityScoringTests,CancellableImageIOWorkTests,ComparisonCandidateInspectorTests,LoupeImageKeyActionTests
Version 1.9.6
RawCull Changelog β v1.9.4 β 1.9.6
Released on Apple App Store.
π Comparison view is now a horizontal filmstrip
The burst comparison layout was completely redesigned.
- Candidates are now presented in a side-by-side horizontal scroll, one full-width pane per candidate, instead of a vertical grid stack.
- Navigation is left/right only β up/down arrow keys are removed. The view snaps one candidate at a time using SwiftUI scrollTargetBehavior(.viewAligned).
- Selecting a file in the filmstrip updates the main selection and vice-versa, keeping both views in sync automatically.
- The burst header bar is more compact: decision text and action buttons share a single line with tooltips replacing verbose inline descriptions.
π Loupe view can now toggle the extracted JPG
The loupe (single-image zoom) view gains a built-in extracted-JPG mode so you can compare the embedded thumbnail against the full-size sidecar or extracted JPEG without opening a separate window.
- Press J (or j) to toggle between the embedded thumbnail and the extracted JPG. Zoom (+/-) continues to work in both modes.
- A LoupeImageKeyAction enum centralises key resolution (+, -, j/J), replacing the inline switch on key characters and making key handling unit-testable.
- When the extracted JPG is active, a ProgressView is shown while loading and a “No extracted JPG” placeholder appears if no sidecar or embedded preview is available. The task is cancelled and cleaned up when the image changes or the view disappears.
- ZoomPreviewHandler.loadExtractedJPGPreview is extracted as a reusable static method (sidecar JPG β RAM cache β raw extraction pipeline), shared between the loupe toggle and the existing zoom-window open path.
- The focus overlay and focus mask both track currentImageSize / currentDisplayedImage, so they remain correctly anchored whether the thumbnail or the extracted JPG is displayed.
- The image-source toggle in ImageOverlayControlsView is now wired to showExtractedJPG, replacing the previously constant .constant(false) binding.
π· Rating badge now visible on every thumbnail view
CurrentRatingBadgeView is now shown as an overlay on ImageItemView, RatedImageItemView, and the loupe MainThumbnailImageView.
- A new density parameter (.regular / .compact) shrinks the badge’s font, icon, and padding for use inside small thumbnails where screen space is limited.
- In ImageItemView the rating badge and the burst-recommendation badge are stacked vertically in the top-left corner.
- RatedImageItemView extracts its rating lookup into a shared ratingValue computed property, eliminating duplicated savedFiles traversal.
π― Scoring signatures now version-stamp every result
Sharpness scores are now stamped with a SharpnessScoringSignature that captures the exact algorithm version, ISO scaling policy, aperture hint policy, and all scoring parameters used to produce the score.
- Saved file records (savedfiles.json) store the scoring signature, file size, and modification date alongside the score, so RawCull can detect when a cached score is stale.
- A SharpnessScoringSignature carries explicit algorithm version, ISO policy version, and aperture hint policy version fields, making it straightforward to invalidate old scores when the pipeline changes.
- The burst cache schema advances to version 2 to match the new signature layout.
- BurstSharpnessSignature is now a typealias for SharpnessScoringSignature (no migration needed for existing burst caches).
π©Ί Candidate inspector shows richer scoring evidence
The inspector panel shown when reviewing burst candidates now surfaces much more of the internal scoring data.
- New fields: Source, Blur Gate sigma, Subject Label, Subject Confidence, Focus Flag, Mask Region, and Mask Threshold in the Scoring section.
- New evidence fields: Scoring Local Detail, AF Center Detail, AF Neighborhood Detail, Scoring AF Patch, Scoring Subject Patch, Saliency Candidates, Saliency Selection reason, Evidence Threshold, Evidence Coverage, and Visibility Relaxed.
π§© Saliency selection is now multi-candidate with AF-point guidance
Vision saliency results are no longer collapsed into a single union rectangle.
- Each detected object is now a SaliencyCandidate with its own rect and confidence.
- A dedicated selectSaliencyCandidate function picks the winning region by weighing AF-point overlap, distance to AF point, local detail score, and area β preferring the subject the camera actually focused on.
- The selection reason and candidate count are recorded in the breakdown and shown in the inspector.
πΌ Focus mask gains visibility relaxation
The focus mask overlay now actively checks whether the selected threshold would produce a nearly invisible mask.
- When coverage falls below a configurable minimum, the threshold is automatically relaxed until the overlay is visible, and relaxedForVisibility = true is recorded in the breakdown.
- Overlay styles are renamed from subjectHeat/globalDetail to subjectEdges/globalEdges to better reflect what they show.
β‘ Cancellation guards throughout the scoring pipeline
All heavy per-frame work checks Task.isCancelled at every major stage, so switching images quickly no longer queues up stale work.
- A shared runCancellableWorker helper on FocusMaskEngine wraps detached tasks with a proper withTaskCancellationHandler so cancellation propagates immediately.
- Calibration, saliency, Laplacian sampling, mask generation, and scoring all return early when cancelled.
π Calibration now samples pixel energies, not scores
The auto-calibration pass that sets the visual edge threshold was redesigned.
- Instead of scoring every file end-to-end, calibration now decodes a small 512-px thumbnail, runs only the Laplacian, and collects raw pixel energy samples.
- This makes calibration faster and ensures the core sharpness score no longer depends on catalog contents β only the visual threshold changes per catalog.
π Compact overlay controls in comparison panes
All image overlay control capsules (focus mask, focus points, ratings, image source) now accept a density parameter.
- .compact density shrinks button sizes, padding, and font sizes for use inside the comparison pane where screen space is limited.
- Focus peaking (FocusPeakingControlsView and the G keyboard shortcut) has been removed from the zoom overlay.
π§ͺ New tests
- resolution scaling uses longest side regardless of orientation
- scoring size normalization clamps legacy and oversized values
- conservative subject score keeps broad score dominant
- conservative subject score preserves broad fallback without patches
- saliency selection prefers AF overlap over confidence
- saliency selection is deterministic without AF
- saliency selection reports empty fallback
- cancellable worker forwards cancellation (thread-safety, 1 min limit)
- visibility relaxation lowers threshold and reports coverage
- generic decode normalization produces sRGB eight bit RGBA
- scoring signature ignores visual controls and tracks score controls
- scoring signature invalidates for every score-affecting field and policy version
- applying visual calibration does not change scoring signature
- zoom shortcuts resolve from characters
- jpg source shortcuts resolve from lowercase and uppercase j
- unmapped keys are ignored
Version 1.9.4
RawCull Changelog β v1.8.5 β 1.9.4
Updated on Apple App Store.
v1.9.1 β v1.9.4
π― Sharpness scoring now has intent presets and precision modes
Sharpness scoring is now much more configurable and better tuned for different kinds of photography.
- Added photo-type presets: Auto, Birds/Wildlife, Portrait, Landscape, and Action.
- Added quality modes: Fast, Balanced, and High Precision. Balanced and High Precision decode larger previews and blend more fine detail for better small-subject ranking.
- Added a scoring source picker: Embedded Preview for normal culling speed, or RAW Demosaic for slow, final-precision checks.
- These scoring choices are now persisted in settings and restored when a catalog is reopened.
π Focus mask evolved into focus evidence
The focus mask is now much closer to an explanation overlay for the sharpness score, instead of a generic edge mask.
- Focus evidence now chooses between AF center, AF neighborhood, saliency/subject region, or global detail, depending on which region best supports the score.
- Sharp images can now relax the visual threshold when needed, so the overlay stays visible when RawCull says the image is sharp.
- Aperture-aware blur gating and revised high-ISO handling make wildlife, portrait, and deep-DoF scenes behave more consistently.
- The system now records richer diagnostics such as winning region, rendered region, overlay style, patch rankings, AF distance, spatial alignment, and confidence reason.
π Better burst ranking and comparison evidence
Burst ranking is now more nuanced when multiple images in a burst are very close.
- Burst ranking now blends absolute sharpness with burst-relative sharpness when there is a meaningful spread inside the group.
- Very small sharpness spreads no longer create artificial separation between near-identical frames.
- High-confidence Keep Best decisions still require strong absolute sharpness evidence.
- Comparison view now surfaces subject-sharpness rank and subject/global deltas against the burst winner.
- Candidate Inspector now shows burst-relative sharpness alongside subject, global, and AF-detail breakdowns.
π οΈ Stability and persistence improvements
- Burst analysis cache now invalidates when scoring intent, quality, source, thumbnail size, or related scoring parameters change.
- Settings loading/saving was tightened so persisted scoring settings are not overwritten during initial load.
- Shared memory cache diagnostics and counters were improved and covered by new tests.
- Version metadata advanced to 1.9.4 / build 94.
π§ͺ Tests
SharpnessScoringTestsexpanded heavily around RAW demosaic selection, focus-evidence region choice, visibility relaxation, patch ranking heuristics, focus-failure classification, aperture hints, ISO ramps, and concurrent scoring.BurstAnalysisTestsadded coverage for burst-relative sharpness and comparison summaries.- New concurrency tests cover cache counters and settings persistence.
v1.9.0 β v1.9.1
π·οΈ Burst grid label legend
A legend panel now appears above the grouped burst grid so the burst badges are explained in-place.
- The legend currently documents: Best frame found, Compare first, Needs manual review, Manual, Applied, Suggested best, and Check frame.
- The legend is only shown while burst groups are visible in Similarity Grid, so it does not clutter the normal grid.
β Batch selection and rating by visible badge
The standard culling grid can now batch-select visible thumbnails by their current badge labels.
- Badge buttons show the visible count for each currently present burst/subject badge.
- Clicking a badge button selects all matching thumbnails; holding β Command adds or removes them from the current selection.
- A compact rating picker plus Apply button lets you rate the whole selection in one action.
- These controls are hidden while burst groups are displayed.
π Burst mode now survives view changes
Burst analysis and burst mode are no longer discarded when moving between the main view modes.
- Burst state is preserved when switching between Loupe, Grid, and Similarity Grid.
- Burst-group rendering is now gated by
showsBurstGroups, so grouped bursts are only shown where they belong: Similarity Grid. - This prevents grouped-burst UI from leaking into unrelated views while still preserving the active burst-analysis state.
π§Ή Cleanup
- Marketing version updated to 1.9.1.
- Burst display logic was centralized through
showsBurstGroups. - Stale internal markdown documents were removed from
documents/.
π§ͺ Tests
BurstAnalysisTestsnow verify the legend label set and ensure grouped-burst visibility survives view switching correctly.
v1.8.5 β v1.9.0
β Manual burst winner override
You can now override the algorithmβs automatic burst winner and pick the keeper yourself.
- Set Manual Winner appears in burst comparison.
- Manual winners are clearly labeled in both comparison and grid views.
- Manual overrides are persisted in
savedfiles.json, survive reloads, and are reattached when bursts regroup. - Keep Best respects the manual winner when one is active.
π§ Safer burst culling decisions
Burst culling is now more conservative about when automatic actions are allowed.
- Keep Best and Keep Top 2 are only available when the burst is safe for one-click culling and sharpness scores are present.
- Medium-confidence bursts now push you toward comparing finalists first.
- Low-confidence bursts ask for manual review instead of presenting an unsafe automatic choice.
- Burst keyboard shortcuts now respect the same safety rules.
π Better burst comparison workflow
Burst comparison gained a much richer inspection flow.
- Added a Candidate Inspector side panel with ranking evidence, EXIF summary, candidate reasons/cautions, and rank tables.
- Comparison view can focus on finalists, return to the active burst group, and clearly shows when a manual winner is active.
- Comparison navigation and image-loading behavior were refined to make burst review smoother.
π§Ύ Clearer burst presentation in the grid
Burst headers and recommendation copy were rewritten to be easier to understand at a glance.
- Burst headers now use clearer decision text such as Best frame found, Compare before deleting, Needs manual review, and Manual winner: frame X.
- Human-readable explanations replace raw internal reasoning.
- Thumbnail badges more clearly distinguish suggested frames, manual winners, and applied actions.
π Burst reanalysis
A new Reanalyze Bursts action lets you throw away stale cached analysis and recompute from scratch for the current catalog.
- The action deletes the saved burst-analysis cache for the catalog before rerunning analysis.
- It is disabled while grouping or analysis is already in progress.
π Focus mask on demand
Focus mask generation is now done only when you actually ask for it.
- Focus masks are generated when the overlay is toggled on, instead of being precomputed for every image.
- In-flight mask work is cancelled if you toggle the overlay off.
- Mask state resets cleanly when switching images.
π Zoom and inspection improvements
- Zoom now preserves scale while navigating between images and recenters the pan offset.
- RAW diagnostics presentation is now driven through
RawCullViewModel.presentRawDiagnostics(). - The main window now starts in detail-only mode.
π Fixes & internal improvements
- Version metadata advanced through 1.8.6, 1.8.7, 1.8.8, 1.8.9, and 1.9.0, with build 90 at v1.9.0.
BurstAnalysisCachegained explicit deletion support for reanalysis.- Burst review states were expanded to track manual overrides and applied actions.
- Logger identifiers were corrected in
RequestThumbnail. - Burst presentation helpers were cleaned up for Swift 6.
π§ͺ Tests
BurstAnalysisTestsexpanded for grouping, confidence handling, manual winners, reanalysis, and safe one-click culling.- New
ComparisonCandidateInspectorTestscover ranking evidence and EXIF presentation. CullingModelTestscover manual-winner persistence and pruning.ComparisonGridNavigationTests,SharpnessScoringTests, andZoomOverlayKeyActionTestsgained regression coverage.
Version 1.8.5
RawCull Changelog β v1.8.1 β 1.8.5
β¨ 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
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.