This is the multi-page printable view of this section. Click here to print.

Return to the regular view of this page.

Release History

RawCull changes, listed by publication date. Each entry begins with a short summary, followed by the detailed changelog.

Recent Changes

  • Version 3.2.8: RAW 9 preview handling, AF-point sharpness sorting, and focus evidence in AI review.
  • Version 3.2.6: Objects analysis with numbered subjects, crops, and local descriptions.
  • Version 3.2.4: the AI Analysis workspace and Qwen Vision assessments.

Reading the History

Release notes record behavior and release status at the date shown. Older versions may have different requirements, controls, and model support. Source-development notes are not confirmation of App Store availability.

For the current documented workflow, use Quick Start, AI Step by Step, or the screenshot tour.

Version 3.2.9 - In Development

RawCull 3.2.9 is in development and has not yet been released.

Catalog-wide JPEG extraction, Burst Groups preparation status, and catalog and cache reliability improvements.

Changes: v3.2.8 β†’ v3.2.9 (in development)

This changelog continues from the 3.2.8 release notes and covers source changes since the v3.2.8 tag through October 6, 2026. It is a development snapshot; features and build numbers may change before release.

RawCull requires macOS 27 (Golden Gate) and an Apple Silicon Mac. Building from source requires Xcode 27.

Commit range: v3.2.8..da251c4
Baseline tag: v3.2.8 at 2b04aa6 (2026-09-30), RawCull 3.2.8 Build 398
Latest commit: da251c4 (Align release documentation and metadata tests with 3.2.9, 2026-10-06)
Current source version: RawCull 3.2.9 (Build 403)
Release status: In development; not yet released

JPEG Extraction

  • Add an Images selector to the JPEG extraction sheet, with Selected images and Complete catalog options.
  • Default to selected images when a selection exists; otherwise use the complete active catalog.
  • Use the chosen scope for extraction and the sheet’s source summary.
  • Retain source-folder access while background JPEG extraction and embedded-preview cache warming finish.

Burst Groups Preparation Status

  • Add a Review data panel to the Burst Groups home view.
  • Show coverage counts and preparation state for sharpness, the CLIP index, Vision similarity data, optional subject evidence, and burst grouping.
  • Distinguish ready, partial, preparing, needed, unavailable, and empty-catalog states.
  • Mark the inactive similarity backend as Not used.
  • Hide the idle semantic-search coverage message when all catalog photographs have compatible CLIP artifacts; keep incomplete-coverage guidance visible.

Catalog Cancellation and Sorting

  • Make Abort cancel pending catalog transitions as well as active catalog loading.
  • Reject cancelled or superseded transitions after persistence finishes, preventing a delayed transition from starting a catalog load or restoring an outdated selection.
  • Publish asynchronous sort results only when the request, catalog, selected source, sort order, and search text still match.
  • Invalidate pending sorts when catalog loading is cancelled and keep sorting activity tied to the current request.

Background Folder Access

  • Retain catalog access for the lifetime of background file operations, including catalog loading, thumbnail creation, JPEG extraction, full-size previews, sharpness scoring, similarity indexing, and AI analysis.
  • Keep existing work’s folder access alive when the selected catalog changes, then release it when that work finishes.
  • Strengthen shared catalog-access bookkeeping for overlapping operations.

Thumbnail Cache Reliability

  • Synchronize thumbnail storage changes with cached-image count and memory-cost accounting.
  • Handle replacement and eviction callbacks using entry identities so an older entry’s eviction cannot remove a newer entry’s accounting.
  • Give each tracked cache ownership of its eviction delegate and detach the delegate during teardown.
  • Clear storage and accounting together when resetting the cache.

Release Tooling and Dependencies

  • Add Scripts/release.sh and Makefile commands for internal TestFlight and App Store Connect uploads, with dry-run support and optional explicit build numbers.
  • Preserve archives and export diagnostics under build/releases/. These upload commands do not submit for App Review or publish the app.
  • Advance app and model-downloader metadata to version 3.2.9, Build 403, and align release-metadata tests and documentation.
  • Update PhotoAIKit to revision 648ea75a1c6bf511e03e879100dc149e4cccd022 and Apple Core AI models to revision 52c84ba874b2c57adcede08a671ce96ed1b3f433.
  • Update Swift Hugging Face from 0.11.0 to 0.12.0.

Regression Coverage

  • Add tests for aborted and superseded catalog transitions and stale asynchronous sort results.
  • Add tests for retained catalog access across overlapping operations and Qwen analysis cancellation.
  • Add concurrent cache-accounting tests and complete-catalog JPEG extraction selection coverage.

These entries describe checked-in test coverage, not test results from preparing this changelog. No application tests, release uploads, or Hugo build were run while preparing this page.

Version 3.2.8

RAW 9 preview handling, AF-point sharpness sorting, and measured focus-location evidence in AI review.

Historical record dated 2026-10-02. Requirements and release status below refer to this version. For usage instructions, see the documentation.

Changes: v3.2.6 β†’ v3.2.8

This changelog continues from the 3.2.6 release notes and covers subsequent development through the latest source commit on September 30, 2026. It includes the intervening development leading to version 3.2.8 and does not establish App Store availability.

RawCull requires macOS 27 (Golden Gate) and an Apple Silicon Mac. Building from source requires Xcode 27.

Commit range: 89cb666..1c12bb0
Baseline: the 3.2.6 source snapshot documented in the previous release notes, Build 392
Latest commit: 1c12bb0 (update, 2026-09-30)
Current source version: RawCull 3.2.8 (Build 398)
Scope: 17 commits after the documented 3.2.6 snapshot

πŸš€ Major Enhancements

  • Request RAW 9 decoding for developed RAW previews and sharpness analysis.
  • Show RAW 9 in the image-source selector when the installed decoder supports it for the selected photograph.
  • Sort Grid View photographs by measured detail at the recorded autofocus point.
  • Display focus maps and camera autofocus markers alongside AI subject outlines.
  • Add measured focus-location evidence to individual Objects results.
  • Show keyboard shortcut help for the active review workspace.
  • Add a separate real-photo Release sharpness test plan and detailed Markdown reports.

πŸ–ΌοΈ RAW 9 Preview Handling

  • Request RAW 9 when developing full-size RAW JPEGs and generating sharpened previews for Zoom and comparison views.
  • Request RAW 9 in the production photo-analysis adapter.
  • Check the selected file’s supported decoder versions asynchronously, recognizing both RAW 9 and RAW 9 DNG support.
  • Label the developed source RAW 9 when supported, with corresponding help text and accessibility labels. Retain the RAW label and system-decoder guidance when RAW 9 is unavailable.
  • Update developed-RAW disk-cache keys so previews generated by the previous decoder are not reused. Embedded JPEG cache keys remain compatible.

Decoder availability is determined per photograph by the installed system; this change does not promise RAW 9 support for every camera or file.

🎯 AF-Point Sharpness Sorting

  • Change catalog/Grid View sharpness ordering to use the small AF-center measurement rather than the combined photograph score.
  • Require a valid recorded autofocus location and a finite, usable AF-center score before treating a photograph as measured.
  • Sort measured photographs strongest-first and place unknown measurements last, preserving the incoming order for ties and unknown values.
  • Rename the controls to Score AF Sharpness and AF-point sharpness, and show the number of photographs with AF measurements.
  • Save and restore AF-point scores separately from existing combined sharpness scores.
  • Keep legacy saved combined scores from enabling AF-point sorting when no usable AF measurements exist.

