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)
├── 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.
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
External tools
| Variable | Effect |
|---|---|
SHOOTS_EXIFTOOL |
Path to an existing exiftool binary. Wins over the provisioned one — no download happens. |
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. |
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 |
develop export --baseline external fails; --baseline embedded-preview (the default) still works. |