
Simon WhiteWhen I started this project, I genuinely wasn't sure I could finish it. I'm a UX and ex-web developer...
When I started this project, I genuinely wasn't sure I could finish it. I'm a UX and ex-web developer — 25 years of ASP, PHP, JavaScript. Swift felt like a completely different planet.
The idea had been sitting in my head for a while: a Tinder-style interface for your photo library. Swipe right to keep, swipe left to mark for deletion, review the pile before anything gets permanently removed. Simple concept. But the gap between "simple concept" and "working iOS app" felt enormous.
I started with Cursor for the initial scaffolding. Then iterated with ChatGPT for smaller modifications and UI experiments. The real breakthrough came with Claude — specifically Claude Projects for keeping context across the whole codebase, and Claude Code for the final review and polish.
What surprised me wasn't just that the code worked. It's that I actually understood it. The iterative back-and-forth forced me to engage with Swift and Xcode properly, not just copy-paste. By the end I was making architectural decisions myself, pushing back on suggestions that didn't fit the app's design intent.
Photo Declutter is a calm, session-based photo triage app for iOS.
The core loop:
A few things I deliberately built in:
A few things that took real iteration to get right:
PHPhotoLibrary change observer — requires NSObject inheritance, needed careful handling around @MainActor and deinit for Swift concurrency.
Animation via onChange is fragile — I learned this the hard way with the double-tap "Rediscovered" feature (adds a photo to a custom album with a heart animation). Driving opacity directly from the gesture state turned out to be far more reliable.
True random vs shuffle — true random selection means some photos never appear, others repeat. The fix was shuffling the library once, and keeping it active (except for changes to the library, which a listener takes care of).
HEIC and WhatsApp sharing — sharing HEIC images via the standard share sheet gets silently rejected by WhatsApp. Fix: transcode to JPEG via a temp file URL before sharing.
The app is free, no ads, no subscription. Two optional ways to support development:
I wanted it to feel like a daily ritual, not a product hunting for your wallet. Small apps that chase you for money at every session — I find that depressing both as a user and a developer.
Where it stands
V1.0 is live on the App Store, approved in about 2 days, localised in French and English. V1.1 will add the StoreKit premium unlock properly once I can test it thoroughly.
Happy to talk Swift, AI-assisted development, indie App Store reality, or the UX philosophy. What worked for you when learning a new language or platform?
FAQ & privacy policy: caperet.com/photo/