<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Culling on PHP Boy Scout</title><link>https://phpboyscout.uk/tags/culling/</link><description>Recent content in Culling on PHP Boy Scout</description><generator>Hugo -- gohugo.io</generator><language>en-gb</language><copyright>Matt Cockayne</copyright><lastBuildDate>Wed, 02 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://phpboyscout.uk/tags/culling/index.xml" rel="self" type="application/rss+xml"/><item><title>Cull a shoot, end to end</title><link>https://phpboyscout.uk/cull-a-shoot-end-to-end/</link><pubDate>Wed, 02 Sep 2026 00:00:00 +0000</pubDate><guid>https://phpboyscout.uk/cull-a-shoot-end-to-end/</guid><description>&lt;img src="https://phpboyscout.uk/cull-a-shoot-end-to-end/cover-cull-a-shoot-end-to-end.png" alt="Featured image of post Cull a shoot, end to end" /&gt;&lt;p&gt;I installed my own photo culler the wrong way, got three steps into my own tutorial, and walked into a wall my own documentation had put a warning box in front of. In fairness to the documentation, it&amp;rsquo;s a good warning box. In fairness to me&amp;hellip; &lt;code&gt;go install&lt;/code&gt; is what your fingers do when the thing&amp;rsquo;s written in Go and you&amp;rsquo;ve typed that command four thousand times.&lt;/p&gt;
&lt;p&gt;What I got was a working &lt;code&gt;krites&lt;/code&gt; binary that culled a shoot perfectly happily and then, when I asked it for the studio, served me a very polite page explaining that the studio UI wasn&amp;rsquo;t built into this binary. Which is exactly what the docs say will happen, in a box, in bold, a few lines above where I&amp;rsquo;d stopped reading.&lt;/p&gt;
&lt;p&gt;So that&amp;rsquo;s where this starts, because it&amp;rsquo;s the one step in the whole walkthrough that can cost you an evening. Everything after it is twenty-odd minutes, and nothing you do in it can hurt your originals.&lt;/p&gt;
&lt;p&gt;The short version of what &lt;a class="link" href="https://phpboyscout.uk/i-built-my-wife-a-judge/" &gt;krites&lt;/a&gt; does: you point it at a folder of frames and it gives every one of them a verdict, keep or maybe or reject, and tells you why it decided that. It groups the bursts too, so you&amp;rsquo;re not squinting at ten near-identical frames trying to work out which one has both sets of eyes open. And then it gets out of the way, because the judgement&amp;rsquo;s yours and the tool&amp;rsquo;s only there to stop you making it four thousand times from cold.&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;This is the canonical walkthrough from the krites docs, reproduced here so the two don&amp;rsquo;t drift. The docs are the source of truth: &lt;strong&gt;&lt;a class="link" href="https://krites.phpboyscout.uk/tutorials/cull-a-shoot/" target="_blank" rel="noopener"
 &gt;https://krites.phpboyscout.uk/tutorials/cull-a-shoot/&lt;/a&gt;&lt;/strong&gt;. Every command and every output below was run against &lt;strong&gt;v0.9.0&lt;/strong&gt; before this went out, bar the one RAW claim in step 6, which says so itself.&lt;/p&gt;
&lt;p&gt;The frames are real: forty-four out of Lyndsey and Denis&amp;rsquo;s wedding, shot by my wife Hailey at &lt;a class="link" href="https://www.instagram.com/echos_photographyuk/" target="_blank" rel="noopener"
 &gt;Echos Photography&lt;/a&gt;. Hailey and the couple have agreed to them turning up here, which for a tool whose whole pitch is that your clients&amp;rsquo; photographs never leave your machine isn&amp;rsquo;t a detail I was going to skate past. I worked on a copy, so nothing here wrote a byte into her actual shoot.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="1-install-it-and-not-the-way-i-did"&gt;1. Install it, and not the way I did
&lt;/h2&gt;&lt;p&gt;The studio&amp;rsquo;s web assets are built by a &lt;code&gt;go generate&lt;/code&gt; step and baked into the binary. &lt;code&gt;go install&lt;/code&gt; and a bare &lt;code&gt;go build&lt;/code&gt; skip that step, so you get the placeholder page I got. A release build is what you want.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you&amp;rsquo;re on a Mac, take the &lt;code&gt;.dmg&lt;/code&gt; and ignore the rest of this section.&lt;/strong&gt; &lt;code&gt;Krites_&amp;lt;version&amp;gt;_arm64.dmg&lt;/code&gt; from the &lt;a class="link" href="https://gitlab.com/phpboyscout/krites/-/releases/permalink/latest" target="_blank" rel="noopener"
 &gt;latest release&lt;/a&gt;, drag it into Applications, done. It&amp;rsquo;s signed and notarized, so none of that unidentified-developer nonsense. The ONNX runtime the local analysis wants is bundled inside it, so there&amp;rsquo;s nothing else to go and install. And double-clicking it starts the studio and opens your browser for you; click it again a week later and it reopens the one you&amp;rsquo;ve already got running rather than starting a second, with &lt;strong&gt;Shutdown krites&lt;/strong&gt; in the studio settings when you want it gone. I&amp;rsquo;d take that route even on a machine where I was perfectly happy in a terminal. Apple Silicon only, mind, so on an Intel Mac take &lt;code&gt;krites_Darwin_x86_64.tar.gz&lt;/code&gt; and follow the CLI route below.&lt;/p&gt;