The smaller measurement region helps avoid ranking a photograph by nearby sharp background detail instead of the intended focus location. A score remains review evidence rather than a guarantee that the subject or eye is sharp.

🧠 Focus Evidence in AI Review

  • Add the generated focus map and camera autofocus point to the Objects overview alongside numbered regions and subject outlines.
  • Add per-object Measured focus locations showing whether the camera AF point lies inside the object, the object’s share of highlighted focus-map edges, and highlighted edges near the AF point when available.
  • Report missing focus information as unavailable.
  • Add focus maps and camera autofocus markers to SAM 3 + CLIP Deep Review previews alongside the subject mask.
  • Load preview and focus information asynchronously, with cancellation checks when the selected photograph changes.

These spatial measurements support inspection alongside Qwen’s assessment. Focus-map overlap alone does not confirm sharpness, and AI assessments remain advisory.

⌨️ Context-Sensitive Shortcut Help

  • Refine the About window to show shortcuts for the active workspace together with shared app commands.
  • Distinguish catalog browsing, Grid View, Loupe, Zoom, manual comparison, burst groups, burst review, and burst comparison contexts.
  • Match Zoom navigation help to the active vertical or horizontal navigation axis.
  • Expand guidance for focus masks, autofocus points, subject outlines, source switching, ratings, and burst actions.
  • Clarify that P means previous in Burst Review, where 0 keeps a photograph neutral.

πŸ§ͺ Release Sharpness Evaluation and Tests

  • Add make releasesharpnesstest and the separate ReleaseSharpness plan to the existing hostless Release integration target.
  • Analyze real ARW photographs in 11 scenarios covering all five presets, missing AF information, quality levels, image resolution, and embedded-preview versus RAW-demosaic input.
  • Run sharpness evaluation without requiring Qwen or SAM 3 models, using a separate explicit opt-in flag.
  • Write incremental Markdown reports containing configuration, algorithm identity, metadata, scores, available focus diagnostics, timings, failures, ordering comparisons, and a visual-inspection worksheet.
  • Preserve failed and unprocessed comparisons, and return failure for invalid or incomplete scoring runs.
  • Rename the Objects integration suite to ReleaseAIObjectsTest and retain separate plans and opt-in controls for Objects and sharpness runs.
  • Add regression coverage for AF-point ordering, invalid and missing measurements, saved-score handling, and object focus-location mapping.

The harness checks execution and numeric validity. Photographic ranking accuracy still requires visual review and expert-ranked comparison photographs. No application tests or real-photo benchmarks were run while preparing this changelog.

πŸ› οΈ Dependencies and Documentation

  • Advance app and downloader-extension metadata to version 3.2.8, Build 398.
  • Update RawParserKit from 1.3.0 to 1.3.1 and Swift Collections from 1.7.0 to 1.7.1.
  • Expand the Release integration documentation with sharpness scenarios and report interpretation.
  • Consolidate asset guidance into Docs/assets.md and add a future-release roadmap. Roadmap proposals are not implemented features or commitments for 3.2.8.

Version 3.2.6

Objects analysis with numbered subjects and crops, plus improved AI review and file-copy handling.

Historical record dated 2026-09-28. Requirements and release status below refer to this version. For usage instructions, see the documentation.

Changes: v3.2.4 β†’ v3.2.6

This changelog covers development since the released RawCull 3.2.4 through the latest source commit on September 28, 2026. It includes the intervening 3.2.5 work and the current 3.2.6 implementation; it does not establish App Store availability for 3.2.6.

RawCull requires macOS 27 (Golden Gate), an Apple Silicon Mac, and Xcode 27 when building from source.

Commit range: v3.2.4..89cb666
Baseline tag: v3.2.4 at 6612d1a (2026-09-21), RawCull 3.2.4 Build 383
Latest commit: 89cb666 (release test, 2026-09-28)
Current version: RawCull 3.2.6 (Build 392)
Scope: 64 commits after the 3.2.4 tag

The tagged baseline is used for this comparison. The earlier 3.2.4 blog post describes a pre-tag snapshot and lists Build 380; the released tag itself declares Build 383.

πŸš€ Major Features

  • Added Objects beside SAM 3 + CLIP and Qwen Vision in the AI Analysis workspace.
  • Added automatic discovery of visible object categories and a manual Specific Concepts mode.
  • Added separate SAM 3 object instances, numbered object crops, mask outlines, and Qwen assessments for each retained subject.
  • Added retryable object-assessment failures with reuse of compatible cached segmentation masks.
  • Fixed AI result views overriding a photograph selected in Grid View.
  • Allowed SAM 3 + CLIP Deep Review to run again when the analysis target changes.
  • Extracted focused comparison, Loupe, Zoom, Burst, and histogram presentation models.
  • Removed burst-grid Clean View and collapse controls so every frame remains visible.
  • Added an opt-in, hostless Release integration test target and Markdown analysis reports.

🧠 Objects: SAM 3 and Qwen Analysis

  • Added analysis of the selected or rated photographs already available to the AI Analysis workspace.
  • Added Automatic mode, where Qwen proposes concrete, visible object categories before SAM 3 locates their instances.
  • Added Specific Concepts mode with comma-separated categories such as bird, person, car.
  • Limited discovery and manual input to six concepts, normalized duplicate concepts, and rejected invalid or empty manual entries.
  • Added editable photographic criteria covering visibility, focus, expression, obstructions, and strengths.
  • Loaded analysis images at a maximum side of 4,320 pixels and requested up to eight SAM 3 instances per concept.
  • Filtered weak, empty, tiny, and near-full-image masks before assessment.
  • Deduplicated nearly identical masks across concepts while retaining alternative concept names as aliases.
  • Retained up to eight objects for the final review board, with numbered IDs and normalized bounding boxes.
  • Rendered one board containing the photograph overview and numbered object crops for Qwen to assess together.
  • Refined board numbering and aspect-fit rendering to keep crops and outlines readable.
  • Added prompts that distinguish repeated overview/crop views from separate photographs and require descriptions to match the numbered crops.
  • Added per-object descriptions, visibility, focus quality, expression, obstructions, strengths, problems, and confidence.
  • Added photograph-level summaries, relationships, strengths, problems, preferred object IDs, and confidence.
  • Treated segmentation with no retained objects as a valid result, without asking Qwen to assess an empty board.

πŸ–ΌοΈ Objects Results and Progress

  • Added a results table showing filename, retained-object count, concepts, Qwen confidence, and completion or failure status.
  • Added a detail panel with the photograph overview, numbered subject boxes, cached-mask outlines, and a crop of the selected object.
  • Displayed alternative concept aliases alongside the retained object category.
  • Distinguished SAM 3 mask scores from Qwen assessment confidence in the interface.
  • Added visible progress stages for image loading, concept discovery, segmentation, board preparation, and object assessment.
  • Added sequential batch processing, cancellation, Retry Failed, and Clear Results controls.
  • Preserved completed results and skipped successful photographs when continuing analysis.
  • Kept invalid structured assessments retryable and preserved the original response for inspection.
  • Reused cached segmentation for assessment retries when source metadata, concept mode, Qwen model name, and mask-cache entries remain compatible; otherwise performed segmentation again.
  • Added guidance for missing SAM 3, missing Qwen, both missing, no results, no matching objects, and no selected result.
  • Added accessibility labels for analysis modes, input sources, object concepts, results, mask scores, and selected-object crops.

