<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Version 2.2.4 on RawCull</title><link>https://rawcull.netlify.app/tags/version-2.2.4/</link><description>Recent content in Version 2.2.4 on RawCull</description><generator>Hugo</generator><language>en</language><lastBuildDate>Fri, 03 Jul 2026 12:23:02 +0200</lastBuildDate><atom:link href="https://rawcull.netlify.app/tags/version-2.2.4/index.xml" rel="self" type="application/rss+xml"/><item><title>Version 2.2.4</title><link>https://rawcull.netlify.app/blog/2026/07/03/version-2.2.4/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>https://rawcull.netlify.app/blog/2026/07/03/version-2.2.4/</guid><description>&lt;h1 id="rawcull-changelog-v221--latest-commits"&gt;RawCull Changelog: v2.2.1 → Latest Commits&lt;a class="td-heading-self-link" href="#rawcull-changelog-v221--latest-commits" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;hr&gt;
&lt;h2 id="-jpg-export-improvements"&gt;🖼️ JPG Export Improvements&lt;a class="td-heading-self-link" href="#-jpg-export-improvements" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Added a new &lt;strong&gt;Extract JPGs&lt;/strong&gt; sheet.&lt;/li&gt;
&lt;li&gt;JPG extraction now works from the current selection:
&lt;ul&gt;
&lt;li&gt;multiple selected thumbnails&lt;/li&gt;
&lt;li&gt;or the single active image when no multi-selection exists&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Added destination folder selection for JPG export.&lt;/li&gt;
&lt;li&gt;Added export mode picker:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Embedded JPG&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Demosaiced RAW&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Demosaiced exports are saved with a &lt;code&gt;_demosaic.jpg&lt;/code&gt; suffix.&lt;/li&gt;
&lt;li&gt;Added extraction progress overlay in the main view.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-raw-loading-refactor"&gt;📷 RAW Loading Refactor&lt;a class="td-heading-self-link" href="#-raw-loading-refactor" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Introduced a shared &lt;code&gt;RawImageLoading&lt;/code&gt; abstraction.&lt;/li&gt;
&lt;li&gt;Centralized metadata, thumbnail, and preview loading through &lt;code&gt;RawParserKit&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;FullSizePreviewLoader&lt;/code&gt; for reusable full-size embedded preview loading.&lt;/li&gt;
&lt;li&gt;Sidecar &lt;code&gt;.jpg&lt;/code&gt; files are preferred before extracting from RAW.&lt;/li&gt;
&lt;li&gt;Full-size preview extraction now reuses disk cache when possible.&lt;/li&gt;
&lt;li&gt;Removed older local thumbnail and preview loading paths.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-performance-and-concurrency"&gt;⚡ Performance and Concurrency&lt;a class="td-heading-self-link" href="#-performance-and-concurrency" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Added a shared batch extraction concurrency limit based on CPU count.&lt;/li&gt;
&lt;li&gt;Thumbnail creation, JPG extraction, and full-size preview loading now share more consistent loading paths.&lt;/li&gt;
&lt;li&gt;Improved cancellation checks during preview and extraction work.&lt;/li&gt;
&lt;li&gt;Reduced duplicated image-loading logic across zoom, comparison, thumbnail, and scan flows.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-rawparserkit-update"&gt;🧩 RawParserKit Update&lt;a class="td-heading-self-link" href="#-rawparserkit-update" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Updated &lt;code&gt;RawParserKit&lt;/code&gt; from &lt;strong&gt;1.1.0&lt;/strong&gt; to &lt;strong&gt;1.2.5&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Migrated RawCull code to use newer RawParserKit APIs for:
&lt;ul&gt;
&lt;li&gt;EXIF metadata&lt;/li&gt;
&lt;li&gt;focus point metadata&lt;/li&gt;
&lt;li&gt;thumbnail generation&lt;/li&gt;
&lt;li&gt;embedded preview extraction&lt;/li&gt;
&lt;li&gt;full-size JPEG and demosaic export support&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-scanning-and-metadata"&gt;🔍 Scanning and Metadata&lt;a class="td-heading-self-link" href="#-scanning-and-metadata" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ScanFiles&lt;/code&gt; now uses the shared raw loader for EXIF and Sony focus-point metadata.&lt;/li&gt;
&lt;li&gt;Removed local EXIF parsing helpers from RawCull.&lt;/li&gt;
&lt;li&gt;Focus point normalization now comes from RawParserKit metadata.&lt;/li&gt;
&lt;li&gt;Security-scoped folder access handling was made more tolerant by only stopping access when it was actually started.&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;Added tests for JPG extraction selection behavior.&lt;/li&gt;
&lt;li&gt;Added tests for JPG output naming.&lt;/li&gt;
&lt;li&gt;Added integration-style tests for:
&lt;ul&gt;
&lt;li&gt;thumbnail request cache promotion&lt;/li&gt;
&lt;li&gt;full-size preview disk caching&lt;/li&gt;
&lt;li&gt;sidecar JPG preference&lt;/li&gt;
&lt;li&gt;cancellation behavior&lt;/li&gt;
&lt;li&gt;scan metadata loading through &lt;code&gt;RawImageLoading&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Updated existing tests for current MainActor isolation needs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-tooling-and-maintenance"&gt;🛠️ Tooling and Maintenance&lt;a class="td-heading-self-link" href="#-tooling-and-maintenance" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Added a dedicated &lt;code&gt;RawCullPeriphery&lt;/code&gt; Xcode scheme.&lt;/li&gt;
&lt;li&gt;Updated &lt;code&gt;.periphery.yml&lt;/code&gt; to use the new scheme and exclude tests.&lt;/li&gt;
&lt;li&gt;Removed obsolete local helper files:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SupportedFileType.swift&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ThumbnailError.swift&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OrientationNormalizedImageLoader.swift&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-documentation-and-review-notes"&gt;📝 Documentation and Review Notes&lt;a class="td-heading-self-link" href="#-documentation-and-review-notes" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Moved issue tracking into &lt;code&gt;doc/issues.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Added a deep code review report and later re-verification notes.&lt;/li&gt;
&lt;li&gt;Updated README latest-release text to show &lt;code&gt;v2.2.1&lt;/code&gt; as the App Store release.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-commit-range-summary"&gt;📦 Commit Range Summary&lt;a class="td-heading-self-link" href="#-commit-range-summary" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;From: &lt;code&gt;v2.2.1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;To: latest commit &lt;code&gt;e46f76d&lt;/code&gt; on &lt;code&gt;version-2.2.5&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Total: &lt;strong&gt;17 commits&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Diff size: &lt;strong&gt;47 files changed&lt;/strong&gt;, &lt;strong&gt;1352 insertions&lt;/strong&gt;, &lt;strong&gt;1122 deletions&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>