&lt;p&gt;It configures itself at launch, too, so if you&amp;rsquo;ve gone that way you can skip the &lt;code&gt;krites init&lt;/code&gt; below entirely and go straight to registering a shoot.&lt;/p&gt;
&lt;p&gt;Everywhere else, or if you&amp;rsquo;d genuinely rather stay at the command line, the install script fetches the right archive and drops the binary in &lt;code&gt;~/.local/bin&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsSL https://gitlab.com/phpboyscout/krites/-/raw/main/install.sh &lt;span class="p"&gt;|&lt;/span&gt; bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then initialise your config, once:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;krites init
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It&amp;rsquo;s idempotent, so run it again any time you&amp;rsquo;re not sure.&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;One correction to the docs while you&amp;rsquo;re here&lt;/strong&gt;, and it only bites on the CLI route. Both the tutorial and the getting-started page say &lt;code&gt;init&lt;/code&gt; seeds a &lt;code&gt;wedding-default&lt;/code&gt; cull profile into &lt;code&gt;~/.krites/config.yaml&lt;/code&gt;. At v0.9.0 it doesn&amp;rsquo;t. Your config file will have logging, server and update keys in it and nothing else, and that&amp;rsquo;s fine: &lt;code&gt;wedding-default&lt;/code&gt; is built into the binary and it&amp;rsquo;s the profile every command below actually uses. It threw me long enough to go hunting for a file that was never going to be there, so I&amp;rsquo;ve raised it as &lt;a class="link" href="https://gitlab.com/phpboyscout/krites/-/work_items/11" target="_blank" rel="noopener"
 &gt;krites#11&lt;/a&gt;.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="2-register-the-shoot"&gt;2. Register the shoot
&lt;/h2&gt;&lt;p&gt;krites keeps no catalogue of its own. It works on a &lt;strong&gt;shoot&lt;/strong&gt;: your originals, plus a &lt;code&gt;.krites/&lt;/code&gt; sidecar it puts down beside them.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;krites ingest ~/Pictures/lyndsey-denis
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Registered shoot &amp;#34;lyndsey-denis&amp;#34; — 44 frames (~/Pictures/lyndsey-denis)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ingest scans the folder, records each frame and sets the sidecar up. It only ever reads your files. From here on, pass &lt;code&gt;--shoot ~/Pictures/lyndsey-denis&lt;/code&gt;, or just run the commands from inside that directory.&lt;/p&gt;
&lt;h2 id="3-judge-every-frame"&gt;3. Judge every frame
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;krites cull --shoot ~/Pictures/lyndsey-denis
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Shoot &amp;#34;lyndsey-denis&amp;#34; — 44 frames
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; keep 10 maybe 28 reject 6
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; keep DSC07925.jpg
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; maybe DSC07926.jpg — near-duplicate of DSC07925.jpg (kept the sharper frame)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; maybe DSC07927.jpg — near-duplicate of DSC07925.jpg (kept the sharper frame)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; reject DSC07929.jpg — blown highlights (11% over 10%)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; reject DSC07930.jpg — blown highlights (11% over 10%)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; maybe DSC07935.jpg — near-duplicate of DSC07937.jpg (kept the sharper frame)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; keep DSC07937.jpg
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Forty-four frames took a minute and three quarters on my machine, so a full wedding is the sort of thing you kick off and go and put the kettle on for.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s the right-hand column that does the work here. Every verdict comes with its reason and the number behind it, so when it rejects one you liked you can see whether it misread the frame or whether you did. Sharpness and motion blur, exposure, and, with the &lt;a class="link" href="https://krites.phpboyscout.uk/how-to/enable-face-eye-analysis/" target="_blank" rel="noopener"
 &gt;face and eye provider enabled&lt;/a&gt;, closed eyes and blinks.&lt;/p&gt;
&lt;p&gt;None of it touches your photos. The verdicts are records in the sidecar, nothing more. The judgement itself comes from that &lt;code&gt;wedding-default&lt;/code&gt; profile, and its thresholds are &lt;a class="link" href="https://krites.phpboyscout.uk/how-to/tune-a-cull-profile/" target="_blank" rel="noopener"
 &gt;yours to tune&lt;/a&gt; once you&amp;rsquo;ve got an opinion about them.&lt;/p&gt;
