<?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: Ethan</title>
    <description>The latest articles on DEV Community by Ethan (@ethanwalker89m).</description>
    <link>https://dev.to/ethanwalker89m</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%2F4009878%2Ffda1a68f-8380-4a3e-b963-aa8c190f95b8.png</url>
      <title>DEV Community: Ethan</title>
      <link>https://dev.to/ethanwalker89m</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ethanwalker89m"/>
    <language>en</language>
    <item>
      <title>A 4.7MB photo cleaner, reviewed — what tiny apps get right</title>
      <dc:creator>Ethan</dc:creator>
      <pubDate>Sat, 18 Jul 2026 06:04:37 +0000</pubDate>
      <link>https://dev.to/ethanwalker89m/a-47mb-photo-cleaner-reviewed-what-tiny-apps-get-right-4f7e</link>
      <guid>https://dev.to/ethanwalker89m/a-47mb-photo-cleaner-reviewed-what-tiny-apps-get-right-4f7e</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Disclosure: I'm part of the Nomos network, which recently started working with OnePhoto. What follows is my own take, based on actually using the app — including the parts I'd change.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My camera roll hit 11,000 items sometime this spring. Screenshots of error messages from 2023. Nine near-identical photos of the same whiteboard. The usual.&lt;/p&gt;

&lt;p&gt;I've tried cleaning this up before. The blocker was never motivation — it was that every cleanup session starts with a decision about &lt;em&gt;how&lt;/em&gt; to clean, and ends with me second-guessing a batch delete. So when OnePhoto (listed as "Swipe Cleaner" on some app stores) came across my desk this week, I gave it a full evening instead of a polite five minutes.&lt;/p&gt;

&lt;p&gt;Here are my notes, from a product person's angle.&lt;/p&gt;

&lt;h2&gt;
  
  
  The most interesting spec is the download size
&lt;/h2&gt;

&lt;p&gt;OnePhoto is 4.7MB.&lt;/p&gt;

&lt;p&gt;If you haven't looked at App Store listings lately, that number might not register. For context: most photo cleaner apps in the same category ship between 90 and 200MB. That's a 20–40x difference for what is, functionally, the same job — show photo, ask keep-or-delete, repeat.&lt;/p&gt;

&lt;p&gt;Why does a photo cleaner need 150MB? It doesn't. What fills that space is usually an account system, an analytics stack, a subscription paywall framework, a cloud sync SDK, and often some form of "AI enhancement" nobody asked for.&lt;/p&gt;

&lt;p&gt;So a 4.7MB binary isn't just a technical flex. It's a roadmap you can read backwards: no account, no cloud, no tracking SDKs, no upsell machinery. The absence of weight is the product statement. As someone who evaluates products for a living, I find this more honest than any privacy policy page — you can't collect what you didn't ship the code to collect.&lt;/p&gt;

&lt;h2&gt;
  
  
  The interaction model: swipe, then confirm
&lt;/h2&gt;

&lt;p&gt;The core loop is Tinder-style: swipe left to delete, right to keep, up to favorite. One photo at a time, full screen.&lt;/p&gt;

&lt;p&gt;The detail I want to highlight is the &lt;strong&gt;confirm queue&lt;/strong&gt;. Swiping left doesn't delete anything — it stages the photo in a pending list. You review the whole queue at the end and commit the batch in one action.&lt;/p&gt;

&lt;p&gt;This is a small thing that solves the actual psychological blocker with photo cleanup. Batch-select interfaces make you afraid of your own thumb: one mis-tap in a grid of 200 selected items and you genuinely don't know what you just lost. OnePhoto's queue turns a destructive action into a two-phase commit. You can be fast &lt;em&gt;and&lt;/em&gt; sloppy during triage, because precision only matters once, at review time.&lt;/p&gt;

&lt;p&gt;I cleared a few hundred items in my first session. The swipe pace is quick enough that it fills the same niche as a mobile game — I did one round while waiting for a build to finish.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it doesn't do (and whether that matters)
&lt;/h2&gt;

&lt;p&gt;Honest review means listing the gaps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No smart duplicate detection.&lt;/strong&gt; It won't cluster those nine whiteboard photos for you. You swipe through them one by one. Competitors with ML-based similarity grouping do this better — at the cost of being the 150MB apps described above.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No cloud backup integration.&lt;/strong&gt; Deleted means deleted (into the iOS recently-deleted bin). By design, since nothing leaves the device — but if you expected a safety net beyond that, there isn't one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apple platforms only.&lt;/strong&gt; iOS 16+, iPadOS, macOS on Apple silicon.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For my use case, none of these are dealbreakers. The duplicate-detection gap is the one real trade-off: you're exchanging convenience for the guarantee that no third party ever computes anything about your photo library.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;p&gt;Free, with a one-time supporter unlock (about $1.50 equivalent). No subscription. That pricing is consistent with the rest of the product's philosophy — a tool, not a revenue funnel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verdict
&lt;/h2&gt;

&lt;p&gt;OnePhoto won't impress anyone in a feature-comparison table, and that's precisely the point. It picks one job — triage your camera roll fast, locally, without fear of mis-deletion — and executes it with a discipline you can measure in megabytes.&lt;/p&gt;

&lt;p&gt;If your camera roll is also a graveyard of screenshots, it's a genuinely pleasant way to spend twenty minutes. And if you're a developer or product person, it's worth installing just to study how much product you can ship in 4.7MB.&lt;/p&gt;

&lt;p&gt;App Store: &lt;a href="https://apps.apple.com/app/id6779493280" rel="noopener noreferrer"&gt;apps.apple.com/app/id6779493280&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ios</category>
      <category>mobile</category>
      <category>productivity</category>
      <category>ux</category>
    </item>
    <item>
      <title>Subtraction as a Feature: What a Tiny Meditation Timer Taught Me About Product Restraint</title>
      <dc:creator>Ethan</dc:creator>
      <pubDate>Wed, 15 Jul 2026 09:32:24 +0000</pubDate>
      <link>https://dev.to/ethanwalker89m/subtraction-as-a-feature-what-a-tiny-meditation-timer-taught-me-about-product-restraint-4kcc</link>
      <guid>https://dev.to/ethanwalker89m/subtraction-as-a-feature-what-a-tiny-meditation-timer-taught-me-about-product-restraint-4kcc</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Disclosure: I work in the OpenNomos ecosystem, which OneZen is a part of.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The first thing I noticed about OneZen wasn't a feature. It was the absence of them.&lt;/p&gt;

&lt;p&gt;The settings screen is shorter than the average cookie banner. No account creation. No streak counter. No content library with 400 guided sessions narrated by a celebrity. No "premium unlock" nag on day three. A timer, a breathing rhythm, a handful of natural sounds, and a local record of your sessions. That's the product.&lt;/p&gt;

