Skip to content

Shoot layout

Every file krites writes into a shoot directory, what it holds, and which command writes it.

The shoot directory is your own folder

A shoot is your folder of frames. krites does not create a workspace elsewhere and does not copy anything into one. It adds a .krites/ directory beside your files and, only when you export, an export/ directory.

~/Pictures/smith-wedding/
├── IMG_2043.CR2            ← your originals, never modified
├── IMG_2043.xmp            ← only if you ran `krites xmp write`
├── .krites/                ← everything krites decides
└── export/                 ← only if you ran `krites export`

The .krites/ sidecar

Path Holds Written by
shoot.yaml The manifest: shoot name, source path, creation time, frame list ingest
verdicts.yaml Per frame: verdict, reasons, whether you overrode it, star rating, burst cluster, the machine's own proposal, decision time cull, verdict
analysis.yaml The regenerable signal cache: sharpness, exposure, eye, smile and facing, perceptual hashes, face boxes, frame dimensions cull
develop.yaml The shoot's develop config: the look catalog and the straighten/crop settings develop and the studio
exports.yaml Append-only ledger of each export run: when, which frames, which verdict set, --max-dim and --quality export
edits/<frame>.yaml One frame's reversible edits: straighten angle, crop rectangle, look reference, removal list straighten, crop, develop, remove
removals/<frame>/<n>.png The materialised inpaint patch for one object removal remove
reviews/<frame>.md The rendered AI critique review
reviews/<frame>.yaml The structured review record: scores, labels, and which provider and model wrote it review
previews/… The preview cache, keyed by frame, size, render mode and edit state the studio
jobs/<jobId>.yaml A crash breadcrumb for a running background job, deleted the moment it ends the studio

Directories are created 0750 and files 0600.

Which of these you can safely delete

File Safe to delete?
analysis.yaml Yes, it's regenerable. The next cull re-decodes and re-measures
previews/ Yes, it's regenerable, and nothing else prunes it
jobs/ Yes, it only affects whether an interrupted job is reported
verdicts.yaml Loses every verdict and rating; the frames themselves are fine
edits/ Loses every straighten, crop and look
develop.yaml Loses the shoot's look catalog
removals/ No: each patch is the only copy of a generative fill
shoot.yaml No: without the manifest the folder is no longer a shoot
exports.yaml Loses the delivery history; exports themselves are unaffected

The removal patches deserve the emphasis. Unlike the preview cache they are not regenerable: each one is the sole copy of a generative fill, and the edit record only points at it. Losing one loses that removal, recoverable only by re-running krites remove against the model, which won't reproduce the same fill.

export/

krites export renders into <shoot>/export/. It is the only directory outside .krites/ that krites writes, and the only place new pixels are ever produced.

A frame with no edits and no resize is copied verbatim: original bytes, original metadata, no re-encode. Anything else is decoded, baked and re-encoded: PNG for a .png source, JPEG otherwise.

A RAW frame always renders, because the deliverable is a JPEG from its embedded preview rather than a copied RAW container. The .jpg is appended rather than swapped, so IMG_2043.ARW exports as IMG_2043.ARW.jpg. That looks odd but is deliberate: swapping the extension would collide a RAW+JPEG pair (IMG_2043.ARW and IMG_2043.JPG) onto one output file.

The one file krites puts in your own folder

krites xmp write writes <frame-base>.xmp beside the original, in your folder, not in .krites/. It writes only the .xmp companion and never the image.

Two consequences worth knowing:

  • No reset removes them. krites reset only touches .krites/ and export/. Deleting stale sidecars is a manual step.
  • A RAW+JPEG pair collides. The extension is stripped, not appended, so IMG_2043.ARW and IMG_2043.JPG both map to IMG_2043.xmp. When both are in the shoot, one verdict overwrites the other, and which one wins is not deterministic. Shoot RAW-only, or JPEG-only, if you rely on sidecars.

Which files each command touches

Command Writes Deletes Touches an original?
ingest .krites/shoot.yaml — No
cull verdicts.yaml, analysis.yaml — No
verdict verdicts.yaml — No
straighten edits/<frame>.yaml that file, if the record becomes empty No
crop edits/<frame>.yaml that file, if the record becomes empty No
develop edits/<frame>.yaml that file, if the record becomes empty No
remove removals/<frame>/<n>.png and edits/<frame>.yaml — No
review reviews/<frame>.md, reviews/<frame>.yaml — No
xmp write <frame-base>.xmp beside the original — No, only the .xmp beside it
export export/<frame>, appends to exports.yaml — No
reset frame rewrites verdicts.yaml edits/<frame>.yaml, removals/<frame>/ No
reset shoot rewrites or deletes verdicts.yaml see reset shoot No
reset exports — the whole export/ directory No

What ingest does and does not do

krites ingest registers. It does not copy, move, rename or link anything; it reads the directory listing, records the frame names in the manifest, and creates the sidecar.

Behaviour Detail
Accepted extensions .jpg, .jpeg, .png, .arw, .cr2, .nef, .dng, matched case-insensitively
Unrecognised files Silently skipped. No error, no warning, no line in the report
Subdirectories Not scanned. Ingest is non-recursive; only files directly in the folder are registered
A folder with no supported frames Fails with no supported frames (…) in "…"
Re-ingesting an existing shoot Rewrites shoot.yaml with a fresh manifest and a new creation timestamp. Verdicts and edits are untouched; there is no "already a shoot" guard

Because unrecognised files and subdirectories are skipped without comment, a card dump with frames in DCIM/100CANON/ registers zero frames and fails rather than finding them.