Photos Library Sort Helper is a personal/hobby macOS app built for my own media triage workflow. It exists primarily to satisfy my own needs; public usefulness is incidental. No warranty, support commitment, stability guarantee, or roadmap promise is implied beyond the actual license.
Media-Sort-Helper is now retired. This repo is the replacement for both the old Photos-only app and the older folder-based experiment.
- Reviews similar media from either:
- your Apple Photos library, or
- a regular folder of image/video files.
- Supports two manual review modes:
Discard-first: assume discard unless you mark keep or editKeep-first: assume keep for review unless you mark discard or edit
- The app does not auto-pick a keeper.
- Lets you review one group at a time, decide what to keep, and queue follow-up work safely.
- Supports two follow-up destinations:
Files to EditFiles to Manually Delete
- In folder mode, those destinations are sibling folders beside the selected root folder, and nested paths are preserved.
- In folder mode, kept files stay in place by default. There is an explicit toggle if you also want reviewed keeps moved into a sibling
Keepfolder.
- No automatic deletion.
- No direct destructive delete action from this app.
- No file-level writes into the Photos library package.
- No Photos prompt at app launch. The app asks only when you explicitly start a Photos scan or queue Photos album changes.
- Folder writes are explicit and user-initiated, happen only from the commit summary, and preserve relative subfolder structure.
- Marked discards go to
Files to Manually Deletefor final human review.
- The packaged
.appis code-signed ad hoc for local use, but it is not notarized for public macOS distribution. - This is a personal-use app. I am intentionally not paying for Apple Developer Program notarization for this project right now.
- The build script produces a universal app bundle intended to run on both Apple Silicon and Intel Macs running macOS 15 or later.
- If macOS blocks the app on first launch, use normal platform UI:
- In Finder, Control-click the app and choose Open.
- If needed, open System Settings > Privacy & Security and use Open Anyway for the blocked app.
- Install Xcode from the Mac App Store.
- Open Xcode once and accept the license.
- In Terminal, run:
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer- Open this folder in Xcode:
open Package.swift- In Xcode, click the Run button.
To build a double-clickable universal app bundle and DMG in dist/:
cd /path/to/repo
./scripts/build_app.shThis creates:
dist/Photos Library Sort Helper.appdist/PhotosLibrarySortHelper-macos-universal.dmg
The packaged app keeps the source-controlled version and build number from Resources/Info.plist; the build script does not auto-bump them.
If you are intentionally preparing a release version, bump the tracked version/build first:
./scripts/bump_release_version.sh- Launch the app and keep
Photos Libraryselected. - Choose
All Photosor a specific album. - Optionally narrow the scope with a date range.
- Click Scan for Similar Media. macOS will ask for Photos access at that point if needed.
- Review one group at a time.
- Pick
Discard-firstorKeep-firstbefore scanning if you want to change the review assumption for the next session. - Use the Review menu, toolbar, or
Ewhen a highlighted item should go intoFiles to Edit. - Use Open Summary and Queue when you are ready to queue keeps/discards into Photos review albums.
- Switch the source type to
Folder. - Click Choose Folder... and pick the root folder you want to review. You can also drag a folder into the sidebar, reuse one from recent folders, or choose one from the File menu.
- Click Scan for Similar Media.
- Review one group at a time.
- Pick
Discard-firstorKeep-firstbefore scanning if you want to change the review assumption for the next session. - Use
Eto mark a highlighted item for theFiles to Editfolder commit queue. - Use Finder actions from the toolbar, menus, summary sheet, or inspector whenever you want to open the selected folder or reveal queue destinations.
- Open the summary and review the exact destination paths and sample relative paths.
- Commit only when you are ready to move queued items into sibling folders beside the selected root.
- The app supports
Discard-firstandKeep-firstmanual review. Discard-firststarts each group with no automatic keeper selection.Keep-firststarts each group as kept for review, but only explicit keeps, explicit discards, and edit items are committed or queued.- You decide what to keep, what to discard, and what should be queued for later follow-up.
- Users should not expect automatic culling or AI-led keep/discard decisions.
- Review session state is stored locally at:
~/Library/Application Support/com.jkfisher.photoslibrarysorthelper/review-session-v2.json
- Scan preferences are stored locally at:
~/Library/Application Support/com.jkfisher.photoslibrarysorthelper/scan-preferences-v2.json
- Folder selections are stored in the preferences file using bookmark-backed data plus the resolved path.
- Recent folder selections are also stored there so the Settings window and sidebar can offer quick reuse.
- If you are upgrading from the old
Photo Sort Helperidentity, the app migrates previous local session and preference data into the current bundle identifier. - If you are upgrading from older
Media-Sort-Helperhabits, there is no separate app state to keep using; this repo/app is now the canonical path forward. - The app may request iCloud-backed assets through PhotoKit when thumbnails, previews, or videos are needed, but it does not upload your media to any third-party service.
- If macOS blocks the standalone app on first launch, use Finder Open or System Settings > Privacy & Security > Open Anyway. The app is ad-hoc signed, not notarized.
- If the app cannot see your library, check Photos permission in System Settings > Privacy & Security > Photos.
- If folder mode cannot reopen a previously selected folder, choose it again so the bookmark/path reference can be refreshed.
- The app now targets macOS 15 so it can use the newer SwiftUI window/inspector scene APIs cleanly.
- Large scans can take a while, especially when PhotoKit needs to fetch iCloud-backed assets for thumbnails, previews, or videos.
- Folder-mode commits move files only when you explicitly confirm from the summary sheet.
- The app does not delete anything for you, does not sync to any remote service, and does not auto-cull in the background.
- On macOS, PhotoKit exposes a single Photos authorization for both reading the library and user-initiated album changes, so the app defers that prompt until you explicitly begin Photos review work.
- Similarity threshold is fixed at
12.0for consistent grouping. If results feel too broad or too narrow, adjustMax time gap. - Current project status and the latest durable rollback anchor are summarized in
docs/WHERE_WE_STAND.md.
