Binny, the smiling bin that lives in the Decluttering app icon

Snap. Sort. Bin.

Decluttering shows you the photos you took on this day in past years, so you can keep the ones that sparkle and let the rest go. Tiny sessions, a very encouraging bin.

iOS 26UIKit + SwiftUI widgetNo accountsPhotos never leave your phone

A calmer way to clean your camera roll

Thousands of photos at once is overwhelming. One day at a time, split by year, is not. Here is the whole app, one piece at a time.

01

On This Day folders

Open the app and every photo you took on today's date lands in a folder per year. Fold the years you are done with, or filter by photos, Live Photos, videos and screenshots.

  • One folder per year, newest first
  • Filter chips with live counts
  • Step back or forward to any other day
02

Swipe sort

Go through photos one at a time. Swipe right to keep, left to bin. Made a mistake? Undo it. Nothing is deleted until you have taken a last look.

  • Big, focused card for each photo
  • Undo the last decision
  • Binned photos go to Recently Deleted
✕
3 / 12
Sunglasses Sunday13 Nov 2024KEEP
↶🗑♥
03

Drag to select

Press Select, then slide a finger across the grid to pick a whole row in one sweep. One tap on Bin it clears them all.

  • Select many photos in a single drag
  • Confirmation before anything goes
04

Look-alike finder

Ten nearly identical shots of the same sunset? Binny spots the near-duplicates and lets you review the extras together.

  • Groups similar photos from the same day
  • Keep the best, bin the rest
‹
Review

Look-alikes

3 shots of the same moment
♥ Keep
🗑
🗑
Binny spotted 11 look-alike photos. Review the extras?
Bin 2 extras
05

Streaks and stickers

Bin a little each day and the streak grows. Hit milestones to collect stickers for your Booth Report. Locked ones stay a mystery until you earn them.

  • Daily streak counter
  • Nine stickers to collect
‹

Booth Report

38 binned · 6 kept · 🔥 7 day streak
✨First bin
♥First keep
🔥3-day streak
🍃10 binned
♥10 kept
🌙7-day streak
🔒???
🔒???
🔒???
06

Home screen widget

A memory from this day, right on your home screen. Tap the heart to keep it without even opening the app. Small, medium and large sizes.

  • Photos from past years, refreshed through the day
  • Heart button keeps a photo straight from the widget
  • Follows your chosen theme
9:41Friday, 13 November
2 years ago
13 Nov 2024
♥
07

Gentle breaks

Sorting photos can be oddly tiring. After a long run, Binny suggests a stretch and a sip of water, and you can switch on a daily reminder to come back.

  • Friendly nudges, never nagging
  • Optional daily reminder

Time for a tiny break

You've sorted 40 photos today. Decluttering is best in small doses, so stretch, sip some water and come back fresh.

Take a break
Keep going
08

14 themes

Make it yours. One tap on the palette button changes the colours, typeface, textures and photo frames of the whole app, the widget and even the home screen icon.

  • Red Curtain, Film Roll, Darkroom, Camera Roll and ten more
  • Switches instantly, remembered next time

How it works

Under a minute a day.

Open the app

Today's date opens with photos from every past year, in folders.

Sort

Swipe sort, or select a few and tap Bin it.

Confirm

A last look shows what is going. Binned photos go to Recently Deleted.

Come back tomorrow

A new day brings a new set. Keep the streak going.

Pick a look

One tap on the palette button changes the typeface, colours, textures and even the app icon. Scroll sideways to see them all.

Previews use colour blocks in place of your photos.

Under the hood

The interesting bits, in plain words first and the proper jargon underneath.

Architecture

VIPER & protocols

Every screen is split into small jobs: one part draws, one decides, one fetches, one moves you to the next screen. They only talk through contracts, so any part can be swapped or faked in a test.

  • VIPER: View, Interactor, Presenter, Entity, Router for On This Day, Swipe Sort and the Photo Viewer.
  • Protocol contracts: OnThisDayPresenterProtocol, PhotoViewerInteractorProtocol, DecisionRecording
  • Dependency injection: each Router builds its module and passes in the real parts. The tests pass in stand-ins.
Photos

Photos framework

Reads your camera roll straight from the device and finds what you took on this day in past years. Nothing is copied or uploaded.

  • Fast thumbnails that load ahead as you scroll. PHCachingImageManager
  • Safe deleting. Binned photos go to Recently Deleted, after a last look. PHPhotoLibrary.performChanges
  • Live Photos and video play in the viewer. PhotosUI, AVFoundation
Look-alikes

Vision

Finds the retakes and burst shots, so you can keep the best one. It turns each photo into a "fingerprint" of what it looks like and compares them, on the phone.

  • Image feature prints measure how alike two photos are. VNGenerateImageFeaturePrintRequest, VNFeaturePrintObservation
  • Shot close together too. Photos must be within 90 seconds, so unrelated photos are not matched.
  • One year per thread, so the search stays quick. DispatchQueue.concurrentPerform
Memory

SwiftData

Remembers what you kept and binned, so the stats, the streak and the stickers always add up.

  • One small record per decision. @Model Decision
  • Streaks and totals are worked out from those records, with no server or account.
Widget

WidgetKit & App Intents

A home screen photo with a Keep heart. Tap it and the decision is saved without opening the app.

  • Widget timeline picks a photo from today's date. TimelineProvider
  • Interactive Keep button. Button(intent:) + KeepPhotoIntent
  • Shared with the app through an App Group, then refreshed. reloadAllTimelines()
Feel

Core Haptics & UIKit

Small taps and buzzes that make sorting feel physical.

  • Custom haptic patterns for keep, bin and sparkle. CHHapticEngine, CHHapticPattern
  • Swipe cards and drag to select follow your finger. UIPanGestureRecognizer
  • Folder grids that adapt to any screen. UICollectionViewCompositionalLayout
Themes

Theme system

One tap restyles the whole app, the widget and even the app icon.

  • 14 themes defined once in shared code, used by the app and the widget.
  • Icon swap. UIApplication.setAlternateIconName
Gentle nudges

UserNotifications & BreakPolicy

Binny suggests a break before sorting turns into a chore, and can remind you tomorrow.

  • Break policy is a small rule: two levels a day, each shown once. BreakPolicy
  • Local reminders are scheduled on the device. UNCalendarNotificationTrigger
Safety net

Automated tests

Little robots that check the rules every time the code changes.

  • Presenter tests for On This Day, Swipe Sort and Photo Viewer, using mock interactors and routers.
  • Logic tests for themes, break rules and drag select.
SwiftUIKitSwiftUI (widget)PhotosVisionSwiftDataWidgetKitApp IntentsCore HapticsUserNotificationsVIPERiOS 26
git clone https://github.com/khansharkhamnida/decluttering.git
open decluttering/decluttering.xcodeproj   # pick an iPhone simulator, press Run

Your photos stay yours

Decluttering talks only to the Photos library on your device. There are no accounts, no servers and no analytics in the code, and deleted photos go to Recently Deleted so you can still change your mind.

Build it

Decluttering is open source. You need Xcode 26 and an iPhone or simulator on iOS 26.

git clone https://github.com/khansharkhamnida/decluttering.git
cd decluttering
open decluttering.xcodeproj

Choose the decluttering scheme, set your own team under Signing & Capabilities (the App Group is group.com.shofia.decluttering, change it to yours), and run.