&lt;p&gt;My honest first reaction was: &lt;em&gt;is that enough?&lt;/em&gt; I've spent years around SaaS and consumer apps, and my instinct — trained by a decade of roadmap meetings — is that a product this small must be unfinished.&lt;/p&gt;

&lt;p&gt;Then I used it for two weeks, and I want to unpack why "small" here is a deliberate design position, not a lack of ambition.&lt;/p&gt;

&lt;h2&gt;
  
  
  Feature creep has a direction, and it's always inward
&lt;/h2&gt;

&lt;p&gt;Meditation apps are a fascinating category because the job-to-be-done is almost comically simple: help me sit down and be quiet for ten minutes.&lt;/p&gt;

&lt;p&gt;Yet look at the market leaders. Subscriptions. Daily streaks. Push notifications that guilt you back ("You haven't meditated in 3 days 😢"). Sleep stories, masterclasses, mood check-ins, social features. Each addition makes sense in isolation — retention teams need retention levers. But stack them up and you get something strange: an app about calm that generates anxiety about using the app.&lt;/p&gt;

&lt;p&gt;This isn't a moral failing of any particular team. It's structural:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every feature has an internal advocate. &lt;strong&gt;Nobody owns removal.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Engagement metrics reward additions. Absence doesn't show up in dashboards.&lt;/li&gt;
&lt;li&gt;"We added X" is a press release. "We refused to add X" is invisible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So products accrete. The default trajectory of any successful app is toward more, and it takes an explicit, ongoing decision to hold the line.&lt;/p&gt;

&lt;h2&gt;
  
  
  What restraint looks like in practice
&lt;/h2&gt;

&lt;p&gt;OneZen's choices read like a list of things a growth team would veto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No account.&lt;/strong&gt; Your practice records stay on the device. This kills cross-device sync as a feature — a real trade-off — but it also means registration friction is zero and there's no advertising profile being built.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No streaks.&lt;/strong&gt; If you skip a week, the app doesn't know or care. You come back because you want to, not because a number would reset.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No content library.&lt;/strong&gt; A breathing rhythm and ambient sounds. That's the ceiling of complexity. There's nothing to "finish," so there's no backlog guilt.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's the part that surprised me: &lt;strong&gt;I skip fewer days now than I did with a streak-based app.&lt;/strong&gt; With streaks, one missed day converted motivation into shame, and shame into churn. With nothing to lose, restarting costs nothing. The absence of a retention mechanic &lt;em&gt;is&lt;/em&gt; the retention mechanic.&lt;/p&gt;

&lt;h2&gt;
  
  
  The uncomfortable question for builders
&lt;/h2&gt;

&lt;p&gt;I keep coming back to this: for most products, the honest version of the roadmap conversation isn't "what should we build next?" It's "what are we adding to avoid admitting the core job is already done?"&lt;/p&gt;

&lt;p&gt;There are real limits to the subtraction position. If you want guided courses, OneZen is not for you. If you need multi-device history, local-only records will annoy you. Restraint is a filter, and filters exclude people — that's the price, and it should be stated plainly rather than papered over.&lt;/p&gt;

&lt;p&gt;But as a product stance, it's coherent in a way that most "calm tech" marketing isn't. The app's architecture (no account, local data) makes the promise structurally credible. It &lt;em&gt;can't&lt;/em&gt; spam you; it doesn't have your email. That's a stronger privacy statement than any policy page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaways I'm stealing for my own work
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Write the not-doing list.&lt;/strong&gt; For every roadmap item, keep a parallel list of things you've explicitly decided not to build, with reasons. Review it as seriously as the backlog.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask what each feature costs the user, not just the team.&lt;/strong&gt; Streaks cost shame. Accounts cost trust. Libraries cost completion anxiety.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make constraints architectural.&lt;/strong&gt; A promise enforced by system design (local-only data) beats a promise enforced by policy.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you want to see what the subtraction position looks like shipped, OneZen is on the App Store: &lt;a href="https://apps.apple.com/cn/app/id6780318004" rel="noopener noreferrer"&gt;https://apps.apple.com/cn/app/id6780318004&lt;/a&gt; — the whole tour takes about ninety seconds, which is sort of the point.&lt;/p&gt;

&lt;p&gt;Would this approach survive contact with a venture-scale growth target? Probably not. That tension — between products that respect finished-ness and business models that can't afford it — is the more interesting conversation, and I don't think our industry has an answer yet.&lt;/p&gt;

</description>
      <category>design</category>
      <category>ux</category>
      <category>productivity</category>
      <category>startup</category>
    </item>
    <item>
      <title>The UX trick that finally got me to clean up 20,000 photos</title>
      <dc:creator>Ethan</dc:creator>
      <pubDate>Tue, 14 Jul 2026 07:52:34 +0000</pubDate>
      <link>https://dev.to/ethanwalker89m/the-ux-trick-that-finally-got-me-to-clean-up-20000-photos-4klm</link>
      <guid>https://dev.to/ethanwalker89m/the-ux-trick-that-finally-got-me-to-clean-up-20000-photos-4klm</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Disclosure: I work within the Opennomos ecosystem, which is how I came across the app mentioned here. No affiliate links, no sponsorship — just a genuine UX observation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The hardest part of a boring task is almost never the task. It's the interaction model.&lt;/p&gt;

&lt;p&gt;I sat on ~20,000 photos for about two years. Screenshots, near-duplicate food shots, three-second videos of nothing. Every few months I'd open the Photos app, feel the weight of it, tap "Select," start long-pressing, and quit within ninety seconds. The task wasn't hard. The interface made it feel like data entry.&lt;/p&gt;

&lt;p&gt;What finally broke the loop was switching to a different interaction: one photo at a time, full screen, swipe left to queue a delete, swipe right to keep. No multi-select grid. No checkboxes. No "are you sure" on every tap. Decisions get batched and confirmed at the end, so nothing is destructive until you say so.&lt;/p&gt;

&lt;p&gt;I cleared a few hundred in one sitting, on the couch, without thinking of it as a chore.&lt;/p&gt;

&lt;p&gt;As a developer this bugged me in a good way, because the lesson generalizes far past photo cleanup:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Reduce the decision surface to exactly one thing.&lt;/strong&gt;&lt;br&gt;
The grid asks you to scan, compare, and select simultaneously. The card view asks one question: this one, yes or no? Same underlying work, dramatically lower cognitive load. We do the opposite constantly in our own tools — dashboards that show twelve actions when the user only ever needs one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Make the reversible path the default.&lt;/strong&gt;&lt;br&gt;
"Swipe left = queue for delete" isn't the same as deleting. The queue is the safety net that lets you move fast. Batch-confirm at the end. Most destructive UIs would be less scary and more usable if they separated &lt;em&gt;intent&lt;/em&gt; from &lt;em&gt;commit&lt;/em&gt; the way git does.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Match the input to the muscle memory people already have.&lt;/strong&gt;&lt;br&gt;
Swiping through cards is a gesture a billion people already learned from other apps. You're not teaching a new interaction; you're borrowing one. The cheapest UX win is often "use the gesture they already know."&lt;/p&gt;

