Candidate work, prioritized within each section. Effort: S < half a day,
M ≈ a day or two, L = multi-day. Sources: NegPy (UPSTREAM.md
flagged candidates), Negative Lab Pro v3/v3.1 release notes, darktable's
negadoctor, and standard macOS app conventions.
- Arrow-key frame navigation (←/→ walks the film strip, honoring folder order) — S, the single biggest workflow hole.
- Rating/culling: pick ★/reject flags with keyboard (1–5, X, U), filter bar in the library — M. Pairs with arrow-key navigation for a real culling pass.
- Open via Finder/Dock: register RAW UTIs (CFBundleDocumentTypes in Packaging/Info.plist) so drag-onto-Dock and "Open With" work; accept folder/file drops on the library pane — S/M.
- Open Recent submenu (folders) in File — S.
- Zoom menu items: Zoom In ⌘+ / Out ⌘− / Fit ⌘0 / Actual Pixels ⌘1 in View — S.
- Copy rendered image ⌘C (current conversion to clipboard) — S.
- Dock progress + notification for batch export (NSProgress on the Dock tile; UNUserNotificationCenter when done/failed) — S.
- Settings window ⌘, — default export options, canvas color, preview size cap, sidecar behavior — M.
- Share menu (NSSharingServicePicker on an on-demand JPEG) — S/M.
- Drag a frame OUT of the library/canvas to Finder → exports on demand (NSItemProvider file promise) — M.
- Help menu → open README/guide; About panel version/credits — S.
- If ever distributed: sandbox + security-scoped bookmarks for the library folder, hardened runtime + notarization, Sparkle-style updates — L (not needed while personal).
- TIFF compression (Adobe Deflate + horizontal predictor; NegPy
fb4b7a7) — S. Exports are currently uncompressed; ~2-3× smaller files. - Carry EXIF into exports (capture date, camera/lens, exposure — ImageIO metadata copy from the RAW) — S/M. Exports are currently bare.
- Batch apply: "Paste Adjustments to Selection" — S. Copy/paste exists; applying to a multi-selection is the missing 20 lines with outsized value.
- Preset management (save/apply named setting bundles; NLP v3 headliner) — M. Builds directly on the copy/paste plumbing.
- Roll analysis / match (NLP v3's flagship; NegPy's roll-baseline concept): meter selected frames together → shared normalization so a roll converts consistently; pick a reference frame to "match" — M/L. Highest conversion-quality payoff for whole-roll work.
- White-balance eyedropper (NLP-style: click a neutral → temp/tint; negadoctor's pickers are the same idea) — M.
- Straighten reference line (drag a line along a horizon → exact
angle; NegPy 0.37 has this) — S/M; plus a one-click
auto-straighten via Vision's
VNDetectHorizonRequest— S. - Auto-crop film borders (detect rebate/holder edges; NegPy autocrop / Vision rectangle detection) — M.
- Clipping "blinkies" overlay on the image (shadow/highlight clip masks; the histogram indicators already compute this) — S.
- Crop aspect-ratio presets (original, 2:3, 4:5, 5:7, 1:1, free) — S/M.
- Spot densitometer (NegPy 0.37
77c8113) — hover the canvas → D + zone in the control bar, with a zone strip;negcli meteris the headless twin. Thedensity_histogramGPU metric was deliberately NOT ported (it feeds NegPy's H&D chart, which we don't ship — see Deferred below). - "Negative character" stat (measured density range vs default →
"flat ≈N−1 / contrasty ≈N+1" diagnostic; NegPy
stats.py) — shown under the Grade slider. - Midtone gamma (Snap) slider (deliberately-skipped NegPy port; cheap to add) — S.
- Export sharpening (unsharp after downscale) — S/M. We ship no sharpening at all.
- B&W negative mode (NegPy has a BW process mode; post-curve luma collapse) — M.
- Slide film / positive (E-6) support (NLP added it in v3.1; no inversion, WB + tone only) — M.
- Duplicate/near-duplicate detection (Vision feature prints) — M.
- Per-channel R/G/B trims, Split Grade, Zone Density (NegPy's convergent equivalents of our tone controls — revisit only if per-channel crossover correction is needed).
- NegPy's
density_histogram(120-bin GPU metric) and the H&D chart it feeds; the densitometer's ΔD-above-base per-channel figure (needs an actor round-trip per pointer move). Revisit only with an H&D chart. - NegPy's
RenderMemo(memoized last-displayed render): our warm-tower re-render is ~5 ms, so it buys nothing here (see UPSTREAM.md 2026-07-15). - Dust/scratch removal (NegPy retouch is a large subsystem), C-41 denoise, crosstalk profile editor, LUT film looks, camera-scanning/tethering, RGB narrowband scanning, contact sheets, flat/log export intent.