&lt;p&gt;Then look at what it grouped:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;krites dedup --shoot ~/Pictures/lyndsey-denis
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Shoot &amp;#34;lyndsey-denis&amp;#34; — 6 burst(s)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; burst of 3 — kept DSC07925.jpg
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; ★ DSC07925.jpg
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; DSC07926.jpg
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; DSC07927.jpg
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="4-review-in-the-studio"&gt;4. Review in the studio
&lt;/h2&gt;&lt;p&gt;The studio is where krites is really meant to be driven from, and it&amp;rsquo;s a local web UI over the same shoot files:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;krites studio
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It takes no &lt;code&gt;--shoot&lt;/code&gt; flag, which threw me for a moment until I remembered why: unlike the CLI it isn&amp;rsquo;t scoped to one shoot, it opens onto a library of them and you pick. If the one you just ingested isn&amp;rsquo;t in the list, add it with &lt;strong&gt;Browse…&lt;/strong&gt; on the Shoots page. Mine wasn&amp;rsquo;t, so that line in the docs is doing real work.&lt;/p&gt;
&lt;p&gt;Then it&amp;rsquo;s the cull grid, which is where you&amp;rsquo;ll actually spend your time: confirming the keepers, rescuing whatever the profile was harsh on, binning the rest. Each frame carries a colour-coded verdict stripe down its left edge, a rating chip if you&amp;rsquo;ve starred it, and a burst marker if it belongs to a cluster.&lt;/p&gt;
&lt;p&gt;&lt;img alt="The krites studio cull grid: forty-four frames in justified rows, each with a green, amber or red verdict stripe down its left edge and its sharpness score in the corner, the selected frame open in the loupe on the right, and Keep 10 / Maybe 28 / Reject 6 along the bottom." class="gallery-image" data-flex-basis="384px" data-flex-grow="160" height="1000" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://phpboyscout.uk/cull-a-shoot-end-to-end/studio-cull-grid_hu_9861a231220abe17.webp" srcset="https://phpboyscout.uk/cull-a-shoot-end-to-end/studio-cull-grid_hu_519eb3a0ad67285e.webp 480w, https://phpboyscout.uk/cull-a-shoot-end-to-end/studio-cull-grid_hu_3153636ef9c4a924.webp 720w, https://phpboyscout.uk/cull-a-shoot-end-to-end/studio-cull-grid_hu_b70abd03d1113b98.webp 1080w, https://phpboyscout.uk/cull-a-shoot-end-to-end/studio-cull-grid_hu_e5f229c3cdad169e.webp 1440w, https://phpboyscout.uk/cull-a-shoot-end-to-end/studio-cull-grid_hu_9861a231220abe17.webp 1600w" width="1600"&gt;