&lt;p&gt;The app I ended up using is a small iOS one called Swipe Cleaner (part of the One Apps set — swipe left to delete, right to keep). Two details I appreciated as someone who cares about how software is built: photos never leave the device, and there's no account to create. For a utility that touches your entire camera roll, "it just runs locally" is the correct default, not a premium feature.&lt;/p&gt;

&lt;p&gt;None of this is novel. Tinder shipped the mechanic years ago; plenty of apps have borrowed it. But that's exactly the point — the winning move wasn't a clever algorithm, it was picking an interaction model that made a tedious task feel almost pleasant. If you're building anything where users have to grind through a queue (reviewing flagged items, triaging a backlog, approving records), it's worth asking: am I making them fill out a form, or am I letting them swipe?&lt;/p&gt;

&lt;p&gt;The task was always doable. I just needed an interface that didn't argue with me about it.&lt;/p&gt;

</description>
      <category>ux</category>
      <category>ios</category>
      <category>productivity</category>
      <category>privacy</category>
    </item>
    <item>
      <title>5 habits that finally helped me keep up with AI papers (without burning out)</title>
      <dc:creator>Ethan</dc:creator>
      <pubDate>Mon, 13 Jul 2026 05:41:14 +0000</pubDate>
      <link>https://dev.to/ethanwalker89m/5-habits-that-finally-helped-me-keep-up-with-ai-papers-without-burning-out-12ep</link>
      <guid>https://dev.to/ethanwalker89m/5-habits-that-finally-helped-me-keep-up-with-ai-papers-without-burning-out-12ep</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Disclosure: I'm part of the OpenNomos ecosystem and I mention one tool from it near the end. Everything below is my honest workflow, not an ad.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you build anything near AI right now, you already know the feeling: you open your feed and there are nine "must-read" papers before breakfast, and by the time you've bookmarked three of them, six more have shown up. I spent most of last year feeling permanently behind. Then I stopped trying to "keep up" and started building a system. Here are the five habits that actually stuck.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Accept that you can't read everything — then act like it
&lt;/h2&gt;

&lt;p&gt;The single most useful shift was giving up on completeness. arXiv alone gets hundreds of new cs.LG/cs.CL submissions a day. No human reads that. Once I admitted that out loud, my goal changed from "read all the important papers" to "reliably notice the few that matter to what I'm building." That reframe removed about 80% of the guilt, and guilt is what makes people quit.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Split "discovery" from "reading" — they're different jobs
&lt;/h2&gt;

&lt;p&gt;I used to try to read a paper the moment I found it. That's a trap: discovery happens in scattered 30-second moments (a tweet, a Discord ping, a newsletter), while real reading needs a 45-minute focused block. Mixing them means you do both badly. Now discovery just means &lt;em&gt;capture the link and move on&lt;/em&gt;. Reading is a separate, scheduled activity.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Keep one running list, not 40 open tabs
&lt;/h2&gt;

&lt;p&gt;Open tabs are where papers go to die. So are 200 browser bookmarks. What works is a single, searchable list that I actually trust — title, link, a one-line "why I saved it," and a status (unread / skimmed / read). The magic isn't the tool, it's having exactly &lt;strong&gt;one&lt;/strong&gt; place. When capture is frictionless, you stop losing things, and "I'll find it later" becomes true instead of a lie you tell yourself.&lt;/p&gt;

&lt;p&gt;This is the habit I fought with the longest, because a plain note doc gets messy fast. I've been using &lt;a href="https://paperlist.ai/" rel="noopener noreferrer"&gt;Paper List&lt;/a&gt; for this lately — it's built specifically around maintaining a paper list for a paper engine, so the "capture → organize → find again" loop is the whole point rather than a feature bolted onto a general notes app. (I found it through OpenNomos, an ecosystem that aggregates small independent tools like this.) Use whatever you like here — the habit matters more than the app.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Batch your reading, don't stream it
&lt;/h2&gt;

&lt;p&gt;Streaming papers (one here, one there, all day) destroys deep work and you retain almost nothing. Batching wins. I do one 45-minute reading block, 2–3 times a week, and I go through the list newest-relevant-first. In one sitting I'll fully read one paper, skim two, and archive four that turned out to be noise. That's a good session. Trying to do a little every hour is how you end up reading nothing well.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Write a one-line summary or it didn't happen
&lt;/h2&gt;

&lt;p&gt;If I can't compress a paper into a single sentence — "X shows that Y improves Z by doing W" — I didn't actually understand it. That one line goes back into the list next to the link. Two benefits: it forces real comprehension, and future-me can grep the list months later and instantly remember why a paper mattered. This tiny step is what turns a pile of links into an actual knowledge base.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;None of this is about reading faster. It's about lowering the cost of &lt;em&gt;deciding&lt;/em&gt; — what to capture, when to read, what to keep. Keeping up with AI research stopped being a source of dread the moment I treated it as a lightweight pipeline instead of an infinite to-do list.&lt;/p&gt;

&lt;p&gt;Start with habit #3: pick one place for your list this week. Everything else gets easier once you trust that nothing is falling through the cracks.&lt;/p&gt;

&lt;p&gt;What does your paper-tracking setup look like? I'm always looking to steal a better workflow.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>From Idea to Launch: What I Learned Building 3 MVPs in 2024</title>
      <dc:creator>Ethan</dc:creator>
      <pubDate>Sat, 11 Jul 2026 02:35:06 +0000</pubDate>
      <link>https://dev.to/ethanwalker89m/from-idea-to-launch-what-i-learned-building-3-mvps-in-2024-497f</link>
      <guid>https://dev.to/ethanwalker89m/from-idea-to-launch-what-i-learned-building-3-mvps-in-2024-497f</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Disclosure: I contribute to the OpenNomos ecosystem, which includes 01MVP.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I spent most of 2024 building things that nobody used. Not because the ideas were bad—but because I kept making the same mistake: treating every project like it had to be perfect before anyone saw it.&lt;/p&gt;

&lt;p&gt;Here's what finally clicked.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Trap: Building Products Instead of Experiments
&lt;/h2&gt;

&lt;p&gt;My first two projects took 3+ months each before I showed them to anyone. I added authentication, dark mode, onboarding flows, payment integration—everything a "real" product needs.&lt;/p&gt;

&lt;p&gt;Both launched to silence.&lt;/p&gt;

&lt;p&gt;The problem wasn't the features. The problem was that I hadn't validated a single assumption before building all of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Shift: One Hypothesis, One Week
&lt;/h2&gt;

&lt;p&gt;A friend recommended I try a framework called &lt;a href="https://01mvp.com" rel="noopener noreferrer"&gt;01MVP&lt;/a&gt; that forces you to break your idea into week-by-week deliverables. At first I dismissed it—I knew how to build things. Why do I need a framework?&lt;/p&gt;

