<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Changelog on RawCull</title><link>https://deploy-preview-18--rawcull.netlify.app/categories/changelog/</link><description>Recent content in Changelog on RawCull</description><generator>Hugo</generator><language>en</language><lastBuildDate>Mon, 22 Jun 2026 07:18:52 +0200</lastBuildDate><atom:link href="https://deploy-preview-18--rawcull.netlify.app/categories/changelog/index.xml" rel="self" type="application/rss+xml"/><item><title>Version 2.1.8</title><link>https://deploy-preview-18--rawcull.netlify.app/blog/2026/06/22/version-2.1.8/</link><pubDate>Mon, 22 Jun 2026 00:00:00 +0000</pubDate><guid>https://deploy-preview-18--rawcull.netlify.app/blog/2026/06/22/version-2.1.8/</guid><description>&lt;h1 id="rawcull-changelog--v205--218"&gt;RawCull Changelog — v2.0.5 → 2.1.8&lt;a class="td-heading-self-link" href="#rawcull-changelog--v205--218" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Submitted for update on &lt;a href="https://apps.apple.com/no/app/rawcull/id6759362764?mt=12"&gt;Apple App Store&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="-actual-pixels-inspection"&gt;🔍 Actual-Pixels Inspection&lt;a class="td-heading-self-link" href="#-actual-pixels-inspection" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Added &lt;code&gt;Z&lt;/code&gt; as a fast inspection shortcut from grid, loupe, and comparison views.&lt;/li&gt;
&lt;li&gt;Opens the zoom overlay directly on the embedded JPEG at an actual-pixels zoom level.&lt;/li&gt;
&lt;li&gt;Centers the view around the AF focus point when one is available.&lt;/li&gt;
&lt;li&gt;Shows the focus-point marker on open for faster sharpness checking.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-faster-culling-flow"&gt;⭐ Faster Culling Flow&lt;a class="td-heading-self-link" href="#-faster-culling-flow" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Rating, reject, keep, and tag actions now advance automatically to the next image.&lt;/li&gt;
&lt;li&gt;The same advance behavior is available in thumbnail navigation, zoom overlay, and comparison grid workflows.&lt;/li&gt;
&lt;li&gt;Catalog loading now preselects the first visible file by name, so keyboard culling can begin immediately.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-orientation-correct-previews"&gt;🧭 Orientation-Correct Previews&lt;a class="td-heading-self-link" href="#-orientation-correct-previews" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Normalized source orientation for thumbnails, embedded previews, sharpened previews, comparison images, and zoom previews.&lt;/li&gt;
&lt;li&gt;Improved handling for Sony embedded previews that do not carry their own orientation metadata.&lt;/li&gt;
&lt;li&gt;Added corrected transform handling for EXIF orientation values, including rotated and mirrored images.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-adaptive-memory-handling"&gt;🧠 Adaptive Memory Handling&lt;a class="td-heading-self-link" href="#-adaptive-memory-handling" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Added adaptive preview and grid cache recommendations based on installed memory, current system memory use, and macOS memory pressure.&lt;/li&gt;
&lt;li&gt;Reduced cache budgets automatically when memory pressure is warning or critical.&lt;/li&gt;
&lt;li&gt;Updated default cache settings for different memory tiers.&lt;/li&gt;
&lt;li&gt;Simplified the memory warning banner and added a close button.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-about-window"&gt;🪟 About Window&lt;a class="td-heading-self-link" href="#-about-window" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Added a native About RawCull window.&lt;/li&gt;
&lt;li&gt;Replaced the standard app info command with RawCull&amp;rsquo;s custom About window.&lt;/li&gt;
&lt;li&gt;Included app version/build information and a compact keystroke reference.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-saved-files-view-cleanup"&gt;🗂️ Saved Files View Cleanup&lt;a class="td-heading-self-link" href="#-saved-files-view-cleanup" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Split saved-files UI into smaller focused components for catalog rows, file rows, detail rows, section headers, and star ratings.&lt;/li&gt;
&lt;li&gt;Kept the saved-file detail presentation while making the view easier to maintain.&lt;/li&gt;
&lt;li&gt;Added a &lt;code&gt;FileRecord&lt;/code&gt; convenience initializer for previews and tests.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-tests"&gt;🧪 Tests&lt;a class="td-heading-self-link" href="#-tests" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Added and expanded Swift Testing coverage for culling auto-advance, thumbnail/cache admission, zoom overlay key actions, comparison navigation, and thumbnail provider behavior.&lt;/li&gt;
&lt;li&gt;Added coverage for &lt;code&gt;Z&lt;/code&gt; actual-pixels inspection in comparison navigation.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-maintenance"&gt;🛠️ Maintenance&lt;a class="td-heading-self-link" href="#-maintenance" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Aligned project versioning across build settings and release branches.&lt;/li&gt;
&lt;li&gt;Added a &lt;code&gt;test-performance&lt;/code&gt; Makefile target.&lt;/li&gt;
&lt;li&gt;Performed cleanup in scoring parameter UI and cache-related code.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Version 2.0.5</title><link>https://deploy-preview-18--rawcull.netlify.app/blog/2026/06/18/version-2.0.5/</link><pubDate>Thu, 18 Jun 2026 00:00:00 +0000</pubDate><guid>https://deploy-preview-18--rawcull.netlify.app/blog/2026/06/18/version-2.0.5/</guid><description>&lt;h1 id="rawcull-changelog--v202--205"&gt;RawCull Changelog — v2.0.2 → 2.0.5&lt;a class="td-heading-self-link" href="#rawcull-changelog--v202--205" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Submitted for update on &lt;a href="https://apps.apple.com/no/app/rawcull/id6759362764?mt=12"&gt;Apple App Store&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;🖼️ Fixed orientation handling for embedded JPEG previews, sidecar JPEGs, cached previews, comparison view, and zoom previews.&lt;/li&gt;
&lt;li&gt;🎯 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.&lt;/li&gt;
&lt;li&gt;⚡ Refreshed full-size JPEG cache keys to avoid reusing older non-orientation-normalized previews.&lt;/li&gt;
&lt;li&gt;🧹 Fixed empty catalog handling so loading state and security-scoped access are cleaned up correctly.&lt;/li&gt;
&lt;li&gt;✨ Added an “Add Catalog” action when a selected folder contains no RAW files.&lt;/li&gt;
&lt;li&gt;🧪 Added regression tests for orientation decoding, scoped sharpness/burst analysis, cache behavior, and empty catalog cleanup.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Version 2.0.2</title><link>https://deploy-preview-18--rawcull.netlify.app/blog/2026/06/09/version-2.0.2/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0000</pubDate><guid>https://deploy-preview-18--rawcull.netlify.app/blog/2026/06/09/version-2.0.2/</guid><description>&lt;h1 id="rawcull-changelog--v196--202"&gt;RawCull Changelog — v1.9.6 → 2.0.2&lt;a class="td-heading-self-link" href="#rawcull-changelog--v196--202" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Updated on &lt;a href="https://apps.apple.com/no/app/rawcull/id6759362764?mt=12"&gt;Apple App Store&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-new--image-source-toggle-in-zoom--loupe-view"&gt;✨ New — Image source toggle in zoom / loupe view&lt;a class="td-heading-self-link" href="#-new--image-source-toggle-in-zoom--loupe-view" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Switch between the embedded JPEG preview and a full-size JPEG created from the RAW file while inspecting an image:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New &lt;code&gt;ImageSourceToggleView&lt;/code&gt; with keyboard shortcut support&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ZoomPreviewHandler&lt;/code&gt; significantly expanded to manage source switching&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ZoomOverlayView&lt;/code&gt; updated with key-action routing&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FullSizeJPGDiskCache&lt;/code&gt; extended to support the toggle flow&lt;/li&gt;
&lt;li&gt;New &lt;code&gt;DiskCacheAndScanAdmissionTests&lt;/code&gt; covering the cache admission logic&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="-new--burst-review-queue"&gt;✨ New — Burst Review Queue&lt;a class="td-heading-self-link" href="#-new--burst-review-queue" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A structured review-queue workflow for burst groups:&lt;/p&gt;</description></item><item><title>Version 1.9.6</title><link>https://deploy-preview-18--rawcull.netlify.app/blog/2026/06/04/version-1.9.6/</link><pubDate>Thu, 04 Jun 2026 00:00:00 +0000</pubDate><guid>https://deploy-preview-18--rawcull.netlify.app/blog/2026/06/04/version-1.9.6/</guid><description>&lt;h1 id="rawcull-changelog--v194--196"&gt;RawCull Changelog — v1.9.4 → 1.9.6&lt;a class="td-heading-self-link" href="#rawcull-changelog--v194--196" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Released on &lt;a href="https://apps.apple.com/no/app/rawcull/id6759362764?mt=12"&gt;Apple App Store&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="-comparison-view-is-now-a-horizontal-filmstrip"&gt;🔄 Comparison view is now a horizontal filmstrip&lt;a class="td-heading-self-link" href="#-comparison-view-is-now-a-horizontal-filmstrip" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The burst comparison layout was completely redesigned.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Candidates are now presented in a side-by-side horizontal scroll, one full-width pane per candidate, instead of a vertical grid stack.&lt;/li&gt;
&lt;li&gt;Navigation is left/right only — up/down arrow keys are removed. The view snaps one candidate at a time using SwiftUI scrollTargetBehavior(.viewAligned).&lt;/li&gt;
&lt;li&gt;Selecting a file in the filmstrip updates the main selection and vice-versa, keeping both views in sync automatically.&lt;/li&gt;
&lt;li&gt;The burst header bar is more compact: decision text and action buttons share a single line with tooltips replacing verbose inline descriptions.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="-loupe-view-can-now-toggle-the-extracted-jpg"&gt;🔍 Loupe view can now toggle the extracted JPG&lt;a class="td-heading-self-link" href="#-loupe-view-can-now-toggle-the-extracted-jpg" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;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.&lt;/p&gt;</description></item><item><title>Version 1.9.4</title><link>https://deploy-preview-18--rawcull.netlify.app/blog/2026/05/31/version-1.9.4/</link><pubDate>Sun, 31 May 2026 00:00:00 +0000</pubDate><guid>https://deploy-preview-18--rawcull.netlify.app/blog/2026/05/31/version-1.9.4/</guid><description>&lt;h1 id="rawcull-changelog--v185--194"&gt;RawCull Changelog — v1.8.5 → 1.9.4&lt;a class="td-heading-self-link" href="#rawcull-changelog--v185--194" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Updated on &lt;a href="https://apps.apple.com/no/app/rawcull/id6759362764?mt=12"&gt;Apple App Store&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="v191--v194"&gt;v1.9.1 → v1.9.4&lt;a class="td-heading-self-link" href="#v191--v194" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="-sharpness-scoring-now-has-intent-presets-and-precision-modes"&gt;🎯 Sharpness scoring now has intent presets and precision modes&lt;a class="td-heading-self-link" href="#-sharpness-scoring-now-has-intent-presets-and-precision-modes" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Sharpness scoring is now much more configurable and better tuned for different kinds of photography.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Added photo-type presets: &lt;strong&gt;Auto&lt;/strong&gt;, &lt;strong&gt;Birds/Wildlife&lt;/strong&gt;, &lt;strong&gt;Portrait&lt;/strong&gt;, &lt;strong&gt;Landscape&lt;/strong&gt;, and &lt;strong&gt;Action&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Added quality modes: &lt;strong&gt;Fast&lt;/strong&gt;, &lt;strong&gt;Balanced&lt;/strong&gt;, and &lt;strong&gt;High Precision&lt;/strong&gt;. Balanced and High Precision decode larger previews and blend more fine detail for better small-subject ranking.&lt;/li&gt;
&lt;li&gt;Added a scoring source picker: &lt;strong&gt;Embedded Preview&lt;/strong&gt; for normal culling speed, or &lt;strong&gt;RAW Demosaic&lt;/strong&gt; for slow, final-precision checks.&lt;/li&gt;
&lt;li&gt;These scoring choices are now persisted in settings and restored when a catalog is reopened.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="-focus-mask-evolved-into-focus-evidence"&gt;🔍 Focus mask evolved into focus evidence&lt;a class="td-heading-self-link" href="#-focus-mask-evolved-into-focus-evidence" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The focus mask is now much closer to an explanation overlay for the sharpness score, instead of a generic edge mask.&lt;/p&gt;</description></item><item><title>Version 1.8.5</title><link>https://deploy-preview-18--rawcull.netlify.app/blog/2026/05/20/version-1.8.5/</link><pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate><guid>https://deploy-preview-18--rawcull.netlify.app/blog/2026/05/20/version-1.8.5/</guid><description>&lt;h1 id="rawcull-changelog--v181--185"&gt;RawCull Changelog — v1.8.1 → 1.8.5&lt;a class="td-heading-self-link" href="#rawcull-changelog--v181--185" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="-smarter-burst-culling"&gt;✨ Smarter Burst Culling&lt;a class="td-heading-self-link" href="#-smarter-burst-culling" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;RawCull now includes an intelligent burst analysis workflow to help identify the best frames in fast sequences.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Groups visually similar burst shots automatically.&lt;/li&gt;
&lt;li&gt;Recommends the best frame using sharpness, subject/saliency, AF evidence, and metadata stability.&lt;/li&gt;
&lt;li&gt;Shows confidence levels: High, Medium, or Low.&lt;/li&gt;
&lt;li&gt;Adds burst evidence and caution notes so you can understand why a frame was recommended.&lt;/li&gt;
&lt;li&gt;Adds quick actions to Keep Best, Keep Top 2, Compare, or Undo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-improved-burst-comparison"&gt;🔍 Improved Burst Comparison&lt;a class="td-heading-self-link" href="#-improved-burst-comparison" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The comparison view now supports burst-specific review.&lt;/p&gt;</description></item><item><title>Version 1.8.1</title><link>https://deploy-preview-18--rawcull.netlify.app/blog/2026/05/16/version-1.8.1/</link><pubDate>Sat, 16 May 2026 00:00:00 +0000</pubDate><guid>https://deploy-preview-18--rawcull.netlify.app/blog/2026/05/16/version-1.8.1/</guid><description>&lt;h1 id="rawcull-changelog--v180--181"&gt;RawCull Changelog — v1.8.0 → 1.8.1&lt;a class="td-heading-self-link" href="#rawcull-changelog--v180--181" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-security-scoped-resource-lifecycle"&gt;🔒 Security-Scoped Resource Lifecycle&lt;a class="td-heading-self-link" href="#-security-scoped-resource-lifecycle" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Catalog access is now scoped to the &lt;em&gt;active&lt;/em&gt; catalog&lt;/strong&gt;, not every catalog ever opened in the sidebar. Long sessions no longer accumulate stale security-scoped accesses.&lt;/li&gt;
&lt;li&gt;Added explicit &lt;code&gt;startSecurityScopedAccess(for:)&lt;/code&gt;, &lt;code&gt;stopSecurityScopedAccess(for:)&lt;/code&gt;, and &lt;code&gt;stopActiveSecurityScopedAccess()&lt;/code&gt; on &lt;code&gt;RawCullViewModel&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Catalog cancellation and app shutdown both route through the same cleanup path; &lt;code&gt;deinit&lt;/code&gt; is now a last-resort fallback rather than the primary stop point.&lt;/li&gt;
&lt;li&gt;Picker flow simplified — view no longer manually pairs start/stop calls.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-zoom-preview--no-more-main-thread-hangs"&gt;⚡ Zoom Preview — No More Main-Thread Hangs&lt;a class="td-heading-self-link" href="#-zoom-preview--no-more-main-thread-hangs" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ZoomPreviewHandler&lt;/code&gt; sidecar JPG decode moved &lt;strong&gt;off the MainActor&lt;/strong&gt; into a &lt;code&gt;Task.detached(priority: .userInitiated)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Opening the zoom overlay on a large Sony JPEG no longer blocks the UI while ImageIO opens and decodes the file.&lt;/li&gt;
&lt;li&gt;Cancellation is now checked between every async step, so dismissing the overlay early stops in-flight work cleanly.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;loadCGImage(from:)&lt;/code&gt; and the disk-cache accessor are marked &lt;code&gt;nonisolated&lt;/code&gt; to make the off-main path explicit.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-rsync-copy-path-executecopyfiles"&gt;🛠️ Rsync Copy Path (&lt;code&gt;ExecuteCopyFiles&lt;/code&gt;)&lt;a class="td-heading-self-link" href="#-rsync-copy-path-executecopyfiles" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Security-scoped URLs for source and destination are now paired with a single, idempotent &lt;code&gt;cleanup()&lt;/code&gt; call covering: rsync success, launch failure, user close/cancel, sheet dismissal, and &lt;code&gt;deinit&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Progress streaming callback hops to &lt;code&gt;@MainActor&lt;/code&gt; before touching &lt;code&gt;progressContinuation&lt;/code&gt;, removing a latent actor-isolation race that strict concurrency would flag.&lt;/li&gt;
&lt;li&gt;Progress continuations and streaming handler state are finished/cleared exactly once.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-catalog-loading--cancellation"&gt;🧵 Catalog Loading &amp;amp; Cancellation&lt;a class="td-heading-self-link" href="#-catalog-loading--cancellation" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;startCatalogLoad(for:)&lt;/code&gt; short-circuits cleanly when the active catalog already has live security-scoped access — no redundant cancel/restart cycles.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cancelCatalogLoad()&lt;/code&gt; now also clears &lt;code&gt;currentselectedSource&lt;/code&gt; and stops active security-scoped access, preventing a new load from racing previous cleanup.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-tests"&gt;🧪 Tests&lt;a class="td-heading-self-link" href="#-tests" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;New &lt;code&gt;RawCullViewModelSecurityScopeTests&lt;/code&gt; covering start/stop pairing, re-selection no-op behavior, and cancellation cleanup.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ThumbnailProvider*&lt;/code&gt; tests updated for the refreshed memory and cancellation surface.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-cleanup"&gt;🧹 Cleanup&lt;a class="td-heading-self-link" href="#-cleanup" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Removed legacy &lt;code&gt;documents/ver176.md&lt;/code&gt;; added &lt;code&gt;documents/ver181.md&lt;/code&gt; capturing the v1.8.0 review findings actually shipped in this release.&lt;/li&gt;
&lt;li&gt;Minor follow-ups in &lt;code&gt;RawCullViewModel+Catalog&lt;/code&gt;, &lt;code&gt;SharpnessScoringModel&lt;/code&gt;, and project settings.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Version 1.8.0</title><link>https://deploy-preview-18--rawcull.netlify.app/blog/2026/05/14/version-1.8.0/</link><pubDate>Thu, 14 May 2026 00:00:00 +0000</pubDate><guid>https://deploy-preview-18--rawcull.netlify.app/blog/2026/05/14/version-1.8.0/</guid><description>&lt;h1 id="rawcull-changelog--v174--180"&gt;RawCull Changelog — v1.7.4 → 1.8.0&lt;a class="td-heading-self-link" href="#rawcull-changelog--v174--180" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h2 id="-v180"&gt;🚀 v1.8.0&lt;a class="td-heading-self-link" href="#-v180" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="-new-comparison-view"&gt;🖼️ New Comparison View&lt;a class="td-heading-self-link" href="#-new-comparison-view" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Added a dedicated comparison view for reviewing selected images side by side.&lt;/li&gt;
&lt;li&gt;Supports comparing up to four selected thumbnails.&lt;/li&gt;
&lt;li&gt;Added keyboard navigation inside the comparison view.&lt;/li&gt;
&lt;li&gt;Added zoom and pan controls for closer inspection.&lt;/li&gt;
&lt;li&gt;Added focus mask and focus point overlays while comparing images.&lt;/li&gt;
&lt;li&gt;Added support for switching between thumbnail preview and extracted JPEG source.&lt;/li&gt;
&lt;li&gt;Added rating controls directly inside comparison mode.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-improved-zoom-review"&gt;🔍 Improved Zoom Review&lt;a class="td-heading-self-link" href="#-improved-zoom-review" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Improved the full-window zoom overlay experience.&lt;/li&gt;
&lt;li&gt;Added previous/next image navigation in zoom view.&lt;/li&gt;
&lt;li&gt;Added visible rating badge for the current image.&lt;/li&gt;
&lt;li&gt;Added keyboard shortcuts for zooming and switching image source.&lt;/li&gt;
&lt;li&gt;Added tests for zoom overlay navigation and behavior.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-faster-and-more-responsive-thumbnail-handling"&gt;⚡ Faster and More Responsive Thumbnail Handling&lt;a class="td-heading-self-link" href="#-faster-and-more-responsive-thumbnail-handling" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Improved cancellation of thumbnail and JPEG extraction work.&lt;/li&gt;
&lt;li&gt;Switching or cancelling catalogs should now feel more responsive because old ImageIO work is cancelled earlier.&lt;/li&gt;
&lt;li&gt;Sony and Nikon thumbnail/JPEG extraction now check for cancellation before expensive decode work.&lt;/li&gt;
&lt;li&gt;Improved thumbnail loader slot accounting so cancelled requests do not consume concurrency capacity.&lt;/li&gt;
&lt;li&gt;Added regression tests for thumbnail loader cancellation and concurrency behavior.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-sharpness-and-similarity-reliability"&gt;🎯 Sharpness and Similarity Reliability&lt;a class="td-heading-self-link" href="#-sharpness-and-similarity-reliability" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Similarity and burst actions now wait for in-progress sharpness scoring when needed.&lt;/li&gt;
&lt;li&gt;Prevents similarity/burst workflows from running before required sharpness scores are ready.&lt;/li&gt;
&lt;li&gt;Added test coverage for concurrent sharpness scoring behavior.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-cache-and-memory-improvements"&gt;🧠 Cache and Memory Improvements&lt;a class="td-heading-self-link" href="#-cache-and-memory-improvements" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Improved cache replacement accounting for memory and grid thumbnail caches.&lt;/li&gt;
&lt;li&gt;Improved test isolation around shared cache state.&lt;/li&gt;
&lt;li&gt;Added memory diagnostics checklist for validating large-catalog behavior.&lt;/li&gt;
&lt;li&gt;Improved cache-related concurrency tests.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-rating-workflow-improvements"&gt;⭐ Rating Workflow Improvements&lt;a class="td-heading-self-link" href="#-rating-workflow-improvements" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Added reusable rating controls and rating badge UI.&lt;/li&gt;
&lt;li&gt;Rating actions are now available in more review contexts, including comparison and zoom workflows.&lt;/li&gt;
&lt;li&gt;Ratings support reject, keeper, and 2-5 star values.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-build-and-test-tooling"&gt;🛠️ Build and Test Tooling&lt;a class="td-heading-self-link" href="#-build-and-test-tooling" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Added shared Xcode scheme.&lt;/li&gt;
&lt;li&gt;Added dedicated test plans:
&lt;ul&gt;
&lt;li&gt;Smoke&lt;/li&gt;
&lt;li&gt;Full test suite&lt;/li&gt;
&lt;li&gt;Performance&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Updated Makefile test commands.&lt;/li&gt;
&lt;li&gt;Improved documentation for test architecture and release validation.&lt;/li&gt;
&lt;li&gt;Pinned Swift Package dependencies to exact versions for more predictable builds.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-camera-and-image-extraction-notes"&gt;📷 Camera and Image Extraction Notes&lt;a class="td-heading-self-link" href="#-camera-and-image-extraction-notes" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Continued improvements to Sony ARW thumbnail extraction.&lt;/li&gt;
&lt;li&gt;Added cancellation-aware extraction paths for Sony and Nikon raw/JPEG preview handling.&lt;/li&gt;
&lt;li&gt;Nikon support remains experimental.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-latest-commit-after-v180"&gt;📝 Latest Commit After v1.8.0&lt;a class="td-heading-self-link" href="#-latest-commit-after-v180" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="-documentation"&gt;📚 Documentation&lt;a class="td-heading-self-link" href="#-documentation" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Updated README release information and project description.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Version 1.7.4</title><link>https://deploy-preview-18--rawcull.netlify.app/blog/2026/05/10/version-1.7.4/</link><pubDate>Sun, 10 May 2026 00:00:00 +0000</pubDate><guid>https://deploy-preview-18--rawcull.netlify.app/blog/2026/05/10/version-1.7.4/</guid><description>&lt;h1 id="rawcull-changelog--v170--174"&gt;RawCull Changelog — v1.7.0 → 1.7.4&lt;a class="td-heading-self-link" href="#rawcull-changelog--v170--174" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Version 1.7.4 is submitted for update on Apple App Store. RawCull 1.7.0 focuses on faster zoom previews, better cache management, and more reliable culling-data saving.&lt;/p&gt;
&lt;h2 id="new"&gt;✨New&lt;a class="td-heading-self-link" href="#new" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Full-size JPG disk cache.&lt;/strong&gt; The zoom view now caches the full-resolution embedded JPEG to disk (&lt;code&gt;~/Library/Caches/no.blogspot.RawCull/FullsizeJPGs/&lt;/code&gt;), so re-opening a previously zoomed photo is instant instead of re-extracting from the ARW.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;ldquo;Cache JPGs&amp;rdquo; button&lt;/strong&gt; in the catalog sidebar lets you pre-warm the full-size JPG cache for an entire catalog in one go (uses a new &lt;code&gt;ScanAndExtractJPGs&lt;/code&gt; actor with progress + ETA).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JPG cache controls in Settings → Cache.&lt;/strong&gt; A new section shows the on-disk size of the full-size JPG cache and adds a Prune action (with confirmation).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-changed"&gt;🔄 Changed&lt;a class="td-heading-self-link" href="#-changed" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Unified culling grid.&lt;/strong&gt; The standard grid and the Similarity/Burst grid now share one &lt;code&gt;CullingGridView&lt;/code&gt;. Selection, scroll-to-selection, rating filter, the &amp;ldquo;N selected&amp;rdquo; status, and the three progress overlays now behave identically in both views.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Redesigned Scan Stats sheet&lt;/strong&gt; — clearer layout for the per-catalog statistics.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Smoother progress ETA.&lt;/strong&gt; The &amp;ldquo;Estimated time to completion&amp;rdquo; label is now &amp;ldquo;Estimated time left&amp;rdquo;, and the countdown no longer jitters upward when a slow file briefly inflates the average.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cleaner toolbar mode switching.&lt;/strong&gt; Loupe / Grid / Similarity / Rated buttons go through a single &lt;code&gt;selectMainViewMode(...)&lt;/code&gt; helper for consistent state reset.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Saved-files persistence moved out of the main view model&lt;/strong&gt; into a dedicated &lt;code&gt;CullingModel&lt;/code&gt;, with debounced JSON writes (350 ms) to avoid hammering disk on rapid rating changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-under-the-hood"&gt;📦 Under the hood&lt;a class="td-heading-self-link" href="#-under-the-hood" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;New concurrency tests for &lt;code&gt;SharedMemoryCache&lt;/code&gt; and &lt;code&gt;FocusMaskModel&lt;/code&gt;; revisions to thumbnail-cache eviction (&lt;code&gt;CacheDelegate&lt;/code&gt;, &lt;code&gt;CachedThumbnail&lt;/code&gt;) for safer cross-actor access.&lt;/li&gt;
&lt;li&gt;Catalog load/cancel path reworked — switching catalogs now reliably cancels in-flight scan, thumbnail, JPG-extract, and sharpness/similarity work.&lt;/li&gt;
&lt;li&gt;Image extractors (&lt;code&gt;SaveJPGImage&lt;/code&gt;, &lt;code&gt;JPGSonyARWExtractor&lt;/code&gt;, &lt;code&gt;JPGNikonNEFExtractor&lt;/code&gt;) tightened.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Version 1.7.0</title><link>https://deploy-preview-18--rawcull.netlify.app/blog/2026/05/06/version-1.7.0/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://deploy-preview-18--rawcull.netlify.app/blog/2026/05/06/version-1.7.0/</guid><description>&lt;h1 id="rawcull-changelog--v169--170"&gt;RawCull Changelog — v1.6.9 → 1.7.0&lt;a class="td-heading-self-link" href="#rawcull-changelog--v169--170" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;h2 id="-highlights"&gt;✨ Highlights&lt;a class="td-heading-self-link" href="#-highlights" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Faster zoom preview loading&lt;/strong&gt; with a new full-size JPG disk cache.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Better cache controls&lt;/strong&gt; in Settings, including cache size visibility and manual JPG cache pruning.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;More reliable culling persistence&lt;/strong&gt; when rating, batch-rating, and saving sharpness results.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Improved diagnostics&lt;/strong&gt; for understanding memory pressure and cache evictions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-whats-new"&gt;✨ What’s new&lt;a class="td-heading-self-link" href="#-whats-new" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="full-size-jpg-disk-cache-for-zoom-previews"&gt;Full-size JPG disk cache for zoom previews&lt;a class="td-heading-self-link" href="#full-size-jpg-disk-cache-for-zoom-previews" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;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.&lt;/p&gt;</description></item></channel></rss>