<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yifan Huang</title>
    <description>The latest articles on DEV Community by Yifan Huang (@fanhhh1103).</description>
    <link>https://dev.to/fanhhh1103</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4242521%2F5f10b616-846c-4cf8-868e-317818d5ad8e.png</url>
      <title>DEV Community: Yifan Huang</title>
      <link>https://dev.to/fanhhh1103</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fanhhh1103"/>
    <language>en</language>
    <item>
      <title>Why I Built a Keep-First iPhone Photo Cleaner Instead of Swipe-to-Delete (On-Device Vision + Core ML)</title>
      <dc:creator>Yifan Huang</dc:creator>
      <pubDate>Fri, 13 Nov 2026 08:44:43 +0000</pubDate>
      <link>https://dev.to/fanhhh1103/why-i-built-a-keep-first-iphone-photo-cleaner-instead-of-swipe-to-delete-on-device-vision-core-3die</link>
      <guid>https://dev.to/fanhhh1103/why-i-built-a-keep-first-iphone-photo-cleaner-instead-of-swipe-to-delete-on-device-vision-core-3die</guid>
      <description>&lt;p&gt;Most iPhone photo cleaner apps follow the same interaction pattern: load photos in a stack, swipe left to delete, swipe right to keep.&lt;/p&gt;

&lt;p&gt;It feels fast for the first fifty screenshots. After a few hundred family photos, though, swipe-to-delete starts creating anxiety. One tired thumb flick marks a keeper for deletion, and most people don't review every deleted thumbnail before confirming.&lt;/p&gt;

&lt;p&gt;When I built &lt;strong&gt;&lt;a href="https://keepfirst.app/" rel="noopener noreferrer"&gt;KeepFirst: Photo Cleaner&lt;/a&gt;&lt;/strong&gt; (&lt;code&gt;iOS 17+&lt;/code&gt;), I flipped that workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Keep-First Pattern (+ In-App Review Bin)
&lt;/h2&gt;

&lt;p&gt;Instead of making "delete" the fast gesture, KeepFirst asks you to &lt;strong&gt;choose what to keep first&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pick a focused task&lt;/strong&gt;: Clean by time (recent, specific month, or shuffled batches), media type (screenshots, screen recordings, large videos, Live Photos), local similar-photo groups, or on-device scene categories.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tap only the keepers&lt;/strong&gt;: Select the photos worth keeping (&lt;code&gt;Keep N&lt;/code&gt;), or use &lt;code&gt;Keep All&lt;/code&gt; / &lt;code&gt;Clean All&lt;/code&gt; when an entire batch is obvious.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quarantine in the Review Bin&lt;/strong&gt;: Every unselected item moves to an in-app &lt;strong&gt;Review Bin&lt;/strong&gt; — nothing is removed from your Apple Photos library yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confirm with iOS&lt;/strong&gt;: Only when you review the bin and confirm does KeepFirst invoke Apple's standard iOS deletion prompt (and iOS's 30-day &lt;em&gt;Recently Deleted&lt;/em&gt; recovery net still applies after that).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You stay in control at every boundary; there is no silent or one-tap bulk purge.&lt;/p&gt;

&lt;h2&gt;
  
  
  How On-Device Processing &amp;amp; Privacy Work Under the Hood
&lt;/h2&gt;