&lt;p&gt;But the structure changed everything:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 1&lt;/strong&gt;: Define the core hypothesis (not "people want a task manager"—that's too vague. Try "people will pay $5/month for a task manager that auto-prioritizes based on deadlines").&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 2&lt;/strong&gt;: Build the absolute minimum to test that hypothesis. Not a landing page. Not a waitlist. An actual working thing, ugly as hell.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 3&lt;/strong&gt;: Put it in front of 10 people and watch them use it.&lt;/p&gt;

&lt;p&gt;This sounds obvious in retrospect. But when you're the one coding, the temptation to "just add one more feature" before showing anyone is overwhelming.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Rules That Actually Work
&lt;/h2&gt;

&lt;p&gt;After going through this process a few times, here's what stuck:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. One Feature. Period.
&lt;/h3&gt;

&lt;p&gt;Not three. Not "one and a half." If your core feature doesn't get anyone excited, adding a settings page won't fix it.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Off-the-Shelf Everything
&lt;/h3&gt;

&lt;p&gt;You're not proving you can write an auth system. You're proving someone needs your product. Clerk for auth, Stripe for payments, Vercel for hosting—use what exists.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Ship in Two Weeks or Kill It
&lt;/h3&gt;

&lt;p&gt;If you can't ship something testable in 14 days, you're either over-scoping or the idea is too vague. Either way, it's a red flag.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Result
&lt;/h2&gt;

&lt;p&gt;Since adopting this approach, my "time from idea to real user feedback" dropped from months to weeks. More importantly, I kill bad ideas before they consume months of my life.&lt;/p&gt;

&lt;p&gt;The hardest part isn't the code. It's the discipline to stop building and start testing.&lt;/p&gt;

&lt;p&gt;If you're sitting on an idea right now, give yourself two weeks. Ship something ugly. See what happens.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What's your MVP process look like? I'd love to hear what's worked (or failed) for you.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>I Built a Personal Paper Engine to Stop Losing Research Papers</title>
      <dc:creator>Ethan</dc:creator>
      <pubDate>Fri, 10 Jul 2026 03:35:47 +0000</pubDate>
      <link>https://dev.to/ethanwalker89m/i-built-a-personal-paper-engine-to-stop-losing-research-papers-3d56</link>
      <guid>https://dev.to/ethanwalker89m/i-built-a-personal-paper-engine-to-stop-losing-research-papers-3d56</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Disclosure: I contribute to the OpenNomos ecosystem where Paper List is listed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I read about 30 research papers a month. Not because I'm an academic—I'm a product person who needs to stay on top of what's happening in AI, developer tools, and Web3.&lt;/p&gt;

&lt;p&gt;The problem wasn't reading the papers. It was remembering them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "Where Did I Read That?" Problem
&lt;/h2&gt;

&lt;p&gt;Three months ago, I was writing a product analysis and needed to reference a specific finding from a paper I'd read in January. I spent &lt;em&gt;45 minutes&lt;/em&gt; searching:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Browser history: too many entries, no context&lt;/li&gt;
&lt;li&gt;Zotero: I'd stopped using it because the interface felt like filing taxes&lt;/li&gt;
&lt;li&gt;Notion: I had notes, but buried three levels deep&lt;/li&gt;
&lt;li&gt;Slack DMs: I'd sent a summary to a colleague, but scrolling back through three months of messages was hopeless&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I found the paper eventually. But that 45 minutes felt like it went straight into a black hole.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Actually Needed
&lt;/h2&gt;

&lt;p&gt;I didn't need a full academic reference manager. I needed:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Quick capture&lt;/strong&gt; — save a paper in under 10 seconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lightweight annotation&lt;/strong&gt; — 2-3 bullet points, not a literature review&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search that works&lt;/strong&gt; — find by keyword, topic, or date&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Progress tracking&lt;/strong&gt; — know what I've read, what's in my queue&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most tools in this space are built for academics writing theses. I just wanted something that felt like a to-do list for my reading brain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter Paper List
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://paperlist.ai/" rel="noopener noreferrer"&gt;Paper List&lt;/a&gt; is a personal paper engine. The tagline is "Paper list for paper engine" — and it delivers on that.&lt;/p&gt;

&lt;p&gt;Here's my current workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Find a paper&lt;/strong&gt; → Save to Paper List with the URL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read&lt;/strong&gt; → Highlight key sections&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Annotate&lt;/strong&gt; → 3-sentence summary: what problem, how solved, what limitations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tag&lt;/strong&gt; → Categorize by topic (ML, devtools, crypto, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revisit&lt;/strong&gt; → Search by tag or keyword when I need to reference something&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The whole process takes less than two minutes per paper. And when I need to find something later, I just search.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "Personal Paper Engine" Matters
&lt;/h2&gt;

&lt;p&gt;The phrase "paper engine" isn't just marketing. It captures something important:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A paper engine is to research what a search engine is to the web. It doesn't just store—it retrieves.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Zotero and Mendeley store papers. They're archives. Paper List is designed for retrieval first. The reading, annotating, and organizing all serve one purpose: finding what you need, when you need it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Months In
&lt;/h2&gt;

&lt;p&gt;I've tracked about 90 papers since I started using it. The real ROI isn't the tool itself—it's the mental model it creates.&lt;/p&gt;

&lt;p&gt;When you know you can find anything in 30 seconds, you stop hoarding. You read with more focus because you're not worried about forgetting. You take better notes because you know they'll be retrievable.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Still Missing
&lt;/h2&gt;

&lt;p&gt;No tool is perfect. Here's what I wish Paper List had:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Collaboration&lt;/strong&gt;: sharing reading lists with teammates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration&lt;/strong&gt;: browser extension for one-click save&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export&lt;/strong&gt;: markdown or JSON export for backup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But for a personal reading workflow, it covers 80% of what I need. And I'll take 80% coverage with 10-second setup over 100% coverage with 2-hour setup any day.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you read papers regularly and have a system that works, I'd love to hear about it. What's your workflow?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Three Tools I Use Every Day as a Developer (And Why Less Is More)</title>
      <dc:creator>Ethan</dc:creator>
      <pubDate>Thu, 09 Jul 2026 02:51:20 +0000</pubDate>
      <link>https://dev.to/ethanwalker89m/three-tools-i-use-every-day-as-a-developer-and-why-less-is-more-7d</link>
      <guid>https://dev.to/ethanwalker89m/three-tools-i-use-every-day-as-a-developer-and-why-less-is-more-7d</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Disclosure: I contribute to the OpenNomos ecosystem, where some of these projects are listed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every few months I go through my tools folder and delete things. Not because they're bad—most are genuinely well-made—but because I realize I haven't opened them in weeks.&lt;/p&gt;

&lt;p&gt;The ones that survive the purge are the ones that do &lt;em&gt;one thing&lt;/em&gt; and get out of the way.&lt;/p&gt;

&lt;p&gt;Here are three that made the cut this quarter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paper List — Research Without the Noise
&lt;/h2&gt;

&lt;p&gt;I used to dread literature reviews. Open Google Scholar, type a query, scroll through fifteen irrelevant papers, open five tabs, realize three are behind paywalls, close everything, try again with different keywords.&lt;/p&gt;

&lt;p&gt;Paper List (&lt;a href="https://paperlist.ai" rel="noopener noreferrer"&gt;paperlist.ai&lt;/a&gt;) changed that workflow completely. You type what you're researching, and it surfaces relevant papers. No complex query syntax. No manually filtering by year or citation count. Just results that match what you asked for.&lt;/p&gt;

&lt;p&gt;The interface is the real differentiator. There's no dashboard with seventeen widgets, no "recommended for you" sidebar, no AI chatbot trying to summarize papers for you. The designer clearly understood that researchers don't need another dashboard—they need to find papers and get back to work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Swipe Cleaner — A Photo App That Doesn't Want to Be Your Social Network
&lt;/h2&gt;

&lt;p&gt;Phone storage fills up fast, especially when you take screenshots of everything. Most photo cleaner apps come bundled with editors, cloud backup subscriptions, and social sharing features I never asked for.&lt;/p&gt;

&lt;p&gt;Swipe Cleaner is different. You open it, you swipe through your photos, you delete what you don't need. That's the entire feature set.&lt;/p&gt;

&lt;p&gt;There's something almost radical about a mobile app that resists feature creep. No account required. No subscription upsell. No "share to community" button. Just a tool that does its job and closes.&lt;/p&gt;

&lt;h2&gt;
  
  
  OneZen — Meditation Without the Gamification
&lt;/h2&gt;

&lt;p&gt;Meditation apps have gotten weird. Streak counters. Achievement badges. Leaderboards. Social sharing of your "mindfulness minutes." It's like someone decided inner peace needed a retention strategy.&lt;/p&gt;

&lt;p&gt;OneZen asks you two questions: how long, and what sound. Then it starts a timer.&lt;/p&gt;

&lt;p&gt;No login wall. No premium subscription. No notifications. No "your friend just meditated for 12 minutes!" push alerts. You pick a duration, pick a nature sound, and you're done.&lt;/p&gt;




&lt;h2&gt;
  
  
  What These Three Have in Common
&lt;/h2&gt;

&lt;p&gt;None of them try to be platforms. None of them have social features. None of them ask for your email before showing you anything useful.&lt;/p&gt;

&lt;p&gt;After years of trying every productivity tool that launches on Product Hunt, I've come to a simple conclusion: the best tools are the ones you forget you're using.&lt;/p&gt;

&lt;p&gt;If a tool needs a tutorial, it's already lost. If it sends you a "we miss you" email, it's trying too hard. If it has more than three tabs in its navigation bar, someone in a meeting said "what if we also..."&lt;/p&gt;

&lt;p&gt;Sometimes the best feature is restraint.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
    <item>
      <title>"Swipe Cleaner: A Technical Deep Dive into On-Device Photo Privacy"</title>
      <dc:creator>Ethan</dc:creator>
      <pubDate>Tue, 07 Jul 2026 03:18:29 +0000</pubDate>
      <link>https://dev.to/ethanwalker89m/swipe-cleaner-a-technical-deep-dive-into-on-device-photo-privacy-dld</link>
      <guid>https://dev.to/ethanwalker89m/swipe-cleaner-a-technical-deep-dive-into-on-device-photo-privacy-dld</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Disclosure: I write about projects in the OpenNomos ecosystem, including Swipe Cleaner.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Problem With Photo Cleaners
&lt;/h2&gt;

&lt;p&gt;Most photo cleaning apps have a dirty secret: your photos leave your device. They get uploaded to some server for "AI processing," "cloud analysis," or just because the developer didn't think about it.&lt;/p&gt;

&lt;p&gt;Swipe Cleaner takes the opposite approach. Everything happens on your iPhone. Not a single pixel leaves your device.&lt;/p&gt;

&lt;p&gt;Let me break down why that matters, and how it actually works under the hood.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;

&lt;p&gt;Swipe Cleaner is built on three principles:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. On-device processing, always.&lt;/strong&gt; Image analysis, duplicate detection, and similarity matching all run locally using Apple's Core ML and Vision frameworks. No cloud roundtrips, no server costs, no privacy policy loopholes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Tinder-style UX for decisions.&lt;/strong&gt; You don't manage a grid of thumbnails and checkboxes. You swipe. Right to keep, left to delete. This isn't just a UI gimmick — it's a deliberate choice to reduce decision fatigue. When you have 3,000 photos to clean, you need flow, not friction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Sandboxed storage access.&lt;/strong&gt; The app requests permission for exactly what it needs. It doesn't ask for your entire photo library if you only want to clean screenshots. This is iOS privacy-by-design done right.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why On-Device Matters Now
&lt;/h2&gt;

&lt;p&gt;We're in a weird moment. AI capabilities are exploding, which means the temptation to "send it to the cloud for better results" is stronger than ever. But at the same time, Apple is pushing hard in the opposite direction — Private Cloud Compute, on-device ML, differential privacy.&lt;/p&gt;

&lt;p&gt;Swipe Cleaner aligns with where the platform is going, not where the industry has been.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Technical Trade-offs
&lt;/h2&gt;

&lt;p&gt;Local-first isn't free. Here's what you give up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model size constraints.&lt;/strong&gt; You can't run a 70B parameter vision model on an iPhone. The models need to be small, optimized, and ruthlessly efficient.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No cross-device sync.&lt;/strong&gt; Your cleaning decisions stay on one device. No cloud means no sync. For a photo cleaner, this is arguably a feature, not a bug.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Battery &amp;amp; thermal limits.&lt;/strong&gt; Heavy image processing on-device generates heat. You need to batch operations, throttle when needed, and respect the device's thermal state.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;The team is exploring on-device ML for smarter grouping — detecting burst photos, identifying "best shot" candidates, and flagging near-duplicates with subtle differences. All without a server in sight.&lt;/p&gt;

&lt;p&gt;If you care about privacy and you have an iPhone with thousands of photos you've been meaning to clean, Swipe Cleaner is worth a look. It's free, it's fast, and your photos never leave your phone.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built on OpenNomos. Contribute tools or improvements and earn ecosystem rewards.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>ios</category>
      <category>privacy</category>
    </item>
    <item>
      <title>The Architecture of On-Device Privacy — How Swipe Cleaner Keeps Your Photos Local</title>
      <dc:creator>Ethan</dc:creator>
      <pubDate>Mon, 06 Jul 2026 02:41:31 +0000</pubDate>
      <link>https://dev.to/ethanwalker89m/the-architecture-of-on-device-privacy-how-swipe-cleaner-keeps-your-photos-local-4n5f</link>
      <guid>https://dev.to/ethanwalker89m/the-architecture-of-on-device-privacy-how-swipe-cleaner-keeps-your-photos-local-4n5f</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Disclosure: I work on Nomos, the ecosystem behind Swipe Cleaner.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Problem with Photo Cleaners
&lt;/h2&gt;

&lt;p&gt;Most photo cleaning apps follow the same pattern: upload your photos to a cloud server, run ML models server-side, send back results. It's convenient for developers — you get unlimited compute, easy model updates, simple analytics.&lt;/p&gt;

&lt;p&gt;It's terrible for users.&lt;/p&gt;

&lt;p&gt;Your photos are the most personal data on your phone. Medical records, family moments, private documents, embarrassing screenshots. Uploading them to someone else's server means trusting that company with literally everything. And we've seen how often that trust is broken.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture Decision
&lt;/h2&gt;

&lt;p&gt;When we built Swipe Cleaner, we made one decision that shaped everything else:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;All processing happens on the device.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not "we encrypt data in transit." Not "we delete after processing." Not "trust us, we're different."&lt;/p&gt;

&lt;p&gt;None of it. The data never leaves.&lt;/p&gt;

&lt;p&gt;This sounds simple until you try to build it. Here's what it actually requires.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core ML on iOS: The Technical Reality
&lt;/h2&gt;

&lt;p&gt;Apple provides excellent on-device ML infrastructure through Core ML and the Neural Engine. Modern iPhones have dedicated ML hardware that can run models with impressive performance.&lt;/p&gt;

&lt;p&gt;But "it works on paper" and "it works in production" are very different things.&lt;/p&gt;

&lt;h3&gt;
  
  
  Model Size Constraints
&lt;/h3&gt;

&lt;p&gt;A cloud model can be gigabytes. An on-device model needs to run on a phone that's also running iOS, background apps, and maybe Spotify. Our image classification model is under 50MB — achieved through aggressive quantization and architecture optimization.&lt;/p&gt;

&lt;p&gt;We use &lt;code&gt;Core ML Tools&lt;/code&gt; for model conversion, with INT8 quantization as the default. For the blur detection and duplicate detection models, FP16 precision provides a good balance of accuracy and speed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;MLModelConfiguration&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;computeUnits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cpuAndNeuralEngine&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="kt"&gt;SwipeCleanerModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;configuration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Memory Management
&lt;/h3&gt;

&lt;p&gt;Processing a library of 10,000+ photos without crashing requires careful memory management. We batch process in groups of 50 images, releasing memory between batches:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;processBatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="nv"&gt;images&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;UIImage&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;throws&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;Classification&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;withCheckedThrowingContinuation&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;continuation&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
        &lt;span class="kt"&gt;DispatchQueue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;global&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;qos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;userInitiated&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;images&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compactMap&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;classify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="n"&gt;continuation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resume&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;returning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Real-Time Analysis
&lt;/h3&gt;

&lt;p&gt;Users expect instant feedback. Swiping through photos should feel native. We achieve this through:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Progressive loading&lt;/strong&gt;: Show thumbnails immediately, analyze in background&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Priority queuing&lt;/strong&gt;: Photos visible on screen get analysis priority&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Result caching&lt;/strong&gt;: Once analyzed, results are stored locally in Core Data&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Privacy by Architecture, Not Policy
&lt;/h2&gt;

&lt;p&gt;This is the part that matters philosophically.&lt;/p&gt;

&lt;p&gt;A privacy policy is a promise. Architecture is a guarantee. When you say "we don't collect your data" in a privacy policy, users have to trust that a) you're telling the truth, and b) you won't change your mind later.&lt;/p&gt;

