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.
On this page
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
| View | Tier used |
|---|---|
| Grid view (thumbnails) | Compare |
| Compare 4-up tiles | Compare |
| Keeper Mode pane thumbnails (when needed) | Compare |
| Loupe at fit-to-window | Screen |
| Loupe zoomed past 1.5× | Native (if available) — falls back to Screen if not |
| Play Mode | Screen, 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:
- Opens the file with ImageIO (
CGImageSourceCreateWithURL) -
Tries the fast path:
kCGImageSourceCreateThumbnailFromImageIfAbsentwithCreateThumbnailWithTransform: 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. -
Falls back to
kCGImageSourceCreateThumbnailFromImageAlwayswhen the embedded preview is too small — this triggers a full RAW render. Slower, but guaranteed to produce the requested resolution. - Writes the result as a JPEG with
CGImageDestinationat 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:
0— Native disabled (default)4096/5120/6016/7680— render Native capped at this long-edge in pixels
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:
-
A scan detects file changes. If a re-scan sees a file with the same
relative path but different size or modified-time, the image gets the
changedstatus and its previews are queued for re-render. - You enable a new tier. Toggling Native on queues only the missing Native renders for each image; existing Compare/Screen previews are untouched.
-
Generation failed previously. Any image marked
preview-failedgets retried on the next Generate run.
You can also delete previews entirely (Cleanup screen → Delete previews) and re-run Generate from scratch. The catalogue and your ratings are unaffected.