Open Source Product

Best Photo Picker

Find your best photos. Without the cloud.

A local-first desktop and web tool that scores every photo in your library on sharpness, lighting, faces, and composition, clusters the near-duplicates, and helps you curate the perfect fifty in minutes. Nothing leaves your machine. No account, no subscription, MIT-licensed.

Best Photo Picker library grid with per-photo score badges and the smart album sidebar
The library grid, with a score badge on every thumbnail and smart albums down the side.

Cloud photo apps are built to store everything. They are not built to help you find the few shots that matter. Best Photo Picker scores your whole library locally, so the best ones rise to the top without anything being uploaded.


The Problem

You have fifteen thousand photos of your kid. You want the best fifty for the grandparents, the photo book, or the year-end card.

Apple Photos and Google Photos are great at storing all fifteen thousand and surfacing the occasional "memory," but they bury your genuinely best shots in an endless feed. Lightroom and digiKam are built for professional photographers, not for triaging a family library. And every one of the cloud options assumes you are fine uploading your entire collection of family faces to someone else's data center.

The hard part is not storing the photos. The hard part is finding the actual best fifty out of thousands of near-identical burst shots, blinks, and blurry frames, without handing your library to a third party.

Best Photo Picker exists for exactly that case: thousands of photos of a specific subject, and you want the real keepers, on your own machine.


What It Does

Point it at a folder. It analyzes every photo, scores it, and lets you tune what "best" means in real time.

Quality scoring

Each photo gets a score combining sharpness, exposure, face detection and framing, and composition. The weights are sliders. Want faces to matter more than rule-of-thirds? Drag, and the whole library re-ranks live.

Near-duplicate dedup

Burst shots and near-identical frames are clustered automatically by perceptual hashing (dHash plus aHash), with CLIP semantic similarity catching the same shot cropped or edited differently. You pick the keeper; the rest stay out of your selection.

Faces, and boost-by-person

Detected faces are clustered into people automatically. Name a cluster "Leo," and you can bias the picks toward that person. "Pick the fifty best photos of Leo" is one slider away.

Temporal diversity

Selection uses per-day caps and monthly coverage, so your final pick spans the whole year instead of clumping into the one well-lit afternoon you shot a hundred frames in.

Smart albums

Picks, Faces, Pets, Duplicates, Calendar, Favorites, and more are generated automatically, alongside any manual albums you build. The library stays navigable even at tens of thousands of photos.

Soft delete

Deletes are reversible for thirty days via a Recently Deleted album. Curating aggressively never means losing a photo by accident.

BPP Picks view selecting the best photos across the library
Picks: the best K across the whole library
Automatic face clustering grouped into named people
Faces, clustered into people
Near-duplicate review with side-by-side comparison
Near-duplicate review
Non-destructive in-place editor with crop and straighten
Non-destructive in-place editor
Calendar view with photos grouped by month
Calendar view for browsing by time
Library grid with score badges and zoom control
The library grid with live score badges

How It Was Built, and Why

Every decision in Best Photo Picker traces back to one constraint: your photos never leave your machine. That ruled out the easy cloud path and shaped the rest of the engineering.

Local-first by design: privacy is the architecture, not a setting

All analysis, scoring, and selection run on your computer. There is no telemetry and no account. The handful of network calls the app can make (one-time model downloads, OpenStreetMap tiles only when you open the Map view, an optional update check, optional local-network sharing) are each individually disclosed and switch-off-able. Nothing about your library is ever sent anywhere.

Python plus a focused model stack: proven models, run locally

Face detection uses a layered stack (YuNet, SCRFD, BlazeFace, MediaPipe, dlib) so it degrades gracefully across hardware. Near-duplicate detection pairs fast perceptual hashing (dHash plus aHash) with CLIP semantic similarity for the harder cases. Pet detection uses YOLOv11n. Everything runs on CPU by default, with optional hardware acceleration (Apple Neural Engine, CUDA, DirectML) via a single environment variable.

Web UI plus a native desktop app: a terminal is never required

The core is a local Flask server with a vanilla-JS single-page UI. For people who would rather have a dock icon than a terminal, a Tauri v2 desktop app wraps that same UI in a signed, notarized native macOS window. Power users still get a full CLI for batch and headless workflows.

Demo mode: try the whole product in thirty seconds, with no photos

bpp demo generates a synthetic library and boots the full UI locally, so anyone can evaluate the product end to end before pointing it at their own photos. It quits cleanly when you close the tab and never touches your files.

A deliberate legal posture: model licenses handled honestly

The code is MIT, but ML model weights carry their own, often non-permissive, upstream licenses. Rather than bundle weights or silently auto-download them, the app ships zero weights, fetches each one only on explicit per-model consent, verifies it against a pinned SHA-256, and gates research-only and non-commercial models behind a use-context acknowledgment. The reasoning is captured in an architecture decision record.

AI-assisted development: disciplined, with decisions on the record

Built with AI-assisted development under tight product direction: scope, priorities, and every architectural decision are owned and approved deliberately, not handed off. The load-bearing choices are captured in a set of architecture decision records covering the subprocess runner, cancellation contract, plugin protocol, error hierarchy, and the model-license posture above. The result is a real product with its reasoning on the record, not a prototype.


Why Not Just Use Apple or Google Photos?

If you live in the Apple or Google ecosystem and your collection fits comfortably in their feeds, those tools work great. Use them.

Best Photo Picker is for the case they are bad at: you have thousands of photos of one specific subject (your kid, your dog, last summer's trip) and you want to find the actual best fifty.

It auto-scores for picking, not just storage

The whole library gets ranked for curation. Cloud apps optimize for keeping everything and surfacing the occasional algorithmic "memory," not for handing you your top fifty on demand.

It can boost the people who matter

Bias the selection toward a named person so the final pick favors the faces you actually want. No mainstream consumer app does this.

It runs offline, with no account and no subscription

Free and open source under MIT. Nothing to sign up for, nothing to upload, nothing to pay.


0 photos uploaded
MIT open source
30s to try the demo

Local-first photo curation that finds your best shots without uploading anything.

View on GitHub Install from PyPI
Back to top