&lt;p&gt;A major concern users raise about photo cleaners is library privacy. KeepFirst is built so your camera roll never leaves your iPhone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero backend / zero accounts&lt;/strong&gt;: There is no KeepFirst server storing user libraries, no sign-up flow, no remote analytics SDK, and no third-party ad SDK.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metadata-only persistence (&lt;code&gt;SwiftData&lt;/code&gt;)&lt;/strong&gt;: KeepFirst stores only Apple Photos asset identifiers, local keep/review states, manual &lt;code&gt;Keeps&lt;/code&gt; collection memberships, and processing timestamps — never copies of your photos or videos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bundled Core ML + Apple &lt;code&gt;Vision&lt;/code&gt;&lt;/strong&gt;: Starting in 1.4, optional &lt;strong&gt;Scenes&lt;/strong&gt; recognition sorts photos (such as people, food, pets, and scenery) and splits screenshots by purpose (chats, orders/receipts, games) using a bundled Core ML model alongside Apple's on-device &lt;code&gt;Vision&lt;/code&gt; human, animal, and text recognition. Only category labels/signals stay on-device; recognized screenshot text itself is not stored.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App Store Privacy Label&lt;/strong&gt;: &lt;strong&gt;Data Not Collected&lt;/strong&gt; (&lt;a href="https://keepfirst.app/privacy" rel="noopener noreferrer"&gt;Privacy Policy&lt;/a&gt;). Photo analysis, similarity review, and scene grouping happen locally (only optional Apple StoreKit purchases, or Apple's iCloud fetching if your originals are offloaded, use the network).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick Comparison: Keep-First vs. Common iPhone Cleaners
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;App&lt;/th&gt;
&lt;th&gt;Primary Workflow&lt;/th&gt;
&lt;th&gt;Deletion Safety Buffer&lt;/th&gt;
&lt;th&gt;Privacy &amp;amp; Tracking&lt;/th&gt;
&lt;th&gt;Pricing Model&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;KeepFirst&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pick keepers first in batches + manual &lt;code&gt;Keeps&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;In-app Review Bin + iOS prompt&lt;/td&gt;
&lt;td&gt;On-device; &lt;code&gt;Data Not Collected&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;200 items free; Weekly &lt;code&gt;$2.99&lt;/code&gt; / Monthly &lt;code&gt;$5.99&lt;/code&gt; / Lifetime &lt;code&gt;$19.99&lt;/code&gt;; no forced trial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Slidebox&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Swipe up/down + album filing&lt;/td&gt;
&lt;td&gt;Trash queue before confirm&lt;/td&gt;
&lt;td&gt;On-device&lt;/td&gt;
&lt;td&gt;Free with ads; lifetime unlock&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Clever Cleaner&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Swipe-to-delete + auto grouping&lt;/td&gt;
&lt;td&gt;Trash preview before delete&lt;/td&gt;
&lt;td&gt;On-device photo scan; App Store label lists tracking/analytics&lt;/td&gt;
&lt;td&gt;Generous free tier + premium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CleanMyPhone&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Automated similarity &amp;amp; clutter scan&lt;/td&gt;
&lt;td&gt;Review queue before delete&lt;/td&gt;
&lt;td&gt;On-device analysis; usage analytics&lt;/td&gt;
&lt;td&gt;Subscription&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;More workflow details and comparisons: &lt;a href="https://keepfirst.app/iphone-photo-cleaner-app" rel="noopener noreferrer"&gt;Best iPhone Photo Cleaner Apps Compared&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Try KeepFirst
&lt;/h2&gt;

&lt;p&gt;Every device gets &lt;strong&gt;200 newly processed photos or videos for free&lt;/strong&gt;, with &lt;strong&gt;no forced trial&lt;/strong&gt; and &lt;strong&gt;no startup subscription gate&lt;/strong&gt;. Browsing and organizing your kept memories inside &lt;code&gt;Keeps&lt;/code&gt; stays free regardless of that limit.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Download on the App Store&lt;/strong&gt;: &lt;a href="https://apps.apple.com/us/app/keepfirst-photo-cleaner/id6782832739" rel="noopener noreferrer"&gt;KeepFirst: Photo Cleaner&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a href="https://keepfirst.app/" rel="noopener noreferrer"&gt;https://keepfirst.app/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review Bin Guide&lt;/strong&gt;: &lt;a href="https://keepfirst.app/review-bin" rel="noopener noreferrer"&gt;https://keepfirst.app/review-bin&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>swiftui</category>
      <category>ios</category>
      <category>indiedev</category>
      <category>privacy</category>
    </item>
  </channel>
</rss>
