mirror of
https://github.com/storytold/lightcraft.git
synced 2026-11-01 05:57:09 -06:00
171 lines
16 KiB
Markdown
171 lines
16 KiB
Markdown
# What's new in LightCraft
|
||
|
||
## October 2026
|
||
|
||
### RAW decoding
|
||
- 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.
|
||
|
||
### 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.
|
||
|
||
### Reliability
|
||
- 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.
|
||
- 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.
|
||
|
||
### 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
|
||
- 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.
|