The five workflow phases.
Every shoot in SpeedCull moves through the same five phases: Scan, Generate Previews, Cull, Sync to XMP, and Cleanup. The sidebar in the main window lets you jump between them at any time — the order is just the recommended path.
1. Scan
Scan walks the folder you opened, finds every supported RAW file, and records each one in the project database. It runs once initially and any time you want to pick up newly-added files.
What gets indexed
- RAW files in any of the supported extensions (see the full list in Specs)
- XMP sidecar presence for each RAW (so the Sync phase knows which files already have ratings on disk)
- JPEG companions (a same-name
.jpg/.jpegnext to a RAW)
What gets skipped
- Hidden directories (anything starting with
.) - The
.SpeedCull/folder itself - Unsupported file types (counted in the summary, otherwise ignored)
Stable identity
SpeedCull identifies each image by a hash of projectId + relativePath, not by
filename. That means duplicate filenames in different sub-folders (e.g. across multiple card
backups) are kept distinct, and a database unique constraint enforces it.
File-changed-since-scan detection
On re-scan, SpeedCull compares each file’s file size and modified-at timestamp
against the recorded values. Anything that moved gets the changed status,
its existing previews are invalidated, and Generate Previews picks it up next time.
2. Generate Previews
This is the slow phase, and the only slow phase. SpeedCull renders JPEG previews in up to three sizes (Compare, Screen, optionally Native) so culling itself is fast. See Preview tiers for the sizing details.
How it works
- Up to 4 concurrent workers (one per CPU core, capped at 4 to avoid I/O thrash)
- Each RAW is opened with ImageIO; SpeedCull prefers the embedded JPEG preview when present, falling back to a full RAW render only when the embedded preview is too small
- Output JPEGs use quality
88by default (Compare runs slightly lower at84to save space; Native is at least85) - Optional sleep prevention via an
IOPMAssertionso overnight runs don’t pause when your Mac idles — toggle in Settings → Processing
Pause / resume / cancel
Long preview runs can be paused (cooperative — the current image finishes before pausing), resumed, or cancelled outright. The progress strip shows ETA based on the current rate.
Resuming after a crash
Progress is journaled to SQLite per-image, so if the app exits mid-run you can return to Generate Previews and click Start again — only the unfinished images get redone.
3. Cull
The main work surface. Cull is divided into five view modes — see View modes for the deep dive. Pick your filter, your sort order, and your mode, then make decisions.
The Pass workflow
Across the top of the Cull screen sits the Pass control bar — five chips for five passes. Each chip sets the appropriate filter and jumps to the first image:
| Pass | Filter | Promotes to | Use it for |
|---|---|---|---|
| Pass 1 | All | 1★ | First quick-no-review pass — kill the obvious misses |
| Pass 2 | ≥ 1★ | 2★ | Survivors of pass 1 get a second look |
| Pass 3 | ≥ 2★ | 3★ | Pickers — frames worth showing the client |
| Pass 4 | ≥ 3★ | 4★ | Hero candidates — selects for delivery |
| Pass 5 | ≥ 4★ | 5★ | Portfolio frames — the final cut |
The funnel strip along the bottom shows how many images are at each level. Numbers update live as you rate. Click any funnel item to filter to that bucket.
Filters and sort
The filter dropdown supports All / Unrated / =N★ / ≥N★ / Picked / Rejected / Unflagged. Sort options are Capture Time (default), Filename, Folder Path, Rating, and Culling Order (the order images were added to the project).
Folder filter
If your project has multiple top-level folders (e.g. one card backup per shoot day), a Folder dropdown appears that scopes the filter to one card at a time. Useful when culling a multi-card event.
4. Sync to XMP
When you’re happy with the ratings, Sync writes them to standard XMP sidecar files that Lightroom Classic, Bridge, and Capture One can read. See Lightroom sync for the full round-trip.
What gets written
- Star ratings (1–5) become
xmp:Rating - Reject flags become
xmp:Rating="-1"— the same convention Bridge uses - Pick flags are not written — internal-only in 0.1 (LR round-trip not yet verified)
Backup-then-update
If an XMP sidecar already exists, SpeedCull copies it to
.SpeedCull/backups/xmp-before-sync/<timestamp>_<id>_<name>.xmp
before writing. Only the xmp:Rating attribute is touched —
every other namespace, attribute, and child element is preserved exactly.
Read-only handling
If the XMP file or its parent directory is read-only (common on archived shoots), the
sync action is recorded as skipped with a separate count for read-only failures.
Nothing is overwritten silently.
5. Cleanup
Once your ratings are synced and Lightroom has read the sidecars, you generally don’t need the preview cache any more. The Cleanup phase shows you exactly how much disk each preview tier is using and lets you reclaim it.
Targets
| Compare previews | 1 920 px JPEGs (the small ones) |
|---|---|
| Screen previews | 3 840 px JPEGs (the loupe-fit ones) |
| Native previews | Source-resolution JPEGs (only if you opted in) |
| Focus crops | AF-aware 100% crops, regenerated on demand |
| Database & logs | The SQLite catalogue and sync logs |
| XMP backups | Pre-sync sidecar copies — keep these until you’re sure the sync went well |
Delete previews removes the JPEG cache (compare + full + native). The catalogue
and backups stay. Delete everything nukes the entire .SpeedCull/
folder — your RAWs and XMP sidecars are untouched.
Offline-drive handling
SpeedCull projects often live on external drives. If the drive disconnects mid-session, an offline banner appears at the top of the workspace with a Reconnect button. All your records — ratings, previews already generated, sync logs — are preserved in the database. Re-mounting the drive and clicking Reconnect resumes work.