Concepts¶
The load-bearing ideas behind krites.
The shoot is the state; krites is stateless¶
krites keeps no state of its own. The unit of work is a shoot — your own
directory of frames, plus a .krites/ sidecar holding the manifest, analysis
cache, verdicts, edit records and previews, and an export/ directory once you
render one.
krites operates on whatever shoot it is handed. There is no cross-shoot catalog or library; that is Lightroom's job. The studio keeps a list of folders you have opened so you can switch between them, but that list holds a name and a path and nothing else.
The practical consequence: a shoot is portable and self-describing. Copy the folder to another machine and every decision goes with it. Delete krites and nothing is orphaned — you are left with your photographs and some YAML. Nothing in krites' own state can go stale relative to a shoot, because krites has none.
See the shoot layout reference for every file this creates.
Non-destructive by construction¶
Originals are immutable inputs. Every judgement and edit is a reversible
record in the sidecar, never a change to a pixel, and only export writes
pixels.
So a cull, a straighten, a crop, a look or an object removal can always be undone, and the export is deterministic: the same records produce the same output.
The full account — including the three places the guarantee has an honest edge — is in What "non-destructive" means, stage by stage.
The pipeline¶
Value is delivered in order, with certainty decreasing and cost and privacy exposure increasing down the line:
- Cull flags out-of-focus and motion blur, bad exposure, closed eyes and blinks, and near-duplicate bursts, giving each frame a keep / maybe / reject verdict with reasons.
- Develop straightens, composition-crops and applies a colour look to the keepers.
- Object removal inpaints an unwanted distraction.
- Export bakes everything, in the order
removals → straighten → crop → look.
The ordering is a deliberate ranking by confidence. Sharpness is a measurement; "is this a good photograph" is an opinion. Putting the measurable, cheap, entirely-local work first means the parts you are most likely to trust are also the parts that need nothing switched on.
Judgement and aesthetic are config, not code¶
The judgement — per-signal thresholds, hard gates versus soft penalties, dedup aggressiveness — lives in a cull profile. The aesthetic — white balance, tone, grade or LUT — lives in a look. Both are configuration seeded as starting points, never hardcoded Go constants.
This matters because taste is the thing that differs between photographers, and between a ceremony and a reception. A threshold in the source is a threshold nobody can move; a threshold in config is one you can tune, override for one shoot, and revert.
The cull profile is fully wired: the
cull.profile.* keys cascade
global-to-shoot, and re-culling under revised thresholds is near-instant. The look
catalog is the half of this idea that is not finished — see
Limitations.
Three surfaces over one workspace¶
The same shoot is driven from three places: the CLI, the studio (the primary, browser-based surface), and MCP (krites' commands exposed as tools to an AI assistant). None of them owns the state — the shoot directory does — so you can move between them freely mid-shoot.
The MCP surface is deliberately the narrowest of the three. Anything that
produces pixels, egresses an image or destroys work is excluded, so an agent can
prepare work but a human commits it. See
krites mcp.
Local-first, pluggable providers¶
Every heavy backend — RAW handling, face and eye analysis, aesthetic scoring, generative inpainting — sits behind a narrow Go interface, chosen from config. Every cloud-capable provider is off by default, opt-in per capability, with disclosure before any pixels leave the machine.
Why that is the default, and why each capability is off for a different reason, is in Why the heavy providers are opt-in.
Fits Lightroom¶
krites writes XMP sidecars, so a krites cull surfaces in a Lightroom catalog — cull in krites, finish in Lightroom.
The handoff is partial by design: the verdict, the crop and the straighten angle travel; the look and any object removal do not, because Camera-Raw XMP cannot express them. See What krites does not do.