Skip to content

About

πŸ“Έ Browser-based tool for culling and ranking large photo libraries. Remove blurry shots πŸ—‘οΈ, collapse burst duplicates πŸ“š, and surface your best photos ⭐. Everything runs locally on your machine πŸ”’ β€” no uploads, no cloud, no privacy concerns. πŸš€ Mac, Win, Linux

Topics

Resources

Security policy

Stars

22 stars

Watchers

2 watching

Forks

Repository files navigation

πŸ“Έ Photo Curator

Photo-Curator-header Automated_Photo_Culling_Workflow

v7.0 Β· A local, browser-based tool for culling and ranking large photo libraries. Point it at a folder of JPEG, PNG, HEIC or RAW files (Canon CR2/CR3, Nikon NEF, Sony ARW, DNG and more) β€” and it walks you through three steps β€” drop the blurry ones, collapse burst duplicates, and surface your best shots β€” all running entirely on your own machine. Nothing is ever uploaded anywhere.

Built for photographers who come home from a trip with a few thousand frames and want the keepers fast.

pipeline: Cull β†’ Dedup β†’ Rank RAW support HEIC support Python 3.9+ 100% local MIT License Support on Ko-Fi

πŸ’› Photo Curator is free and open source. If it saved you an evening of culling, please buy me a Ko-Fi β€” it directly funds new features.


Contents

Why Photo Curator

A long shoot leaves you with 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 ruthless pass for you β€” in seconds per hundred photos β€” and leaves every decision reversible. Nothing is deleted or moved until you say so, and your files never leave your computer.

πŸ†• What's new in v7.0 β€” HEIC / iPhone photos

Photo Curator now reads HEIC/HEIF straight from an iPhone import β€” no conversion step, no detour through Photos:

  • Formats β€” .heic, .heif and .hif (iPhone and Android stills, plus Canon/Sony HEIF), decoded by pillow-heif (libheif). EXIF β€” date, lens, GPS, orientation β€” comes through exactly as it does for JPEG, so the map view and burst timing work unchanged.
  • A HEIC filter chip in Cull sits next to All types Β· RAW only Β· JPG only, and every HEIC card carries a teal HEIC tag.
  • Browser-safe display β€” only Safari renders HEIC natively, so the full-size view is served as a transcoded JPEG (cached, same as RAW previews). Your .heic files are never modified, and exports always copy the untouched original.
  • Mixed folders just work β€” a card or folder holding JPEG + HEIC + RAW is culled, deduped and ranked in one pass, and every card is tagged with its real format (HEIC, CR2, PNG, TIFF…).

Full format list: JPEG Β· PNG Β· HEIC / HEIF / HIF Β· TIFF Β· BMP Β· WebP Β· every RAW format LibRaw reads. PNG, TIFF and BMP carry no EXIF, so those frames get no capture time or map pin β€” dedup falls back to hash-only clustering for them, everything else works the same.

  • Bundled in the offline packages. Running from source? It's in requirements.txt; without it the app keeps working and says so in the sidebar.

RAW support (since v6.0)

Photo Curator also curates your RAW files alongside JPEGs:

  • Formats β€” Canon CR2/CR3, Nikon NEF, Sony ARW, Adobe DNG, Fuji RAF, Olympus ORF, Panasonic RW2, Pentax PEF and more (anything LibRaw reads).
  • Fast by design β€” instead of demosaicing every file, the full-size JPEG preview your camera embeds in each RAW is used for thumbnails, analysis and on-screen display. EXIF (date, lens, GPS, orientation) comes along with it. Files without a usable preview fall back to a half-size RAW develop.
  • Shoot RAW+JPG? Two tools keep pairs under control:
    • Cull filter chips β€” view All types Β· RAW only Β· JPG only; every card carries a RAW (purple) or JPG (gray) tag. The filter carries into Dedup and Rank, and the app tells you when only one format continues.
    • RAW+JPG pair setting (Dedup panel) β€” collapse same-frame pairs (IMG_0001.CR2 + IMG_0001.JPG) to one file before deduping: keep both, keep RAW, or keep JPG. Applies in Rank too, so no more duplicate keepers.
  • Originals stay originals β€” exports always copy the untouched RAW file, never a converted preview.
  • Powered by rawpy (LibRaw). It's in requirements.txt; without it the app keeps working JPEG-only and says so in the sidebar.

