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¶
- An original image file is opened for reading and never written. No stage modifies, renames, moves or deletes one.
- Every judgement and every edit is a record in
.krites/, not a change to an image. - Only
krites exportproduces pixels, and it produces them into a separateexport/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 themselves — reset 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.