Workflow

Preview tiers.

SpeedCull renders JPEG previews up front so culling itself is fast. Three tiers cover the three viewing scenarios — small for grids, screen-fitting for loupe, and source-resolution for actual pixel-peeping. The first two are always on; the third is opt-in.

The three tiers

Tier Long edge JPEG quality Default
Compare 1 920 px 84 Always on
Screen (internally "full") 3 840 px 88 Always on
Native Source-native, capped (configurable) 88 Off — opt-in per project

Naming history. The mid tier is called Screen in the UI but full in the database column names — they refer to the same thing. Native means source-resolution and is independent of the other two.

When each is used

ViewTier used
Grid view (thumbnails)Compare
Compare 4-up tilesCompare
Keeper Mode pane thumbnails (when needed)Compare
Loupe at fit-to-windowScreen
Loupe zoomed past 1.5×Native (if available) — falls back to Screen if not
Play ModeScreen, falling back to Compare if Screen isn’t ready

How previews are rendered

Preview generation is parallelised across up to 4 concurrent workers (one per CPU core, capped at 4 to avoid I/O contention on shared external drives).

For each RAW, SpeedCull:

  1. Opens the file with ImageIO (CGImageSourceCreateWithURL)
  2. Tries the fast path: kCGImageSourceCreateThumbnailFromImageIfAbsent with CreateThumbnailWithTransform: true. If the camera’s embedded JPEG preview is large enough (≥95% of target long-edge), uses it directly. This is the same code path that makes the Finder show RAW thumbnails instantly.
  3. Falls back to kCGImageSourceCreateThumbnailFromImageAlways when the embedded preview is too small — this triggers a full RAW render. Slower, but guaranteed to produce the requested resolution.
  4. Writes the result as a JPEG with CGImageDestination at the tier’s quality setting

Metadata extraction

While the preview is being generated, SpeedCull also reads basic metadata from the RAW file — capture time, camera make / model, lens model, dimensions, orientation — and writes those back to the image record. This is fast (no separate file open) and means subsequent culling can sort by capture time without re-reading every RAW.

Storage cost

For a typical 5 000-image, 24 MP RAW shoot:

Tier~Size per image~Total for 5 000
Compare (1 920 px)200 KB~1 GB
Screen (3 840 px)600 KB~3 GB
Native (24 MP source)5 MB~25 GB

Numbers are rough — your mileage will vary with subject complexity (high-detail nature shots compress worse than low-key portraits) and with the camera’s embedded preview quality. The Generate Previews screen shows a live size estimate before you start.

Enabling the Native tier

Native is off by default because the storage cost is real — 25 GB per 5 000 RAWs adds up quickly across a year of shoots. Enable it only when you need to pixel-peep, e.g. for sharpness checks at 100% zoom in Loupe.

How to enable. The Generate Previews screen has a Native preview toggle that updates the project’s preview_native_long_edge setting:

Pick a cap that matches your camera’s native resolution (or close to it) — for example 6 016 px is the long edge of a 24 MP Sony A7-series body, 7 680 px covers most ~50 MP sensors. Storage scales roughly with the square of the long edge.

You can enable Native later. Toggling Native on for an existing project queues only the missing Native previews — Compare and Screen aren’t re-rendered. You can also delete just the Native tier later from the Cleanup screen without touching Compare or Screen.

On-disk filenames

Every preview is named <32-char slug>_<original basename>.jpg. The slug is the first 32 hex characters (128 bits) of SHA-256(projectId + "|" + relativePath) — the same hash that identifies images in the database. This means two RAWs with the same filename in different sub-folders get distinct preview filenames, with negligible collision risk.

Previews live under .SpeedCull/previews/ inside your shoot folder:

.SpeedCull/previews/
├── compare/        ← 1 920 px
├── full/           ← 3 840 px (Screen tier)
├── native/         ← source-resolution (if enabled)
└── focus-crops/    ← AF-aware 100% crops, generated on demand

Re-generation

SpeedCull re-renders previews automatically when:

You can also delete previews entirely (Cleanup screen → Delete previews) and re-run Generate from scratch. The catalogue and your ratings are unaffected.