<?xml version='1.0' encoding='utf-8'?>
<rss xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" version="2.0">
    <channel>
        <title>DuoBolt Changelog</title>
        <link>https://duobolt.app/appcast</link>
        <description>Most recent updates to DuoBolt</description>
        <language>en</language>
        <item>
            <title>DuoBolt 2.2.1 — Windows scan stability</title>
            <link>https://duobolt.app/changelog/</link>
            <sparkle:version>2006</sparkle:version>
            <sparkle:shortVersionString>2.2.1</sparkle:shortVersionString>
            <description>
                <![CDATA[
<p>DuoBolt 2.2.1 is a focused stability update for Windows scanning.</p>
<p><h3>Fixes</h3></p>
<ul>
<li>Fixed a Windows edge case where scanning a directory tree containing a cycle (for example, a junction loop) could recurse indefinitely and crash with a stack overflow.</li>
<li>Hardened directory traversal guards so repeated visits to the same directory identity are ignored, keeping scans bounded on cyclic filesystem topologies.</li>
</ul>
            ]]>
            </description>
            <pubDate>Thu, 03 Sep 2026 00:00:00 +0000</pubDate>
            <enclosure url="https://duobolt.app/dl/macos/2.2.1" sparkle:version="2006" sparkle:shortVersionString="2.2.1" sparkle:edSignature="4OQNjprH0+jWMyu/cvWmXgwZDEZKA/nIQCzreYT5pTGvtF62VFh/dXi9jN5h/24EKC6KE6taaUFCLm8KdNzHAA==" length="103285876" type="application/octet-stream"/>
            <sparkle:minimumSystemVersion>11.0</sparkle:minimumSystemVersion>
        </item>
        <item>
            <title>DuoBolt 2.2 — Compare two photos, and keep the one you meant</title>
            <link>https://duobolt.app/changelog/</link>
            <sparkle:version>2005</sparkle:version>
            <sparkle:shortVersionString>2.2.0</sparkle:shortVersionString>
            <description>
                <![CDATA[
<p>Two copies of a photograph are rarely identical, and the difference is usually small: a little sharper, a little brighter, one of them cropped. DuoBolt 2.2 puts the two on top of each other and lets you wipe between them, reads the light in each, and lets you write down — once — which copy you want kept, in words rather than by clicking through every group.</p>
<p><h3>What's New</h3></p>
<ul>
<li><strong>Compare two copies in the preview.</strong> Press <code>C</code> and the picture becomes a curtain: one copy on the left of the line, the other on the right, both at the same fit, zoom and position. Drag the line, or hold ⇧ and use ← →; double-click or right-click to put it back in the middle. <code>A</code> and <code>B</code> choose which side the panels are about, <code>X</code> swaps them, and the chevrons walk the chosen side through the group's copies.</li>
<li><strong>A histogram, over the photo.</strong> <code>H</code> opens it: R, G and B together, each channel on its own, or luminance, with the shares of the picture pinned at pure black and pure white. Comparing two copies, <code>Δ</code> lays the other one's curve over this one's — the same measurement on both, so what you see is the difference.</li>
<li><strong>Rules you write once.</strong> Settings → Selection holds one order of rules per finder: keep the copy with more pixels, keep the RAW, keep the one that still has its EXIF, keep the shorter name, keep the copy in — or outside — a folder you name. Read top to bottom, the first rule with an opinion decides, and anything it cannot tell apart is left alone.</li>
<li><strong>Rules that ask about the camera.</strong> An EXIF rule takes an attribute, a comparator and a value: ISO under 400, shutter faster than 1/125, aperture wider than f/2.8, at least 12 MP, has GPS, is a particular colour space. "Is the lowest" and "is the highest" rank the copies against each other instead.</li>
<li><strong>Keep by my rules</strong> runs that order over every group (⌘R), over one group from its right-click menu, or from Bulk Select in either finder. Bulk Select ends with "Edit my rules…", which opens Settings where they live.</li>
<li><strong>Devices, in Settings → License.</strong> The machines using your license, with what each one is and when it was last seen, and a Free button for the one you no longer have. A formatted Mac used to hold its seat forever; now you take it back yourself, and activate.</li>
<li><strong>Settings → Updates</strong> is its own section: where updates come from and how to check for one, and on Windows a link to the app's page in the Microsoft Store.</li>
</ul>
<p><h3>Improvements</h3></p>
<ul>
<li>The fullscreen preview decodes at full fidelity: a RAW is developed rather than served from the small JPEG the camera wrote inside it, and a HEIC is decoded rather than read from its embedded thumbnail. The difference is visible in shadows and fine detail.</li>
<li>Reveal from the preview goes to Photos for a library photo, rather than the Finder and the inside of the library package.</li>
<li>The Similars preview's version switch (JPEG / RAW / Edited) moved to the bottom left, out of the way of the compare curtain, and the file line above follows the version you are looking at.</li>
<li>Every copy in a group is named by what tells it apart — how many megapixels, how large, whether it is an edit or a RAW — so two photos called <code>IMG_0042.HEIC</code> are no longer two identical-looking rows.</li>
<li>On a Mac with no photo library, the Similars setup says so instead of counting forever.</li>
<li>Windows: after a cleanup that went well, DuoBolt asks once — and only once — whether you would rate it in the Microsoft Store.</li>
<li>On macOS the whole interface is drawn through Skia's newer Metal pipeline. What you notice is the scrolling: a grid of thumbnails, a long list of file names, the compare line dragged across a photo. The About box names the renderer your copy is running.</li>
<li>File names and labels are drawn from a shaped copy kept between frames instead of being laid out again on every one — it is a long list of names that pays for that, and it is where the difference shows.</li>
<li>DuoBolt ships the graphics pipelines it needs, so opening a screen for the first time no longer pauses while they compile.</li>
</ul>
<p><h3>Fixes</h3></p>
<ul>
<li>A photo in the fullscreen preview could come back soft after restarting the app: the cached copy was re-encoded at the quality meant for grid thumbnails.</li>
<li>A license whose seat had been released elsewhere now recognises the one it already holds instead of spending a second.</li>
<li>A dialog with its background effects on could leave a smear of the screen behind it on macOS.</li>
</ul>
            ]]>
            </description>
            <pubDate>Mon, 31 Aug 2026 00:00:00 +0000</pubDate>
            <enclosure url="https://duobolt.app/dl/macos/2.2.0" sparkle:version="2005" sparkle:shortVersionString="2.2.0" sparkle:edSignature="Zy1Ua89z9F5LQhPFDwKJAO2QQmhp04OwBVYFxJxoLRGLYC0KpJ6O1InsV+hq+GWfOzcUD64RKCIh9oQ0V2ltAA==" length="103280877" type="application/octet-stream"/>
            <sparkle:minimumSystemVersion>11.0</sparkle:minimumSystemVersion>
        </item>
        <item>
            <title>DuoBolt 2.1 — Your Photos library</title>
            <link>https://duobolt.app/changelog/</link>
            <sparkle:version>2004</sparkle:version>
            <sparkle:shortVersionString>2.1.0</sparkle:shortVersionString>
            <description>
                <![CDATA[
<p>DuoBolt 2.1 opens the Photos library. Similars can scan it directly, the way it scans a folder, and everything it finds there is shown by the names Photos uses, removed the way Photos removes, and explained with what Photos knows about each photo: when it was imported, whether it was edited, whether you marked it a favorite.</p>
<p><h3>What's New</h3></p>
<ul>
<li>Similars scans your Photos library (macOS). Pick "Photos" instead of "Folders" at the top of the Similars setup. DuoBolt reads the library itself — no export, no copy — and groups look-alikes and identical copies, including the photos you imported more than once. Photos that only live in iCloud are set aside and counted, not guessed at.</li>
<li>Removing from the library goes to Photos' Recently Deleted, so nothing is gone until Photos says so. A photo's edit and a Live Photo's video go with it, and the confirmation says so before you agree.</li>
<li>Photos shows its names, DuoBolt shows them too: <code>IMG_0042.HEIC</code> on the tile, in the preview, in the review and in the removal report — never the file name the library keeps underneath.</li>
<li>Every tile states what Photos knows: the import date — "1st import · 16 Jun 2023" when the same photo was imported more than once — a heart for a favorite, a wand for an edit, and "JPEG + RAW" for a pair. An edited photo is shown as the edit; the scan compared the original.</li>
<li>A "Photos" filter on the results toolbar keeps the groups holding a photo that is edited, favorited, a RAW, or imported more than once — with the count each one would leave.</li>
<li>Bulk Select learned the library: Keep Favorite keeps what you starred, Keep First Import keeps the copies from the earliest import and selects the later ones. Every rule now keeps everything it cannot tell apart, and a rule with nothing to go on leaves the group alone — the footer says how many it left.</li>
<li>The preview switches between a photo's versions with a control on the image: original, edit, RAW. <code>O</code> cycles through them, <code>1</code> <code>2</code> <code>3</code> pick one, and the size in the header follows what you are looking at.</li>
<li>AI Curation skips the scoring for copies that are byte-for-byte identical — there is nothing to judge — and marks the one it keeps KEPT rather than BEST SHOT, with the import date as its reason. Its groups follow the order of the results.</li>
<li>Copying out of the library exports each photo under its own name, and can bring the untouched original along beside the edit.</li>
<li>A rating left by Lightroom, Bridge or darktable in an XMP sidecar shows on the tile and in the preview.</li>
</ul>
<p><h3>Improvements</h3></p>
<ul>
<li>Keep Newest and Keep Oldest, and the "Latest" sort, go by the date the photo was taken, not the date the file was written. In a library every original is written at import, which made "newest" mean "imported last".</li>
<li>Favorites wear a heart, as in Photos.</li>
<li>A folder scan skips Photos, iPhoto and Aperture libraries (Scan parameters → Skip folders → Photo libraries, on by default). A library holds a copy of everything you also keep in folders, and walking into one paired a whole collection with itself. macOS only.</li>
<li>The Dashboard's resumable-session cards show the library by its own name and icon.</li>
<li>Disabled buttons no longer cast a shadow in light mode.</li>
</ul>
<p><h3>Fixes</h3></p>
<ul>
<li>The removal report could count a note as a skipped file, and add a library copy's size twice.</li>
<li>The Similars setup no longer flicks on its first frame while the library's photo count arrives.</li>
<li>Section headings across the app draw their rule in the same color.</li>
</ul>
<p><h3>Notes</h3></p>
<ul>
<li>Scanning the library asks for access to Photos the first time. The first scan walks the whole library (about 15 seconds for 8,000 photos); after that DuoBolt asks Photos what changed and only looks at that.</li>
<li>Photos you have hidden are not scanned: macOS does not show the Hidden album to other apps, whatever their permissions.</li>
<li>Scanning folders is unchanged, on macOS and Windows alike. The Photos library is a macOS feature.</li>
</ul>
            ]]>
            </description>
            <pubDate>Wed, 26 Aug 2026 00:00:00 +0000</pubDate>
            <enclosure url="https://duobolt.app/dl/macos/2.1.0" sparkle:version="2004" sparkle:shortVersionString="2.1.0" sparkle:edSignature="NvdwTKemGo80PEREAJFnFUmcXIxidiYZOEcbeIEEx5ahDtmUsxw0kkj9xsO6lpTGLpeMSRtCECTccP6YCR6bAw==" length="100514668" type="application/octet-stream"/>
            <sparkle:minimumSystemVersion>11.0</sparkle:minimumSystemVersion>
        </item>
        <item>
            <title>DuoBolt 2.0.2 — Scrolling and menus</title>
            <link>https://duobolt.app/changelog/</link>
            <sparkle:version>2002</sparkle:version>
            <sparkle:shortVersionString>2.0.2</sparkle:shortVersionString>
            <description>
                <![CDATA[
<p>A round of repairs to 2.0, most of them in places you touch without thinking about them.</p>
<p><h3>Fixes</h3></p>
<ul>
<li>The Dashboard could stop scrolling — neither the wheel nor the keyboard — after starting a scan again from Scan History. The page was fine; the scroll was being delivered to the screen you had just left.</li>
<li>Opening a menu or dropdown with the mouse left a dashed outline around a control, sometimes one unrelated to the menu. That outline marks where the keyboard is, and it now appears only when you are actually navigating by keyboard.</li>
<li>Right-clicking a saved setup under Recent Setups gave no sign of which row the menu belonged to, while a different row stayed highlighted as the loaded one. The row you right-click is now marked for as long as its menu is open, and the loaded setup keeps its own mark.</li>
<li>The Protected Folders menu reserved an empty row of space below its contents once a folder was in the list.</li>
<li>Small corrections to the credits shown in About.</li>
</ul>
            ]]>
            </description>
            <pubDate>Wed, 12 Aug 2026 00:00:00 +0000</pubDate>
            <enclosure url="https://duobolt.app/dl/macos/2.0.2" sparkle:version="2002" sparkle:shortVersionString="2.0.2" sparkle:edSignature="edsocl7WI11dMgVqiF25D12zIRaZtefRdHqqVXyMiHDarBhEFln3K34Ny7i0pm1ZPlSAfqYVDOMKVuxrkpepDQ==" length="100070729" type="application/octet-stream"/>
            <sparkle:minimumSystemVersion>11.0</sparkle:minimumSystemVersion>
        </item>
        <item>
            <title>DuoBolt 2.0 — Rewritten from scratch, and it finds photos now</title>
            <link>https://duobolt.app/changelog/</link>
            <sparkle:version>2001</sparkle:version>
            <sparkle:shortVersionString>2.0.0</sparkle:shortVersionString>
            <description>
                <![CDATA[
<p>DuoBolt 2.0 is a complete rewrite. Same app, rebuilt from the ground up in Rust on a native UI toolkit, with a second engine beside the duplicate finder: similar photos, grouped and ranked by on-device AI. Your license carries over — 1.x customers get 2.0 free, and DuoBolt adopts the license already on the machine the first time it runs.</p>
<p><h3>What's New</h3></p>
<ul>
<li>Similar photos: a second engine that finds photos which merely look alike — bursts, edits, re-saves, screenshots of the same thing — and groups them. Duplicates still means byte-for-byte identical; this is everything that isn't.</li>
<li>AI Curation ranks a group of near-identical shots and says why it picked what it picked: eyes open, smiling, face sharpness, framing. It runs entirely on your Mac or PC — no upload, no account, no network.</li>
<li>RAW files are read directly, from Canon, Nikon, Sony, Fuji and more, rather than skipped or read through an embedded preview.</li>
<li>Duplicate results are now two columns: groups on the left, the files inside the selected group on the right, each scrolling and navigable on its own. 1.x expanded a group in place and pushed everything below it down the page, so comparing two groups meant scrolling back and forth.</li>
<li>Results can be filtered by name or path, file type, extension, tag, and a size range bounded to what the scan actually found, then sorted by recoverable space, number of copies, file size, type or tag. Every filter applies after the scan, so narrowing down never means running it again.</li>
<li>Each filter now reports what its own values are worth over the set the other filters leave. Choose Images and the extension list immediately shows the sizes and counts within images, not within everything — so you can see what a filter will do before you apply it.</li>
<li>New Dashboard with lifetime scan and deletion stats, your recent scans, and space reclaimed broken down by file type.</li>
<li>Fullscreen preview plays photos, video and audio in place, so a file can be judged before it moves rather than after.</li>
<li>DuoBolt no longer stops working when a trial ends. Every download starts with 7 days of Pro; after that it keeps scanning and showing everything it finds, and caps only what a single operation moves.</li>
</ul>
<p><h3>Improvements</h3></p>
<ul>
<li>Rewritten in Rust on a native UI toolkit built for this app. It uses roughly half the memory of 1.x and stays responsive on result sets that used to make it crawl.</li>
<li>Scans run off the interface thread, so the window keeps drawing while a scan does not.</li>
<li>Thumbnails are cached on disk between runs, so reopening a set of results is immediate rather than a second round of decoding.</li>
<li>The review surface is navigable from the keyboard, with the selection, filters and preview reachable without the mouse.</li>
</ul>
<p><h3>Notes</h3></p>
<ul>
<li>Byte-for-byte matching with BLAKE3, APFS clone awareness on macOS, Trash, Delete, Archive and Copy to…, Protected Folders, tags, saved scan setups and session restore all carry over from 1.x unchanged.</li>
<li>Your 1.x license is picked up automatically on first launch and keeps its seat. 1.x and 2.0 can be installed side by side.</li>
<li>Pro adds similar photos on every group and AI Curation everywhere. Standard and the free tier see the first 8 groups, whole — the grid, the ranking and the deletion all work inside them.</li>
<li>Licenses now cover their major version. All 2.x updates are included, forever; a future 3.0 will be an optional paid upgrade, discounted for existing customers.</li>
<li>Requires macOS 11 or later, or Windows 10 and 11.</li>
</ul>
            ]]>
            </description>
            <pubDate>Mon, 10 Aug 2026 00:00:00 +0000</pubDate>
            <enclosure url="https://duobolt.app/dl/macos/2.0.0" sparkle:version="2001" sparkle:shortVersionString="2.0.0" sparkle:edSignature="JtT2HGGIdaMeE4NT0bOgmrm/ivBD1PCnivVjSh8rPma6gzjaKOTYRTqp+Nxzd67mjKNVRFODhZdU3yR1qgOMBw==" length="100053841" type="application/octet-stream"/>
            <sparkle:minimumSystemVersion>11.0</sparkle:minimumSystemVersion>
        </item>
        <item>
            <title>DuoBolt 1.4.0 — Archive flow &amp; APFS clone awareness</title>
            <link>https://duobolt.app/changelog/</link>
            <sparkle:version sparkle:xmlns="http://www.andymatuschak.org/xml-namespaces/sparkle">172</sparkle:version>
            <sparkle:shortVersionString>1.4.0</sparkle:shortVersionString>
            <description>
                <![CDATA[
<p><h3>What's New</h3></p>
<ul>
<li>New "Move to Archive..." action — pick any folder and DuoBolt moves selected duplicates there with their directory structure preserved, instead of sending them to the Trash. Archives appear in Deletion History with a "Review Archive" page to restore from.</li>
<li>New "Exclude archive folders from scans" setting (on by default) keeps archived duplicates out of future scans. Scan Setup also highlights any selected folders that overlap with known archives.</li>
<li>macOS scans now detect APFS clone groups — files that share storage on disk (e.g., from <code>cp</code>, Time Machine snapshots, build caches) — so DuoBolt no longer counts them as recoverable space. Toggleable via Advanced → Performance options, on by default.</li>
<li>Selection size, the Review screen total, the master-folder-rule preview, and delete confirmations all use the new clone-aware accounting, so the bytes you see before clicking "Delete" match what your disk actually frees.</li>
<li>Deletion History distinguishes "freed" (deletes) from "archived" (archives), since archived files still occupy real space at their destination volume.</li>
</ul>
<p><h3>Improvements</h3></p>
<ul>
<li>Scan Results header, sort order, and per-group display now show "recoverable" alongside "total" when APFS clones are detected, making it clear which groups actually free space when removed.</li>
<li>Scan-button accent in the Setup screen now uses the app's semantic gradient for better visual consistency.</li>
<li>On non-APFS volumes (Windows, Linux, HFS+, SMB) clone detection is a no-op — behavior is unchanged.</li>
</ul>
<p><h3>Fixes</h3></p>
<ul>
<li>Deletions and archives performed after restoring scan results from a previous session (e.g., closing and reopening the app) now record correctly in Deletion History.</li>
</ul>
            ]]>
            </description>
            <pubDate>Fri, 01 May 2026 21:41:08 +0000</pubDate>
            <enclosure url="https://duobolt.app/dl/macos/1.4.0" sparkle:version="172" sparkle:shortVersionString="1.4.0" length="28390010" type="application/octet-stream" sparkle:edSignature="zXg5bgpfN7JRGGo5JkDmKZCXCOovm85cQuoUnSxykpy8pY7NzZP+r/jbCPdaCyBf1aM/i8n+lr2I6+8IS1veCw=="/>
            <sparkle:minimumSystemVersion>11.0</sparkle:minimumSystemVersion>
        </item>
    </channel>
</rss>