&lt;p&gt;When your app literally can't send data because there's no network code for photo upload, privacy becomes a property of the system, not a promise from the company.&lt;/p&gt;

&lt;h3&gt;
  
  
  What We Don't Have
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No photo upload pipeline&lt;/li&gt;
&lt;li&gt;No cloud storage for user photos&lt;/li&gt;
&lt;li&gt;No analytics tracking which photos users clean&lt;/li&gt;
&lt;li&gt;No third-party SDKs that exfiltrate data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aren't features we turned off. They're features we never built.&lt;/p&gt;

&lt;h3&gt;
  
  
  What We Do Have
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;On-device ML pipeline (Core ML + Neural Engine)&lt;/li&gt;
&lt;li&gt;Local Core Data storage for analysis results&lt;/li&gt;
&lt;li&gt;iCloud sync for preferences (opt-in, encrypted)&lt;/li&gt;
&lt;li&gt;On-device photo comparison (pixel-level, never leaves device)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Trade-offs
&lt;/h2&gt;

&lt;p&gt;Being honest about the downsides:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model updates require app updates.&lt;/strong&gt; Cloud models can be updated silently. We have to ship a new app version when we improve our ML models.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Device compatibility varies.&lt;/strong&gt; iPhone 12 runs the same models slower than iPhone 16. We handle this with runtime performance detection and model selection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No usage analytics.&lt;/strong&gt; We genuinely don't know which features users use most. We rely on App Store reviews and direct feedback.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Harder debugging.&lt;/strong&gt; When something goes wrong, we can't just check server logs. We built an opt-in debug mode that users can share voluntarily.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters More in 2026
&lt;/h2&gt;

