Point Photo Curator at a folder of shots β JPEGs or RAW (CR2 Β· CR3 Β· NEF Β· ARW Β· DNG & more) β and it does the ruthless first pass for you β ποΈ drops the blurry frames, 𧬠collapses burst duplicates, and π surfaces your keepers. All on your own Mac. π
127.0.0.1 and opens a browser tab against it. No data leaves your machine β no uploads, no telemetry, no external APIs. The only outbound requests are optional OpenStreetMap tiles (GPS view) and a Ko-fi badge, loaded by your browser, not the app.
Out-of-focus shots flagged by real, contrast-aware sharpness β haze and night skies aren't mistaken for blur. Shoot RAW+JPG? Filter to RAW only or JPG only.
Burst sequences collapse to one frame. The sharpest survivor is kept, labelled βBest of N.β
Each keeper scored on composition, lighting, focus, colour and contrast, then sorted to your TOP N.
Thousands of near-identical frames, blurred misfires, and a handful of genuine keepers buried in the middle. Going through them by hand is slow and easy to get wrong. Photo Curator does the first pass in seconds per hundred photos β and every decision stays reversible. Nothing is deleted or moved until you say so.
Point it at your RAW shoot β no conversion step, no detours through Lightroom. Powered by LibRaw.
Canon CR2 / CR3, Nikon NEF, Sony ARW, Adobe DNG, Fuji RAF, Olympus ORF, Panasonic RW2, Pentax PEF and more. Fast by design: the full-size JPEG preview your camera embeds in each RAW is used for thumbnails, analysis and display β EXIF, GPS and orientation included β with a half-size RAW develop as fallback. Exports always copy the untouched original.
Cull gets file-type filter chips β All types Β· RAW only Β· JPG only, plus per-format chips (CR2 only, NEF onlyβ¦) when a folder mixes brands β and every card wears its format tag. A Dedup setting collapses same-frame RAW+JPG pairs to one keeper (keep both / keep RAW / keep JPG), and your choice carries through Dedup and Rank.
Insert a card and the sidebar finds your shots no matter who made the camera: Canon 100CANON, Nikon 100NIKON, Sony 100MSDCF, Fuji, Olympus, Panasonic, GoPro, DJIβ¦ Date-nested DCIM layouts are handled too, empty folders are skipped, and each shortcut is labelled with the detected brand β "SD Β· Nikon".
RAW decoding runs on your machine like everything else β no uploads, no cloud APIs. Running from source? RAW needs one extra library: pip install rawpy. Without it the app keeps working JPEG-only and says so in the sidebar.
Sharpness is measured as var(Laplacian) / var(image) on a normalized copy β so it judges real focus, not contrast. Big skies, haze and night scenes are kept, not punished.

A 192-bit perceptual hash clusters near-duplicates globally; EXIF capture-time tightens bursts and ORB feature-matching stops distinct scenes from being wrongly merged.

Every keeper is scored across five dimensions and shown with a per-photo radar chart and a TOP-N average βmetric profile.β Tune the weights to your taste; ranking shows live progress with elapsed time and ETA.


Open any photo to see camera, lens, exposure, ISO and capture time β plus an inline map pin for geotagged shots, so you remember exactly where that frame happened.

Tap to mark a top shot as a wallpaper. Export writes full-res originals plus a universal 1290Γ2796 (19.5:9) crop β pixel-perfect on iPhone and covering nearly all Android.
Press once and Photo Curator advances through Cull β Dedup β Rank automatically, landing on your ranked TOP N β without moving a single file. You still review and move rejects yourself.
Not a policy β a design. There's no cloud and nothing to sign into.
All analysis runs in Python on your machine. The only socket opened is a local server on 127.0.0.1 so your browser can reach it β unreachable from the network.
No cloud, no accounts, no telemetry, no third-party trackers. It collects nothing and phones home to nothing.
Nothing is deleted or moved without your say-so. Rejects relocate to Blurred/, Duplicates/ or TOP_N/ only when you press the button.
| Step | Metric | What it does |
|---|---|---|
| RAW decode | Embedded JPEG preview via rawpy/LibRaw (fallback: half-size demosaic) | ~50Γ faster than developing the sensor data; EXIF, GPS and orientation preserved. Exports copy the original RAW. |
| Cull | var(Laplacian) / var(image) on a 1024px copy | Resolution-independent sharpness that normalizes out contrast, so haze β blur. Threshold adjustable. |
| Dedup | 192-bit perceptual hash (avg + dual dHash) + ORB confirm | Global clustering; EXIF-timed bursts get a relaxed bar; the sharpest frame of each group survives. |
| Rank | Weighted focus / lighting / contrast / colour / composition | Per-photo radar plus a TOP-N average profile. Weights are yours to tune. |
Pick the one that fits. Both run 100% locally and open in your browser at 127.0.0.1:5014.
For anyone who just wants it to work. Python and every image library are bundled inside β no install, no terminal, no internet needed.
Apple Silicon (M1βM4) Β· macOS 11+ Β· runs entirely offline.
For developers, or anyone comfortable with Python. Tiny download β you install the libraries yourself. Cross-platform.
Python 3.9+ Β· macOS / Windows / Linux Β· MIT licensed.
Not sure which? Pick the Offline package β it needs nothing else installed.
Both run on port 5014 (β50mm f/1.4β) because macOS reserves port 5000 for AirPlay.
# what the Offline package shows on launch ====================================== πΈ Photo Curator v6.0 ====================================== Using Python: /usr/bin/python3 Starting the photo engine... o ___________ /|\ | _______ | ))) / \ | | - - |#| >>> | |_______| | ))) you |___[===]___| P H O T O C U R A T O R *CLICK* β¦ flash! β¦ πΈ Got it! Opening your browser... http://127.0.0.1:5014