Files
lightcraft/docs/whats-new.md
T
2026-10-13 02:05:14 -04:00

61 KiB
Raw Blame History

What's new in LightCraft

2026-10-13

Slider drags on large raws

  • Dragging a slider no longer re-renders the edited photo's filmstrip thumbnail on every frame; it follows once you let go. On a 64 MP raw the first of those renders decoded the whole file again, which held up the loupe's previews for up to a second.
  • A thumbnail of the photo open in Detail is made from its already decoded preview instead of decoding the file again.

2026-10-12

Canon CR2 highlights

  • Blown highlights in CR2 files from the Canon EOS 50D, 60D, 450D (Rebel XSi), 500D (Rebel T1i), 550D (Rebel T2i), 1200D (Rebel T5) and 100D (Rebel SL1) now count as clipped (issue #1272). They used to stop at 81–98% of white, so highlight recovery missed them and, darkened, they took a colour cast instead of going neutral grey.

2026-10-12

Pentax raws without black borders

  • Raws from the Pentax KP, KF, K-3 Mark III (and Monochrome), K-70, K-1, K-1 Mark II, K-S1, K-S2 and 645Z no longer show a black (or, on the 645Z, white) band along one or more edges (issue #1271). The sensor's masked border is left out, so these photos come out a little smaller, closer to the camera's own JPEG. Crops and masks on photos edited earlier may shift by a few pixels.

2026-10-12

Camera-look deep shadows

  • The starting look fitted from a raw's camera JPEG now uses its darkest tones too (issue #1307). Photos with deep shadows no longer have to extend the first measured tone in a straight line to black. Existing smart previews are refreshed when their originals are online, and cached renders are redrawn.

Slider drags follow the pointer more closely

  • With a GPU, a slider drag's preview is drawn in the same frame as the slider moves instead of one frame later, when the preview renders in a few milliseconds (it waits at most 40 % of a frame for it; slower renders, such as on the CPU, are not waited for).

2026-10-12

Kelvin white balance for more Sony cameras

  • Sony ILCA-99M2, ILCA-77M2, SLT-A33, DSC-RX10, ILCE-3500 and ILCE-7S raws now show white balance in Kelvin too, read from the white-balance presets the camera stores in every ARW: a photo shot at 3400 K on the camera reads 3396 K, one on the Shade preset 7493 K. As for #730, only the numbers change: edits made on the old relative scale keep their look, and As Shot shows the real temperature once the file is opened.

2026-10-12

Bold text in other scripts

  • Arabic names and other Arabic text in headings, chosen tabs and other bold places are now drawn bold, as Latin text beside them is; they used to stay at regular weight.

2026-10-12

Older raw cameras

  • Canon PowerShot G9 raws open with the camera's white balance (White Balance ▸ As Shot); it used to start from a neutral default.

2026-10-12

Older raw cameras

  • Olympus E-10 raws open with the camera's white balance (White Balance ▸ As Shot) and without the grey haze in the shadows: the black level recorded in the file is now subtracted.

Told when there is no GPU

  • When GPU rendering is on but no graphics processor can be found, LightCraft now says so once at start-up instead of quietly rendering everything on the CPU, much more slowly. Help ▸ System Info says why. On NixOS this happens when a cargo build runs outside nix develop (no Vulkan loader); start it from there.

2026-10-12

Leaf and Hasselblad raws

  • The Hasselblad Lunar's raws (a Sony NEX-7 inside) now develop from their sensor data with every editing tool, instead of opening as their embedded preview. Photos imported earlier switch over with Photo ▸ Reload from Disk.
  • An uncompressed Leaf Aptus 22 MOS no longer opens as a dark, colourless picture of its sensor mosaic: it imports as a raw and shows its embedded preview (preview only, with the reason), as the compressed MOS files do.

2026-10-12

Zoomed 64 MP raws stay decoded

  • Panning a photo zoomed to 1:1, or moving a slider while zoomed, no longer decodes the whole raw again each time on high-resolution cameras such as the Sony A7R VI (64 MP). Their decoded original (~800 MB) is bigger than the default cache share (768 MB), so it was evicted as soon as it was stored. The original of the photo shown in Detail now stays, like its preview, until another photo or view is shown.
  • Zooming in with Before/After side by side decodes the original once: the Before side used to decode its own copy beside the After's, and a window asked for again while the first was still decoding (a pan, the layout settling) started yet another decode.
  • A zoomed view keeps the GPU copy of the original while it is on screen: pausing for a few seconds between pans no longer frees it, which cost a re-upload of about a second on the next pan (800 MB for a 64 MP raw). It is freed once you zoom out or move on.
  • The kept original no longer pushes everything else out of the cache: on a 64 MP raw it filled the cache share alone, so the photo's preview and thumbnail sources and its neighbours' were decoded from the raw again on every edit at 1:1, every zoom out and every step to the next photo.

2026-10-11

HDR and panorama merges of CR2 keep their colour

  • Photo Merge of Canon CR2 (and other raws whose colour LightCraft fits from the camera's own JPEG, such as NEF and ARW) gives the merged DNG the colour each photo has when opened alone (issue #965). An HDR merge of CR2s used to come out green and dark.

"Rendering…" on the photo

  • The loupe says "Rendering…" at the bottom of the photo when what it shows isn't the finished photo yet: the camera's embedded JPEG while a raw decodes, the previous render while an edit renders, or the magnified frame while the 1:1 detail is on its way. It appears once that has lasted half a second, so quick renders never show it.
  • If LightCraft can't open a photo (its original is on a drive that isn't connected, or the file is damaged) but has its embedded JPEG or a thumbnail to show, the loupe now says so at the bottom of the photo ("Original offline · no smart preview" or "This photo can't be opened", the reason on hover) instead of showing that preview as if it were the photo.

--import <folder> takes HEIC

  • lightcraft-cli run --import <folder> (and the MCP tools that take folders) now picks up HEIC, HEIF and Nikon NRW files, the same files as library.import (issue #1080). They used to be skipped without a word.
  • Compare and Reference View panes say "Rendering…" (or that the photo can't be opened) the same way, so a magnified preview isn't taken for the photo when checking focus at 1:1.

JPEG XL export

  • Export as JPEG XL (issue #247): Format ▸ JPEG XL in the Export dialog, format: "jxl" for agents and the CLI (render in.raw -o out.jxl). Quality as for JPEG, or Lossless; Effort (Fast / Normal) trades time for a smaller file; Progressive files show a coarse version first. 8- or 16-bit, sRGB, Display P3 or Rec. 2020 (lossless files also Adobe RGB and ProPhoto), metadata as for JPEG. With HDR output, photos edited in HDR are written as 16-bit Rec. 2020 PQ. Not in the web version yet.
  • Lossy JPEG XL files in Display P3 or Rec. 2020 now open in their real colours; saturated colours used to come in noticeably duller.

Open Library knows a Lightroom catalog

  • Choosing a Lightroom Classic catalog folder in File → Open Library… (or one of its Previews.lrdata / .lrcat-data folders, or the .lrcat) no longer makes an empty LightCraft library inside it (issue #891). The library open now stays, and LightCraft says "This is a Lightroom catalog, not a LightCraft library" and offers Import Lightroom Catalog… with that catalog, or Cancel. lightcraft-cli --library refuses those folders too.

Canon EOS R5 Mark II

  • Canon EOS R5 Mark II C-RAW files that opened as "preview only" (more than half of them, depending on the scene) now develop from their sensor data with every editing tool, like the camera's other raws. Photos imported earlier switch over with Photo ▸ Reload from Disk.

Switching libraries

  • File ▸ New Library… asks for a name, then where to put it, and opens the new library (issue #902).
  • File ▸ Open Recent Library lists the last 8 libraries; ones that are gone (moved, drive disconnected) are greyed out. Clear Recent Libraries empties the list.
  • The open library's name shows under My Photos at the top of the left panel and in the window title.
  • lightcraft-cli --library given a library's own file (catalog.snap) opens its folder instead of failing with "File exists".
  • Agents use app.newLibrary {path, name}, app.recentLibraries and app.clearRecentLibraries.

Edit in PhotoCraft

  • Right-click a photo ▸ Edit In ▸ Edit in PhotoCraft (or Photo ▸ Edit In, ⇧⌘E) renders a copy with your edits, stacks it with the original and opens it in PhotoCraft. LightCraft finds PhotoCraft where its installer put it (Windows, macOS, Linux packages, AppImage, Flatpak), and says so if it isn't installed, before making a copy.
  • The copy is a 16-bit PSD by default, which PhotoCraft saves straight back to with File ▸ Save; when you come back to LightCraft the copy shows what you saved.
  • Settings ▸ General ▸ External Editing: the format (PSD or TIFF), colour space and bit depth for PhotoCraft and for the other editor (Edit in Other Editor, now ⌥⌘E), and where PhotoCraft is if you use a portable copy.
  • Export can write PSD too (flat, 8- or 16-bit).

Faster GPU exports

  • Exports with noise reduction, Texture, Clarity, Dehaze or Highlights and Shadows can be much faster on the GPU, depending on the graphics card. On a Windows laptop with an AMD Radeon 780M, a full-size export of a 24 MP raw with those edits went from about 3.7 s to 1.9 s. Photos look the same as before.

Reliability

  • Upgrading from a Windows installer older than 0.6 (such as 0.5.0) keeps LightCraft in the folder it was installed in, instead of moving it back to Program Files (issue #399). If that folder has been deleted since, the upgrade installs to Program Files.
  • A photo that runs into a bug in LightCraft while it renders (in a raw decoder or the editing pipeline) now fails like a photo that can't be opened, with the reason, instead of rendering forever; its thumbnail stops waiting too. Each such bug used to take one of the render threads with it, so after a few of them no photo rendered until LightCraft was restarted. The bug is still written to the log (Help ▸ Open Log Folder) for a report.

Library sorting

  • Photos that tie on the sort key (equal ratings, one import batch, a burst shot within the same second) now sort by file name, then id, instead of import order. Recently Added keeps a batch in file name order, and Auto-Stack orders a burst by file name, so the first file is the cover.

Large preset collections

  • A library holding thousands of presets (a Lightroom collection imported whole: 11 000 presets, a 42 MB presets.json) stays responsive. Every command used to re-serialize the whole list to see whether it had changed (~0.6 s per slider tick); now the list is saved only after it changes, and a slider tick takes ~2 ms.
  • The Presets panel builds only the rows in view (and their thumbnails) instead of every preset on every frame; the preset pickers in Import and Settings ▸ Import scroll the same way.
  • Importing a large collection and opening its library no longer compare every preset with every other.

2026-10-10

Dialogs fit the window

  • A dialog taller than the window no longer runs off it (issue #781): on a 1366×768 screen the Export dialog's title and its Cancel / OK buttons were off screen, so it couldn't be confirmed. Now its options scroll and the title and buttons stay visible. Long lists in dialogs (What's New, All Metadata, Keyboard Shortcuts) get shorter to fit. Dialogs that fit look as before.

Previews match exports on Mac screens

  • On macOS, photos are shown through the profile of the screen the window is on while no monitor profile is chosen in Settings ▸ Display (issue #787). On P3 screens previews used to look more saturated than the exported files in Preview or Photos. Moving the window to another screen is followed; Use Screen Profile goes back to it after choosing a profile file.

Sidebar sections

  • Arrange the left sidebar your way: drag Albums, Local, By Date, Folders or Keywords by its header to move it (a line shows where it will go), or right-click a header for Move Up / Move Down.
  • Hide the sections you don't use: View ▸ Sidebar Sections, or right-click a header ▸ Hide This Section. Right-click the My Photos title to bring one back, or choose Reset Sidebar Sections. The arrangement is remembered.
  • In a long section, the header stays at the top of the sidebar while you scroll through its rows, so you always see which section you are in and can fold it from there.
  • Sections are easier to tell apart: a hairline between them, the fold chevron in the same column as the rows' triangles, a highlight under the pointer. A folded section shows how many rows it holds, counts of 0 are fainter, and a section with nothing in it says so instead of disappearing.
  • Recently Deleted is listed with All Photos, Recently Added and Picks under My Photos.
  • Keywords has a + in its header, like Albums: Create Keyword Tag without opening the Keyword List.
  • Agents: view.sidebarSection, view.sidebarMoveSection, view.sidebarReset; ui.set takes sidebar.

Kelvin white balance for raws whose camera has colour matrices

  • Raws from the 52 camera models whose colour matrices LightCraft has measured (Sony ILCE-7M3, ILCE-7M4, ILCE-7RM3, Nikon D850, Canon EOS 5D Mark III and others) now show white balance in Kelvin, as a DNG does and as Lightroom does: As Shot reads the file's white (an ILCE-7M3 sample: 4268 K / +7), the Temp slider runs 2000–50000 K and the Daylight, Cloudy, Shade, Tungsten, Fluorescent and Flash presets set real temperatures (issue #730). The matrices only convert between the camera's multipliers and Kelvin; the colour look is what it was.
  • Nothing already edited changes: a Custom white balance set on the old relative scale renders pixel for pixel as before, and becomes the Kelvin value with the same look the next time it is edited. A photo imported earlier shows its real As Shot temperature once the file is opened (or Reload reads it).
  • Lightroom's crs:Temperature for these raws is read as the Kelvin it is (sidecars, Lightroom catalogs, presets); raws of other cameras keep the as-shot shift of issue #510. The two Kelvin scales come from different matrices and differ by about 7–10 % on the ILCE-7M3; which one is off is still open.

Fujifilm lens corrections

  • Fujifilm RAFs from 59 camera models now get the lens correction the camera stores in the file: distortion (with the camera's own zoom to fill the frame) and vignetting, as with Panasonic and Sony files. The Optics profile controls adjust or switch them off, and DNG export keeps them. Lateral chromatic aberration data is not applied: our demosaic already lines the colour planes up. Details and measurements: docs/fuji-lens-corrections.md.

Appearance

  • Settings ▸ Interface ▸ Appearance Mode: Sync with System, Dark Mode or Light Mode, above a light and a dark theme card, each previewing its theme (dark: Charcoal, the look so far, or Midnight; light: Silver or Paper). New and existing installs stay dark; following the system is opt-in.
  • The top bar's appearance button cycles Auto, Light, Dark (a monitor, sun or moon), and View ▸ Appearance lists the modes and themes. On Linux, Auto follows the desktop portal's colour scheme as it changes, without polling.

Add to Apple Photos (macOS)

  • The Export dialog has Add to Apple Photos, with an optional album. The files are exported to your folder as usual and then added to Photos, into a top-level album of that name (made when it's missing). The toast says how many Photos added, or why it added none. Export with Previous and export presets repeat it.
  • The first time, macOS asks whether LightCraft may control Photos. Photos may ask about duplicates; files it skips show as a partial import.
  • Agents: app.export {addToPhotos, photosAlbum}, export.addToPhotos {paths} for files already on disk, and export.photosImports. See Add to Apple Photos.

Activity stack

  • Long-running tasks show in one place, top left under the top bar, as in Lightroom Classic (issue #345): imports and folder scans, exports (and the contact sheet PDF), Synchronize Folder, Build / Smart Previews, Lightroom catalog import, Photo Merge, model downloads, the face scan, AI Denoise and Find Missing Photos. Each row has the task's name, a progress bar, the count and what it is working on; ✕ stops the tasks that can stop. Three rows show, then "+N more". The separate export panel and the progress windows and toasts are gone.
  • Quitting while a task that can be stopped is running asks first ("Quit Anyway" stops it).
  • Agents list and stop tasks with activity.list and activity.cancel; ui.inspect reports them as activity.

Importing a deleted photo again

  • Importing a file whose photo is in Recently Deleted brings the photo back, with its edits, rating and albums (issue #706; before, the import skipped it as "already in the library" while the grid showed it deleted). The import review checks such files, marks them "Will be restored" and counts them as "in Recently Deleted"; the choice next to that (Restore them / Import as new / Leave them) now starts on Restore. Files dropped on the window restore the photo too and say "Restored 1 photo from Recently Deleted". A deleted photo whose file was moved is relinked to the file it is imported from. Browsing a folder in Local, Auto Import and a Lightroom catalog import never restore anything. Agents: library.import → onDeleted defaults to restore (skip keeps the old behaviour, fresh imports a clean copy and deletes the old record).

Formats

  • File extensions match whatever their letter case: IMG_0001.JPG and DSC_0002.NEF as Nikon writes them, .Jpg after a rename, an .XMP sidecar. Adding photos or a folder, Browse Folder (Local), drag-and-drop, the CLI and the sidecar lookup always did; the Add Photos dialog on Linux did not until 0.5.0 (GTK and the desktop portal match *.jpg case-sensitively, so .JPG and .NEF files were hidden — issues #342 and #705).

Reliability

  • Closing a library releases its lock explicitly (issue #680). On Linux and macOS the lock used to go with the file handle, and a program being started by another thread at that moment held a copy of the handle until it was fully launched, so reopening the library straight away could be refused with "This library is already open in another LightCraft program" although nothing had it open. Nothing in the shipped app is known to hit the window today; it made a lock test flaky, and the fix closes the window for good.

2026-10-09

HDR PNG export

  • With HDR output on, a photo edited in HDR can now be exported as a 16-bit PNG with the PQ curve in Rec. 2020, like the HDR AVIF: the same brightness, with SDR white at 203 cd/m², and content light levels recorded.
  • The colour is described by the PNG cICP chunk, not an ICC profile. HDR-aware viewers (current Chromium-based browsers, for example) show it in HDR; viewers that don't read cICP show the PQ values as if they were sRGB, so the picture looks flat and washed out there. That's how PQ PNG works, not a broken file: for a picture that looks right everywhere, export a JPEG with HDR output on (an SDR image plus a gain map).

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: no rating 0–5 is 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 picker shows your albums as in the sidebar (folders open on click) or finds them as you type part of a name or folder (↑ / ↓ and Enter to pick); albums that can't be picked, such as one that would make an album include itself, are greyed with the reason. 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.
  • 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 is "is" or "isn't" an album, picked with the album picker.
  • 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.

Keyword lists

  • File ▸ Import Keywords… and Export Keywords… read and write keyword list files as Lightroom Classic does (a keyword a line, a tab per level, synonyms in braces, keywords left out of export in brackets). Capture One, darktable, Adobe Bridge and Photo Supreme (its Formatted Vocabulary File) use the same files, so keyword lists move between them and LightCraft. Importing adds the keywords you don't have, in one undo step; a file it can't read says which line, or to save it as UTF-8. Exporting warns about keywords Capture One won't import, and names any keyword the format can't hold (such as a name in brackets), which it leaves out so the file always reads back.

Keyword sets

  • Keyword Set ▸ Edit Set… edits a set's nine keywords in place, one field per ⌥ key, and renames it (or saves the edits as a new set). An empty field leaves its key empty instead of moving the keywords after it; editing Recent Keywords and naming them saves a new set.

Keywording box

  • The chips at the top of the Keywords panel are the keywords of every selected photo, not only the active one's; a keyword only some of them have is marked with an asterisk (hover: how many). Only the × removes a keyword, from every selected photo; a chip's menu acts on the selection (add to all, remove, show photos, edit) and no longer deletes a keyword from the whole library.
  • Switch to & Containing to see the keywords with the keywords containing them, or to Will Export to see what exported files will carry for the selection.
  • The keyword set's buttons and the suggestions follow the selection too; the typing boxes get the Cut / Copy / Paste menu, and Return in the painter's box starts painting.

Keyword List

  • The Keywords panel ends with a Keyword List, as in Lightroom Classic: every keyword with its photo count, those no photo has yet too. Filter it, tick a keyword to give it to the selected photos (a dash: only some have it), or click the arrow to see its photos.
  • Create keywords with + (inside the one you picked, with synonyms, and given to the selection if you like), edit one by double-clicking it, delete one with − after a confirmation. Right-click for more: create inside, Put New Keywords Inside This Keyword, Purge Unused Keywords.
  • Drag a keyword onto another to nest it, or onto the list's title to bring it back to the top level; photos dragged from the grid onto a keyword get it.
  • Right-click ▸ Put New Keywords Inside This Keyword: new keywords, made with + or typed in the box above, go inside it. The list is there with no photo selected too, to set up keywords first.
  • Keyword tag options decide what exported files carry: Include on Export, Export Containing Keywords, Export Synonyms. Exports now write keyword names to dc:subject and their paths to lr:hierarchicalSubject, and keywords imported from files (or read from sidecars) keep the hierarchy lr:hierarchicalSubject gives them.

Text fields

  • Right-click Search Photos, a slider's typed value, the Info panel's fields, the name field of New Album, Rename Album, New Smart Album, Rename Keyword, Merge Keywords and similar dialogs, or the name field under unnamed faces for Cut, Copy, Paste and Select All. Esc in them gives back the text from before you started typing (in the Info panel it no longer saves it). Return in those dialogs now confirms them, and their name opens selected. More fields will follow.
  • On Windows and Linux, Ctrl+C outside a text field copies edit settings and Ctrl+V pastes them (⇧Ctrl+V: Paste Selected Settings). Ctrl+V only reaches LightCraft while the system clipboard holds text; otherwise use Edit ▸ Paste Edit Settings.

Dialogs

  • System Info, All Metadata and What's New end with one Close button, like About, instead of Cancel and OK (issue #782).

Synchronize Folder

  • Right-click a folder (or a disk other than the startup disk) in the sidebar's Folders section ▸ Synchronize Folder…. The folder and the folders inside it are scanned in the background for photos added on disk, photos whose file is gone, photos whose file was renamed or moved within the folder, and XMP sidecars changed by other apps; then choose what to do: import the new photos and relink the moved ones (the defaults), move the missing ones to Recently Deleted, read the metadata updates. A folder on a disk that isn't connected is reported as such. Synchronizing runs in the background with a row in the activity stack (✕ stops it); everything it does is one undo step, and no file on disk is touched. Agents use folder.scanChanges and folder.synchronize.

Folder colour labels

  • Right-click a folder (or a disk other than the startup disk) in the sidebar's Folders section ▸ Set Color Label ▸ a colour or None. The row shows the label's dot before its photo count. Agents use folder.label (path, label); library.folders reports each row's label.
  • A label follows its folder when it is renamed or moved in LightCraft, together with the labels of the folders inside it; undo and redo carry them back and forth.
  • The catalog format is now version 4 (Catalog.folder_records, Op::SetFolderRecord). Once this version has opened a library, older versions refuse it, as with every format change.

Monitor profiles

  • Settings ▸ Display ▸ Choose Profile… shows photos through your monitor's ICC profile (matrix/TRC or LUT-based), so colours are right on wide-gamut and calibrated displays instead of oversaturated. The Detail view renders straight into the display's own gamut; thumbnails and other previews are converted to it. Histograms, the preview caches and exports don't change. Agents use app.displayProfile. See display profiles.

Highlights and Shadows (process 2)

  • Highlights and Shadows keep the fine detail of the tones they move (issue #632): pulling Highlights down on a bright sky no longer flattens the twigs, lines and texture in it, and lifting Shadows keeps the texture of dark areas, much as Exposure would; the edges between bright and dark regions stay as sharp as before. This is rendering process 2: new photos (and Reset) get it, photos you already edited keep their look until you choose Photo ▸ Update to Current Process. See process versions.

Masking

  • Drag anywhere inside the selected radial gradient's ellipse to move it, including rotated ellipses and radial components in compound masks. Edge and rotation handles keep their existing functions, and one Undo restores the entire drag.

Crop rotation

  • Outside the crop box, where dragging rotates the photo, the pointer is a curved double arrow, and the angle is shown next to it while you rotate (issue #534). For an exact angle, type it in the new Angle field under Straighten and press Return (Esc keeps the old angle; a decimal comma works too), or click the Straighten value; hovering any slider's value now says it can be typed.

2026-10-08

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.

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.

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.
  • Return presses OK in Choose Edit Settings to Copy (⇧⌘C) and Paste Selected Settings (⇧⌘V), and Esc cancels them (issue #735).

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.
  • HEIC colours now match libheif to within one code value (they were up to ~10 off): the HEVC stream's own full-range/matrix signalling is honoured (iPhone photos are full range), chroma is upsampled like libheif, grids take their tiles' ICC profile, and imir mirrors the way libheif writes it. Importing a HEIC reads its size from the container instead of decoding it; small previews use the file's embedded thumbnail. The release packages (macOS, Windows, Linux, FreeBSD, Nix) now really are built with HEIC support; a build without it reports "HEIC/HEIF support isn't included in this build" for each .heic/.heif at import.

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). ) )

2026-10-07

RAW decoding

  • Olympus ORF raws get the starting look fitted to the camera's own JPEG too, instead of opening flat and grey (the E-1, E-400 and XZ-2 corpus files: all accepted), with white balance relative to the as-shot look as for the other formats. On an E-1 photo the starting render moved from ΔE00 11.3 to 8.3 against Lightroom's. Photos already imported pick it up when re-rendered.
  • Samsung SRW files without compression now open as raws: NX5, NX10, NX11, NX20, NX200, NX210, NX1000, NX1100, EX1 and WB2000. The compressed ones (NX1, NX30, NX300, NX500, NX2000, NX3000, NX3300, NX mini) still open from their camera JPEG. Photos already imported pick the change up on Reload.
  • Raws from 52 camera models (22 Canon, 11 Nikon, 11 Sony, 3 Fujifilm and 5 others, plus their other names) whose camera JPEG can't be fitted no longer open with the neutral fallback: they start from colour matrices fitted to the camera's measured spectral sensitivities, from the Academy Software Foundation's rawtoaces-data. A camera profile and the fit to the photo's own JPEG still come first, so photos that had a fitted look keep it. See camera preview colour.
  • Canon CR2 raws no longer open too dark with blocked-up shadows: the black level was measured over border columns that light already reaches (left of the image area Canon records), 4 % of the range too high on the EOS 6D. It is now measured on the masked columns alone (8 corpus bodies, EOS 40D to 5DS R). On a 6D photo the starting render moved from ΔE00 7.6 to 5.2 against Lightroom's.
  • 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, keeping the raw values above 1.0 instead of clipping them (checked on one real file). A tile that cannot be decoded makes the file open from its embedded preview, with the reason, instead of showing a black tile. 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 by default: Lightroom Classic renders ProRAW without it. To see a ProRAW the way the iPhone renders it, turn on Profile ▸ Camera local tone mapping (shown for photos that carry the map); the option is per photo, so presets and Copy Settings carry 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.

2026-10-05

Reliability

  • The Windows installer asks where to install LightCraft (Program Files by default; upgrades keep the folder you chose) and ends on a page saying it was installed, with a "Launch LightCraft" box. It used to finish without a word, so a successful install looked like nothing had happened (issues #18, #399). Silent installs (/qn, /passive) show no dialogs and take INSTALLFOLDER=....
  • 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 Linux and FreeBSD, file dialogs (Import Photos…, Open Library, Export, presets, keyword lists…) are children of the LightCraft window. The xdg-desktop-portal picker used to open as a separate top-level window on Wayland ("Failed to associate portal window with parent window" in the portal's log): tiling compositors put it beside the app, and with LightCraft fullscreen it was hidden altogether, so Import Photos… looked like a hang until the dialog was found and closed.
  • 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 <name>.xmp.bak-<time> first. With the default stem naming, a raw and a JPEG with the same name (IMG_0001.CR3 + IMG_0001.JPG) no longer share one sidecar: the raw keeps IMG_0001.xmp, the JPEG uses IMG_0001.JPG.xmp.
  • A save that fails part-way (a full disk, a network share that drops) no longer looks like a damaged catalog afterwards (issue #101): the partial write is cut off before LightCraft retries, so the next launch replays every change. Catalogs already holding such a fragment load in full. Quitting while the catalog log can't be written still saves your queued changes in the closing snapshot.
  • The catalog has a format version (issue #102). Opening a library from an older LightCraft upgrades it; a library written by a newer LightCraft is refused with "this library was written by a newer version of LightCraft" and left untouched — older versions no longer read part of it as a damaged log. Once this version has opened a library, LightCraft 0.2.0 and older refuse it ("unsupported format … v2").
  • The control port (--control) closes a connection as soon as it receives anything that isn't a JSON request (issue #94): an HTTP request from a web page can no longer carry a command in its body. Lines are capped at 4 MiB and connections at 16.
  • A sleeping NAS, a dropped network share or a USB drive spinning up no longer freezes the window (issue #104): whether originals are there is checked on a worker thread (grid thumbnails, the Info panel, the photo menu, Missing Photos); importing (also by drag and drop), Find Missing Photos, Build / Discard Smart Previews, the Rename preview, the Local folder tree and Auto Import read the disk on worker threads too. The import progress window has Cancel.
  • Browser version (experimental), keeping a library safe (issue #107): File ▸ Back Up Library… downloads the catalog and every imported photo as one zip, and File ▸ Restore Library from Backup… brings it back (the current library is kept). A failed save (storage full) now shows the unsaved warning and is retried, a photo that can't be stored isn't added, a second tab shows a message instead of overwriting the first, ?reset asks first, and the page says when the browser may evict the library. Hosting: the sample cache headers no longer mark the (unhashed) files immutable, and HOSTING.md describes the actual build.
  • Canon CR2 photos from the EOS 7D, 50D, 60D, 550D, 600D, 1200D, 1300D, 5D Mark II and 1D Mark IV (and other models whose sensor starts on a green-blue row) no longer come out magenta (issue #85): the colour-filter layout is read from each file instead of assumed.
  • Exports are never black because of the GPU (issue #78): a GPU render that runs out of device memory, exceeds the GPU's buffer limits, hits a driver error or reset, or comes back incomplete is redone on the CPU — the file is the same image either way. Work is sent to the GPU in short pieces so slow integrated GPUs aren't reset by their watchdog. ui.inspect → perf (gpuReason, gpuFallback), Help ▸ System Info and Settings ▸ Performance say why the GPU isn't used (e.g. a skipped software adapter such as llvmpipe) and why the last render fell back.
  • The thumbnail cache only ever counts and deletes its own files (issue #98): a library opened on a folder that already has a thumbs/ folder of other pictures no longer loses them when the cache is trimmed or cleared.
  • Settings files are never quietly reset (issue #103): a damaged prefs.json, presets.json or view.json is kept as <name>.corrupt-<time> and you're told; one that can't be read (e.g. locked by another program) is left alone for the session instead of being overwritten with defaults. The app settings (ui.json, which remembers your library) are written atomically and saved as soon as you open another library, not only at quit. Quitting while changes couldn't be saved tries once more, then asks: Try Saving Again, Quit Anyway or Cancel.

2026-10-02

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.
  • XMP presets apply their red / green / blue curves only when they also have the master curve and all three channel curves, as Lightroom does: a preset with just one channel curve (or no master curve) leaves the channels alone.
  • Imported .cube LUT profiles appear in the Profile menu and the profile browser, grouped by their folder, and stay favourites across restarts (issue #328).

Library

  • Photos in Recently Deleted can be restored from the app: right-click ▸ Restore (or Delete Permanently), also in the Photo menu. The filmstrip has the photo context menu too. Adding a file again that is in Recently Deleted no longer just says "duplicate skipped": it opens the side panel on Recently Deleted with the photo selected and says how to restore it or delete it permanently and import it afresh. (For a fresh start on a photo, Reset Edits, Cmd+Shift+R, keeps the photo and clears its edits.)
  • Canon CR3 files show their full-size embedded JPEG (e.g. 6960 × 4640 on an EOS R6 Mark III) instead of the 1620 × 1080 preview, and import with their metadata: capture time, camera, lens, exposure, GPS and XMP. Their raw data is not decoded yet, so they stay preview-only. For CR3s imported earlier, Photo ▸ Reload from Disk (now in the Photo menu and the photo context menu) picks up the full-size preview and fills in the camera metadata they were missing, without touching anything already set.
  • Rename Photos never overwrites another photo when only the letter case changes (issue #95): on case-sensitive volumes (Linux, case-sensitive APFS) img_1.JPG next to IMG_1.JPG is a different photo and the renamed one gets img_1-1.JPG; on case-insensitive volumes the case change still goes through.
  • Rename Photos reports files it could not move back after a failure (issue #105), e.g. when a network share drops mid-batch: the error lists them (old → new) and the library points at their new names (an undoable partial rename), so none shows as missing. Renaming one of a raw + JPEG pair copies their shared IMG_0001.xmp instead of taking it away from the other (issue #92). Find Missing Photos also finds renamed files by their content, prefers a content match over a same-name same-size look-alike, and skips (and reports) photos it can't tell apart instead of guessing.
  • Rename Folder… and Move Folder To… (Local) can be undone and redone (issue #97): the folder moves back on disk with its photos and XMP sidecars, and the photos point at it again. If something now occupies the old place, the undo is refused and nothing is overwritten.
  • Smart albums with a rule editor: match all / any / none, nested groups, 26 fields.
  • Quick Collection and target album (B in the grid), keyword sets (⌥1–⌥9), colour-label sets.
  • Colour-label filter with several labels at once; expandable folder tree in Local.
  • Import: copy to any folder, by day / by month / one folder, rename on import, metadata preset, Copy as DNG.
  • Import ▸ Move: photos go into the destination (with the same folders and renaming as Copy, e.g. Photos/2026/20260114/20260114_001.jpg) together with their XMP sidecars; each original leaves the card only after its copy is verified and in the library. Duplicates and files that fail stay where they were.
  • Watched-folder auto import; Convert to DNG; Duplicate; Build Standard / 1:1 / Smart Previews.
  • Export file names use the Rename Photos tokens ({title}, {seq:2}, {date:%Y-%m-%d}…), plus new {num}, {folder}, {lens}, {iso}, {rating}, {creator}.
  • Copyright status, rights usage terms and copyright info URL in Info, metadata presets and exports.
  • Auto-Tag from Tracklog: GPS locations for your photos from a GPX track log, matched by capture time.
  • A change that can't be saved to disk (full or unplugged drive) is no longer silent: the command reports "saved in memory but not written to disk", the top bar shows a warning, and LightCraft keeps retrying until the save goes through.
  • Smaller, faster catalogs: photos you only looked at in Local (never added, rated or edited) are forgotten once their folder has not been browsed for 30 days — your files and sidecars stay, and browsing the folder shows them again. Change the period (or turn it off) in Settings → Performance.
  • A library is open in one program at a time (issue #99): opening a library that LightCraft or lightcraft-cli already has open — on this computer or another one sharing the folder — says who has it ("already open in LightCraft (process 123 on studio-mac)") instead of letting both write and silently drop each other's edits. A crash never leaves the library locked: the lock is the operating system's and goes away with the program.
  • If your library can't be opened at launch (open in another program, unreadable, on a drive that isn't connected, written by a newer LightCraft), LightCraft says so and why, and offers Try Again, Choose Another Library…, Continue Without Saving and Quit (issue #100). It no longer quietly starts a demo session that looked like a reset library and lost everything at quit; a temporary session shows a banner the whole time and never writes to your library.

Editing

  • Optional remote SAM 3: keep the native editor local and run Object, Describe, and detail inference on a Mac through SSH. Saved masks still render and export offline. See remote Metal inference.
  • AI masks with SAM 3 (Object and Describe in the Masking panel): click an object to select it (⌥-click leaves a part out), or type what to select ("sky", "the red car", "car, road"); both combine with other masks, have an Edge setting, and get a sharper zoomed-in pass in the background. The model runs inside LightCraft in pure Rust and never freezes the window. It is optional and not part of LightCraft (Meta's SAM License, about 3.4 GB): the first time you use an AI mask, LightCraft asks before downloading it, shows the progress, can cancel and resume, and checks the file before using it. Masks keep their selection, so they render and export without the model.
  • Auto Sync: edits apply to every selected photo. Auto B&W mix. Automatic versions.
  • Colour-range masks: click the photo to sample. Luminance ranges: range bar, smoothness, luminance map.
  • ⌘-drag to straighten, ⇧G Guided Upright, a grid while transforming.
  • Nikon NEFs start from a colour and tone look fitted to the camera's own JPEG, as Sony ARWs do, instead of a muted, greenish neutral rendering (issue #150); white balance is adjusted relative to the as-shot look. 12-bit NEFs (e.g. D750, D780, D850, D7500, Z 50) no longer render nearly black or with crushed shadows: their black level was read in the wrong units.

Viewing and sharing

  • Slideshow, second window, All Metadata, System Info.
  • Edit in External Editor (⇧⌘E): a 16-bit TIFF copy, stacked, refreshed when you come back.
  • Lossy DNG files and Smart Previews open as raw photos.
  • Compressed Nikon NEFs (lossless and lossy compressed, 12- and 14-bit — e.g. D3200, D5100, D7000, D750, D850, Z 50) now develop from the raw data instead of the camera's embedded JPEG, so a B&W or other picture style set in the camera no longer gets baked in. Photos already imported as "preview only" switch over on Reload. (Files that Nikon splits into two differently compressed halves still use the preview for now.)
  • Panasonic and Leica raws (RW2, RWL and the older RAW files, DMC-LX1 to DC-S1R II) develop from the raw data in every format the cameras write. Most bodies opened as preview only before: GH1–GH5, the G, GX, GF, GM, FZ, LX and TZ/ZS series, Leica D-Lux, V-Lux and C-Lux, and the GH6, GH7, G9 II, S5 II and S9 generation. They start from a colour and tone look fitted to the camera's own JPEG, as Nikon and Sony raws do, framed in the aspect ratio set in the camera; mapped-out sensor defects are filled in. .rwl and .raw files are imported too. Photos already imported as "preview only" switch over on Reload.
  • Sony ARWs from before about 2017 (RX100, RX100 II–V, RX10, NEX, SLT, ILCE-6000, A7 / A7 II / A7R II and their siblings) no longer open bright green (issue #148): their as-shot white balance and black level are read from the file (Sony stores them only in scrambled maker-note data on these bodies), the few columns of padding at the right edge are cropped away, and "12-bit uncompressed" files are no longer clipped. The RX100 series renders much closer to the camera's own JPEG.