Configuration

DocsReference

Configuration

shoots needs no configuration to work. Everything below is an override for non-default setups: portable installs, air-gapped machines, CI images, forks.


The shoots home

A single directory under the user's profile holds everything machine-local and provisioned at runtime. It is ~/.shoots on every OS — deliberately uniform, so no environment variables need to be set on end-user machines.

~/.shoots/
├── bin/                          Downloaded external tools
│   ├── shoots(.exe)                the CLI binary itself (installer target)
│   ├── exiftool/13.59/             pinned version, checksum-verified
│   └── libraw/<version>/           dcraw_emu, the neutral RAW developer
├── models/
│   └── clip/vit-b32-int8-2/        clip-image-encoder.onnx
│                                   keywords.json
│                                   aesthetics.json
├── profiles/                     Your learned rating profiles (*.json)
├── match/                        Preference-learning duel databases
│   └── <profile>.db                every duel you have judged — not recomputable
├── develop/                      The develop predictor's own working files
│   ├── profile/export.json         your fitted style profile
│   ├── feedback.jsonl              every (predicted, kept) pair ever recorded
│   └── export/                     the training dataset, and one dir per shoot
│       └── shooting/<shoot>/         export.jsonl · prediction.json
│                                     refine-state.json (what `schedule` last saw)
├── triage/                       Marks from `cull --mark` / `rate --mark`
│   └── <shoot>-<digest>.jsonl      pending decisions, until a sidecar writer takes them
├── labels/                       Your label vocabulary per editor (*.json)
├── cache/                        Regenerable: thumbnails, RAW previews
├── logs/
│   └── schedule.log                the daily `schedule run` transcript
└── config.json

On Windows the same tree lives at %USERPROFILE%\.shoots.

profiles/ is the one directory you write to yourself. Drop a linear-embedding profile JSON there (as emitted by shoots match train) and it becomes selectable as shoots rate --profile <filename-without-.json>. See Rating profiles.

labels/ is the other directory you write to yourself — see Label sets below.

develop/feedback.jsonl is the one file that cannot be rebuilt at any price. It records what photographs looked like the day they were developed, and re-reading them now cannot recover that. develop clean never touches it, --all or not.

Everything else is regenerable: delete the tree and shoots setup rebuilds the tools and models, develop init the dataset and the profile.


Environment variables

Locations

Variable Default Effect
SHOOTS_HOME ~/.shoots Relocate the entire home directory. Useful for portable installs, tests, and CI caches.
SHOOTS_INSTALL_DIR ~/.shoots/bin Installer only — where the binary is placed.
# Portable: keep everything on an external drive
export SHOOTS_HOME=/Volumes/Field/shoots-home
shoots setup

Derived-value cache

Variable Effect
SHOOTS_CACHE Set to 0 to recompute everything, every run. Per run, use --no-cache.
SHOOTS_CACHE_MAX Ceiling on ~/.shoots/cache. Default 1GB; accepts 512MB, 2GB or plain bytes. Crossing it drops whole shoots, oldest first.

The cache holds derived numbers only — measurements, embeddings — never image data, which is why ~150 MB covers a 100,000-frame catalog. See shoots cache.

External tools

Variable Effect
SHOOTS_EXIFTOOL Path to an existing exiftool binary. Wins over the provisioned one — no download happens.
SHOOTS_EXIFTOOL_DAEMON Set to 0 to start a fresh exiftool per call instead of keeping one alive for the whole command. Slower by roughly 25×; only useful when isolating a suspected exiftool bug.
SHOOTS_LIBRAW Path to an existing LibRaw dcraw_emu binary.
SHOOTS_RAW_DEVELOPER An arbitrary RAW-developer executable for develop export --baseline external. Wins over the provisioned LibRaw.
SHOOTS_RAW_DEVELOPER_ARGS Argument template for the above. {in} and {out} are substituted per file.
# Use the system exiftool during development
export SHOOTS_EXIFTOOL=/usr/local/bin/exiftool

# Use RawTherapee with a neutral profile as the develop baseline
export SHOOTS_RAW_DEVELOPER=rawtherapee-cli
export SHOOTS_RAW_DEVELOPER_ARGS='-Y -q -o {out} -p neutral.pp3 -c {in}'

The default args already target dcraw_emu: -w -W -o 1 -q 0 -T -Z {out} {in} — camera white balance, no auto-brighten (so the true scene exposure survives), sRGB output, TIFF.