πŸ”§ Qwen Response Reliability and Model Lifecycle

  • Added a general vision-request interface with an instruction, image, and response-token limit, shared by Qwen Vision and Objects.
  • Serialized Qwen generations across features sharing the same inference runtime.
  • Added cancellable waiting for queued generation requests.
  • Cancelled active inference when the model is cleared or revalidated, and rejected results from superseded model generations.
  • Validated token limits and rejected empty model responses.
  • Used 384 response tokens for concept discovery and 1,024 for object assessment; retained the existing 512-token whole-photo assessment limit.
  • Added JSON-envelope extraction followed by strict discovery and assessment validation.
  • Added specific errors for incomplete JSON, missing or mistyped fields, invalid values, excessive list lengths, and duplicate, unknown, or missing object IDs.
  • Required the structured assessment to cover exactly the object IDs sent on the board, with finite confidence values between zero and one.
  • Accepted observed response variations including numeric board IDs, an omitted optional image summary, and singular text values in list fields, while retaining ID and value validation.
  • Added optional private diagnostic capture of raw discovery and assessment responses with model, token-limit, and response-length metadata.
  • Added separate in-memory and optional disk stores for object masks, alongside the existing subject-mask stores.
  • Connected Objects availability to the application-owned SAM 3 service and shared Qwen runtime.
  • Cancelled Objects work when its model services change and disabled it while managed model locations are being refreshed.

🎯 AI Workspace, Selection, and Deep Review

  • Grouped image-source controls beside the analysis-tool choices and expanded the mode picker for the third tool.
  • Allowed switching tools or image sources during analysis, cancelling the affected in-flight work.
  • Preserved an existing Grid selection when returning to stored Qwen or Deep Review results; chose a result automatically only when no photograph was selected.
  • Tracked completed Deep Review photographs separately for each target preset.
  • Allowed photographs analyzed under one target to be analyzed under another, such as Full Subject or Head / Face.
  • Removed unused Deep Review summary presentation and controller forwarding code.

πŸ” Comparison, Loupe, Zoom, and Burst Review

  • Moved comparison selection, display scope, image state, source flags, viewport state, loading, reloads, and focus-mask work into ComparisonSessionModel.
  • Added a comparison presentation snapshot for visible files, rows, selection, recommendation, focus status, and analysis status.
  • Extracted shared image-review policies for source selection, rating display/actions, keyboard actions, zoom limits, and request identity.
  • Added LoupeSessionModel, ZoomSessionModel, and BurstWorkspaceSessionModel to own workspace-specific review state and lifecycle.
  • Routed review actions through focused rating, navigation, focus-analysis, and subject-outline dependencies.
  • Added request tracking and cancellation checks to prevent stale image or focus results from replacing current review state.
  • Hardened comparison completion handling so older reloads and bulk loads superseded by newer work are rejected.
  • Preserved the existing review controls and source choices during the session extraction.
  • Moved histogram bins and asynchronous presentation into HistogramPresentationModel.
  • Renamed the Loupe image view to LoupeMainImageView and standardized several model and view property names.

🎞️ Burst Grid and Catalog Sorting

  • Removed Clean View, the top-three-frame limit, and burst expand/collapse controls.
  • Kept every burst frame available in ranked order, appending frames absent from the ranking.
  • Kept review/defer actions without hiding frames after a review-state change.
  • Replaced the nested lazy horizontal stack with an eager stack so burst rows retain a stable height inside the outer lazy list.
  • Replaced generic catalog sort comparators with a typed descriptor for filename, modification date, and size, in either direction.
  • Used natural filename comparison and explicitly preserved input order for equal sort values.
  • Retained case-insensitive filename filtering after sorting.

πŸ“‚ Copy-Folder Access and Reliability

  • Added CopyBookmarkStore as the shared owner of destination bookmark creation, resolution, refresh, and access acquisition.
  • Preserved the existing destBookmark preference key so saved destinations remain usable.
  • Added scoped-access objects that release successful folder-access acquisitions once, including during cleanup or deinitialization.
  • Kept source and destination access active for the copy operation and released both during cleanup.
  • Refreshed stale destination bookmarks while access was active; a refresh failure did not discard an otherwise usable grant.
  • Preserved the previous saved destination if selecting or saving a replacement failed.
  • Added explicit missing, invalid, denied-access, and save-failure handling with folder-reselection guidance.
  • Updated the folder picker and copy executor to use the same bookmark store.
  • Standardized copy, source/destination, and output-presentation naming.

πŸ§ͺ Tests and Release Integration

  • Added Objects tests for concept normalization, invalid discovery, manual-input validation, response envelopes, exact board-ID matching, confidence validation, and observed schema variations.
  • Added tests for mask deduplication, concept aliases, numbered board crops, transparent contours, automatic analysis, no-match results, model-removal cancellation, and retries using cached masks.
  • Added runtime and model-download tests for Objects service composition and managed-model availability.
  • Added Qwen generation-gate coverage and opt-in real-model probes.
  • Added comparison-session, shared review-policy, focused-dependency, Loupe, Zoom, and Burst session tests.
  • Added regression coverage for comparison cancellation, out-of-order reloads, superseded bulk results, and selected image sources.
  • Added copy-bookmark tests for saved-destination compatibility, refresh behavior, denied access, failed replacement, and balanced access release.
  • Added natural-sort, stable-tie, and revised burst-frame-order coverage.
  • Raised the expected smoke enumeration from 222 to 227 tests and retained two performance tests.
  • Updated release-metadata expectations for version 3.2.6 and matching app/downloader build numbers.
  • Added RawCullReleaseTests, its shared scheme, and the ReleaseObjects test plan, separate from ordinary app, smoke, and performance tests.
  • Added make releastest to run the production Objects, Qwen, and RAW-loader sources in a hostless Release target on arm64 macOS 27.
  • Added configurable catalog and model paths, with a default nonrecursive scan of ARW files in Downloads.
  • Added a unique Markdown report written before model initialization, after each photograph, and at completion, containing identities, concepts, masks, assessments, timings, raw fallback responses, and failures.
  • Continued processing remaining photographs after a per-photo failure and returned failure for incomplete analysis.
  • Added isolated release-runner contract tests and required explicit environment opt-in for real-model inference.

πŸ“‹ Recorded Validation and Current Limits

  • The checked-in Objects workplan records a September 24 Xcode run with 466 tests passed and one skipped out of 467. This is recorded historical evidence, not a test run performed while preparing this changelog.
  • The documented eight-photo packaged-model probe produced 16 structured results from 16 analyses across Automatic and manual bird modes, with the expected board-ID sets.
  • The workplan also records completed in-app Automatic batches for eight puffin photographs and eight mixed-subject photographs.
  • Visual grounding remains under validation: recorded examples include swapped crop descriptions, repeated descriptions, and an incorrect additional-bird claim despite valid structured output and high reported confidence.
  • Objects assessments remain advisory. Structured decoding, successful model downloads, and Qwen confidence do not establish factual accuracy.
  • Successful photographs are skipped on subsequent analysis. Use Clear Results before comparing discovery modes or changing criteria for a photograph already marked Complete.
  • Broader subject/overlap/no-match testing, clean-install TestFlight lifecycle checks, and release-build resource measurements remain documented follow-up work.

