Skip to content

What "non-destructive" means, stage by stage

"Non-destructive" is used loosely across photo software, usually meaning "you can undo it in our app". krites means something narrower and more checkable: your original files are read-only inputs, and only one command ever produces pixels.

This page says exactly what that guarantee covers at each stage, and — more usefully — exactly where it stops.

The rule

  1. An original image file is opened for reading and never written. No stage modifies, renames, moves or deletes one.
  2. Every judgement and every edit is a record in .krites/, not a change to an image.
  3. Only krites export produces pixels, and it produces them into a separate export/ directory.

Point 2 is what makes everything reversible. A verdict is a line in a YAML file. A straighten is an angle. A crop is four numbers. A look is the id of a catalog entry. None of them exist as pixels until you ask for them.

Stage by stage

Stage What it writes Any original mutated?
ingest .krites/shoot.yaml — the manifest No. It registers in place; nothing is copied or moved
cull .krites/verdicts.yaml, .krites/analysis.yaml No. A verdict is a label, never a file operation
verdict .krites/verdicts.yaml No
straighten / crop / develop .krites/edits/<frame>.yaml No. An angle, a rectangle, a look id
remove .krites/removals/<frame>/<n>.png and the edit record No. The fill is a patch file, composited only at export
review .krites/reviews/<frame>.md and .yaml No. Advisory, and it never sets a verdict
xmp write <frame-base>.xmp beside the original No — but this is the one stage that writes into your own folder
export export/<frame>, and appends to the export ledger No
reset (any) Rewrites or deletes files under .krites/ and export/ No

Where the guarantee stops

Three honest caveats. Each is a real edge, not a hedge.

xmp write writes into your folder. It places <frame-base>.xmp beside each original. It never touches the image itself, but it does put a new file in the directory you handed krites, and no reset removes those sidecars — reset only cleans .krites/ and export/. Deleting stale .xmp files is a manual step.

A removal patch is the one thing that is not regenerable. Everything else under .krites/ can be rebuilt from your originals: the analysis cache, the previews, the verdicts if you are willing to re-cull. A removal patch cannot. It is the sole copy of a generative fill, and the edit record only points at it. So while removals are non-destructive to your originals, they are destructible in themselvesreset frame and a default reset shoot both delete them permanently.

Non-destructive is not the same as recoverable. krites guarantees your photographs survive anything you do to them. It does not guarantee your work survives — reset shoot deletes verdicts, ratings, edits and removals immediately, with no confirmation and no undo. The originals will still be there. Three hours of culling will not.

Why export is the only writer

Keeping pixel production in one place is what makes the rest of the design possible.

It means the export is deterministic: the same records produce the same output, so re-running it is free and re-rendering after a tweak is not a migration. It means an edit can be revised any number of times at no cost, because nothing has been committed. And it means the bake order is a single, stated pipeline — removals → straighten → crop → look — rather than an accumulation of whatever order you happened to click things in.

That order is not arbitrary. Removals composite first, on the original frame, so the fill gets levelled, cropped and graded along with everything around it; a fill applied after the grade would sit visibly outside it.

Why a verdict is a label and not a file operation

The obvious implementation of culling is to move rejects into a rejects/ folder. krites deliberately does not, and the reason is that a cull is a judgement that gets revised.

You will disagree with the machine, change a threshold, re-cull, and change your mind again at 2am on a frame you rejected at noon. Every one of those is free when a verdict is a line of YAML, and every one is a filesystem operation that can half-fail when a verdict is a file move. Half-finished file moves are how a shoot gets lost.

It also means the machine's opinion and yours can coexist. Each frame records what krites proposed and what you decided, so a re-cull under revised thresholds can show that the machine came round to your view — which is both the point of tuning and the raw material a learner would eventually need.