Photo Curator Features

1. Cull

  • 1 Β· Cull β€” flags out-of-focus shots using a contrast-normalized sharpness measure, so genuinely soft frames are caught while low-contrast-but-sharp shots (haze, night, big skies) are kept. Sorts into Sharp / Soft (recoverable) / Blurry, with a one-click tier toggle on the badge of every photo. Filter by RAW / JPG when you shoot both. Blurry shots move to Blurred/ only when you press Move blurry β€” review first, move second.
PhotoCuratorv3 4-ezgif com-video-to-gif-converter

2. Dedup

  • 2 Β· Dedup β€” global perceptual-hash clustering collapses burst sequences to a single frame. EXIF capture-time tightens burst detection, ORB feature-matching prevents distinct scenes from being wrongly merged, and the sharpest frame of each group is kept and labelled "Best of N" (so you can see how many near-duplicates it stood in for). Frames with no near-duplicate are labelled "Original". The RAW+JPG pairs setting collapses same-frame format pairs before clustering. Matching is vectorized and signatures are cached, so big cards stay fast.
Dedup-Japan

3. Rank and find TOP Photos

  • 3 Β· Rank β€” scores each photo on composition, lighting, focus, color, and contrast, then shows your TOP N with a per-photo hexagonal radar chart and a TOP-N average "metric profile". Ranking shows live per-photo progress with percentage, elapsed time, and ETA. If you skip Dedup, ranking folds the clustering in automatically so a one-click run still gives a burst-free result.
PhotoCuratorv3 4-ezgif com-video-to-gif-converter (2)
Rank view SCR-20260531-sxoh Rank radar

πŸ“± Phone Background selector - (new since v3.5)

  • (new since v3.5) β€” being in the TOP N already vouches for a photo's quality, so a single tap marks any top shot as a phone wallpaper. Each ranked card and the lightbox get a πŸ“± toggle (press B in the lightbox), a Phone BG filter chip shows just the ones you picked, and Export Phone BG writes a PhoneBG/ folder with two subfolders: Original/ (full-res copies) and Wallpaper_19.5x9/ (each photo center-cropped and resized to 1290Γ—2796, 19.5:9). That ratio is pixel-perfect on iPhones and, because phones zoom wallpapers to fill, covers nearly all Android (20:9) too β€” one universal crop, no device picker.
Phones-PhotoCurator-BG

πŸ“ Photo EXIF & Location Data - (new since v3.7)

(new since v3.7) β€” full photo context in one glance. The lightbox Details panel now shows EXIF info (camera, lens, aperture, shutter, ISO), date & time, and an interactive map view with exact coordinates showing where each shot was taken β€” for RAW files too, read from the camera's embedded preview. Browse by place with the πŸ“ Location filter chip. Perfect for travel curation β€” instantly map your top-ranked images and remember where you captured each golden moment.

Screenshot 2026-06-01 at 12 44 07

⚑️God Mode

  • ⚑ God Mode β€” one button runs the whole pipeline automatically: Cull β†’ Dedup β†’ Rank, advancing through each stage and landing on your ranked TOP N. It produces the ranking without moving any files, so you still review and move rejects yourself.

  • Built for big libraries β€” live preview (newest first) with pagination for huge sets, per-stage progress with elapsed time and ETA, EXIF-orientation-correct thumbnails, light/dark theme, a lightbox with arrow-key review, and optional auto-move of rejects into Blurred/, Duplicates/, and TOP_N/ subfolders.

Library view

Install

πŸ“¦ Offline package for Mac (recommended)

No Python, no terminal, no internet needed β€” everything is bundled (RAW and HEIC support included).

➑️ Download Β· Apple Silicon β€” ~76 MB Β· M1–M6 Β· macOS 11+

Unzip, keep the PhotoCurator folder together, right-click "Start Photo Curator.command" β†’ Open (first time only) β€” your browser opens automatically.

πŸ“¦ Offline package for Windows

Self-contained Python 3.11 and every library included β€” nothing is installed into Windows.