&lt;p&gt;The AI industry is moving toward more data collection, not less. Every new model launch comes with questions about training data, inference privacy, and data retention. Apple Intelligence is pushing on-device as a differentiator, but most third-party apps still default to cloud.&lt;/p&gt;

&lt;p&gt;Building privacy-first isn't a marketing angle. It's a technical choice with real engineering consequences. It costs more in development time, limits some product decisions, and requires justifying why you &lt;em&gt;can't&lt;/em&gt; add certain features.&lt;/p&gt;

&lt;p&gt;But the alternative — asking users to trust you with their most personal data — is a responsibility most apps shouldn't carry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Questions
&lt;/h2&gt;

&lt;p&gt;We're still figuring out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to do collaborative ML improvement (federated learning?) without compromising privacy&lt;/li&gt;
&lt;li&gt;Better on-device model compression for older devices&lt;/li&gt;
&lt;li&gt;Privacy-preserving ways to understand feature usage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building something similar, I'd love to hear how you're solving these problems.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Swipe Cleaner is part of the Nomos ecosystem. All code examples are simplified for clarity.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ios</category>
      <category>privacy</category>
      <category>machinelearning</category>
      <category>swift</category>
    </item>
    <item>
      <title>Privacy Isn't a Checkbox — It's Architecture</title>
      <dc:creator>Ethan</dc:creator>
      <pubDate>Sun, 05 Jul 2026 03:05:19 +0000</pubDate>
      <link>https://dev.to/ethanwalker89m/privacy-isnt-a-checkbox-its-architecture-32no</link>
      <guid>https://dev.to/ethanwalker89m/privacy-isnt-a-checkbox-its-architecture-32no</guid>
      <description>&lt;p&gt;Privacy isn't a checkbox. It's not a statement in your terms of service. It's not a toggle in your settings app.&lt;/p&gt;