πŸ› οΈ Dependencies, Build, and Documentation

  • Advanced the tagged RawCull 3.2.4 Build 383 baseline through 3.2.5 and into RawCull 3.2.6 Build 392.
  • Updated PhotoAIKit to revision 77cc1d84a5d98a485caa15be102c8a55eb3d7698, including the additive SAM 3 instance API alongside existing union-mask support.
  • Updated Apple Core AI models to revision 475c585fdb0fe82a83c8f777f259e9414bd44c98.
  • Updated resolved Swift ASN.1 to 1.7.3, Swift Collections to 1.7.0, and Swift Hugging Face to 0.11.0.
  • Extended AI import-boundary verification for the object-analysis workflow.
  • Updated the README for the current AI workflows, model requirements, and application structure.
  • Expanded the SAM 3 β†’ Qwen workplan with implementation checkpoints, response-reliability findings, real-model results, known issues, and remaining release evidence.
  • Added a detailed Apple-hosted model-pack runbook covering packaging, provenance, uploads, processing, and exact-build TestFlight download checks.
  • Revised Apple assets documentation to distinguish the released 3.2.4 distribution baseline from ongoing 3.2.6 Objects validation.
  • Documented the separate Release integration runner and its report format.

πŸ“¦ Development Progression

  • September 21: began post-3.2.4 correctness hardening and catalog/review refinements.
  • September 22: extracted comparison and shared review policies, adopted focused Loupe/Zoom/Burst sessions, and refined burst presentation.
  • September 23: completed the 3.2.5 work, strengthened copy bookmarks, fixed AI result selection and target reruns, and advanced to Build 388.
  • September 24: implemented the 3.2.6 Objects pipeline, UI, caching, response validation, and real-model validation refinements.
  • September 26: updated release and model-pack guidance with Objects test evidence and known visual-grounding issues.
  • September 28: added the Release Objects integration test target and report runner; current source is Build 392 at 89cb666.

Version 3.2.4

A dedicated AI Analysis workspace with local Qwen Vision assessments of selected photographs.

Historical record dated 2026-09-20. Requirements and release status below refer to this version. For usage instructions, see the documentation.

Changes: v3.2.1 β†’ v3.2.4

Version 3.2.4 is submitted for update on Apple App Store.

RawCull 3.2.4 requires macOS 27 (Golden Gate), an Apple Silicon Mac, and Xcode 27 when building from source.

Commit range: v3.2.1..3b39d82
Latest commit: 3b39d82 (AI, 2026-09-20)
Current version: RawCull 3.2.4 (Build 380)

πŸš€ Major Features

  • Added a dedicated AI Analysis workspace for photographs selected in Grid View or rated two stars and higher.
  • Added a choice between SAM 3 + CLIP Deep Review and local Qwen photo assessment.
  • Added Qwen3-VL-2B-Instruct to RawCull’s verified model catalog and Managed Background Assets workflow.
  • Added Apple-hosted model delivery for DataComp CLIP, SAM 3, and Qwen3-VL-2B-Instruct.
  • Added local, criteria-driven vision-language assessment with structured scores, strengths, problems, confidence, and subject details.
  • Improved SAM 3 prompt selection by using cached CLIP artifacts to infer coarse subject labels.

✨ AI Analysis Workspace

  • Added an AI Analysis toolbar action that becomes available when a catalog has selected or rated images to review.
  • Added separate input choices for the current Grid selection and photographs rated two stars or higher.
  • Preserved the selected photographs when moving between Grid View and AI Analysis.
  • Added a horizontal thumbnail strip so the complete analysis set remains visible while reviewing results.
  • Added empty-state guidance when the chosen input source has no photographs.
  • Moved Deep Review out of burst-group headers and into the focused AI Analysis workflow.
  • Allowed SAM 3 + CLIP analysis to operate on an arbitrary selected or rated set, not only an existing burst group.
  • Applied the SAM 3 + CLIP recommendation back to RawCull’s current selection and returned directly to Grid View when the review closes.

🧠 Qwen Photo Assessment

  • Added local Qwen3-VL vision-language inference through PhotoAIKit’s Core AI Qwen backend.
  • Added editable assessment criteria, with a default review covering composition, exposure, subject visibility, expression, and obstructions.
  • Added sequential batch analysis with per-image progress, cancellation, partial-failure handling, and protection against stale results.
  • Added structured results for subject, composition, exposure, visibility, eye state, strengths, problems, overall score, and confidence.
  • Added a sortable results table and a detail panel for each analyzed photograph.
  • Preserved useful free-form model responses when Qwen does not return the structured schema.
  • Added clear unavailable, validating, missing, invalid, and ready states for the active Qwen model.
  • Rejected text-only Qwen models because RawCull requires a compatible vision-language bundle.
  • Kept Qwen assessments advisory so photographers can verify the model’s conclusions before making culling decisions.

πŸ“¦ AI Models and Downloads

  • Added the verified Qwen3-VL-2B-Instruct Core AI model pack to the model-download catalog.
  • Added Qwen provenance, Apache 2.0 licensing, Apple Core AI conversion notices, archive size, installed size, and SHA-256 verification.
  • Added Qwen to the Managed Background Assets manifest beside DataComp CLIP and SAM 3.
  • Added automatic use of the downloaded managed Qwen model with an optional custom Core AI model-folder override.
  • Added security-scoped bookmark persistence for custom Qwen model folders.
  • Added model revalidation, source switching, clearing, and recovery when a saved custom model can no longer be accessed.
  • Updated DataComp CLIP and SAM 3 provenance records for the new model release.
  • Updated the production download service to use Apple’s hosted asset-pack manifest.
  • Added App Store Background Assets metadata, shared app-group configuration, and packaging support for all three model packs.
  • Updated model release documentation with the v4 asset-pack workflow and verified archive information.

🎯 SAM 3 and CLIP Review

  • Added CLIP-based coarse subject classification for person, bird, deer, animal, car, and landscape prompts.
  • Reused compatible cached CLIP embeddings when selecting a SAM 3 subject prompt, without decoding source images again.
  • Retained saliency-derived subject labels as a fallback when CLIP evidence is unavailable.
  • Added support for Deep Review contexts created from selected photographs that do not belong to a saved burst group.
  • Improved subject-mask outlines so disconnected subjects each receive a visible contour.
  • Kept Deep Review cancellation, recommendation, focus-mask, and subject-detail behavior within the focused controller.

πŸ–ΌοΈ Grid, Selection, and Sorting

  • Kept multi-image Grid selections intact when moving between RawCull workspaces.
  • Added a focused-image fallback when no multi-selection exists.
  • Preserved catalog order when passing selected photographs into AI Analysis.
  • Updated sharpness sorting so enabling it selects the sharpest visible photograph and resets the grid position consistently.
  • Preserved the current selection when sharpness sorting is disabled.
  • Simplified Grid and Similarity views after moving Deep Review presentation into AI Analysis.

πŸ§ͺ Testing and Quality

  • Added tests for AI Analysis input selection, catalog ordering, focused-image fallback, and selection persistence across view changes.
  • Added Qwen tests for compatible model validation, text-only model rejection, structured response decoding, free-form fallback, invalid scores, and empty responses.
  • Added model-catalog tests for the Qwen asset pack, provenance revision, sizes, checksums, and release readiness.
  • Added tests for managed Qwen installation, custom-model selection, model-source switching, and saved-folder recovery.
  • Added tests for CLIP-assisted Deep Review subject labels and arbitrary selected-image review contexts.
  • Added coverage for disconnected SAM 3 mask contours and sharpness-sort selection behavior.
  • Expanded release-metadata verification for version 3.2.4, Build 376, Apple-hosted Background Assets, app-group settings, and the three production asset packs.
  • Updated the smoke-test manifest for the new release.

