# What's new in LightCraft ## October 2026 ### Smart album rules - The rule editor's field menu is grouped: Rating, Pick Flag, Color Label and Any Searchable Text at the top, then submenus for Source, File, Date, Keywords & People, Description, Camera Info, Location, Size, Develop and Assisted Culling. - New fields: Keyword Count ("2 or more", "exactly 2"…), People and People Count (named faces), Shutter Speed (written as 1/250), File Extension, Video Duration, Copy Name, In a Stack, Alt Text, City, State / Province, Country, Long Edge, Short Edge, Aspect Ratio (landscape / portrait / square), Cropped and Treatment (in color / black & white). Size rules measure the photo as shown: Megapixels now counts the cropped photo, like Long Edge, Short Edge and Aspect Ratio (a 24 MP photo cropped to a square is 16 MP). - Choice values read as words in every language: "Public Domain", "Picked", "Black & White" rather than ids like `publicDomain` (rules and agents keep using the ids; `album.ruleFields` adds `choiceLabels`). - Rule values are checked: a rating of 9, a date like 2026-13 or "banana", a "between" whose dates are the wrong way round, "in the last 0 days", a colour label that doesn't exist, "contains" with nothing to look for, an album that is gone, or an empty group is reported with its rule ("rule 2.1: rating is 0–5, not 9") instead of quietly matching nothing or everything. New date rules start at the current year. - A smart album can include or exclude another smart album: "Keywords contain travel" and "Album isn't Excluded Photos" leaves out whatever Excluded Photos matches, as its rules change. The album list offers smart albums under their own heading; a rule that would make an album include itself is refused. Esc with a dropdown or calendar open in a dialog closes just that. - Date rules have a calendar button: pick a day, a month or a whole year (Year / Month / Day), in your language; the two dates of a "between" can't be picked out of order; Esc closes just the calendar. It picks dates, not times (a time is typed, and picking a day replaces one). Typing still works, and "2026-10-01 10:00" (a space for the T) now matches; a time zone is refused, since capture times are local. - Rule problems are shown in your language and name the field the way the menu does ("Title: needs something to look for"). - A smart album whose rules no longer check (an album they test was deleted) is marked ⚠ in the sidebar; its tooltip says what to fix, and `albums.list` reports `problems`. - Editing a smart album's name and rules is one step: both or neither, and one undo takes both back (`album.setRules` takes `name`). - The rule editor marks each rule that needs fixing right under it and keeps OK disabled until they are fixed. An Album rule picks its album from a list (is / isn't) instead of taking an id. - Yes/no fields (Has Edits, Cropped, Has GPS…) read Yes / No instead of true / false. A rule sent as `"false"` now means no (it used to count as yes), and a value that is neither yes nor no is refused. - Any Searchable Text also finds the state / province, alt text, people and a virtual copy's name. ### Albums tree - Album folders fold with the same disclosure triangle as Local, By Date, Folders and Keywords. - Right-click a folder ▸ New ▸ Create Album… / Create Smart Album… / Create Smart Album from Filter… / Create Folder… makes it inside that folder (`dialog.newAlbum`, `dialog.newFolder`, `dialog.smartAlbum`, `dialog.newSmartAlbum` take `parent`). - Drag an album or folder onto a folder to move it there (a closed folder opens after 0.6 s under the pointer; a "Albums" header takes it back to the top level; Esc cancels; holding a dragged album or photos near the top or bottom edge of the sidebar scrolls it). Drop on the top or bottom half of another album, or the edge of another folder, to place it before or after it: that folder is then ordered by hand. Right-click ▸ Sort Contents A–Z (or + ▸ Sort Albums A–Z at the top level) goes back to by name. To put a folder after an open folder, fold that folder first (the bottom of an open folder means "inside"). Agents use `album.reorder` (`id`, `parent?`, `before?`) and `album.sort`. - The catalog format is now version 3 (`Album.order`, `Op::SetAlbumOrder`). Once this version has opened a library, older versions refuse it, as with every format change. ### AI RAW denoise - Detail has a per-photo AI Denoise switch and Amount. Bayer RAW photos use a disposable cache, with matching previews and exports and pure-Rust CPU/GPU inference. - Models are installed separately after accepting their terms; no weights are bundled. See [setup and limitations](denoise.md). ### Library keyboard culling - Colour labels tint thumbnail surrounds in Square Grid and the Detail filmstrip, and a translucent footer along the bottom of the photo in Photo Grid. Label confirmations use a matching pale colour. - Setting or clearing a colour label shows a brief bottom confirmation, like rating a photo; custom label names appear in the message too. - On macOS, ratings `0–5`, labels `6–9` and pick/unflag `P/U` now reach the app even when shown in the native menu (issue #283; adapted from PR #261). - `Shift+6–9` labels and advances. `Shift+P` picks and advances in Photo Grid and Square Grid; it opens Presets in other views. With Auto Advance on, Shift still moves only once. - Help → Keyboard Shortcuts includes the number-key bindings. See [library shortcuts](library-shortcuts.md). ### Keyboard shortcuts - Shortcuts are editable: Help ▸ Keyboard Shortcuts (⌘/) lists every command with a search box; click a shortcut and press the new keys (Esc cancels), × removes it, ↺ restores the original, Reset All undoes every change. A key that belonged to another command moves to the new one. Menus show the new keys; agents use `app.setShortcut`. ### RAW decoding - Canon CR2 and Pentax PEF raws get the same starting look fitted to the camera's own JPEG as ARW, NEF, RW2, RAF and CR3, instead of opening flat and desaturated (issue #310). Photos already imported pick it up when re-rendered. - JPEG XL compressed DNGs (DNG 1.7) now open: lossless tiles decode sample for sample (checked on synthetic files); lossy tiles decode too, but no real file has checked them yet. A JPEG XL preview stored in the DNG is used like an embedded JPEG. - Apple ProRAW's gain table map (its local tone mapping, `ProfileGainTableMap`) is now read and kept when a photo is exported or converted to DNG. It is not applied to the render: Lightroom Classic renders ProRAW without it. - iPhone ProRAW and other DNGs that carry their own segmentation mattes (DNG semantic masks) use them for the Select Sky, Subject and Background masks instead of our heuristics, so the sky is selected where the camera found it (checked on one CC0 iPhone 12 Pro ProRAW). Photos without mattes are unchanged. - Panasonic and Leica raws (RW2, RWL) are now corrected for lens distortion the way the camera corrects its own JPEG (issue #256): the correction the camera records in the file is applied under Lens Corrections ▸ Enable Profile Corrections, on by default for newly imported photos, with the same framing as the camera's JPEG. At 12 mm the 12–32 mm kit zoom was off by about 5 % of the image width at the corners before. Files shot with the correction off are unchanged; photos imported before this change get it when imported again. - Canon CR3 raws now develop from their sensor data: lossless RAW and C-RAW, checked sample for sample on the EOS M50, R100 and R8. CR3 files the decoder can't read yet still open from their embedded JPEG, as before. - Canon EOS R7 C-RAW files develop from their sensor data too, instead of opening from their embedded JPEG. For R7 C-RAWs imported earlier, Photo ▸ Reload from Disk picks up the raw data. - Canon CRW, Minolta MRW, Sigma X3F, Kodak KDC, Leaf MOS and Epson ERF files that LightCraft can't decode yet now import as "preview only" with their embedded JPEG instead of failing. A raw whose data is damaged but whose preview is intact does the same. - Raw files whose raw data sits in a private block of a TIFF (Phase One / Leaf IIQ, Canon EOS-1D / 1Ds and Kodak DCS TIFFs) are no longer opened as a thumbnail-sized ordinary image. They are recognised as raws LightCraft can't decode yet and import as "preview only", with the reason. - Sony ILCE-7M4 downsized lossless ARWs now decode subsampled YCbCr tiles into linear RGB, preserving RAW editing & full-resolution export instead of using embedded JPEG previews. - Sony A7R II (and other) raws whose camera JPEG is lens-corrected no longer open grey and too dark (issue #232): the starting look is fitted to the camera JPEG away from edges when the misaligned edges spoil the fit on all pixels. ### Lightroom Classic catalogs - File → Import Lightroom Catalog… opens `.lrcat` directly, with originals referenced in place. Ratings, flags, labels, keywords, collections/sets, virtual copies and supported edits migrate; existing LightCraft edits are preserved by default. Source settings/history are archived, unsupported fields are reported, and the original Lightroom database stays read-only. Rendering is approximate. ### Formats - HEIC / HEIF photos (iPhone and Mac) open now: the optional `lightcraft-heif` crate (heic-rs, pure Rust) behind codecs' `heif` feature — 8- and 10-bit, alpha, grid tiles, the container's rotation/mirror/crop, ICC, EXIF and XMP. Off by default (HEVC patents are the distributor's call, same as PhotoCraft); official builds pass `--features heif`. ### Presets and profiles - Import presets from other editors: XMP presets, classic `.lrtemplate` files, "DNG presets" from mobile apps and `.zip` bundles of any of these — whole folders at once, grouped by pack. Masks inside presets come along. - Luminar looks: `.lmp` files and `.mplumpack` collections import as presets (grouped by collection); the sliders with a counterpart here come along, the rest is listed. - 23 new built-in presets: Portrait, Landscape, Urban, Food, Seasons, Vintage and B&W toners. - Importing XMP presets no longer lists bookkeeping fields (`Cluster`, `SortName`, `SupportsAmount2`, the as-shot white, empty Point Color slots…) as settings that couldn't be carried over. - A preset whose lens-profile switch is off no longer turns off the lens corrections built into a DNG (iPhone ProRAW and other files with embedded distortion / vignetting corrections), matching what the preset does elsewhere. - A red / green / blue curve in an XMP preset without the master curve is ignored, as Lightroom ignores it. - Imported `.cube` LUT profiles appear in the Profile menu and the profile browser, grouped by their folder, and stay favourites across restarts (issue #328). ### Editing - The Tint slider works the right way round (issues #188, #321): left adds green, right adds magenta, as its track shows and as in Lightroom, and Tint values in Lightroom XMP sidecars now render as they do there. A custom Tint saved in an earlier version now shifts the other way; set it again (or re-run Auto / the white-balance picker). - White balance on DNGs (and other raws with a colour matrix) re-develops the photo for the new white through the camera's own colour matrices, as Lightroom does, instead of shifting the colours of the as-shot rendering: a grey lit by the chosen white comes out grey and saturated colours move as the camera records them. The eyedropper and Auto use the same model. Custom white balances on these photos render slightly differently than before. - Crop (issue #295): a Lock toggle keeps the aspect ratio on every handle, Custom takes your own ratio (Apply), and dragging a handle into the image edge stops there instead of pushing the crop out of shape. ### Library and views - Trackpads: pinch to zoom around the pointer and scroll with two fingers to pan the photo; panning keeps the photo inside the view. A plain mouse wheel over a zoomed photo pans it too. - A Folders section in the sidebar lists the folders your photos were imported from; choose one to see its photos. - Select All and multi-selection show every selected photo in the grid and filmstrip, not only the active one (issues #187, #298). Importing files that are in Recently Deleted asks whether to leave them there, restore them (with their edits) or import them as new; the trash view's Photo menu has Empty Recently Deleted. - The Import Photos review opens bigger and can be resized; its photo grid fills it (issue #337). Shift-click checks or unchecks a range of photos (issue #338). - When a folder holds several file types, the Import Photos review has a toggle per type (`ARW · 120`, `JPG · 120`): import only the raws and leave the JPEGs beside them (issue #344). ### Languages - The interface is available in Spanish (issue #371), German and Russian (Edit ▸ Language), alongside English, Chinese (Simplified and Traditional), Japanese and Brazilian Portuguese. ### Editing - Type an exact value into any slider (issue #322): click the number next to its name, type (`1.5`, `-20`, `5600`) and press Return; Esc keeps the old value. ### Editing - The eye on the Light, Color and Detail section headers now hides their adjustments, as it already did for Effects, Optics, Geometry and Calibration (issue #316). ### Library - Choosing a date under By Date or a keyword under Keywords shows those photos from All Photos, as their counts promise, instead of filtering whatever album or folder was open, which often showed nothing (issue #341). ) ) ### Reliability - If the desktop app can't open its window (for example when no graphics device can be used), it now says so in a message box that names the log file, instead of quitting without a trace (issue #260). - On macOS, single-key shortcuts that appear in the menu bar now work: E, C, H, M, ⇧P, I, K, D, ratings 0–5, labels 6–9, P / U and the rest did nothing, because macOS only passes ⌘ / ⌃ combinations and function keys to the menu bar and the app ignored those keys, assuming the menu bar would handle them. Keys outside the menus (Space, G, X, ⌫) and ⌘ shortcuts were not affected. - `--memory` sessions keep their promise to save nothing (issues #164, #169): UI changes made in one no longer land in `ui.json` (where they replaced the saved settings), and the GPU crash sentinel no longer creates the settings folder there. The same goes for the temporary session offered when the library can't be opened. - The desktop app keeps a log file: `logs/lightcraft.log` in its settings folder (Linux `~/.config/lightcraft/logs/`), with the logs of the two previous runs beside it, so warnings and crashes of a run started from a desktop menu or the Dock can be attached to a bug report. `LIGHTCRAFT_LOG` works as before; `RUST_LOG` takes env_logger-style directives. See README → Quick start → Logs. - Help → Open Log Folder shows that log file in the file manager (Finder, Explorer, or the folder on Linux), so it can be attached to a report without hunting for the settings folder (issue #260). - `lightcraft-cli` logs warnings on stderr too (issue #168); `LIGHTCRAFT_LOG` or `RUST_LOG` picks another level. - LightCraft no longer crashes at launch on Windows PCs whose Vulkan driver is broken (issue #136, e.g. some Intel UHD 630 drivers): on Windows the window and GPU rendering use DirectX 12 only and never load the Vulkan driver unless asked to. `LIGHTCRAFT_GPU_BACKEND=dx12 | vulkan | metal | off` (or wgpu's `WGPU_BACKEND`, which GPU rendering ignored before) chooses the graphics backend; `off` renders on the CPU. The GPU now starts after the window is up, and only when Settings ▸ Performance ▸ Use the GPU for rendering is on; if LightCraft ever dies while starting the GPU, the next launch starts with GPU rendering off and says how to turn it back on. - The Windows app no longer quits at launch with "Parent device is lost" when another program's `dxcompiler.dll` is on the DLL search path without its `dxil.dll` (issue #471): DirectX 12 shaders now always compile with the compiler built into Windows (FXC). `WGPU_DX12_COMPILER=dxc` uses a `dxcompiler.dll` instead. - Exports and renders never write over a photo's original (issue #93): exporting into the photo's own folder with the same name and "Overwrite" (or Export with Previous repeating it), an exact output path from the control channel or MCP, a merge preview path or `lightcraft-cli render IMG.jpg -o IMG.jpg` is refused with a clear message, and the original is left byte for byte. Ordinary earlier exports are still overwritten when asked. Exported files are written to a temp file and then renamed into place, so a full disk or an unplugged drive never leaves a truncated file; the XMP sidecar of an "Original" export follows the "If file exists" choice too. - Convert to DNG, Copy as DNG, Photo Merge and smart previews no longer write straight to the final file (issue #106): a DNG is checked against the raw data, written to a temp file, synced and read back before it gets its name (never replacing a file), and only then is the photo relinked or the raw copy removed — a failed write leaves no DNG and keeps the raw. Smart previews are written the same way; a damaged one (cut short by a crash or a full drive) no longer counts as built and Build Smart Previews replaces it. - Import ▸ Copy verifies every copy, like Move (issue #96): each file is written as a new file, synced to disk and checked against the content read from the card. A copy that fails or differs is removed and reported as a failed import — so "import complete" means the copies are good before you format the card — and a name that is taken gets -1, -2… instead of being replaced. - Faster exports and card imports, with the same protection for what can't be recreated (issue #134): exports, renders and screenshots are still written to a temp file and renamed into place, but no longer forced to disk one by one — they can always be exported again, and on a USB drive or a NAS that per-file sync dominated a large export. The catalog, XMP sidecars, settings, DNGs, merges, smart previews and the copies an import makes are still synced. Import ▸ Copy now checks each copy against the content hash taken while scanning the card instead of reading the card a third time (Move still compares byte for byte before it deletes a source); a file that changed on the card after Review Import is reported instead of being imported with stale details. Checking an export path against the library's originals no longer scans the whole library when nothing is at that path. - Saving metadata to an XMP sidecar another application wrote no longer replaces it (issue #92): LightCraft merges its fields in and keeps the rest — e.g. that application's develop settings and edit history — byte for byte. A sidecar that isn't valid XMP is copied to `.xmp.bak-