&lt;/p&gt;
&lt;p&gt;That run of near-identical frames along the top row is the burst the cull was on about: the groom and the dog, eight times over, and the one it kept has the gold ring round it. Eight frames, one decision&amp;hellip; and it&amp;rsquo;s exactly the sort of decision I&amp;rsquo;d have stopped making carefully somewhere around frame three thousand.&lt;/p&gt;
&lt;p&gt;The grid defaults to justified rows, full uncropped frames at a consistent height with your shot order kept, the way a Lightroom filmstrip lays out. The &lt;strong&gt;Rows / Grid&lt;/strong&gt; toggle swaps it for a dense cropped-to-fill lattice and remembers which you picked.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;d rather stay in the terminal, or you&amp;rsquo;re scripting a correction, override a single frame directly:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;krites verdict DSC07926.jpg keep --shoot ~/Pictures/lyndsey-denis
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;DSC07926.jpg → keep (manual override)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="5-correct-the-keepers"&gt;5. Correct the keepers
&lt;/h2&gt;&lt;p&gt;On the keepers, krites proposes edits, and every one of them is a reversible record rather than a change to the file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;krites straighten DSC07926.jpg --shoot ~/Pictures/lyndsey-denis &lt;span class="c1"&gt;# level horizon&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;krites crop DSC07926.jpg --shoot ~/Pictures/lyndsey-denis &lt;span class="c1"&gt;# composition crop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;krites develop DSC07926.jpg --shoot ~/Pictures/lyndsey-denis &lt;span class="c1"&gt;# apply a look&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;straighten&lt;/code&gt; tells you what it found and what it proposes doing about it, and all three work that way:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Shoot &amp;#34;lyndsey-denis&amp;#34; — straighten
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; DSC07926.jpg +8.00° (detected -44.01°)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Which is a decent illustration of why these are proposals rather than instructions. It reckoned that frame was forty-four degrees out, which it very much isn&amp;rsquo;t, and offered me eight anyway. I wouldn&amp;rsquo;t take it&amp;hellip; and nothing has happened to the photograph either way, so there&amp;rsquo;s no harm done in it having asked.&lt;/p&gt;
&lt;p&gt;Made a wrong call on a frame? Undo everything on it and start again:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;krites reset frame DSC07926.jpg --shoot ~/Pictures/lyndsey-denis
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s the whole safety net, and it&amp;rsquo;s worth getting comfortable with it early, because you can&amp;rsquo;t paint yourself into a corner that needs a re-import. Nothing you&amp;rsquo;ve done has gone anywhere near the original.&lt;/p&gt;
&lt;h2 id="6-export"&gt;6. Export
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;krites &lt;span class="nb"&gt;export&lt;/span&gt; --shoot ~/Pictures/lyndsey-denis
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Exported 11 keep frame(s) to ~/Pictures/lyndsey-denis/export
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Export is the &lt;strong&gt;only&lt;/strong&gt; step that writes pixels. It renders the keepers with every edit baked in, in the order removals then straighten then crop then look, into the shoot&amp;rsquo;s &lt;code&gt;export/&lt;/code&gt; directory. Run it as often as you like, the same records give you the same output every time.&lt;/p&gt;
&lt;p&gt;The bit I wouldn&amp;rsquo;t have guessed, so I went and checked it: a frame with no edits and no resize is copied &lt;strong&gt;verbatim&lt;/strong&gt;. I ran &lt;code&gt;cmp&lt;/code&gt; over one of Hailey&amp;rsquo;s, a 19,887,969-byte frame, and what came out the other end was byte-for-byte the original. Not a re-encode costing her a generation of quality on every pass, which is the sort of thing you only notice three exports later! Which is also why eleven frames exported in under a second, since most of that job was a file copy. A frame that does carry an edit gets re-rendered, as you&amp;rsquo;d expect.&lt;/p&gt;
&lt;p&gt;RAW is the one thing here I didn&amp;rsquo;t exercise, since the shoot I was handed is JPEGs. The documented behaviour is that a RAW frame always renders, as a JPEG off its embedded preview, so &lt;code&gt;IMG_2043.CR2&lt;/code&gt; exports as &lt;code&gt;IMG_2043.CR2.jpg&lt;/code&gt;. I&amp;rsquo;ve no reason to doubt it and no test of my own to offer you, so take that one from the docs rather than from me.&lt;/p&gt;
&lt;h2 id="7-hand-the-cull-to-lightroom"&gt;7. Hand the cull to Lightroom
&lt;/h2&gt;&lt;p&gt;Writing sidecars is its own command, because &lt;code&gt;export&lt;/code&gt; renders pixels and doesn&amp;rsquo;t write XMP:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;krites xmp write --shoot ~/Pictures/lyndsey-denis
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Wrote 44 XMP sidecar(s) beside the originals in ~/Pictures/lyndsey-denis
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That puts an &lt;code&gt;.xmp&lt;/code&gt; beside each original carrying its verdict as a star rating and a colour label, plus the crop and the straighten angle on any frame you corrected. Point Lightroom at your originals and the cull&amp;rsquo;s sitting there waiting for you. If you want the reasoning behind that ten-line packet, &lt;a class="link" href="https://phpboyscout.uk/ten-lines-of-xml-so-a-cull-shows-up-in-lightroom/" &gt;I wrote it up separately&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The look doesn&amp;rsquo;t travel, and neither do object removals, because Camera Raw&amp;rsquo;s XMP can&amp;rsquo;t express either of them. If a keeper needs one of those in Lightroom, import the rendered file out of &lt;code&gt;export/&lt;/code&gt; rather than the original.&lt;/p&gt;
&lt;h2 id="what-you-just-did"&gt;What you just did
&lt;/h2&gt;&lt;p&gt;You&amp;rsquo;ve taken a shoot from import through to an album-ready export without altering an original: every verdict and every correction was a record you could throw away, and only that last &lt;code&gt;export&lt;/code&gt; put a pixel anywhere. From here, &lt;a class="link" href="https://krites.phpboyscout.uk/how-to/tune-a-cull-profile/" target="_blank" rel="noopener"
 &gt;tune the profile&lt;/a&gt; until its taste is closer to yours, or read &lt;a class="link" href="https://krites.phpboyscout.uk/explanation/" target="_blank" rel="noopener"
 &gt;why it judges the way it does&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The photographs, meanwhile, are exactly where you left them, byte for byte&amp;hellip; which is the one part of all this I&amp;rsquo;d genuinely lose sleep over getting wrong.&lt;/p&gt;</description></item></channel></rss>