Culling

Keeper Mode.

Keeper Mode is the side-by-side keeper-vs-contender flow for picking the strongest frame(s) out of a burst. You select a related group of images in Grid, open Keeper Mode, then walk through the queue making one binary decision at a time. At the end, every keeper gets promoted by +1 ★ (capped at 5★). Nothing is written to your ratings until you confirm.

When to use it

Keeper Mode shines when:

For unrelated images, regular Loupe / Grid culling is faster — Keeper Mode is purpose-built for direct comparison of similar frames.

Launching a session

From Grid view, build a multi-selection of 2 + images, then trigger Keeper Mode:

1. Select images

Selected images are passed to Keeper Mode in the current grid sort order — not the order in which you clicked them. So if you’re sorted by capture time, the burst plays through chronologically.

2. Open Keeper Mode

Three equivalent ways to launch:

Pre-flight checks

Before a session opens, SpeedCull validates the selection:

Fewer than 2 eligible images

Keeper Mode promotes by +1 ★, capped at 5 ★, so 5 ★ images can’t be promoted. They’re filtered out. If after filtering you have fewer than 2 images left, you’ll see:

Not enough images for Keeper Mode

Select at least two non-5★ images to use Keeper Mode.

5 ★ images in selection

If your selection includes 5 ★ images, you get a confirmation:

Open Keeper Mode?

3 selected images are already 5★ and will be excluded — Keeper Mode promotes by +1★.

Continue with 9 eligible images?

[Cancel]   [Continue]

Large selection (> 30 images)

Keeper Mode works best with small related groups. If you’ve selected more than 30 images, you’ll see a warning explaining the worst-case comparison count (n − 1 rounds). Continue if you’re sure; otherwise cancel and refine your selection.

The Keeper / Contender layout

Keeper Mode takes over the whole Cull detail pane. Two big panes side-by-side — KEEPER on the left (accent border), CONTENDER on the right. Each pane shows the filename, current star rating, and the Screen-tier preview of the image.

Below the panes:

The pass control bar, funnel strip, mode picker, and filter / sort dropdowns are all hidden during a Keeper Mode session — there’s nothing to do with them while you’re comparing, and the absence of clutter helps you focus.

The four core actions

A — Keeper stays

A or . Current keeper is better than current contender; the contender is consumed and the next image from the queue becomes the new contender. Keeper unchanged.

D — Contender becomes keeper

D or . Current contender is better; it replaces the keeper. The next image from the queue becomes the new contender.

K — Save keeper and continue

K. Lock the current keeper into saved keepers — it’s definitely getting promoted. The current contender becomes the new keeper, and the next image from the queue becomes the new contender. Use this when you’ve found one definite keeper but want to keep searching the rest of the burst for more.

Enter — Finish and review

Enter. Stop comparing immediately and open the completion summary. Any current keeper joins the saved keepers list. Anything still in the queue is discarded (no rating change either way).

Other useful keys

EscCancel session (with confirmation). No ratings have been changed at this point.
⌘Z / Undo the last decision — works for keeperStays, contenderBecomesKeeper, and saveKeeper. Undoing from the completion summary returns you to the active session.
FToggle focus crops on both panes
ZToggle synchronized 2× zoom on both panes

Focus crops and synchronized zoom

Focus (F)

Toggles a small picture-in-picture AF crop in the bottom-right of each pane. Keeper Mode does not trigger crop generation — it displays only crops that already exist on disk. To populate the cache, view the images in Loupe with Focus Monitor on first; from then on Keeper Mode picks them up for free.

See Focus Monitor for details on how AF metadata is parsed.

Zoom (Z)

Toggle a centred 2× zoom on both panes simultaneously. The keyboard flow keeps working while zoomed — A, D, K, Enter still drive the comparison. There’s no panning yet; both panes are centred at 2×. Press Z again to return to fit.

Why 2× and not literal 100%? True 100 % requires a pan-and-zoom workflow that fights the keyboard-first decision flow. The 2× compromise is enough to spot eye-sharpness differences in most bursts; for genuine pixel-peeping, fall back to Loupe (where pinch-zoom and pan are both available).

The completion summary

The summary appears when:

What it shows

Three actions

How promotions are applied

For each image in the final keepers list:

  1. newRating = min(5, oldRating + 1)
  2. If newRating equals oldRating, the image is left untouched (no DB write)
  3. Otherwise the rating is written to the SQLite catalogue and the image’s syncStatus goes to dirty — meaning it’s now ready to be picked up by the next Sync to XMP

The catalogue write is the only thing that happens during Apply. No XMP sidecars are written during Keeper Mode — that happens in the separate Sync to XMP phase, just like every other rating change.

Saved keepers, dedupe, and the final keeper

The final keepers list is built like this:

Guarantees

No rating changes during the active sessionDecisions are kept in memory until you explicitly Apply
5 ★ images are filtered out before launchBelt-and-braces: even if one slipped through, the engine clamps at 5
Other images are never modifiedOnly the final keepers get their rating bumped
Cancel is fully safeEsc → Discard Session leaves your project in exactly the state it was in before launch
RAW files are never writtenSame hard rule as the rest of SpeedCull
Sessions are in-memory in 0.1Force-quitting mid-session loses the session — but no destructive write has happened yet