πŸ› οΈ Build and Documentation

  • Advanced RawCull from version 3.2.1 Build 360 to version 3.2.4 Build 376.
  • Added the CoreAIQwenBackend product and updated PhotoAIKit to revision c5c76590c3d79ad508d24d893cd7d8d6aa873355.
  • Added the App Store-specific Background Assets information property list and export configuration.
  • Updated archive and verification tasks for Apple-hosted model assets.
  • Updated the README with Qwen, AI Analysis, local-inference, model-setup, architecture, and TestFlight information.
  • Documented the DataComp CLIP, SAM 3, and Qwen3-VL roles and how their evidence differs.

πŸ“¦ Version Progression

  • Started from RawCull 3.2.1, Build 360.
  • Refined Grid View selection and sharpness-sorting behavior.
  • Added the Qwen3-VL inference layer, model validation, settings, and batch-analysis presentation.
  • Added the combined AI Analysis workspace for SAM 3 + CLIP and Qwen.
  • Added the Qwen model pack and migrated production model delivery to Apple-hosted Managed Background Assets.
  • Completed release metadata and packaging for RawCull 3.2.4, Build 376.
  • Updated this changelog through commit a6e1d1c on 2026-09-18.

Version 3.2.1

Local CLIP and SAM 3 workflows, managed model downloads, and review-interface improvements.

Historical record dated 2026-09-10. Requirements and release status below refer to this version. For usage instructions, see the documentation.

Changes: v3.1.1 -> v3.2.1

Updated on Apple App Store.

RawCull 3.2.1 requires the latest macOS 27 (Golden Gate), an Apple Silicon Mac, and Xcode 27 when building from source.