&lt;p&gt;Privacy is architecture. And most apps get this backwards.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture Test
&lt;/h2&gt;

&lt;p&gt;Here's a simple test for any app that claims to be "privacy-first":&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If your server goes down, can anyone still access user data?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the answer is yes, your privacy is a policy question — not a technical guarantee. You've built a system where trust in the company replaces trust in the code.&lt;/p&gt;

&lt;p&gt;Every photo cleaner that uploads your images to a server has already failed this test. The moment data leaves your device, privacy becomes something you &lt;em&gt;promise&lt;/em&gt; rather than something you &lt;em&gt;enforce&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What On-Device Processing Actually Means
&lt;/h2&gt;

&lt;p&gt;When we built Swipe Cleaner, we made one architectural decision that defined everything else: &lt;strong&gt;zero data leaves the phone&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No cloud processing of photos&lt;/li&gt;
&lt;li&gt;No API calls that transmit image data&lt;/li&gt;
&lt;li&gt;No server-side storage of any kind&lt;/li&gt;
&lt;li&gt;Every scan, every classification, every cleanup happens locally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The app is 4.7 MB. That's it. There's nothing to hide because there's nowhere to hide anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Architecture Beats Policy
&lt;/h2&gt;

&lt;p&gt;Companies spend millions on legal teams writing privacy policies that their architecture contradicts. They collect data "to improve the service" while the service could have been designed to not need that data in the first place.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Policy-based privacy&lt;/th&gt;
&lt;th&gt;Architecture-based privacy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"We promise not to misuse your data"&lt;/td&gt;
&lt;td&gt;"We can't misuse data we never have"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requires ongoing trust&lt;/td&gt;
&lt;td&gt;Verifiable by anyone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can change with an update to ToS&lt;/td&gt;
&lt;td&gt;Requires rewriting the entire app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compliance-driven&lt;/td&gt;
&lt;td&gt;Principle-driven&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Trust Problem
&lt;/h2&gt;

&lt;p&gt;Here's what I've learned building privacy-focused tools: users can't verify your privacy policy. They can't audit your servers. They can't check if you're actually deleting their data after processing.&lt;/p&gt;

&lt;p&gt;But they &lt;em&gt;can&lt;/em&gt; verify that an app never sends their photos anywhere. They can check network traffic. They can inspect the binary.&lt;/p&gt;

&lt;p&gt;That's the difference between trust and verification. Trust requires faith. Verification requires evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building for Verification
&lt;/h2&gt;

&lt;p&gt;If you're building a privacy-focused product, ask yourself:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Can a user verify your privacy claims without trusting you?&lt;/strong&gt; If they need to believe your server code is honest, the answer is no.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What's the minimum data you actually need?&lt;/strong&gt; Most apps collect data they don't use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can you process locally what you currently process in the cloud?&lt;/strong&gt; On-device ML has come a long way.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is privacy a feature you added, or a property your architecture enforces?&lt;/strong&gt; The answer determines whether you're building trust or just marketing it.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;The best privacy policy is the one you never need to write — because your architecture makes it impossible to violate.&lt;/p&gt;

&lt;p&gt;Not "we take your privacy seriously." Not "your data is safe with us."&lt;/p&gt;

&lt;p&gt;"We never had your data in the first place."&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>security</category>
      <category>ios</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Privacy Is Not a Feature — It's Architecture. How Swipe Cleaner Processes Everything On-Device</title>
      <dc:creator>Ethan</dc:creator>
      <pubDate>Sat, 04 Jul 2026 03:00:38 +0000</pubDate>
      <link>https://dev.to/ethanwalker89m/privacy-is-not-a-feature-its-architecture-how-swipe-cleaner-processes-everything-on-device-3e0m</link>
      <guid>https://dev.to/ethanwalker89m/privacy-is-not-a-feature-its-architecture-how-swipe-cleaner-processes-everything-on-device-3e0m</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Disclosure: I work on Opennomos, the ecosystem behind Swipe Cleaner.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Last week, I watched someone install a photo cleaner app, grant it full photo library access, and hit "Clean" — all without realizing their entire camera roll was being uploaded to a server in a different jurisdiction.&lt;/p&gt;

&lt;p&gt;This isn't an edge case. It's the default.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture Problem
&lt;/h2&gt;

&lt;p&gt;Most iOS photo cleaners follow the same pattern:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User grants photo library access&lt;/li&gt;
&lt;li&gt;Images get uploaded to a cloud server&lt;/li&gt;
&lt;li&gt;Server-side ML models detect duplicates, blur, and screenshots&lt;/li&gt;
&lt;li&gt;Results come back to the app&lt;/li&gt;
&lt;li&gt;User deletes suggested photos&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The problem? &lt;strong&gt;Step 2.&lt;/strong&gt; The moment your photos leave the device, you've lost control. No privacy policy can undo that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Swipe Cleaner's Approach: Zero Data Exfiltration
&lt;/h2&gt;

&lt;p&gt;Swipe Cleaner is 4.7MB. Everything happens on your iPhone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Duplicate detection&lt;/strong&gt; runs against on-device perceptual hashes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blur detection&lt;/strong&gt; uses Core ML models running locally&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Screenshot classification&lt;/strong&gt; uses on-device heuristics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Similar photo grouping&lt;/strong&gt; computes feature vectors in-process&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No API calls. No cloud processing. No analytics that include photo metadata.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "Privacy Architecture" Actually Means
&lt;/h2&gt;

&lt;p&gt;Privacy-as-architecture means three things:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Network Is Untrusted by Default
&lt;/h3&gt;

&lt;p&gt;Swipe Cleaner doesn't make network requests related to photo processing. The only network calls are for optional things like checking for app updates — and those don't include any user data.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Processing Happens Where the Data Lives
&lt;/h3&gt;

&lt;p&gt;Core ML, Vision, and Metal run on the same chip that stores your photos. There's no latency from network round-trips, and no exposure from data in transit.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Privacy Can't Be "Turned Off"
&lt;/h3&gt;

&lt;p&gt;When privacy is a feature toggle, it can be accidentally disabled, changed in an update, or removed under pressure. When privacy is the architecture, there's nothing to toggle. The data path simply doesn't include an exit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Trade-off
&lt;/h2&gt;

