A cross-platform desktop app for reading and organizing photos based on their EXIF metadata. Built with .NET 10 and .NET MAUI, targeting Windows and macOS.
Select a folder and OpenPhotoSort scans it for image files (JPG, JPEG, PNG, BMP, GIF, HEIC), reads each file's embedded EXIF data using Magick.NET, and displays the metadata — camera make/model, date taken, GPS coordinates, and more. The intent is to eventually sort and copy photos into organized folder structures based on that metadata.
- .NET 10 SDK
maui-windowsworkload (dotnet workload install maui-windows) on Windowsmaui-maccatalystworkload on macOS- macOS only: full Xcode, not just the Command Line Tools. Install it, then launch it at least once and let it finish its first-run setup — until you do, its Mac Catalyst SDK isn't registered and builds targeting
net10.0-maccatalystwill fail (e.g.xcrun --sdk maccatalysterrors with "SDK cannot be located", or Rider reports incompatible/missing device targets). Pointxcode-selectat it afterwards:sudo xcode-select -s /Applications/Xcode.app.
# Windows
dotnet build OpenPhotoSort.UI/OpenPhotoSort.UI.csproj -f net10.0-windows10.0.19041.0
# macOS
dotnet build OpenPhotoSort.UI/OpenPhotoSort.UI.csproj -f net10.0-maccatalystscripts/run-mac.sh and scripts/run-windows.ps1 build and launch the app for their respective platform in one step (equivalent to dotnet build -t:Run for the matching target framework).
- Rider: "Failed to find 'mlaunch'" when running/debugging on macOS. Rider routes Mac Catalyst launches through the same launcher pipeline it uses for iOS devices, which depends on a bundled
mlaunchbinary from the old Xamarin.iOS tooling. On at least Rider 2026.2 with Xcode 26.6, that binary is missing and no environment/Xcode/Rider-settings fix resolves it — this is a known, long-standing JetBrains bug (see JetBrains support threads and YouTrack issues RIDER-65418, RIDER-76794, RIDER-80950, RIDER-117599). All of Rider's own suggested fixes (matching the Xcode path in Rider's Apple Platforms settings to Xcode's own Locations tab, installing the iOS platform component) were verified correct on this project and still didn't help. Workaround: usescripts/run-mac.sh(ordotnet build -t:Run -f net10.0-maccatalyst) instead of Rider's Run/Debug buttons. This builds and launches the same way, just without a debugger attached.
OpenPhotoSort.Core/ — Class library: EXIF extraction via Magick.NET
OpenPhotoSort.UI/ — MAUI app: folder picker UI, Windows + macOS targets
Photo scanning and sorting are implemented. Core features:
- Scans a folder (optionally recursive) for JPG/JPEG/PNG/BMP/GIF/HEIC files
- Reads EXIF to detect date and camera model
- Copies or moves files into configurable date-based folder structures (10 patterns)
- Handles file conflicts: skip / rename / overwrite / route to duplicates folder
- Routes no-EXIF files to a dump folder or uses file date as fallback
- Two-phase UX: scan first to see stats, then copy or move with live progress
- Cancel button stops an in-progress operation
- All settings persist across sessions