Focus Monitor.
Focus Monitor is a 100 % crop centred on the actual autofocus point reported by the camera — not the centre of the frame. It lets you check whether focus actually landed where the camera intended it to, without zooming and panning.
On this page
How it works
For each image, the first time you toggle Focus Monitor on:
- SpeedCull invokes ExifTool to read AF-related tags from the RAW
-
AFPointParser turns those tags into an
AFRegionin image-pixel coordinates (top-left origin) — handling brand-specific encoding and reference-frame rescaling - The parsed region is cached in SQLite (
focus_metadatatable) - A 100 %-zoom JPEG crop centred on the AF region is rendered and cached to disk
- An on-screen overlay shows the crop with a green / yellow / orange confidence dot
Subsequent views of the same image are instant — the parse is cached in the database and the JPEG crop is on disk.
Brand support
Three brand families are supported in 0.1, each via a distinct tag path:
| Brand | Source tags | Notes |
|---|---|---|
| Canon | Composite:AFAreaXPosition + AFAreaYPosition (+ AFAreaWidth, AFAreaHeight) |
Pre-normalised by ExifTool to image-pixel space — most reliable path |
| Sony | MakerNotes:FocusLocation |
Reference frame may differ from sensor; SpeedCull rescales to actual image dimensions |
| Fuji | MakerNotes:FocusPixel |
X / Y in image-pixel space |
Other brands (Nikon, Olympus, Panasonic, Pentax, etc.) fall through to a centre crop.
Adding more brands is a matter of extending AFPointParser.parse with a new
branch — contributions welcome.
Real-RAW verification. AF parsing is unit-tested against synthetic tag dictionaries representing each brand’s expected output, but real-world ARW / CR3 / RAF testing is still happening. If your camera reports AF positions that don’t match where the crop ends up, file an issue with the camera model and a sample tag dump.
Using Focus Monitor
In Loupe
- F — toggle the picture-in-picture overlay
- ⇧F — cycle the PiP through the four corners (top-left → top-right → bottom-right → bottom-left)
The PiP shows a 100 %-zoom crop centred on the AF point, with an outlined rectangle indicating the exact reported AF box scaled to the displayed crop. The header shows a confidence dot; the footer shows status text like Precise · Sony A7R V · Spot AF.
In Compare 4-up
With Focus Monitor on, each Compare tile shows a small focus crop in the bottom-right. Compare doesn’t generate crops — it only displays cached ones. Visit images in Loupe with Focus Monitor on once and the crops will be ready next time you compare them.
In Keeper Mode
F in Keeper Mode behaves the same as in Compare — cached crops show in the bottom-right of each pane; uncached ones don’t. Generate them by opening images in Loupe first.
Confidence indicators
The confidence dot tells you how reliable the AF position is:
| ● Precise | AF position read directly with no inference |
| ● Approximate | AF position derived from less-direct tags or sentinel-rescaled |
| ● Fallback | No usable AF data; centre crop is shown |
| ○ Unavailable | ExifTool wasn’t available, or the file produced no readable tags |
The status footer also names the camera (when known) and the AF mode if it was reported, so a Sony spot-AF frame might read “Precise · Sony α7R V · Spot AF”.
Caching
AF results are cached at two levels for speed:
-
Database — the parsed region (x, y, width, height plus image dimensions)
lives in the
focus_metadatatable, keyed by image id. Subsequent views read directly from SQLite, no exiftool subprocess. -
JPEG crop — the 100 % crop is rendered once and saved to
.SpeedCull/previews/focus-crops/<slug>_<basename>.jpg. Compare 4-up and Keeper Mode read from this cache directly.
If you want to wipe the cache (e.g. after upgrading SpeedCull and wanting fresh AF parses): Cleanup screen → Delete focus crops. Crops will regenerate on next view in Loupe.
ExifTool requirement
Focus Monitor needs ExifTool. SpeedCull resolves the binary in this order:
- Bundled inside the app at
SpeedCull.app/Contents/Resources/exiftool/exiftool - Standard system paths:
/opt/homebrew/bin/exiftool,/usr/local/bin/exiftool,/usr/bin/exiftool
In 0.1 ExifTool isn’t bundled inside the app yet — the simplest install path is Homebrew:
brew install exiftool
With ExifTool unavailable, Focus Monitor still works — it just falls back to a centre crop with the unavailable confidence indicator. AF-aware crops require ExifTool.
Troubleshooting
The crop is centred on the wrong spot
Possible causes:
- Reference-frame mismatch — some Sony bodies report AF coordinates against a frame that’s rotated or scaled differently from the actual image. SpeedCull’s rescaler should handle the common cases; if your model isn’t one of them, file an issue with the camera make / model.
- Out-of-bounds rejection — if the parsed coordinates land outside the image, SpeedCull rejects them and falls back to centre. You’ll see a fallback indicator.
- AF mode wasn’t single-point — wide-area or tracking AF reports a region, not a point; the crop will be centred on the region’s centre.
It says “ExifTool not installed”
Run brew install exiftool. SpeedCull will pick it up next time you toggle
Focus Monitor on (no app restart needed).
It’s slow on the first view
That’s the exiftool subprocess + RAW render cost. Subsequent views read from the cache and are instant. Pre-warm the cache by toggling Focus Monitor on in Loupe before going into Compare or Keeper Mode for that image.