Mirrors

Variable Effect
SHOOTS_TOOLS_BASEURL Base URL for the exiftool / LibRaw archive mirror.
SHOOTS_MODELS_BASEURL Base URL for the ONNX model archive mirror.
SHOOTS_REPO GitHub owner/repo used by shoots update and the installers. Default stefanopascazi/shoots.

Point these at an internal artifact server for an air-gapped or bandwidth-limited studio. Checksum verification still applies — the pinned SHA-256 hashes live in the binary, not in the mirror, so a hostile or corrupt mirror cannot substitute content.

export SHOOTS_TOOLS_BASEURL=https://artifacts.studio.internal/shoots/tools
export SHOOTS_MODELS_BASEURL=https://artifacts.studio.internal/shoots/models
shoots setup

Diagnostics

Variable Effect
SHOOTS_DEBUG Print the full stack trace when an unexpected error escapes a command (see packages/cli/src/crash.ts). Off by default: batch output stays one readable error: line.

Build-time only

SHOOTS_VERSION and SHOOTS_AUTHOR are not runtime environment variables. They are substituted into the bundle at build time (packages/cli/tsup.config.ts and scripts/build-binary.ts) from the root package.json. Setting them in your shell has no effect on an installed binary.

GitHub API

Variable Effect
GITHUB_TOKEN / GH_TOKEN Sent as a bearer token by shoots update. Raises the anonymous GitHub API rate limit — worth setting in CI.

Label sets

cull --mark and rate --mark record what a photograph isreject, select — never a colour. The colour is chosen when the mark is written into a sidecar, from a per-editor label set.

The defaults match a stock English Lightroom / Bridge install:

Semantic label Default
reject Red
select Green
review Yellow
second-pass Purple

They are defaults rather than a standard on purpose. xmp:Label is a standard field holding free text: Lightroom and Bridge colour it only when the string matches an entry in your label set, which is localized. Override it in ~/.shoots/labels/<editor>.json:

{
  "reject": "Rosso",
  "select": "Verde"
}

Partial overrides merge over the defaults, so remapping one label leaves the rest alone. Unknown keys and empty values are rejected outright, before anything is written — a shoot half-labelled in the wrong vocabulary is worse than an error.

<editor> is the --editor id — acr or rapidraw. Switching editors later means editing one file, not re-culling.

The defaults differ by editor, because the editors do. Lightroom matches a label by name against a localized set, so acr defaults to Adobe's English colours (Red, Green, Yellow, Purple) and an Italian install wants an override. RapidRAW stores the label as a color:<name> tag against a fixed enum, so rapidraw defaults to its five lowercase names (red, green, yellow, purple) and overriding it means choosing a different colour, not translating the same one.


Pinned versions

Current pins (they move with releases):

Component Version Archive
exiftool 13.59 exiftool-13.59-win32.tar.gz / exiftool-13.59-unix.tar.gz
CLIP model vit-b32-int8-2 clip-vit-b32-int8-2.tar.gz
LibRaw see librawManifest() per-platform dcraw_emu

Each is installed into a version-scoped directory (bin/exiftool/13.59/), so upgrading shoots fetches the new version alongside the old rather than clobbering it. shoots doctor reports what is actually resolved.


Runtime prerequisites

Requirement Needed for Notes
tar Extracting downloaded archives Present by default on modern Windows 10+, macOS and Linux.
perl Running exiftool on macOS/Linux exiftool is a Perl distribution there. Not required on Windows, where exiftool is a native .exe.

shoots doctor checks both.


Working without external tools

shoots degrades rather than failing where it reasonably can:

Situation Behaviour
No exiftool, import with a template using {camera}/{lens} Falls back to file mtime for dates; {camera}/{lens} render as unknown-camera / unknown-lens. The import still runs.
No exiftool, cull on a RAW folder Fails — RAW scoring needs the embedded preview.
No exiftool, cull on JPEGs Works. The aperture column is omitted (it is report context, not a decision input).
No exiftool, exif / rename Fails with a clear message — those commands are exiftool.
No CLIP model rate, embeddings and develop export fail with a message pointing at shoots setup.
No LibRaw and no SHOOTS_RAW_DEVELOPER Anything on --baseline external fails — which includes develop init and develop edit, where it is the default. Fall back to --baseline embedded-preview, at the cost described in the predictor guide.

Edit this page on GitHub