Sample 3 of 3 — CULL FORGE
Keeper export folder — after you CULL
Command:
photocull.cmd "C:\Pictures\wedding-2026" --export keepers --min-stars 4 --suffix → copies into wedding-2026_keepers next to the shoot. Originals never touched.Exporter output — 6 files, suffix on
wedding-2026_keepers/6 keepers · SHA-256 identical
./ WED-0100-cull5G.jpg — 5 Green (was WED-0100.jpg) ✓ 2.1 MB copy
./ WED-0101-cull4.jpg — 4 ✓
./ WED-0106-cull5R.jpg — 5 Red ✓
./ WED-0108-cull4B.jpg — 4 Blue ✓
./ WED-0110-cull5G.png — 5 Green PNG ✓
sub/ WED-0111-cull4.jpg — 4 (nested preserved) ✓ structure kept
✕ WED-0105 NOT exported — rejected -1
· WED-0102 (3 Yellow), WED-0103 (2), WED-0104 (1 Purple) — below --min-stars 4, not exported
./ WED-0101-cull4.jpg — 4 ✓
./ WED-0106-cull5R.jpg — 5 Red ✓
./ WED-0108-cull4B.jpg — 4 Blue ✓
./ WED-0110-cull5G.png — 5 Green PNG ✓
sub/ WED-0111-cull4.jpg — 4 (nested preserved) ✓ structure kept
✕ WED-0105 NOT exported — rejected -1
· WED-0102 (3 Yellow), WED-0103 (2), WED-0104 (1 Purple) — below --min-stars 4, not exported
Naming: <stem>-cull<stars><LabelLetter>.<ext>. Omit --suffix to keep original names.
Integrity — byte-identical
Every keeper is SHA-256 hashed against its source. The files that arrive are the files that left.
sha256(WED-0100.jpg) == sha256(keepers/WED-0100-cull5G.jpg) # True sha256(sub/WED-0111.jpg) == sha256(keepers/sub/WED-0111-cull4.jpg) # True # 6 keepers hashed — all pass (kill test check 20)
Re-run: python scripts/killtest_roundtrip.py → check 20: "every exported copy is byte-identical (SHA-256) — 12-file plan, 6 keepers hashed" PASS.
RAW siblings not exported (only their sidecars). Export is copies — your card dump stays as shot.
Console line you see
[photo-cull] keepers: 6 matched (min 4 star(s)) [photo-cull] copied 6 file(s) (0 already there) -> C:\Pictures\wedding-2026_keepers
Second run skips existing non-empty files (skipped 0 above) — safe to re-export.
← All 3 samples · Contact sheet · XMP sidecar · Home — CULL offers