Commit range: 3b1c41d..3caf6ba
Latest commit: 3caf6ba (Upgrade PhotoAIKit and CoreAI (#11), 2026-09-10)
Current version: RawCull 3.2.1 (Build 360)

πŸš€ Major Features

  • Released the RawCull 3 local AI workflow.
  • Added natural-language semantic photo search using DataComp CLIP.
  • Added DataComp CLIP-powered visual similarity analysis and burst grouping.
  • Added SAM 3 Deep Review with subject isolation, detail scoring, and burst-winner recommendations.
  • Added managed downloads for verified DataComp CLIP and SAM 3 model packs.
  • Added persistent storage for AI embeddings, masks, scores, signatures, and burst-review decisions.
  • Modularized the complete AI application layer while preserving the RawCull 3.1.1 workflow, ranking policies, cache formats, preferences, and migration behavior.

🧩 Modular AI Architecture

  • Added one application-owned RawCullIntelligenceRuntime that creates and retains stable AI feature objects for the app session.
  • Replaced settings callbacks with revisioned, typed AI configuration snapshots that reject stale updates and avoid unnecessary restarts.
  • Split model discovery, downloads, license acceptance, progress, cancellation, retry, removal, and installed-model locations into a focused model-management component.
  • Added dedicated semantic-search and similarity feature surfaces so views no longer inspect providers, embeddings, repositories, or backend descriptors directly.
  • Moved burst computation into a dedicated coordinator with typed pipeline values, cache restoration, compatibility migration, grouping, ranking, lifecycle handling, and review-state preservation.
  • Added a focused Deep Review controller for availability, request construction, operation lifecycle, cancellation, and burst-specific winner application.
  • Reorganized the AI source files under RawCull/Intelligence into Composition, Contracts, Similarity, SemanticSearch, BurstAnalysis, DeepReview, ModelManagement, Persistence, and Presentation areas.
  • Kept the intelligence boundary application-local after evaluating a separate Swift package; the current code still depends intentionally on app-owned catalog snapshots, paths, resources, policy callbacks, and Background Assets wiring.
  • Removed temporary view-model constructors, runtime model exposure, and semantic-search, similarity, and Deep Review forwarding APIs after callers migrated to the focused features.
  • Added exact import-boundary enforcement for all concrete AI backends and PhotoAIKit products. SwiftUI views and general model code no longer import restricted AI modules.
  • Kept persistence modularization Phase 9 deferred to avoid mixing storage API changes with the completed structural refactor. Existing on-disk formats remain unchanged.

🧠 AI Models and Downloads

  • Added dedicated AI model settings and model-management views.
  • Added model bundle discovery, validation, and resource management.
  • Added support for DataComp CLIP and SAM 3 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.
  • Published the V3 managed model release containing DataComp CLIP and SAM 3 asset packs.
  • Added archive size and SHA-256 verification for the published CLIP and SAM 3 downloads.
  • Added provenance validation that rejects incomplete, mismatched, blocked, or malformed production model records.
  • Added EfficientSAM license and provenance records for future use; EfficientSAM is not included in the production download manifest.
  • Improved model-download validation, retry behavior, error handling, and test coverage.
  • Fixed modular-runtime and model-download integration after the Intelligence file reorganization.
  • Documented the version coordination required across RawCull, the downloader extension, Background Assets manifests, and model bundles.
  • Updated PhotoAIKit to v2.4.0 and the matching apple/coreai-models revision.
  • Updated the resolved xgrammar dependency to its released 0.2.2 version.
  • Retained the V3 compiled DataComp CLIP and SAM 3 assets. A V4 model release is not required unless a future CoreAI export changes the verified model artifacts or model contract.

πŸ” 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 DataComp CLIP index entries are missing.
  • Improved similarity backend status and progress presentation.
  • Reserved consistent space for semantic-search activity messages to prevent layout shifts.
  • Improved selection coordination and keyboard navigation.
  • Refined grid controls, button styling, and rating interactions.
  • Routed similarity state and actions through the focused similarity feature instead of the central application view model.
  • Added RawCull-owned semantic-search backend presentation values for UI and accessibility without exposing PhotoAIKit types.
  • Added Deep Review availability indicators and overlay controls to thumbnail presentation.

πŸ”Ž 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.
  • Added keyboard actions for the zoom overlay.
  • Added optional focus-mask and subject-outline presentation to the zoom workflow.
  • Preserved native preview detail for focus-mask analysis instead of using sharpened thumbnail output.

🎞️ Burst View and Deep Review

  • Redesigned the burst-culling workspace around a photo-first review experience.
  • Redesigned the Burst Groups home screen with a guided Next up card, review queues, recent groups, and completion progress.
  • Added staged catalog-preparation status for semantic indexing, sharpness scoring, and burst-group discovery.
  • Added clearer progress and estimated-time feedback while preparing a catalog.
  • Added separate queues for bursts that need review, completed bursts, and all burst groups.
  • Added maintenance actions for scoring parameters, catalog re-indexing, and similarity indexing.
  • 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.
  • Added SAM 3 subject-mask outlines for Deep Review and focus workflows.
  • Added mask-outline controls and availability feedback.
  • Fixed focus-mask source selection for burst JPEG previews.
  • Preserved manual winners and review decisions when compatible burst groups are restored or recomputed.
  • Isolated burst analysis from catalog navigation and rating actions while retaining the existing user workflow.

πŸ—‚οΈ Sidebar, Navigation, and File Operations

  • Refined the main catalog sidebar and file presentation.
  • Added clearer empty, filtered, and missing-file states.
  • Made the empty-state catalog icon an accessible button that opens the catalog folder picker.
  • Improved scan progress by reporting the discovered-file count directly.
  • Added accurate completed/total progress for thumbnail creation and JPEG export.
  • 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.
  • Corrected rated-photo counts so only files with an explicit rating are counted.
  • Improved copy-file startup, completion reporting, source and destination presentation, and recovery after interrupted work.
  • Improved JPEG extraction selection handling and per-file failure reporting.

⚑ 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.
  • Simplified thumbnail and shared-memory cache paths after removing obsolete diagnostics instrumentation.
  • Reduced CullingGridView rendering work identified during performance tracing.
  • Reduced image-downscaling work identified during performance tracing.
  • Made histogram loading use the latest request when selections change quickly.
  • Reduced histogram-processing cost by sampling large previews to a maximum dimension of 512 pixels.
  • Improved JPEG extraction progress, cancellation handling, selection behavior, and per-file failure reporting.
  • 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.
  • Preserved generation-token and cancellation behavior so superseded AI work cannot publish stale results.
  • Kept DataComp CLIP and SAM 3 artifacts separated by compatible model identity.
  • Used PhotoAnalysisKit focus-mask morphology defaults and removed obsolete RawCull visibility overrides.

β™Ώ 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.
  • Added accessible labeling and guidance to the empty-state Add Catalog button.
  • Improved keyboard-accessible culling and navigation actions.
  • Added accessible progress descriptions to the redesigned Burst Groups workflow.
  • Decoupled semantic-search accessibility from PhotoAIKit backend types.
  • Added accessible state and controls for Deep Review mask availability and subject outlines.

πŸ§ͺ Testing and Quality

  • Added tests for semantic search, Deep Review, similarity features, burst coordination, and intelligence-runtime identity and configuration.
  • Added model-download and model-validation test coverage, including retry and modular-runtime integration.
  • Added provenance-validation tests covering malformed records, missing evidence, archive mismatches, blocked distributions, and invalid notice hashes.
  • Added thumbnail cache identity and contention tests.
  • Added histogram request-ordering and bounded-sampling tests.
  • Added typed AI persistence and cache-boundary tests.
  • Added accessibility presentation tests.
  • Added Loupe and Burst metadata tests.
  • Added focused tests for Burst catalog-preparation presentation and JPEG-export selection behavior.
  • Added tests for comparison-image source selection, focus-mask resolution policy, subject-mask outline rendering, zoom-overlay keyboard actions, copy completion, and quit recovery.
  • Updated culling, burst queue, navigation, concurrency, and thumbnail-provider tests for the focused AI feature boundaries.
  • Added isolated test factories so AI and view-model tests do not depend on production caches, settings, or user data.
  • Added checked-in smoke and performance enumeration verification with duplicate-identifier protection.
  • Expanded the smoke manifest to 208 unique test selectors and retained two performance tests.
  • Built RawCull successfully after resolving the PhotoAIKit v2.4.0 and CoreAI dependency upgrade.

🧹 Diagnostics and Code Cleanup

  • Removed the Diagnostics menu and the memory, RAW-file, similarity, and semantic-search diagnostics screens.
  • Removed the supporting diagnostics logs, view models, cache statistics, and obsolete contention instrumentation.
  • Removed unused production APIs and their obsolete test-only coverage.
  • Retained active operational logging and intentional test-support APIs.
  • Removed obsolete AI compatibility shims after all callers moved to focused feature APIs.
  • Completed an unused-code and import audit across RawCull/Intelligence with no findings in the modular AI boundary.
  • Removed superseded modular-AI planning documents after consolidating the active model-release and provenance guidance.

πŸ› οΈ Build and Documentation

  • Updated the project for the RawCull 3.2.1 release.
  • Advanced RawCull to Build 360.
  • Added a dedicated model-downloader target and supporting entitlements.
  • Updated Swift package dependencies and project configuration.
  • Updated PhotoAIKit to v2.4.0 and CoreAI models to revision cc8120.
  • Added model installation, provenance, licensing, and macOS Background Assets release documentation.
  • Added detailed modular-AI architecture, migration, dependency-boundary, rollback, and validation documentation.
  • Added a high-level modular-AI guide for contributors who are new to the architecture.
  • Updated the README with the version-3.2.1 release requirements, AI workflow, model-download guidance, and build instructions.
  • Updated export, release, smoke-test, performance-test, import-boundary, and model-provenance verification.

πŸ“¦ Version Progression

  • Released the initial RawCull 3.0.0 implementation.
  • Stabilized AI persistence, thumbnail loading, accessibility, and release validation.
  • Advanced the project through RawCull 3.1.0 and RawCull 3.1.1 Build 345.
  • Started RawCull 3.2.0 as the modular-AI development branch from the 3.1.1 behavior and data-format baseline.
  • Completed modular-AI Phases 0-8, 10, 11, and 12; intentionally deferred persistence Phase 9.
  • Published the V3 DataComp CLIP and SAM 3 managed model packs.
  • Added Deep Review mask outlines, focus-mask improvements, copy-file reliability fixes, and performance improvements.
  • Updated RawCull to PhotoAIKit v2.4.0 and its matching CoreAI revision.
  • Released RawCull 3.2.1, Build 360.
  • Updated this changelog through commit 3caf6ba on 2026-09-10.

Version 3.0.0

The macOS 26 workflow: burst review, metadata, previews, ratings, and reliability improvements.

Historical record dated 2026-08-31. Requirements and release status below refer to this version. For usage instructions, see the documentation.

Changes: v2.3.5 β†’ v3.0.0

Updated on Apple App Store.

Important: This release is the final version for macOS 26. The next version, 3.2.0, will introduce AI features exclusively available on macOS 27 upon its release. Version 3.0.0 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.2.0 is released.

--- ## πŸ‚ macOS Tahoe
  • Updated RawCull for macOS Tahoe 26.
  • Retained Apple Silicon as the supported architecture.
  • Updated project settings, dependencies, metadata, entitlements, and release configuration.
  • Updated the application version to 3.0.0.

πŸ‘οΈ Vision similarity

  • Rebuilt image similarity around Apple Vision feature prints supplied by PhotoAnalysisKit.
  • Vision is the sole similarity backend.
  • Added a dedicated Vision similarity service and simplified runtime composition.
  • Added bounded parallel indexing, progress reporting, cancellation, and partial-failure handling.
  • Added finite-distance validation to prevent invalid similarity results.
  • Added cache-first loading so previously indexed photographs can be reused.
  • Added generation tracking so cancelled or superseded operations cannot publish stale results. RawCull 3.0.0 contains no CLIP, semantic search, SAM, Deep Review, downloadable models, model licences, or external model runtime.

πŸ“Έ Burst analysis and review

  • Reorganized burst processing around a dedicated BurstAnalysisCoordinator.
  • Added clearer lifecycle handling for catalog preparation, indexing, grouping, ranking, and cancellation.
  • Added an explicit catalog-preparation screen before burst analysis.
  • Added more reliable reuse of compatible saved burst analysis.
  • Added a choice between using an existing index and performing a full re-index.
  • Improved review-queue counts and filtering.
  • Preserved manual winner selection, ratings, rejection, undo, and review state.
  • Prevented older analysis generations from overwriting newer results.
  • Improved progress presentation during sharpness scoring, similarity indexing, and grouping.

πŸ” Loupe and metadata

  • Corrected Actual Pixels to display one source-image pixel per display point.
  • Improved Actual Pixels centring around autofocus points.
  • Added safe clamping for focus points near image edges.
  • Added protection against invalid image and viewport geometry.
  • Added F to show or hide the focus map.
  • Added A to show or hide camera autofocus points.
  • Added E to show or hide image metadata.
  • Retained J for embedded JPEG and R for developed RAW previews.
  • Added a collapsible metadata panel containing file, camera, exposure, rating, focus, sharpness, and histogram information.
  • Added Show in Finder and Open RAW File actions to the metadata panel.
  • Replaced the older file inspector with the integrated metadata presentation.

πŸ–ΌοΈ Histograms and previews

  • Made histogram loading cancellation-safe.
  • Added latest-result-wins behavior when navigating quickly between photographs.
  • Removed the crash path for failed image conversion.
  • Histograms now clear safely when an image cannot be loaded.
  • Improved comparison-image loading and cancellation.
  • Added richer metadata and histogram information to burst comparison views.
  • Improved source selection between thumbnails, embedded JPEGs, and developed RAW previews.

⭐ Rating and selection

  • Rating filters now activate only when the selected catalog contains explicit ratings.
  • Improved multi-selection behavior in thumbnail and culling grids.
  • Improved Command-click, Shift-click, and keyboard selection handling.
  • Preserved selection correctly while navigating grids and comparison views.
  • Improved rating application across multiple selected photographs.
  • Improved rating, keeper, and rejection presentation.
  • Prevented selection state from becoming detached from updated catalog records.

πŸ“ Catalogs and saved files

  • Improved the main catalog sidebar and its empty states.
  • Saved catalogs no longer cause an incorrect β€œNo Files Found” message.
  • Converted saved catalog and file rows to native button interactions.
  • Improved selection persistence in the Saved Files window.
  • Added clearer VoiceOver descriptions for saved catalogs and records.
  • Improved handling of damaged saved-state files.
  • Added an option to archive damaged persistence data and reset safely.
  • Improved atomic writing of settings and saved data.

⌨️ Menus and shortcuts

  • Added File β€Ί Add Catalog… with ⌘O.
  • Added menu commands for copying tagged files and showing saved files.
  • Added Actions β€Ί Extract JPGs with ⌘J.
  • Added Actions β€Ί Abort task with ⌘K.
  • Simplified the main toolbar by moving secondary actions into menus and contextual panels.
  • Added a redesigned, context-sensitive About window.
  • The About window now documents shortcuts for browsing, rating, previews, burst groups, burst review, and manual comparison.

⚑ Cache and performance

  • Added source-aware thumbnail cache identities.
  • Thumbnail keys now include source metadata, requested size, purpose, and orientation policy.
  • Replacing a photograph at the same path no longer reuses its stale thumbnail.
  • Improved separation between thumbnail, full-size preview, similarity, and burst-analysis caches.
  • Added bounded thumbnail preloading during catalog scans.
  • Reduced duplicate thumbnail decoding and scan/grid contention.
  • Improved memory- and disk-cache consistency.
  • Added reusable per-file Vision artifact storage.
  • Added a new Vision-specific cache schema and compatibility signature.
  • Old or incompatible similarity caches are treated as regenerable cache misses.
  • Catalogs, ratings, source photographs, and exported files remain outside cache cleanup.

β™Ώ Accessibility

  • Added clearer VoiceOver labels, values, hints, and selected states.
  • Improved accessibility for thumbnails, ratings, focus controls, image sources, saved files, and comparison images.
  • Improved keyboard navigation throughout catalog and review workflows.
  • Preserved established single-click and double-click image behavior.
  • Added accessible descriptions for progress and review states.
  • Improved focus handling when moving between grids, previews, and sheets.

🧹 Streamlining

  • Removed the standalone RAW diagnostics panel.
  • Removed the standalone memory diagnostics console.
  • Replaced the old file inspector with the integrated metadata panel.
  • Removed obsolete cache statistics and diagnostic infrastructure.
  • Consolidated similarity and burst-related implementation under the new Intelligence structure.
  • Simplified settings while retaining cache, thumbnails, focus, and general configuration.

πŸ›‘οΈ Reliability

  • Improved structured cancellation across scanning, extraction, thumbnail generation, sharpness scoring, similarity indexing, and burst analysis.
  • Improved source fingerprint validation for cached artifacts.
  • Corrupt or incompatible cache records now behave as cache misses rather than breaking catalog loading.
  • Improved atomic cache and settings writes.
  • Improved persistence error reporting and recovery.
  • Strengthened security-scoped file access handling.
  • Improved task isolation and reduced the risk of stale UI updates.

πŸ§ͺ Tests and release verification

  • Added Vision similarity service and persistence tests.
  • Added burst coordinator lifecycle and compatibility tests.
  • Added catalog-preparation presentation tests.
  • Added thumbnail identity and same-path replacement tests.
  • Added histogram cancellation and latest-result tests.
  • Expanded grid selection, comparison navigation, rating, and persistence tests.
  • Added metadata-panel and keyboard-shortcut tests.
  • Added accessibility presentation tests.
  • Added release metadata and smoke-manifest integrity tests.
  • Strengthened concurrency and Thread Sanitizer coverage.
  • Added automatic verification that release test manifests remain complete.

Version 2.3.5

More reliable actual-pixels inspection, histograms, thumbnail caching, and catalog loading.

Historical record dated 2026-08-07. Requirements and release status below refer to this version. For usage instructions, see the documentation.

Changes: v2.3.3 β†’ v2.3.5

Updated on Apple App Store.

--- 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 Z keyboard 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 fatalError from 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 FileInspectorView image 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.xctestplan the sole smoke-test selector.
  • Smoke membership is now controlled by Swift Testing’s .smoke tag.
  • Removed the duplicate Makefile smoke-suite allow-list.
  • New smoke tests only need the .smoke tag; 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.resolved Release 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.framework dependency.

🧰 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.5
  • CFBundleVersion: 335
  • LSMinimumSystemVersion: 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 main and version-3.0.0 implementation.
  • 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 231 is 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.5 tag at the exact tested commit.

πŸ“ Implementation Commits

  • 5da6ff4 β€” Record RawCull 2.3.5 stabilization baseline
  • 53c3057 β€” Fix actual-pixel viewport behavior and tests
  • 7ba0a32 β€” Make histogram loading cancellation safe
  • 5e802e6 β€” Make release test gates authoritative
  • 2f9b033 β€” Make thumbnail cache identity source aware
  • 4874fa1 β€” Gate thumbnail grids during catalog preload
  • dea2b9b β€” Close similarity persistence regression gaps
  • 36157c9 β€” Improve bounded accessibility semantics
  • ab711df β€” Update RawCull 2.3.5 metadata documentation
  • de58ca3 β€” Stabilize integrated release verification
  • f2f86b6 β€” Prepare release and AI-safe 3.0.0 handoff

Version 2.3.3

Reusable similarity artifacts, improved burst grouping, and context-sensitive shortcut guidance.

Historical record dated 2026-08-01. Requirements and release status below refer to this version. For usage instructions, see the documentation.

Changes: v2.3.2 β†’ v2.3.3

Updated on the 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 J switches 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.2 to 2.3.3.
  • Updated the build number from 229 to 230.

Version 2.3.2

Ranked burst frames, clearer candidate evidence, and Find Similar improvements.

Historical record dated 2026-07-23. Requirements and release status below refer to this version. For usage instructions, see the documentation.

Changes: v2.3.0 β†’ v2.3.2

Updated on the 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

Shared photo-analysis components, improved cache controls, and burst-review refinements.

Historical record dated 2026-07-19. Requirements and release status below refer to this version. For usage instructions, see the documentation.

Changes: v2.2.6 β†’ v2.3.0

πŸš€ Version 2.3.0

Updated on the 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.0 Git tag has not yet been created.

Version 2.2.6

A redesigned burst-group overview, a dedicated burst reviewer, and expanded keyboard controls.

Historical record dated 2026-07-13. Requirements and release status below refer to this version. For usage instructions, see the documentation.

Changes: v2.2.4 β†’ v2.2.6

πŸš€ Version 2.2.6

Updated on the 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 P and N for previous and next burst frames.
  • Added G to 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 B for keeping the best candidate on the burst comparison screen.
  • Clarified that P means previous frame during burst review; use 0 to 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

JPG export improvements, RAW-loading changes, and more responsive background processing.

Historical record dated 2026-07-03. Requirements and release status below refer to this version. For usage instructions, see the documentation.

Changes: v2.2.1 β†’ v2.2.4

Updated on the 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.jpg suffix.
  • Added extraction progress overlay in the main view.

πŸ“· RAW Loading Refactor

  • Introduced a shared RawImageLoading abstraction.
  • Centralized metadata, thumbnail, and preview loading through RawParserKit.
  • Added FullSizePreviewLoader for reusable full-size embedded preview loading.
  • Sidecar .jpg files 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 RawParserKit from 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

  • ScanFiles now 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 RawCullPeriphery Xcode scheme.
  • Updated .periphery.yml to use the new scheme and exclude tests.
  • Removed obsolete local helper files:
    • SupportedFileType.swift
    • ThumbnailError.swift
    • OrientationNormalizedImageLoader.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.1 as the App Store release.

πŸ“¦ Commit Range Summary

  • From: v2.2.1
  • To: latest commit e46f76d on version-2.2.5
  • Total: 17 commits
  • Diff size: 47 files changed, 1352 insertions, 1122 deletions

Version 2.2.1

More reliable burst cancellation, cache validation, saved review state, and copy-output reporting.

Historical record dated 2026-06-27. Requirements and release status below refer to this version. For usage instructions, see the documentation.

Changes: 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 RsyncAnalyse package dependency.
  • Updated app version/build settings to 2.2.1 / build 221.
  • Updated README release information for v2.1.8.

Version 2.1.8

Actual-pixels inspection, faster rating navigation, and adaptive memory handling.

Historical record dated 2026-06-22. Requirements and release status below refer to this version. For usage instructions, see the documentation.

Changes: v2.0.5 β†’ 2.1.8

Updated on Apple App Store.

πŸ” Actual-Pixels Inspection

  • Added Z as 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 FileRecord convenience 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 Z actual-pixels inspection in comparison navigation.

πŸ› οΈ Maintenance

  • Aligned project versioning across build settings and release branches.
  • Added a test-performance Makefile target.
  • Performed cleanup in scoring parameter UI and cache-related code.

Version 2.0.5

Correctly oriented previews and sharpness and burst analysis scoped to selections or rating filters.

Historical record dated 2026-06-18. Requirements and release status below refer to this version. For usage instructions, see the documentation.

Changes: 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

JPG/RAW source switching, burst-review queues, and reorganized comparison and RAW parsing.

Historical record dated 2026-06-09. Requirements and release status below refer to this version. For usage instructions, see the documentation.

Changes: 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 ImageSourceToggleView with keyboard shortcut support
  • ZoomPreviewHandler significantly expanded to manage source switching
  • ZoomOverlayView updated with key-action routing
  • FullSizeJPGDiskCache extended to support the toggle flow
  • New DiskCacheAndScanAdmissionTests covering 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 BurstReviewQueueCounts value type exposed on RawCullViewModel
  • 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 SimilarityGridSelectionView toolbar β€” live counts shown inline; filter resets to .all on Exit Groups
  • Auto-sharpness scoring toggle removed from toolbar; scoring now triggered automatically via runWithAutoScoring before 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 navigation
  • CullingGridRenderCache β€” per-cell image caching (keyed by CullingGridRenderCacheKey)
  • CullingGridProgressOverlay β€” loading progress overlay
  • Cell data flow cleaned up: isSelected, ratingValue, ratingDisplay, ratingColor now passed directly to ImageItemView, removing ViewModel look-ups inside the cell

πŸ—οΈ Refactored β€” ComparisonGridView decomposed and redesigned

  • ComparisonGridDisplayState β€” display/layout state extracted from the view
  • ComparisonGridImageCoordinator β€” 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
  • BurstComparisonEvidenceView promoted 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; ThumbnailError typed 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 internal FileItem)
  • Histogram: HistogramCalculator (replaces the internal CalculateHistogram)
  • ✨ 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

  • FocusPeakingControlsView and related BurstAnalysisModels display-only properties removed (moved to package / no longer needed)
  • CacheSettingsTab simplified β€” removed stale showResetConfirmation, showSaveSettingsConfirmation, and cacheConfig state variables
  • SharedMemoryCache β€” 34 lines of redundant code removed
  • SettingsViewModel β€” dead state and unused helpers pruned
  • ImageItemView β€” substantial simplification following the cell data-flow refactor
  • SharedMainToolbarContent β€” 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) β€” BurstWinnerOverride exact-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