➑️ Download Β· Windows x64 β€” ~86 MB Β· Windows 10 / 11 (64-bit)

Unzip the folder, keep it together, double-click "Start Photo Curator.bat". SmartScreen may ask once: More info β†’ Run anyway.

πŸ“¦ Offline package for Linux

Bundled CPython 3.11 and every library included β€” no sudo, no system Python, nothing installed outside the folder.

➑️ Download Β· Linux x64 β€” ~124 MB Β· x86_64 Β· glibc 2.28+ (Ubuntu 20.04+, Debian 10+, RHEL/Rocky 8+)

tar -xzf PhotoCurator-Linux-x64-Offline-v7.0.tar.gz
cd PhotoCurator-Linux
./start-photo-curator.sh

x86_64 only β€” ARM (Raspberry Pi, Ampere) and musl distros (Alpine) are not covered by this bundle; run from source there instead.

πŸ› οΈ Run from source

Requires Python 3.9+.

pip install -r requirements.txt

RAW support comes from rawpy and HEIC support from pillow-heif (both in requirements.txt). Installing on an older setup? Run pip install rawpy pillow-heif. Without either one Photo Curator keeps working on the remaining formats and shows a notice in the sidebar.

Run

python photo_curator.py

Then open http://127.0.0.1:5014 (note 50 mm, F1.4 in the port) in your browser. Pick a folder (or paste a path), choose a step, and press Start.

Workflow

A typical pass on a full card is Cull β†’ Dedup β†’ Rank in order β€” each step feeds its survivors to the next, so ranking only scores the photos worth scoring.

In a hurry? Press ⚑ God Mode to run all three automatically and jump straight to your ranked TOP N. Either way, no files are deleted or moved until you explicitly choose to β€” every stage is review-first.

How it works

Pipeline diagram
Step Metric Notes
RAW decode Embedded JPEG preview via rawpy/LibRaw (fallback: half-size demosaic) ~50Γ— faster than developing the sensor data; EXIF/GPS/orientation preserved. Exports copy the original RAW.
GPS map MapLibre (bundled, no CDN) over OpenFreeMap vector tiles Shown in the lightbox for geotagged photos. OpenStreetMap's own tile servers refuse app traffic under their tile usage policy, so the map uses OpenFreeMap. One map instance is reused across photos.
HEIC decode pillow-heif/libheif, registered as a Pillow plugin EXIF/GPS/orientation preserved. OpenCV can't read HEIF, so analysis routes through Pillow; the browser gets a cached JPEG transcode. Exports copy the original .heic.
Cull var(Laplacian) / var(image) on a 1024px copy Resolution-independent; normalizes out contrast so haze β‰  blur. Threshold is adjustable.
Dedup 192-bit perceptual hash (avg + dual difference hash) + ORB confirm Global clustering; EXIF-timed bursts get a relaxed bar; keeps the sharpest frame. RAW+JPG pairs can pre-collapse to one.
Rank Weighted focus / lighting / contrast / color / composition Per-photo radar + TOP-N average profile.

Thumbnails are cached under your system temp dir, so the first pass over a folder is the only slow one.

Platform notes

Tested on macOS (Apple Silicon), Windows 10/11 x64 and Linux x86_64. On macOS the native folder picker uses osascript and SD-card detection scans /Volumes; on Windows it uses the standard folder dialog and scans drive letters for DCIM. On Linux those two conveniences are skipped, but you can paste a folder path into the field and everything else works the same.

β˜• Support the project

Photo Curator is free, open source, and runs entirely on your own machine. If it saved you time, the best way to say thanks is to fuel the next feature:

Buy Me a Coffee at ko-fi.com

Every coffee genuinely helps β€” thank you! πŸ™

License

MIT

About

πŸ“Έ Browser-based tool for culling and ranking large photo libraries. Remove blurry shots πŸ—‘οΈ, collapse burst duplicates πŸ“š, and surface your best photos ⭐. Everything runs locally on your machine πŸ”’ β€” no uploads, no cloud, no privacy concerns. πŸš€ Mac, Win, Linux

Topics

Resources

Security policy

Stars

22 stars

Watchers

2 watching

Forks

Releases

Contributors

Languages