Slidebox-like iOS photo organizer. Native SwiftUI with iOS 26 Liquid Glass.
- 📷 Reads system photo library, classified by smart albums + metadata inference
- 👉 Swipe to review: left = next, right = previous, up = mark delete
- 🗑 Pending delete list with batch confirmation + native iOS delete dialog
- ⏪ Single-step undo
- 🖼 Photo browser: full-screen view, zoom, swipe pagination, favorite / share / open in Photos.app
- 📊 Metadata sheet: dimensions, file size, type, location, duration
- 💡 Smart Picks: six cleanup entry points (old screenshots / storage hogs / videos / live photos / selfies / low-res images), horizontal cards on home + a "More" sheet for the full list
- 🌗 5 themes: System / Dark / Light / Caramel / Cool
- 🌐 4 languages: 中文 / English / 日本語 / 한국어
- ⬆️ Update check: silently queries GitHub Releases on entering Settings; highlights a chip in the About section when a newer version is published
- ✨ iOS 26 Liquid Glass + custom AppIcon
- 🔒 100% on-device, zero uploads
Left → Right: home screen with Smart Picks and Time Lens · albums list with smart albums and cleanup categories · settings page with themes, languages, and experience toggles.
PhotoCleaner/
├── PhotoCleaner.xcodeproj
├── PhotoCleaner/
│ ├── PhotoCleanerApp.swift App entry + RootShell (injects system colorScheme)
│ ├── Info.plist Permission declarations
│ ├── Models/PhotoCategory.swift Category enum
│ ├── Services/
│ │ ├── PhotoLibraryService.swift PhotosKit wrapper
│ │ ├── PhotoClassifier.swift Metadata inference
│ │ ├── ThemeManager.swift Theme persistence
│ │ ├── LanguageManager.swift Language persistence
│ │ ├── L10n.swift Translation dictionary
│ │ └── UpdateChecker.swift GitHub Releases version check
│ ├── ViewModels/
│ └── Views/
│ ├── RootView.swift Permission routing
│ ├── CategoryListView.swift Home (incl. Smart Picks "More" sheet)
│ ├── SwipeReviewView.swift Swipe review
│ ├── PendingDeletionView.swift Pending delete list
│ ├── PhotosBrowserView.swift Photo browser
│ ├── PhotoDetailView.swift Full-screen viewer
│ ├── PhotoMetadataSheet.swift Metadata detail
│ ├── SettingsView.swift Settings
│ └── Components/ Shared UI
├── scripts/
│ ├── build-ipa.sh One-shot unsigned IPA build
│ └── generate-icon.swift AppIcon generator
├── CHANGELOG.md Version history
├── FEATURES.md Feature spec
├── TEST_PLAN.md Test cases
└── README.md You are here
# Requires Xcode 26+ and an iOS Simulator runtime
open PhotoCleaner.xcodeproj
# Press ⌘R in Xcodebash scripts/build-ipa.sh
# Output: build/PhotoCleaner-v<VERSION>.ipaThe IPA is unsigned. Pick one of these to self-sign with a free Apple ID (cert valid 7 days):
- Download https://sideloadly.io
- Drag
build/PhotoCleaner-v<VERSION>.ipainto it - Sign in with a free Apple ID
- On iPhone: Settings → General → VPN & Device Management → trust the certificate
Run AltServer in the background to keep the 7-day cert refreshed automatically.
Open the project in Xcode, set Signing → Team to your free Apple ID, ⌘R to your device.
- All processing happens locally. Zero network uploads.
- Only
NSPhotoLibraryUsageDescriptionis requested - Deletion always triggers the native iOS confirmation dialog; the app cannot bypass it
- The update check fires a single GET to
api.github.com. It sends only the standard User-Agent and never includes any personal data.
- PayPal
- Buy me a coffee
- Wise
- WeChat Reward Code and Alipay QR are available in Settings → Sponsor.
GPL-3.0-only


