Repository navigation
Releases
Releases · storytold/lightcraft
LightCraft v0.21.1
What's Changed
- security(raw): shared header-scan budget for tagged previews, tile-sized lossy JPEG budget, bound deflate tile padding by @dylanmtaylor in #3695
- security: O(width) box-blur priming, case-insensitive download names, stats walk skips directory links by @dylanmtaylor in #3729
- security(engine): read user-named files through the opened regular file under a byte cap by @dylanmtaylor in #3703
- Release: LightCraft v0.21.0 on main by @FredApps in #4153
- security: mask.exportEffects refuses originals and sidecars, writes atomically by @dylanmtaylor in #4125
- CI: nightly release dry run by @FredApps in #4154
- Use craft-tiff from craft-libs for TIFF/IFD by @dylanmtaylor in #4088
- Fix Flatpak updates and bump to 0.21.1 by @dylanmtaylor in #4151
Full Changelog: v0.21.0...v0.21.1
LightCraft v0.21.0
What's Changed
- LRC-LIB-CATALOG-IMPORT: import Lightroom catalog backup zips directly (#2592) by @francoisgn in #2599
- LR-VIEW-SURVEY: the survey fits its tiles to the photos' shapes, and tiles glide to their new places by @Yeetjof in #3632
- CI: release workflow grants write permissions to the release job only by @FredApps in #4048
- security(engine): one unpack budget across a preset zip's packs; linear comment skipping; small zip errors by @dylanmtaylor in #3675
- security(xtask): web --serve serves only plain files inside the site; linear asset globs; exclusive lock owner file by @dylanmtaylor in #3682
- security(raw): CR3 timed maker notes are parsed once per distinct range under a shared budget; Sony quad tiles' frames may not exceed the tile by @dylanmtaylor in #3700
- security: check caller-supplied image dimensions before sizing from them (codecs, merge, inpaint, slideshow) by @dylanmtaylor in #3712
- security(segment): Object selections take at most 64 clicks at the engine API and the model by @dylanmtaylor in #3717
- LR-EDIT-LIGHT-SHADOWS: fix Highlights/Shadows block artefacts in fine detail; 4× faster GPU median by @jeremyh in #3462
- LR-EDIT-LENSBLUR: camera-like Lens Blur with AI subject focus and per-mask bokeh by @czarist in #2661
- security(heif): count alpha-grid tiles and bound hvcC parameter sets before heic-rs by @dylanmtaylor in #3645
- security(meta): linear entity decoding, indexed keyword de-duplication, bounded XMP path building by @dylanmtaylor in #3672
- ci: run Harden-Runner on every job by @dylanmtaylor in #4129
- Updates: take craft-update from craft-libs main at 6e03f65bf by @dylanmtaylor in #4131
New Contributors
Full Changelog: v0.20.0...v0.21.0
LightCraft v0.20.0
What's Changed
- Honor inverted Lightroom masks when importing catalog edits by @eliets2 in #3862
- LR-IMP-FORMATS: withdraw compressed ORF decoding pending provenance review by @FredApps in #3916
- Cover DxO demosaiced Fujifilm DNGs for Kelvin white balance by @eliets2 in #3887
- Release: refresh contributor credits for each release (#2254) by @Luis-0508 in #3898
- Issue #3776: one selected photo shows "1 selected" in the header by @ZIDAN44 in #3833
- Updates: the updater reports installing, ready, installed and failed, and installs at exit by @dotCooCoo in #3995
- Updates: take craft-update from craft-libs main at 1b34eba41 by @dotCooCoo in #3996
- LR-EDIT-EFFECTS-GRAIN: film grain from crystal layers (process V4), resolution independent, no GPU cost by @jeremyh in #3630
New Contributors
- @Luis-0508 made their first contribution in #3898
- @ZIDAN44 made their first contribution in #3833
- @jeremyh made their first contribution in #3630
Full Changelog: v0.19.0...v0.20.0
LightCraft v0.19.0
What's Changed
- Use crw craftlib by @rwoldberg in #3503
- security(web): ?bench runs on demo photos in an unsaved library, never the stored one by @dylanmtaylor in #3646
- #3601: the Square Grid's badge band sits on the photo itself by @rahul05ranjan in #3604
- lightcraft-cli: calibrate walks folders with the engine's bounded walk by @dylanmtaylor in #3643
- security(engine): Find Missing Photos hashes only regular files, no further than their size by @dylanmtaylor in #3704
- security(engine, faces): index repeated membership scans in photo move, keywords, import planning, sync and rename by @dylanmtaylor in #3709
- security(geocode): bound dataset reads, per-line fields, and the inflate error text by @dylanmtaylor in #3718
- security(logging): a log message cannot begin a record of its own by @dylanmtaylor in #3720
- security(tests): test fixture directories are created exclusively, never reused from a predictable name by @dylanmtaylor in #3721
- security(raw): linear sparse planning, distinct-byte allocation bound, opcode list budget, ORF strip length by @dylanmtaylor in #3679
- security(engine): sidecar copies, backups and version checks read regular files only by @dylanmtaylor in #3677
- catalog: bound keyword list path expansion and index synonym merges by @dylanmtaylor in #3641
- security(web): restore plans its writes first; cap render workers by @dylanmtaylor in #3669
- security(engine): embed only fonts inside the asset checkout; no line breaks in cargo instructions by @dylanmtaylor in #3670
- security: staging and probe files are created new, never written through an existing entry by @dylanmtaylor in #3673
- security(engine): the library folder is protected from folder.move however its path is spelled by @dylanmtaylor in #3676
- security(raster, segment): resample tall narrow images columns first by @dylanmtaylor in #3678
- Issue #2249: a teleconverter combination never inherits the bare lens's profile by @eliets2 in #3660
- #2361: lens corrections crop inside the corrected photo by @emmertex in #3012
- LR-EDIT-OPTICS-PROFILE: Sigma 10-18 mm exception on the ILCE-6700 by @Enthendor in #2733
- security(lensdb): bound the names calibrations copy, read database files through the opened regular file by @dylanmtaylor in #3697
- LR-MASK-GEOMETRY: masks stay on the photo under lens corrections, Upright, Transform and Rotate by @OneSlips in #3550
- LR-EDIT-OPTICS-PROFILE: enable Sony ILCE-7M3 embedded distortion correction (rebase of #1384) by @janickm in #3144
- LR-EDIT-OPTICS-PROFILE: preserve unknown crop factors in lens profiles by @r3d42-git in #2676
- LR-EDIT-OPTICS-PROFILE: the lens database is offered on first launch and downloads on request, the library is looked up, Optics names the profile by @OneSlips in #3073
- LR-EDIT-OPTICS-PROFILE: the log says where the lens database was read from and what it holds, and warns when it has no lenses by @FredApps in #3738
- Pass the Linux signing key to the release workflow by @dylanmtaylor in #3759
- LR-EXP-WATERMARK: decomposed Korean and Vietnamese export text draws whole (#3480) by @chordpli in #3489
- LR-VIEW-HISTOGRAM: the histogram and HDR settings flow between SDR and HDR by @JordyUSA in #1460
- About: credits tables fit without side-scrolling and their columns resize by @FredApps in #3726
- LR-EXP-LOCATION: an export subfolder never leaves the destination folder (#2571) by @insideTheFlux in #2600
- LRC-LIB-VISUALSEARCH: Find Similar Photos reads the photos off the UI thread by @insideTheFlux in #3496
- Logging: each render request and how it ended, at debug level (#2682) by @insideTheFlux in #2772
- GPU-FULL: more of the render on the GPU, loupe drafts from GPU textures by @OneSlips in #1065
- LR-META-LOCATION: place names always download into the settings folder (#2575) by @insideTheFlux in #2659
- LR-EDIT-DETAIL-SHARPEN: Radius and Detail work, and sharpening acts at pixel scale (#757) by @radialmonster in #762
- PERF-STEP-STALL: stepping and flagging never wait for the drive, and no change is ever dropped by @OneSlips in #3557
- Convert Negative 1/4: lightcraft-film, the negative conversion maths by @smyrgeorge in #2490
- LR-VIEW-SURVEY: the × on a survey tile removes the photo again by @Yeetjof in #3715
- Auto Sync: As Shot, Auto and Temp apply to each selected photo's own white balance by @OneSlips in #3571
- LR-BEHAV-RENDER-FIDELITY: calibrated Contrast and Blacks in process V3 (#523) by @AlexChambers in #1383
- Tests: two catalog flakes; a readback waits as long as a render by @FredApps in #3777
- pipeline: apply 8x8 ordered Bayer dithering to prevent display banding by @mynameisdeleted in #3509
- LR-PROF-IMPORT: import the user's own DNG camera profiles (.dcp) by @OneSlips in #1063
- Light tests allow a level of 8-bit dither by @FredApps in #3779
- Culling: the loupe uses built previews; photos prepared ahead and in the background by @OneSlips in #3077
- Detail: Remove Hot Pixels, on for newly imported raws (#1345) by @PiMinusMax in #1350
- LR-EDIT-DETAIL-DENOISE: built-in BM3D denoising with GPU acceleration by @esli1283 in #2982
- LR-BEHAV-TITLEBAR: the Windows title bar takes LightCraft's theme at launch (#3381) by @insideTheFlux in #3650
- LR-PREF-DISPLAY: on Windows, previews follow the monitor's colour profile by @insideTheFlux in #2439
- GPU tests allow a level of 8-bit dither by @FredApps in #3789
- LR-LIB-PEOPLE: face boxes drawn on a photo as stored land on the upright photo (#2674) by @insideTheFlux in #2857
- xtask ci: --no-fail-fast test runs; flaky-test policy by @FredApps in #3791
- CI: stop a hung gate at 80 min with a process list by @FredApps in #3794
- Docs: drop the Last updated / Change header line that every PR conflicted on by @FredApps in #3790
- deps: craft-update with flate2's miniz backend (fixes larger-than-raw ZIP TIFFs on Windows) by @FredApps in #3800
- #2270: a host bridge for pages framing the web build (?host=parent) by @francoisgn in #2315
- feat(web): page host mode, so a page can host LightCraft in its own document (builds on #2315) by @helenkwok in #3591
- CI: Windows leg for pull requests that change Windows code, or labelled full-ci by @FredApps in #3793
- Issue #315: the second launch on Windows can load the Vulkan driver and crash before any window by @eliets2 in #3667
- Test Create Preset name box restores on escape, keeps text on return by @eliets2 in #3773
- Report the lens database contents and missing XML files in the log by @eliets2 in #3809
- catalog: resync finds the retry record from the end, not every marker (#2124) by @eliets2 in #2179
- Issue #2165: a Lightroom collection that can't nest goes under the nearest set instead of failing the import by @THEtheChad in #3145
- LR-BEHAV-RENDER-FIDELITY: process V5 rolls raw tone curves off into white in stops, so raising Exposure keeps highlights (#1632) by @AlexChambers in #3783
- Export: built-in presets for Instagram Feed, Story / Reel, Web / Portfolio, Full Resolution (#2104) by @eliets2 in #2209
- Add GFX100S II to the spectral camera matrix table by @eliets2 in https://github.com/storytol...
LightCraft v0.18.1
Full Changelog: v0.18.0...v0.18.1
LightCraft v0.18.0
What's Changed
- Integration batch 46 (6 community PRs) by @echelon in #3584
- Fix Histogram::percentile returning black when the target truncates to 0 by @Silvertree2010 in #3515
- GPU equivalence tests run on a software adapter when asked (lavapipe, WARP), for local runs on every platform by @THEtheChad in #3370
- Reject shutter fractions with a non-positive numerator or denominator by @Silvertree2010 in #3442
- Match library search date: token case-insensitively by @Silvertree2010 in #3445
- Reject overflowing LIGHTCRAFT_GPU_LIMITS values instead of panicking by @Silvertree2010 in #3465
- LR-VIEW-SURVEY: ⌘/Ctrl-click on a survey tile takes the photo out of the survey by @Yeetjof in #3563
- Keep unequal margins when merging full settings with linkMargins on by @Silvertree2010 in #3443
New Contributors
Full Changelog: v0.17.0...v0.18.0
LightCraft v0.17.0
What's Changed
- Updates: shared check-result dialog from craft-update by @aiongg in #3437
- docs: tidy agent, contributor and asset docs by @aiongg in #3436
- Integration r3: 178 reviewed PRs by @aiongg in #3430
- Issue #3405: Auto Import waits for an import that starts during its listing by @finaler1x in #3409
- LR-BEHAV-ACCESS: a date header in the photo grid is named with the text it shows by @nledford in #3212
- LR-BEHAV-ACCESS: a slider's value field is named " value" and describes how to use it by @nledford in #3214
- LR-VIEW-PHOTOGRID: the grid's empty view names Import Photos' shortcut as the keymap has it by @nledford in #3221
- Issue #3228: the hard-link originals test holds under SeBackupPrivilege (Git Bash, the CI gate) by @THEtheChad in #3230
- Reject signed ports in Url::parse by @Silvertree2010 in #3233
- Reject signed numbers in Content-Range parsing by @Silvertree2010 in #3234
- Show the remembered crop ratio's box on an untouched photo by @Silvertree2010 in #3235
- Reject EXIF offsets beyond 18 hours by @TheGalitube in #3242
- LR-BEHAV-ACCESS: an icon button's accessible name is its label, with the shortcut as its description by @nledford in #3253
- LR-BEHAV-ACCESS: a dialog is exposed to screen readers as a dialog, not a group by @nledford in #3260
- LR-BEHAV-ACCESS: the photo in Detail is named with its file name by @nledford in #3262
- LR-BEHAV-ACCESS: the grid's Thumbnail size reads as a slider by @nledford in #3265
- LR-BEHAV-ACCESS: panels and bars are named as landmarks and toolbars by @nledford in #3273
- LRC-LIB-FOLDERS: the home folder and Local's built-in places can't be renamed or moved by @nledford in #3276
- Develop exports from a source at least twice the output size by @Silvertree2010 in #3281
- Refuse a signed or malformed Content-Length in HTTP responses by @Silvertree2010 in #3283
- FACES: a person's page finds its look-alikes in seconds, not minutes by @tabasko78 in #3286
- MENU-BAR: merge the native menu's identical quit/about/settings branches (clippy::if_same_then_else) by @Peaperfish in #3295
- Issue #3293: README no longer lists an MCP mask helper by @Peaperfish in #3296
- Issue #3251: People card badge shows the full photo count by @Peaperfish in #3297
- Issue #3272: AI masks are enlarged along the photo's edges, no outline under a raised Exposure by @Peaperfish in #3298
- Contributors: add my entry (Peaperfish) by @Peaperfish in #3307
- Reject malformed base64 in MCP and segmask decoders by @Silvertree2010 in #3309
- LR-IMP-FORMATS: decode compressed RAF 13–17 % faster with a buffered bit reader by @cbram in #3321
- LRC-LIB-CATALOG-SWITCH: a library missing at launch is reported instead of being made anew with demo photos (#3239) by @Bruno-Alumn in #3322
- LR-MASK-PINS: Object and Describe masks show a pin that selects them (#3049) by @Bruno-Alumn in #3323
- LRC-LIB-FOLDERS: Move Folder To… asks for the destination without freezing the window (#3140) by @Bruno-Alumn in #3325
- LR-VIEW-HISTOGRAM: the histogram's clipping buttons read in every theme by @nledford in #3331
- LR-BEHAV-TITLEBAR: a dialog leaves the macOS title bar undimmed by @nledford in #3332
- fix(ui): translate the white balance preset menu by @newdives in #3364
- Reject multiple GPX document roots by @TheGalitube in #3367
- Issue #3368: drop_import's launch-list tests wait for the library checks before clicking by @THEtheChad in #3369
- Ignore negative XMP pixel dimensions by @TheGalitube in #3371
- LR-IMP-FORMATS: a Samsung panorama JPEG with its SEF trailer imports (#3350) by @Bruno-Alumn in #3375
- LR-MASK-COLORRANGE: a colour-range mask keeps at most 64 samples however it is loaded (#2556) by @Bruno-Alumn in #3379
- PERF-SMART: a File path rule over a non-ASCII path folds case in stack buffers instead of allocating two strings per photo by @nledford in #3383
- LR-MASK-OBJECTS: a SAM 3 checkpoint in Meta's original format is named as such, not as an unsupported dtype (#3378) by @Bruno-Alumn in #3384
- Never crash: a mask id at the u32 limit doesn't overflow the next mask's id by @Bruno-Alumn in #3385
- Never crash: strip byte counts near u64::MAX don't overflow their sum in ORF, SRW, ARW and PEF by @Bruno-Alumn in #3386
- LRC-LIB-MISSING: settling waits for the Missing Photos count, which can't panic on spawn by @mpratsaki in #3392
- LR-EXP-DIM: export sizes keep the pixels typed (#3300) by @Bruno-Alumn in #3396
- Never crash: a photo renders at most 64 red eye corrections (#2556) by @Bruno-Alumn in #3398
- Never crash: a Samsung encryption key past i64::MAX doesn't overflow keyed() by @Bruno-Alumn in #3400
- RAW.colour: fit the per-file look on the vignetting-corrected sensor by @cbram in #3402
- LRC-LIB-CATALOG-SWITCH: files waiting for a library wait for a running import instead of being dropped (#2779) by @Bruno-Alumn in #3403
- Control: pointer and scroll gestures refuse numbers past any screen instead of queueing NaN positions by @Bruno-Alumn in #3408
- Issue #3406: Auto Import says when it can't read the watched folder by @finaler1x in #3410
- i18n(it): panel and tab group menus, update check, rules, import and retouch labels by @fabiodalez-dev in #3411
- Issue #3412: accessibility audit allows missing glyphs without craft-fonts by @finaler1x in #3413
- Issue #1764: running out of device memory falls back without stopping the GPU by @finaler1x in #3419
- fix(ui): wrap the Edit header buttons instead of letting Reset cover HDR by @Enthendor in #2804
- Enable Filters: a folder moved while filters are off is followed by the filter put aside, and Cmd+L still brings it back (follow-up to #2709) by @marcoarnulfo in #2805
- LR-META-LOCATION: reject malformed typed GPS coordinates by @ronibalthazar in #2821
- LR-BEHAV-DRAGDROP: a right-click on a text field while photos are carried opens no menu by @nledford in #2823
- LR-LIB-ALBUM: album commands skip photos the library lacks and record nothing when they add nothing by @nledford in #2825
- LR-BEHAV-MULTISELECT: replacing the selection with a repeated id keeps each photo once by @nledford in #2830
- Write sidecar keywords as names in dc:subject and paths in lr:hierarchicalSubject by @j-a-b-r-o-n-i in #2841
- GPU: black pixels take the colour tools and a light vignette as on the CPU by @radialmonster in #2844
- LRC-SS-LAYOUT: the Slideshow settings page no longer moves when the slide preview finishes rendering by @nledford in #2848
- LR-EXP-METADATA: refuse Originals with embedded place names by @ronibalthazar in #2849
- i18n(fr): complete the French catalog (1,154 entries) by @Atalantis in #2851
- Keywords: start and stop painting with the keyboard shortcut by @dotCooCoo in #2856
- LRC-LIB-LIBFOLDERS: Don't ask again when moving photos is kept only when the move started by @nledford in #2858
- docs(linux): document LLVM 23 ThinLTO SIGILL workaround (#2811) by @Zaxaerith in #2885
- Export: note when LZW is picked for TIFF, 16-bit ZIP size test (#2882) by @radialmonster in https://github.com/storytold...
LightCraft v0.16.0
What's Changed
- Grant network access so update checks can reach GitHub by @dylanmtaylor in #3269
- Honor CARGO_BUILD_TARGET in FreeBSD packaging for aarch64 release builds by @dylanmtaylor in #3275
- deps: bump tar, zip, roxmltree, rustls-webpki and symphonia to latest by @dylanmtaylor in #3358
- CI: workflows only call craft-common-actions at @main (AGENTS.md; windows-arm64 unpinned) by @dylanmtaylor in #3356
- Update prompt shows the app icon and accent color instead of a letter by @dylanmtaylor in #3362
- Fix update testing and track the embedded updater icon in CI by @dylanmtaylor in #3365
- Integration batch 45 (17 community PRs) by @echelon in #3415
- Never crash: Refuse an ERF or MEF whose raw strip runs past the file (#2119) by @endthestart in #2155
- Reject non-finite values when parsing .cube LUTs by @Silvertree2010 in #2540
- Strip trailing NULs from non-UTF-8 IPTC text by @Silvertree2010 in #2833
- Clamp negative signals to zero in hlg_decode by @Silvertree2010 in #2834
- Reject signed strings in Hash128::parse by @Silvertree2010 in #2909
- LR-FILT-SEARCH-META: >= and <= in fielded search tokens by @softwaregames1 in #2917
- Keep hue below 360 in rgb_to_hsv and rgb_to_hsl by @Silvertree2010 in #2918
- Report a photo's custom white balance left out of an imported look by @Silvertree2010 in #2969
- macOS: declare the UI languages so the open and save panels are translated by @Atalantis in #3038
- i18n(ru): 217 strings the Russian catalog was missing by @JaffarSk24 in #3147
- MENU-FILE-CLOSE: document that closing the window quits the app by @nledford in #3213
- MENU-EDIT-SELECTNONE: Edit lists Select Only Active Photo and Paste Settings from Previous with their kin, and the macOS Edit menu keeps single separators by @nledford in #3225
- Reject ZIP entries with inconsistent decoded sizes by @TheGalitube in #3267
- Issue #3254: README explains how to recover a Windows update that fails with 1612/1714/1603 by @THEtheChad in #3314
- Reject mismatched XML closing tags by @TheGalitube in #3366
- Docs: link the lens profile gap and roadmap priority to #329 by @radialmonster in #2831
- raw: decode lossy single-plane (grey) JPEG XL LinearRaw DNGs (Lightroom monochrome merges) by @radialmonster in #2835
- fix(flatpak): allow reading launcher version pins by @dylanmtaylor in #3420
New Contributors
- @softwaregames1 made their first contribution in #2917
- @Atalantis made their first contribution in #3038
- @JaffarSk24 made their first contribution in #3147
- @TheGalitube made their first contribution in #3267
Full Changelog: v0.15.0...v0.16.0
LightCraft v0.15.0
What's Changed
- Migrate LightCraft to egui 0.37 with current main preserved by @skylartaylor in #2913
- feat(update): add startup update prompt modal and self-update by @dylanmtaylor in #2933
- security: bound heic-rs 0.1.4 work around hostile HEIF containers by @dylanmtaylor in #2770
- security/raw: bound hostile-memory paths in the raw decoders by @dylanmtaylor in #2780
- build: pin craft-update to craft-libs main (495e597) by @dylanmtaylor in #2990
- chore(deps): refresh safe dependency bumps by @skylartaylor in #2994
- showcase: check the file is readable without an empty with-block (S108) by @dylanmtaylor in #3001
- Camera profile: Sony ILCE-7RM5 (α7R V) by @Peaperfish in #3022
- Top bar: the title-bar drag uses craft-window's title_bar; a panel over the bar keeps the window still by @aiongg in #2930
- Docking: side panels in dock columns, on craft-ui's shared docking by @aiongg in #2839
- refactor: shared module layout (craft-contrib#20) by @aiongg in #3103
- Preserve queued file drops across dialogs and restore Flatpak sources by @skylartaylor in #2975
- fix(ui): dropdown menus grow back after a search with no matches by @aiongg in #3154
- Speed up full-size exports by removing copies and serial passes by @Silvertree2010 in #3168
- Originals: on Windows a hard link to an original counts as that original by @dotCooCoo in #3020
- Local: skip offscreen folder widgets and show browsed hidden paths by @dotCooCoo in #3045
- Windows installation policy: LightCraft by @Jeremy8776 in #3104
- Scan the whole repository again in SonarCloud by @dylanmtaylor in #3224
- Enforce Rust coding standards via Clippy by @dylanmtaylor in #3111
New Contributors
- @Peaperfish made their first contribution in #3022
- @Jeremy8776 made their first contribution in #3104
Full Changelog: v0.14.0...v0.15.0
LightCraft v0.14.0
What's Changed
- fix: document the deliberate buffer leak during thread teardown (SonarCloud) by @dylanmtaylor in #2700
- packaging: bash tests, named positional parameters and stderr errors (SonarCloud S7688/S7679/S7682/S7677) by @dylanmtaylor in #2655
- Packaging: pin the signing client and appimagetool, and check their hashes by @aiongg in #2413
- CI: one test binary per crate, line tables only, one WASM check by @aiongg in #2710
- coverage: keep the body scan linear and build the zero counter with dict.fromkeys (SonarCloud S8786/S7519) by @dylanmtaylor in #2713
- CI: shared gate workflow; FreeBSD nightly and on release by @aiongg in #2667
- Catalog import: resolve catalog paths with craft-docpath's resolve_absolute by @aiongg in #2412
- i18n: missing translations are reported, never a failure by @aiongg in #2729
- ci(sonar): stop cancelling main-branch runs so coverage is published by @dylanmtaylor in #2737
- Integration batch 43: 21 community PRs by @echelon in #2744
- Show an empty view when Find Similar has no matches by @Silvertree2010 in #2109
- Masking: outline every visible mask when the all-masks overlay is on by @csy2006 in #2210
- LR-META-XMP: Preserve foreign namespace collisions by @ronibalthazar in #2526
- Read embedded metadata from PSD and PSB files by @ronibalthazar in #2546
- Library lock: Don't write through a link at the owner note's name by @Matoo125 in #2596
- Find Missing Photos matches Windows paths by file name on macOS and Linux by @clydecbrown in #2618
- MENU-BAR: the native menu really gives its keys up to a text field and to shortcut recording on macOS by @nledford in #2621
- docs: add gap 30 — multi-select metadata editing UI by @sylvainv in #2622
- view.maskOverlayColor refuses signed hex digits by @clydecbrown in #2626
- Regression test for #49 by @skylartaylor in #2630
- lightcraft-cli commands: list commands sorted by id by @clydecbrown in #2665
- LR-CROP-AUTO: Auto straighten turns by at most 10° on at least 3 lines, and says when it finds nothing by @ingolfteetz in #2688
- LR-META-LOCATION: the command sweep no longer starts a GeoNames download by @nledford in #2702
- LR-LIB-FILTER: Cmd+L / Ctrl+L (View > Enable Filters) switches the library filter off and on again as it was by @marcoarnulfo in #2709
- LR-BEHAV-ACCESS: Tab leaves the name field of New Album, New Smart Album and the name prompts by @nledford in #2727
- Take photos removed by Synchronize Folder out of their stacks by @Silvertree2010 in #2543
- Corpus tests: Z 8 / Z 6II profile tests pair through the lens warp; Hasselblad TIFF previews pass by @francoisgn in #2620
- perf(pipeline): Highlights/Shadows median about 2× faster on the CPU, bit for bit the same by @nicolasfalesy in #2694
- LR-IMP-ADD-DIALOG: the import-selection test holds the import until the photo is chosen by @nledford in #2612
- Colour-range mask: cap the number of samples from automation by @Matoo125 in #2670
- Fix smart album gte/lte rules missing equal f-number and focal length by @Silvertree2010 in #2728
- security: bounded keyword, repair and journal-recovery work (CodeRabbit) by @dylanmtaylor in #2763
- security: bound codec allocation to what a hostile file declares by @dylanmtaylor in #2769
- security: harden dev-tool scripts and the testkit skip-log test (CodeRabbit) by @dylanmtaylor in #2760
- Round 3a integration: 42 PRs of #2580, built and tested locally by @francoisgn in #2689
- LR-EDIT-COLOR-GRADING: a wheel drag holds the pointer and puts it back where it was pressed (#1899) by @marcoarnulfo in #1979
- #1944: keyword.export refuses library originals and writes durably by @G6bill in #2015
- Export: add Thai glyph fallback only (#2052, partial) by @AlexChambers in #2072
- LR-BEHAV-BG-TASKS: one progress bar, spinner and busy button by @nledford in #2077
- MENU-BAR: menu switches are named for what they show, and no two commands share a name by @nledford in #2195
- LR-IMP-DRAGDROP: files dragged over the window show what a drop will do, and a drop opens the import review by @nledford in #2205
- LR-LIB-CULL: adjustable burst gap and similarity in Assisted Culling (#2275) by @helgehelge123 in #2279
- Gap 9: cargo xtask ci on every PR (Linux x64); ci --quick; one local ci at a time by @mattsivak in #2302
- #2312: culling goes on from a photo rated out of the view by @alvarogonjim in #2327
- PERF-SMART: count every smart album once per pass, not once per album that tests it by @nledford in #2422
- LRC-LIB-SMARTCOLL: the move engine for reordering smart album rules by @nledford in #2424
- fix(web): import picker accept list misses many raw formats by @joblonfk001 in #2430
- Web: the page title names the open photo and unsaved changes (#2397) by @Bruno-Alumn in #2453
- Web: lightcraft.command refuses params that aren't a JSON object by @Bruno-Alumn in #2455
- Print: Japanese photo and postcard paper sizes (L判・2L・KG・はがき) by @midasdf in #2468
- LR-MERGE-HDR: full-size alignment refinement and local alignment (2/3 of #1887) by @mattsivak in #2482
- LR-VIEW-INFOOVERLAY: the info overlay clears the macOS window controls and shows the rating and flag (#2460) by @chordpli in #2501
- LRC-LIB-IMPORT: month names in date templates (%B January, %b Jan) by @bdebyl in #2502
- LRC-LIB-MISSING: the availability worker sweeps a list of files at low priority and gives way to file work by @nledford in #2503
- Edit Capture Time leaves a capture time it can't fully read as it was by @clydecbrown in #2506
- docs: fix four dead links in README.zh-hans.md by @IgnatAi401 in #2507
- KEY-GRID: show the cycle shortcut in the View menu (#2500) by @tylerphotos in #2513
- Make control-server timeout tests independent of client rescheduling by @AlexChambers in #2541
- Write exact 1/N EXIF ExposureTime for fast shutter speeds by @Silvertree2010 in #2542
- Dehaze no longer crushes dark pixels next to bright ones (#2504), split from #2174 by @francoisgn in #2550
- i18n(fr): native-speaker review of key terms (gap 21) by @francoisgn in #2593
- LRC-LIB-CATALOG-IMPORT: ask whether a Lightroom catalog merges into the open library or gets a new one (#2672) by @francoisgn in #2685
- LRC-LIB-CATALOG-SWITCH: choose what opens at launch, the last library or a list of recent ones (#1290) by @francoisgn in #2701
- LR-VIEW-ZOOM: diagnostic overlays render zoom windows; soft proofing on the GPU (stacked on #1027) by @emmertex in #1074
- LR-PREF-GENERAL: the Settings window is one size on every tab, and nothing in it runs off the side by @nledford in #1287
- Help ▸ Debug ▸ Show Frame Rate: a frame-rate display for watching drags and zooms by @mattsivak in #1313
- Issue #1184: a pull request template by @nledford in #1385
- Edit in PhotoCraft: say why it didn't open; find PhotoCraft on macOS and Linux by @emmertex in #1417
- Bump quick-xml to 0.41 (RUSTSEC-2026-0194, RUSTSEC-2026-0195) by @natocool2 in #1464
- Fix graphic watermark aspect/orientation and HDR JPEG file-size limits by @nevicia2010-hub in...