Horizontal burst comparison, extracted-JPG inspection in Loupe, and clearer scoring evidence.

Historical record dated 2026-06-04. Requirements and release status below refer to this version. For usage instructions, see the documentation.

Changes: 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

Sharpness presets and precision modes, improved focus evidence, and stronger burst-review controls.

Historical record dated 2026-05-31. Requirements and release status below refer to this version. For usage instructions, see the documentation.

Changes: 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

  • SharpnessScoringTests expanded heavily around RAW demosaic selection, focus-evidence region choice, visibility relaxation, patch ranking heuristics, focus-failure classification, aperture hints, ISO ramps, and concurrent scoring.
  • BurstAnalysisTests added 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

  • BurstAnalysisTests now 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.
  • BurstAnalysisCache gained 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

  • BurstAnalysisTests expanded for grouping, confidence handling, manual winners, reanalysis, and safe one-click culling.
  • New ComparisonCandidateInspectorTests cover ranking evidence and EXIF presentation.
  • CullingModelTests cover manual-winner persistence and pruning.
  • ComparisonGridNavigationTests, SharpnessScoringTests, and ZoomOverlayKeyActionTests gained regression coverage.

Version 1.8.5

Burst recommendations, richer comparison evidence, RAW diagnostics, and improved preview extraction.