&lt;p&gt;On-device processing means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The app has to be efficient (4.7MB isn't an accident, it's a constraint)&lt;/li&gt;
&lt;li&gt;ML models need to be optimized for mobile (smaller, quantized, Metal-accelerated)&lt;/li&gt;
&lt;li&gt;Some cloud-only features (like "tell me what's in this photo") aren't possible&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But here's what I've learned: users don't actually want cloud processing. They want their photos organized. If you can do that locally, the "trade-off" disappears.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters Now
&lt;/h2&gt;

&lt;p&gt;Apple's privacy labels have made data collection visible, but they haven't changed the default architecture. Most apps with "No Data Collected" labels still process user content on remote servers — they just argue that "processed" data isn't "collected" data.&lt;/p&gt;

&lt;p&gt;That distinction doesn't hold up. If your photos touch a server, that's collection. Period.&lt;/p&gt;

&lt;p&gt;Swipe Cleaner takes the harder path: build everything on-device, accept the engineering constraints, and let the architecture speak for itself.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Swipe Cleaner is part of the Opennomos ecosystem. If you're building privacy-first tools, check out &lt;a href="https://opennomos.com" rel="noopener noreferrer"&gt;opennomos.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>ios</category>
      <category>privacy</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Swipe Cleaner: A 4.7MB iOS Photo Cleaner Built on Privacy-First Principles</title>
      <dc:creator>Ethan</dc:creator>
      <pubDate>Thu, 02 Jul 2026 04:10:16 +0000</pubDate>
      <link>https://dev.to/ethanwalker89m/swipe-cleaner-a-47mb-ios-photo-cleaner-built-on-privacy-first-principles-5ag3</link>
      <guid>https://dev.to/ethanwalker89m/swipe-cleaner-a-47mb-ios-photo-cleaner-built-on-privacy-first-principles-5ag3</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Disclosure: I work on Opennomos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I've tried a lot of photo cleaning apps. Most of them share the same problems: bloated install sizes, mandatory accounts, cloud uploads you didn't ask for, and subscription paywalls that hit you after the "free trial" ends.&lt;/p&gt;

&lt;p&gt;Swipe Cleaner does none of these things. And that's what makes it interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Swipe Cleaner?
&lt;/h2&gt;

&lt;p&gt;It's a 4.7MB iOS app that helps you clean up your photo library. The core mechanic is Tinder-style swiping: left to delete, right to keep, up to favorite.&lt;/p&gt;

&lt;p&gt;No account required. No cloud processing. Everything happens locally on your device.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apps.apple.com/app/id6779493280" rel="noopener noreferrer"&gt;App Store link&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem It Solves
&lt;/h2&gt;

&lt;p&gt;Here's a scenario every iPhone user knows:&lt;/p&gt;

&lt;p&gt;You open Photos, see "5,237 items," and immediately close it. The decision fatigue is real. Every photo demands a judgment call — keep or delete? Is this screenshot still useful? Do I need 14 versions of the same sunset?&lt;/p&gt;

&lt;p&gt;System tools aren't much help. The built-in duplicate detection is decent, but it doesn't handle screenshots, blurry photos, or burst-mode leftovers well. And bulk-selecting photos in the grid view feels like surgery with a spoon.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Things Swipe Cleaner Gets Right
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Privacy by Design, Not by Policy
&lt;/h3&gt;

&lt;p&gt;This is the big one. Swipe Cleaner is &lt;strong&gt;completely on-device&lt;/strong&gt;. Zero network requests for photo processing. Your photos never leave your phone.&lt;/p&gt;

&lt;p&gt;Compare this to mainstream cleaners that upload your library for "AI-powered organization" or "smart categorization." The privacy policy might say they delete your data after processing. Swipe Cleaner eliminates the question entirely — there's nothing to trust because there's nothing to upload.&lt;/p&gt;

&lt;p&gt;For developers: the app bundles Apple's on-device ML models (Vision framework) for photo analysis. No custom model servers, no API keys to leak.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Tinder-Style Decision Making
&lt;/h3&gt;

&lt;p&gt;The swipe mechanic isn't just a gimmick. It solves a real UX problem: reducing the cognitive cost of each decision.&lt;/p&gt;

&lt;p&gt;Traditional flow: tap photo → evaluate → tap delete → confirm → next photo. Five interactions per photo.&lt;/p&gt;

&lt;p&gt;Swipe Cleaner flow: see photo → swipe. One interaction.&lt;/p&gt;

&lt;p&gt;The speed difference is dramatic. I cleared ~400 photos in about 15 minutes — most of them screenshots and near-duplicates that I'd been meaning to delete for months.&lt;/p&gt;

&lt;p&gt;The app categorizes photos into filters: Screenshots, Live Photos, Bursts, Similar, Blurry. You can focus on one category at a time, which reduces the "where do I even start" paralysis.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Confirmation List as Safety Net
&lt;/h3&gt;

&lt;p&gt;Batch deletion is fast but risky. Swipe Cleaner's answer is a &lt;strong&gt;confirmation list&lt;/strong&gt; — all photos marked for deletion go into a pending list. You review everything before the final purge.&lt;/p&gt;

&lt;p&gt;This is different from the iOS "Recently Deleted" album (which is post-deletion recovery). The confirmation list is a pre-deletion checkpoint. It gives you the confidence to swipe fast, knowing you'll get a second look.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Could Be Better
&lt;/h2&gt;

&lt;p&gt;No app is perfect. A few things I'd like to see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Video support&lt;/strong&gt;: Currently focuses on photos. Large video files are often the biggest space hogs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iCloud integration awareness&lt;/strong&gt;: If you use iCloud Photos, deleting locally doesn't always free up space immediately. Some guidance here would help.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch export&lt;/strong&gt;: A "save these to Files before deleting" option for important-but-bulky photos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Size Matters
&lt;/h2&gt;

&lt;p&gt;At 4.7MB, Swipe Cleaner is smaller than a single high-res photo. The entire app binary is about 0.0001% of a 64GB iPhone's storage. For context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google Photos: ~250MB+&lt;/li&gt;
&lt;li&gt;Cleaner Guru: ~150MB+&lt;/li&gt;
&lt;li&gt;Swipe Cleaner: 4.7MB&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This matters more than people think. Large app sizes correlate with feature bloat, bundled SDKs, and analytics frameworks — all things that conflict with the privacy-first approach.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Verdict
&lt;/h2&gt;

&lt;p&gt;Swipe Cleaner is not trying to be an AI-powered digital assistant that "understands your photo collection." It's a focused tool that does one thing well: help you delete unwanted photos quickly, privately, and with a safety net.&lt;/p&gt;

&lt;p&gt;For a 4.7MB app with no sign-up flow and no server costs to recoup, that's exactly the right ambition.&lt;/p&gt;

&lt;p&gt;If you've been putting off the "clean my camera roll" task because it feels overwhelming, this is the tool that turns it from a weekend project into a coffee-break task.&lt;/p&gt;

</description>
      <category>ios</category>
      <category>privacy</category>
      <category>product</category>
      <category>mobile</category>
    </item>
  </channel>
</rss>
