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/ directory beside them holding the manifest,
the 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 .krites/, 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-blurred frames, bad exposure and near-duplicate bursts (and, with face analysis on, closed eyes and blinks), giving each frame a keep, maybe or reject verdict with reasons.
- Develop straightens, composition-crops and applies a colour look to the keepers.
- Retouch is the planned light-retouching stage. It is not built.
- Object removal inpaints an unwanted distraction.
- Export bakes everything, applying object removals, then straighten, then crop, then the look.
The learning stage is designed and not started; see What krites does not do.
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 floors, and how
tightly bursts are grouped) lives in a cull profile. The aesthetic (white
balance, tone, grade or LUT) lives in a look. Both are configuration, never
hardcoded Go constants. krites ships a starting point for each (the
wedding-default profile and the neutral look) and falls back to it for
anything you have not set, so your config holds only what you changed.
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, because 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, the AI review) 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 beside your originals, so a krites cull arrives in Lightroom when you import them: 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.