Historical record dated 2026-05-20. Requirements and release status below refer to this version. For usage instructions, see the documentation.

Changes: 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.json now 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

Fixes for zoom-preview stalls, folder-access cleanup, and file-copy concurrency.

Historical record dated 2026-05-16. Requirements and release status below refer to this version. For usage instructions, see the documentation.

Changes: 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:), and stopActiveSecurityScopedAccess() on RawCullViewModel.
  • Catalog cancellation and app shutdown both route through the same cleanup path; deinit is 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

  • ZoomPreviewHandler sidecar JPG decode moved off the MainActor into a Task.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 marked nonisolated to 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, and deinit.
  • Progress streaming callback hops to @MainActor before touching progressContinuation, 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 clears currentselectedSource and stops active security-scoped access, preventing a new load from racing previous cleanup.

πŸ§ͺ Tests

  • New RawCullViewModelSecurityScopeTests covering 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; added documents/ver181.md capturing 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

Side-by-side comparison, expanded zoom and rating controls, and more responsive thumbnail loading.

Historical record dated 2026-05-14. Requirements and release status below refer to this version. For usage instructions, see the documentation.

Changes: 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

Full-size JPG caching, more consistent grid behavior, and clearer progress reporting.

Historical record dated 2026-05-10. Requirements and release status below refer to this version. For usage instructions, see the documentation.

Changes: v1.7.0 β†’ 1.7.4

Version 1.7.4 is submitted for update on the Apple App Store. It 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 ScanAndExtractJPGs actor 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 SharedMemoryCache and FocusMaskModel; 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

Faster zoom previews, cache controls, and more reliable saving of culling decisions.

Historical record dated 2026-05-06. Requirements and release status below refer to this version. For usage instructions, see the documentation.

Changes: 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.