Batch automation for professional photography workflows.
shoots is a CLI for photographers who shoot a lot and edit in Lightroom, Capture One or anything else. It is not an editor and not a catalog: it sits before and after your editor and automates the boring parts of a shoot.
curl -fsSL https://raw.githubusercontent.com/stefanopascazi/shoots/main/install.sh | bash- Nothing is ever deleted or overwritten
- Everything runs locally — no cloud, no upload
- Every command speaks --json and honours --dry-run

Real terminal capture — every screenshot on this page is generated from actual output.
Nothing is ever deleted
Originals stay untouched and edits go to sidecars. Rejects are moved, never removed; a failed checksum deletes the corrupt copy, never the source.
Everything runs locally
No cloud, no upload, no subscription. The CLIP model and the develop predictor run on your machine, from ~/.shoots.
Editor-agnostic
XMP sidecars are the interface. Lightroom, Bridge and Capture One read them — no host editor has to be installed for the engine to run.
Built to be scripted
Every command speaks --json and honours --dry-run, with meaningful exit codes, so it drops straight into scripts, cron and CI.
Six jobs, one binary
Each one is a standalone command. Run them by hand, chain them in a script, or drive them from the interactive shell.
shoots importOffload and rename
Copy a card into a dated catalog, checksum-verified. Original filenames are kept unless you ask for a template.
Read the docs →shoots exifStamp metadata
Artist, copyright, keywords — any EXIF·IPTC·XMP tag — written across a whole folder in one pass.
Read the docs →shoots cullCull the out-of-focus frames
Focus-aware blur detection, shallow depth of field included, with an optional human-in-the-loop review.
Read the docs →shoots rateStar-rate and keyword
0–5 stars and keyword suggestions from a local ONNX CLIP model, written as XMP sidecars your editor reads.
Read the docs →shoots matchLearn your eye
Duel your own photos two at a time; the outcomes train a rating profile that generalizes your taste to work you have never judged.
Read the docs →shoots developLearn your edit
Fit a predictor on a catalog you have already developed, and get a per-image starting point as an XMP sidecar.
Read the docs →A shallow-DoF portrait is mostly bokeh
A single global sharpness number throws away your best wide-open frames. Alongside it, cull builds a focus map over a tile grid and takes the sharpest region: a frame below --threshold is still kept when that peak clears --focus-threshold. Move the sliders and watch the verdicts change.
Mostly bokeh: the global score is low, but the eyes are tack sharp.
--threshold100Global Laplacian variance below this counts as blurry
--focus-threshold250Keep a soft frame when its sharpest region clears this
Classic computer vision — Laplacian variance plus a tile-based focus map. No model, no inference. How the scoring works →
Your own develop style, learned and re-applied
It learns the global look from a catalog you have already developed and writes a per-image starting point as an XMP sidecar. It does not do local masks, generative edits or a finished image — the goal is the best starting point to refine.
Once, from a catalog you have already developed
Learn your style
Exports a training dataset from your edited photos and fits a develop profile. Under the hood: export --edited-only + train.
shoots develop init ~/Catalogs/2025writes ~/.shoots/develop/profile/export.json
Every step accepts --dry-run. Read the predictor guide →
The 60-second tour
Every mutating command accepts --dry-run. Every command accepts --json. Nothing is ever deleted.
shoots setupshoots import E:/DCIM/100CANON --dest D:/Shoots/2026/smith-weddingshoots exif D:/Shoots/2026/smith-wedding --set-artist "Jane Doe Photography" --set-copyright "© 2026 Jane Doe"shoots cull D:/Shoots/2026/smith-wedding --dest D:/Shoots/2026/smith-wedding/rejectsshoots rate D:/Shoots/2026/smith-wedding --profile wedding --write-xmpCommand map
- importcard → catalog, renamed and SHA-256 verified
- renamein-place batch rename with the same template engine
- exifbatch read/write EXIF·IPTC·XMP via exiftool
- cullfocus-aware blur detection; relocate or review rejects
- rate0–5 star ratings + keywords via the ONNX CLIP model
- embeddingsprofile-neutral CLIP export for preference learning
- matchlearn your eye from duels → a personal rating profile
└─ import · serve · train
- developpersonal develop-setting predictor
└─ init · edit · refine · export · train · predict · calibrate · diagnose
- schedulerun develop refine daily and unattended
- setupprovision exiftool + LibRaw + the inference model
- doctorenvironment health check
- updateself-update the standalone binary
- shellthe interactive shell (default with no arguments)
What it actually looks like
Terminal captures generated from real runs — the interactive UIs driven by keystrokes, the batch commands actually executed.

Source-available, not open source.
shoots is licensed under the PolyForm Noncommercial 1.0.0. You are free to read, use, modify and share the source code — but only for noncommercial purposes. Any commercial use of the software, in whole or in part, is not permitted under this license.
Copyright © 2026 Stefano Pascazi. All commercial rights are reserved by the copyright holder.