# Changelog

All notable changes to this project will be documented in this file.

## [0.8.0] - 2026-03-25

### 🚀 Features

- *(silvernode/develop)* Replace color preservingness with contrast saturation emulation.
- *(neonraw/effects)* Add contrast saturation emulation.
- *(silvernode/develop)* White level.
- *(silvernode/exif)* Display more EXIF info of the picture.
- *(neonraw/effects)* White level.
- *(silvernode/grid)* Drop multi-selection when clicking active edit again.
- *(neonraw/json)* Histogram serialization in base64.
- *(neonraw/histogram)* Histogram computation with Halide pipeline.
- *(silvernode/ai)* Automatic white level determination.
- *(neonraw/effects)* Local histogram equalization is back.
- *(silvernode/grid)* Filter on rejected pictures and non-rejected pictures separately.
- *(neonraw/adjustments)* Create finer-grained groups for the parameters which now also support serializing and deserializing by group.
- *(silvernode/preset)* Rework presets with separately selectable adjustment groups.
- *(silvernode/preset)* Input validation for the preset creation panel.
- *(silvernode/preset)* Preset groups are visualized by a grid of colored patches.
- *(silvernode/preset)* Group bits have fixed hand-picked color.
- *(silvernode/preset)* Hovering a preset "activates" the UI widgets involved.
- *(neonraw/color)* Switch to Y12CoCg10 for RAW files.
- *(silvernode/highlights)* Add UI elements to control highlight reconstruction.
- *(neonraw)*  feat(highlights): Rework highlight reconstruction.
- *(silvernode/settings)* Voice read audio settings (temporarily disabled).
- *(silvernode/toolbar)* Last executed keyboard shortcut shown in Toolbar.
- *(silvernode/copy-paste)* New copy-paste shortcuts and commands: Ctrl-V pastes whatever is copied. Ctrl-C copies style, Win-C copies color correction, Alt-C copies crop. Ctrl-Shift-V copies everything from previous.
- *(silvernode/nui)* Use nui Popup gravity feature.
- *(silvernode/export)* Export panel (Ctrl+E) with several exporting options.
- *(neonraw/adjustments)* Have a special tag for CameraGuessed source illuminant.
- *(silvernode/photo)* Set initial white balance to the one the camera suggests.
- *(silvernode/before-after)* Section headers are now hoverable too to disable the whole section (in combination with holding Escape).
- *(nui/layout)* Pad_by_radius added to disable that feature on request.
- *(nui/layers)* Extra overlay layer for temporary interactions: menus, tooltip, combobox dropdown.
- *(nui/textfield)* Proper UTF-8 support.
- *(nui/popup)* Popup gravity and anchoring to initiator.
- *(nui/label)* Disable wrapping.
- *(nui/popup)* Dismiss popup with escape.
- *(nui/error)* Error flag to render widgets with an opposing color.
- *(nui/textfield)* Hint optionally always shown.
- *(nui/file-browser)* Refresh folder.
- *(nui/image)* Allow unconstrained aspect ratio.
- *(nui/slider)* Reset with backspace.

### 🐛 Bug Fixes

- *(silvernode/export)* Export order now matches the order in the grid.
- *(silvernode)* Clear uninitialized memory crash.
- *(neonraw/effects)* Re-enable primary calibration, which was accidentally disabled.
- *(silvernode/develop)* Disable retry to render texture to prevent a crash or endless retries.
- *(neonraw/color)* Fixed crash when color matrix is unavailable.
- *(silvernode/grid)* Fix crash when deselecting last picture with Ctrl-Click.
- *(silvernode/macos)* Grid multi-select now works with Cmd instead of Ctrl.
- *(neonraw/halide)* Fix GPU API selection for Metal and Vulkan.
- *(neonraw/effects)* Clear up some mixup between exposure (style) and base_exposure(color_correction).
- *(neonraw/bgfx)* Start fixing orientation disaster.
- *(neonraw/color)* Use NeonEXIF as fallback to fetch color matrix information in case RawSpeed didn't (when DNG does not contain D65 calibration).
- *(silvernode/exif)* Orientation loading from EXIF.
- *(silvernode)* Unimportant race condition on SDL event type being created.
- *(silvernode/loop)* Fix busy main-loop when command bar was showing.
- *(silvernode/reject)* Immediately save the metadata as soon as a picture is rejected.
- *(neonraw/error)* Fix result constructor to also accept nullptr strings.
- *(neonraw/small_vector)* Use placement new to correctly initialize objects, instead of relying on (move) assignment operator of uninitialized objects.
- *(silvernode/photo)* Relax full-res image exif search.
- *(silvernode/exif)* Clear author label if not set in exif data.
- *(neonraw/engine)* Separate black levels are authoritative.
- *(neonraw/highlights)* Use reliable RGB16 format for now to fix broken highlights in some scenarios.
- *(neonraw)*  fix(demosaic): Fix an occasional overflow causing weird patterns in highlight regions.
- *(neonraw/libraw)* Better retrieval of camera color matrix from LibRaw.
- *(neonraw/processing)* Remove highlight clipping from non-POT scaling factor.
- *(silvernode/debug)* Fix crash when toggling debug bits in grid.
- *(silvernode/preset-sidebar)* Fix bug in preset sidebar update logic.
- *(neonraw/xtrans)* Fixed demosaicing offsets for XTrans when loading via RawSpeed.
- *(neonraw/highlights)* Fixed some of the maths in the highlight recovery.
- *(silvernode/zig)* Update SDL3 to fix relative mouse motion bug.
- *(neonraw/denoise)* Fixed crash when using denoiser.
- *(silvernode/bindings)* Edits were not saved when using Blender bindings.
- *(neonraw/histogram)* G and B Color channels were swapped by accident. Rebalance colors to make white white in the histogram
- *(neonraw/shader)* Workaround a bgfx/shaderc issue that generates wrong UniformBuffer offsets.
- *(silvernode/preset)* Focus on name field.
- *(silvernode/command-bar)* Fix the command bar popup layout.
- *(silvernode/preview)* Fix preview popup position.
- *(silvernode/copy)* Fix keyboard shortcuts for Copy. Ctrl=Style, Shift=CC, Alt=Crop.
- *(silvernode/command-bar)* Text alignment and maximum size.
- *(neonraw/macos)* Highlight reconstruction bug in Metal shader.
- *(neonraw/effects)* Restore histogram equalization.
- *(silvernode/exif)* Also trim spaces.
- *(silvernode/grid)* Scrolling in grid and tile layout.
- *(silvernode/copy)* Fix silly bug in the copy shortcut.
- *(neonraw/bgfx)* Fix crash due to running out of framebuffers.
- *(silvernode/bgfx)* Flush when running out of frame buffers.
- *(neonraw/curves)* Improve resampling.
- *(silvernode/grid)* Rating was not showing.
- *(silvernode/file-drop)* File-dropping pictures was broken.
- *(silvernode/develop)* Colors changing when first touching a slider.
- *(silvernode/photo)* Initial orientation is now correctly loaded.
- *(silvernode/user-input-viz)* Fixed segv on scroll.
- *(neonraw/crop)* Range of translate.
- *(silvernode/grid)* Rejected edits now have correctly set the alpha of the file name too.
- *(neonraw/engine)* Loading thumbnails switches automatically to the full-res semaphore when starting from the base LOD.
- *(silvernode/loading)* The "Loading" indicator works again.
- *(nui/slider)* Discretized sliders broke: couldn't properly slide them.
- *(nui/file-browser)* Public API should push tasks to the task queue to prevent doing stuff before roots are discovered.
- *(nui/grid-layout)* Use collapses of length 1.
- *(nui/layout)* GridLayout sizing bug for collapsed cells.
- *(nui/text)* UTF-8 multi-byte counting code was wrong.
- *(nui/cursor)* Move cursor to Component, to prevent uncounted removals and bugs.
- *(nui/gui)* Remove body from Component destructor.
- *(nui/textfield)* Refactor bug.
- *(nui/layout)* Fix some aspect ratio bugs.
- *(nui/scroller)* Fix a nan-bug in the Scroller.
- *(nui/refactor)* Fix layout bugs
- *(nui/mouse)* Generate mouse hover events if the cursor leaves the window.
- *(nui/textfield)* Two events are now marked as handled.
- *(nui/popup)* Clamp popup location better.
- *(nui/textfield)* Crash when typing when non-focussed.
- *(nui/slider)* Trigger render when resetting with backspace.

### 🚜 Refactor

- *(silvernode/exif)* Move some of the EXIF-parsing logic into neonEXIF.
- *(neonraw/oops)* Simplify and remove some old OOPs.
- *(silvernode/oops)* Remove old OOPs code.
- *(silvernode/sequence)* Rewrite the EditSequence (no more OOPs).
- *(neonraw)* Refactor(curve)
- *(silvernode/refactor)* Nui refactor
- *(silvernode/refactor)* Nui refactor.
- *(nui/refactor)* Moved curve data to neonraw. nui now uses proxy.
- *(nui)* Wip(refactor)
- *(nui/refactor)* Also moved curve logic behavior and control logic from neonraw to nui.
- *(nui/refactor)* Revive tests.
- *(nui)* Wip(refactor)

### 📈 Improvements

- *(silvernode/plugins)* Detect conflicting keybindings.
- *(silvernode/bindings)* Edit/Learn are now Ctrl/Cmd-E and Ctrl/Cmd-L.
- *(silvernode/histogram)* Move histogram to the right panel to allow collapsing the left one.
- *(silvernode/bindings)* Add R/G/B alternative bind for Primary Calibration.
- *(silvernode/config)* Add default values for sliders (int/float settings).
- *(silvernode/bgfx)* Log which GPU gets selected for the bgfx render backend.
- *(neonraw/color)* Color Info supports multiple calibration illuminants (used in DNG).
- *(silvernode/crash)* Flush the crash report halfway.
- *(neonraw/assert)* Flush all loggers on assert.
- *(silvernode/develop)* Exif data is displayed nicer.
- *(silvernode/fmt)* Paths use native() on Unix and generic_string() on Windows.
- *(silvernode/develop)* Attempt to remove picture from Develop when directory is reloaded, and picture disappears.
- *(neonraw/error)* Force error handling by marking Result<T> as [[nodiscard]].
- *(silvernode/preset)* Preset creation panel is now in 3 columns.
- *(neonraw/color)* New RAW color processing mathematics and pipeline.
- *(neonraw/source)* Add SN_FORCE_RAW_DECODER to forcibly choose between libraw and rawspeed.
- *(neonraw/highlight-reconstruction)* Overhaul highlight reconstruction completely.
- *(silvernode/hsl)* Change colorspace for HSL edits to amcLab.
- *(silvernode/hsl)* Revert to Oklab-based HSL operations.
- *(neonraw/color)* Reduce default contrast saturation to 0.25.
- *(silvernode/settings)* Add descriptions for some more settings.
- *(silvernode/exif)* Label trim null-bytes.
- *(silvernode/config)* Configuration workspace UI improvements.
- *(silvernode/shortcut)* Shortcuts use nice icons on macOS in keyboard_help.
- *(neonraw/error)* Define errors through designated initializer lists.
- *(silvernode/crop)* Increase range of perspective sliders.
- *(silvernode/filter)* Changes to edit metadata now triggers the filters.
- *(silvernode/filter)* Filters updating try to maintain the selected edits.
- *(silvernode/filter)* New setting decides when the filter triggers: immediately or upon workspace switch.
- *(silvernode/develop)* Layout improvements.
- *(nui/layout)* Layout resolving improvements.
- *(nui/spinner)* Up/down sizes.
- *(nui/debug)* Account for UTF-8 multibyte to provide correct padding in print_ui_tree.
- *(nui/theme)* Increase font size to 17.
- *(nui/file-browser)* Use Theme font size.
- *(nui/text)* Baseline, line height and spacing improvements.
- *(nui/debug)* Layout debug printing for popups.
- *(nui/layout)* Max padding with corner radius of container.
- *(nui/debug)* Make debug_name a std::string_view.
- *(nui/error)* Better error colors.
- *(nui/button)* Request to rerender before running user callback to allow destruction.
- *(nui/perf)* Queue after layout performance improved.

### ⚡ Performance

- *(neonraw/copy)* Improve copy pipeline performance.
- *(silvernode/shortkey)* Use small_vector to register keyboard shortcut entries.
- *(neonraw/perf)* Remove Tracy from HalideBuffer move helper.
- *(neonraw/curves)* Optimize LUT compilation.
- *(silvernode/curves)* Optimize LUT generation.
- *(nui/debug)* Improve debug printing performance during layout.

## [0.7.1] - 2025-09-09

### 🐛 Bug Fixes

- *(neonraw/xtrans)* Reduce work group size for XTrans demosaicing.
- *(silvernode/macos)* Icons for Ctrl, Option, Command fixed.
- *(silvernode/bindings)* Map contrast turning point to R instead of V.
- *(neonraw/histogram)* Histogram bincount fixed.
- *(silvernode/exif)* Loading metadata also with the LibRaw fallback.
- *(neonraw/shader)* Fix a weird color glitch in the develop shader.
- *(silvernode/exif)* Let SDL handle conversion of the timestamp to a date time.
- *(neonraw/json)* Fix loading of arrays from json file.

### 🚜 Refactor

- *(nui)* Wip(refactor)
- *(nui)* Wip(refactor)

### 📈 Improvements

- *(neonraw/logging)* Halide errors/messages are now printed through the regular logging system, and errors trigger a ReleaseAssert(false).
- *(silvernode/logging)* Halide specific logger for errors and messages.

## [0.7.0] - 2025-09-03

### 🚀 Features

- *(silvernode/bindings)* Special binding for crop-in with the scroll wheel.
- *(silvernode/ui)* Added icons in many places.
- *(neonraw/histogram)* Histogram computation functionality.
- *(neonraw/ppe)* Support outputting to bit depths 8, 10 and 16.
- *(silvernode/develop)* Add a histogram of the current view (reacts to zoom).
- *(nui/popup)* Add may_quick_dismiss field for Popups that says whether you can close a popup by clicking next of it.
- *(nui/icon)* Key icons.
- *(nui/icon)* Text parsing with embedded icon specifiers, with component flag PARSE_ICONS.
- *(nui/icon)* Icons can be interleaved with text using the `draw_text_with_icons` helper function.

### 🐛 Bug Fixes

- *(silvernode/grid)* Fix crash with assert when changing folder when not scrolled to the top.
- *(silvernode/export)* Auto export now uses the global queue.
- *(silvernode/preview)* Correctly position the popup in the window.
- *(neonraw/shaders)* Make the shader more bgfx-strict to also work for OpenGL.
- *(silvernode/fuji)* EXIF data loading for file width and file height fixed.
- *(silvernode/develop)* Crash when the image size went to zero.
- *(silvernode/grid)* Crash when filtering options where changed but no files are loaded.
- *(nui/slider)* Range doesn't overwrite decimal places anymore.

### 📈 Improvements

- *(silvernode/settings)* Overhaul the settings view with icons and better descriptions.
- *(silvernode/ui)* Disable AI panel black square.
- *(silvernode/bindings)* Contrast turning point is now mapped to C;V.
- *(silvernode/crash-report)* Add version information for SilverNode and NeonRAW to the crash file.

## [0.6.4] - 2025-08-29

### 🚀 Features

- *(silvernode/export)* Show the current number of queued and running export jobs.
- *(silvernode/grid)* Scrolling is now animated.
- *(silvernode/bindings)* Remap ` to give a zero rating, instead of toggle before/after.

### 🐛 Bug Fixes

- *(neonraw/jrs)* Fix for blocked GPU jobs not starting.
- *(silvernode/grid)* Fix that scrolling to the very top didn't update the thumbnails.
- *(silvernode/performance)* Stop rerendering every mouse movement.
- *(nui/scroller)* Animated scrolling didn't call the callback.

### 📈 Improvements

- *(silvernode/bindings)* Before after toggler now only works on Escape.

## [0.6.3] - 2025-08-29

### 🚀 Features

- *(silvernode/export)* Write EXIF data to JPEG files with neonEXIF.
- *(silvernode/export)* Export_album command to export selected pictures as JPEGs with a filename prefix and sequence number.
- *(silvernode/halide)* Add ability to select a compute API via --compute command line argument.
- *(neonexif/write)* Add support for generating TIFF and JPEG Exif data writing.

### 🐛 Bug Fixes

- *(neonraw/jrs)* Groups of Jobs with the same semaphore token can be revived from the blocked list.
- *(silvernode/zig)* Fix the compute API selection, caused by a misconfigured path in the zig build.

### 📈 Improvements

- *(silvernode/windows)* Crash handler handles more hardware exceptions.
- *(neonraw/engine)* Separate semaphore for thumbnails.
- *(silvernode/engine)* Use jrs::SemaphoreToken for most jobs to prevent explosions in memory usage.
- *(silvernode/logging)* Minimize spdlog logger pattern.
- *(neonraw/halide)* Improve the code that handles selecting a compute API.
- *(neonexif)* Non C++23 fallback for std::byteswap.

## [0.6.2] - 2025-08-25

### 🚀 Features

- *(silvernode/develop)* Before after toggler for sharpening/denoising.
- *(neonraw/effects)* EffectStrengths for sharpen and denoise.
- *(silvernode/config)* Add tags to all settings. This will be cool for filtering/sorting later.
- *(silvernode/develop)* Option to disable sharpening and denoise while animating.
- *(neonraw/engine)* Don't rerender blurs for sharpening and denoising when they are still valid.
- *(silvernode/crop)* Add 16:9 and 21:9 aspect ratios.
- *(silvernode/ai)* Allow "features" command from the grid.
- *(silvernode/ai)* Fix positioning of features on the photo in the develop module.
- *(nui/button)* Tag button type.

### 🐛 Bug Fixes

- *(silvernode/gui)* Fix User input visualizer.
- *(silvernode/develop)* Temporary fix for missing frame at end of animations. Needs cleanup.
- *(neonraw/halide)* Remove usage of COPY_TO_HOST macro.
- *(neonraw/pipeline)* Fix validity tracking of intermediate buffers for sharpen and denoise.
- *(silvernode/ai)* Do proper sequencing of AI inference using a jrs::semaphore.
- *(silvernode/halide)* Replace usage of old COPY_TO_HOST macro.

### 🚜 Refactor

- *(silvernode/logging)* Have separate loggers for AI related stuff.
- *(silvernode/logging)* Store the logger globals in SetupLogger.cpp.
- *(neonraw/logging)* Move logger globals to Logger.cpp.

### 📈 Improvements

- *(silvernode/zoom)* Zoom bindings slightly better.
- *(silvernode/develop)* Rerender/dirty logic looks correct now.
- *(silvernode/logging)* Use more appropriate logging levels for AI stuff.
- *(neonraw/datadesk)* Support neonraw::utils::small_vector.

### ⚡ Performance

- *(silvernode/ai)* Use small_vector for facial landmarks.

## [0.6.1] - 2025-08-14

### 📈 Improvements

- *(neonraw/halide)* Schedule GPU for RAW_to_xyY.

## [0.6.0] - 2025-08-13

### 🚀 Features

- *(silvernode/crash)* Crash handler that will try to gather useful information about a crash.
- *(silvernode/bindings)* Disable Vim and Lightroom bindings.
- *(neonraw/demosaic)* First implementation of Nazari demosaicer (seems to not fully work yet).
- *(neonraw/halide)* ScopedHalideNoGPU.
- *(silvernode/libraw)* Add support for loading raw files throuhg LibRaw (slow).
- *(neonraw/libraw)* Add LibRaw data source.
- *(neonraw/libraw)* Integrate LibRaw for wider support of RAW formats.
- *(neonraw/error)* Proper Error handling system with neonraw::Result<T>, integrated into jrs.
- *(neonraw/demosaic)* Initial support for X-Trans color filter arrays.
- *(silvernode/photo)* Allow more known extensions for RAW file formats.
- *(silvernode/grid)* Select directory in filebrowser when passing directory as command line argument.
- *(nui/image)* Very simple error message in a nui::Image.

### 🐛 Bug Fixes

- *(neonraw/demosaic)* Don't crash when the CFA is unsupported.
- *(silvernode/file-browser)* Don't reselect a folder programatically when manually opening it.
- *(silvernode/fuji)* Accept RAF files. Probably won't demosaick still.
- *(silvernode/grid)* Don't crash when the file/folder is not readable.
- *(silvernode/debug)* Fix the rerender indicator.
- *(silvernode/thumbdb)* Fix race condition in dealing with the Thumbnail database.
- *(neonraw/halide)* Revert No-GPU mechanism, as Halide caches the pipeline in a multitarget routine.
- *(silvernode/halide)* API selection is now sequential to avoid incorrect behavior later on.
- *(neonraw/jrs)* Const-ness of dependencies are now correctly unpacked.
- *(neonraw/xtrans)* Fix demosaicing issue in the XTrans Halide generator.
- *(neonraw/libraw)* CFA XTrans recognition was transposed.
- *(neonraw/rawspeed)* Remove incorrect bayer-offset adjustment (cf. crop_offset).
- *(neonraw/libraw)* Prefer LibRaw for loading SRF files (because we can't demosaic that).
- *(neonraw/halide)* Temporarily disable custom_can_use_target_features, because it seems to not work in the Zig build. Need to investigate.
- *(nui/file-browser)* Do not list squashfs mounts (snap).
- *(nui/popup)* Fix popup event handling.
- *(nui/file-browser)* Reduce crashing by handling file system errors more gracefully.
- *(nui/scroller)* Animate crash when scroller was not under the root.

### 🚜 Refactor

- *(neonraw/datasource)* Cleanup DataSource system: go for a data-driven approach.

### 📈 Improvements

- *(silvernode/grid)* Preview popup shows hint on how to close it.
- *(silvernode/develop)* Try to improve zoom bindings a little, break them a little.
- *(silvernode/crash)* Crash reporter includes thread ID and process ID in filename.
- *(silvernode/error)* Transition to the Result/Error system for proper error handling.
- *(silvernode/photo)* Use SmartDataSource which tries both RawSpeed and LibRaw.
- *(neonraw/logging)* Move some logging from neonraw to pipeline to reduce clutter.
- *(nui/file-browser)* Backup mechanism of detecting nodev on linux filesystems.

### ⚡ Performance

- *(silvernode/thumbdb)* Use Halide pipelines for the conversion of interleaved to planar.
- *(neonraw/image-processing)* New Halide pipelines for interleaving and deinterleaving from/to planar.

## [0.5.6] - 2025-07-29

### 🚀 Features

- *(neonraw/memory)* Make memory callstack sampling via tracy a runtime feature set by SN_MEM_CALLSTACKS.
- *(neonraw/denoiser)* Sqrt-compand SNR buckets.
- *(silvernode/file-browser)* Open folders through the file browser.
- *(silvernode/drag-n-drop)* Open folders and photos with drag-n-drop.
- *(silvernode/file-browser)* Select folder when dropping file or folder.
- *(silvernode/bindings)* Blender Develop bindings drastically improved with two-level bindings.
- *(neonraw/util)* Small Vector.
- *(silvernode/develop)* Scroll to activated sliders in Blender bindings.
- *(nui/file-browser)* Function to select a given std::filesystem::path.
- *(nui/scroller)* Update child visible area on demand.
- *(nui/cursor)* Better cursor setting support.
- *(nui/file-browser)* Show mounted drives.
- *(nui/file-browser)* Show Desktop, Home, Downloads, and Pictures.
- *(nui/file-browser)* Action button.
- *(nui/slider)* Oklch hue background function.
- *(nui/file-browser)* Showing drives as root elements under 'My computer'

### 🐛 Bug Fixes

- *(neonraw/denoise)* Fix the tile-overlap detection routine.
- *(neonraw/denoise)* Fix a race condition.
- *(silvernode/grid)* Disable layout optimization for now, to prevent layout glitch.
- *(neonraw/blade)* Trainer works again.
- *(neonraw/adjustment-model)* Stop emitting warnings for not-found keys.
- *(silvernode/grid)* The Grid layout issue is fixed.
- *(silvernode/grid)* The Grid layout issue when toggling fullscreen.
- *(neonraw/halide)* Fix that CUDA got incorrectly selected with AMD GPU.
- *(silvernode/thumbdb)* Do proper copying of the buffers to both prevent crashes and reduce lock contention.
- *(nui/file-browser)* Decode octal escapes in parsing /proc/mounts.
- *(nui/file-browser)* Skip non physical drives and /System/ drives in macOS.

### 📈 Improvements

- *(neonraw/halide)* Keep memory allocation owning logic into the halide_buffer_t::flags.
- *(neonraw/halide)* Add debug name to HalideBuffer's.
- *(silvernode/thumbnails)* Ability to have multiple ThumbnailProviders from different folders.
- *(silvernode/thumbnails)* Database checks better for cache hits.
- *(silvernode/blender)* Improving Blender bindings: new toggle pair with same key.
- *(silvernode/thumbdb)* Store larger thumbnails.
- *(silvernode/thumbdb)* Prevent creating thumbnail database on a filesystem that has less than 2GB of space left.
- *(neonraw/effects)* Reduce strength of sharpening with smaller LODs to reduce artefacts.
- *(nui/slider)* Hints follow the active coloring.
- *(nui/icon)* Clear up icons for FileBrowser.
- *(nui/file-browser)* FileBrowser OS calls go to a worker thread. Updates get queued in a process queue.

## [0.5.5] - 2025-07-12

### 🚀 Features

- *(silvernode/develop)* Resolution multiplier to trade of speed with performance.

### 🐛 Bug Fixes

- *(silvernode/crop)* PhotoCanvas gets the correct _total_ pixel ratio.
- *(silvernode/develop)* MSAA factor in crop mode was broken.

### 📈 Improvements

- *(nui)* Several API improvements to reduce copies.

### ⚡ Performance

- *(neonraw/pipeline)* Pre-allocation strategy for the intermediate pass textures.
- *(neonraw/curves)* Speed up UnitCurve calculations: remove heap allocations.
- *(silvernode/memory)* Several heap allocations removed.
- *(silvernode/copy)* Several needless object copies removed.
- *(silvernode)* Small optimization.
- *(nui/grid-layout)* Remove all heap allocations during layouting.

## [0.5.4] - 2025-07-07

### 🚀 Features

- *(silvernode/crop)* Show grid lines and third-lines in crop mode.
- *(nui/chromaticity-picker)* Default value.

### 🐛 Bug Fixes

- *(silvernode/crop)* Preset sidebar now respects crop.
- *(silvernode/develop)* Temp/tint sliders not updating on reset of chromaticity picker.

## [0.5.3] - 2025-07-06

### 🚀 Features

- *(silvernode/crop)* Crop-in
- *(neonraw/crop)* Crop-in.

## [0.5.2] - 2025-07-05

### 🚀 Features

- *(silvernode/crop)* Aspect ratio.
- *(neonraw/crop)* Aspect ratio.
- *(nui/icon)* Icon drawing helper.

## [0.5.1] - 2025-07-04

### 🚀 Features

- *(neonraw/crop)* Straighten image (rotate + perspective correction).
- *(silvernode/crop)* Implement the grab tool to recenter the photo.
- *(neonraw/denoise)* Bring denoising back after it being disabled upon introducion of the crop feature.

### 🐛 Bug Fixes

- *(silvernode/exif)* Fixed a crash upon failed loading of exif data.
- *(silvernode/crop)* Temporary workaround for a crash when size information is not yet available.h

## [0.5.0] - 2025-07-03

### 🚀 Features

- *(silvernode)* Toggle fullscreen with F11, Alt-Enter, or :fs, or :fullscreen.
- *(silvernode/develop)* Straighten image (rotate + perspective correction).

### 🎨 Styling

- *(silvernode)* Icon for Windows exe file.

## [0.4.1] - 2025-06-23

### 🚀 Features

- *(silvernode/debug)* Backtrace command.

### 🐛 Bug Fixes

- *(silvernode/windows)* Enable VT processing on the ConsoleMode.

### 🚜 Refactor

- *(silvernode/halide)* Use my own HalideBuffer wrapper struct.
- *(neonraw/halide)* New HalideBuffer wrapper struct with better memory management API.
- *(neonraw/data-frame)* Remove the LOD indirection: EDFs now always have a preknown LoD level.

## [0.4.0] - 2025-06-16

### 🚀 Features

- *(silvernode/bindings)* Implemented different variants of blender bindings.
- *(silvernode/bindings)* Reworked the Blender Bindings. Can now cycle through groups under the same letter. Also tweaked some UI aspects.
- *(silvernode)* Initial drop-folder/file support (has memory leak).
- *(silvernode/develop)* Gray background in Develop.
- *(silvernode/thumb-db)* ThumbDB seems to work!
- *(silvernode/settings)* Settings saving and loading.
- *(silvernode)* Version command.
- *(neonraw/blade)* SoE analysis.
- *(neonraw/jrs)* Added the ability to reject the duty of initializing when acquiring a Res.
- *(neonraw/blade)* Side-of-Edge analysis and filter bank dimension.
- *(neonraw/denoiser)* SoE-aware denoising.
- *(silvernode/denoiser)* New continuous denoiser setting for noise amplitude.
- *(neonraw/blade)* New denoiser with SoE analysis.

### 🐛 Bug Fixes

- *(silvernode/settings)* Fix small configuration editor bug.
- *(silvernode/ui)* Fix #232. Color wheel distribution.
- *(silvernode/linux)* Potentially fixes #231. Rerender window when it becomes visible again.
- *(silvernode/linux)* Fix #230. Prefer wayland, but fallback on X11.
- *(silvernode/ai)* Potential fix for the AI-crashes. #224
- *(silvernode/ai)* Fix initialization of ai::PhotoFeatures.
- *(silvernode/bindings)* Small fix in Blender Develop Bindings for cycling pairs.
- *(silvernode)* Small fixes.
- *(silvernode/thumb-db)* Return full mipmap chain from thumb db loader.
- *(silvernode/thumb-db)* Fix bug in ThumbDB destroying device allocations in a race condition.
- *(silvernode/bindings)* Cancel adjusting for blender bindings now resetss all selected images.
- *(silvernode/thumbdb)* Fix loading of ColorInfo to respect the rules of the JRS.
- *(neonraw/engine)* ColorInfo is now correctly precreated without accepting the initialization duty.
- *(neonraw/jrs)* Return CREATED for initialization-duty postponed resources instead of NEW_VERSION.
- *(neonraw/jrs)* Fix a deadlock where the gpu-thread is waiting on the destruction of a GPU resource for which destructor code is in a waiting destroy-job.
- *(neonraw/denoiser)* Fixed incorrect locking of required denoising buffers.
- *(nui/slider)* Slider discrete fill computation fixed.

### 🚜 Refactor

- *(silvernode/engine)* No more unknown LODs.
- *(neonraw/engine)* No more unknown LODs. Simplified some things.

### 📈 Improvements

- *(silvernode)* GridThumbnailManager and ThumbDB.
- *(silvernode/grid)* Improve the GridThumbnailManager
- *(silvernode/thumb-db)* ThumbDB improvements.

### ⚡ Performance

- *(silvernode/grid)* Improve grid priority setting performance.
- *(neonraw/jrs)* Decrease waiting in subjob completion waiting.
- *(nui/nui)* Small perf optimization.

### 🎨 Styling

- *(silvernode/develop)* Shade adjustments panel and AI panel.

## [0.3.0] - 2025-06-02

### 🚀 Features

- *(silvernode/develop)* Sharpening and Color denoising.
- *(silvernode/photo)* Use RawSpeed for parsing metadata.
- *(silvernode/grid)* Masonry zoom with ctrl-scroll.
- *(silvernode/bindings)* Add select/deselect all.
- *(silvernode/debug)* Setting for making debug commands show up in keyboard help.
- *(neonraw/adjustments)* Have default HSL curves have 8 handles.
- *(silvernode/ui)* Add version string to window title.
- *(neonraw/img-proc)* Seperate 2-pass blurring filters for denoise and sharpening statistics.
- *(silvernode/ui)* Light theme.
- *(neonraw/jrs)* Semaphore allocation system in the JRS.
- *(neonraw/debug)* Add Tracy tracking for mimalloc.

### 🐛 Bug Fixes

- *(silvernode/develop)* Fix zoom bug.
- *(silvernode)* Fix icon pixel data layout.
- *(silvernode)* Fix SilverNode not exiting when photos weren't loaded.
- *(silvernode/develop)* Fix UI scaling issue with Zoom plugin.
- *(silvernode/photo)* Fix saving Denoiser settings.
- *(silvernode/bindings)* Fix activating sliders and blender bindings.
- *(silvernode/ai)* Fix AI when running on CUDA.
- *(silvernode/bindings)* Fix shortcuts in Grid.
- *(silvernode/ui)* Fixed non-portable keyboard shortcuts in reference to #186.
- *(silvernode/ui)* Fix alignment of textbox in commandbar.
- *(neonraw/macos)* Disable mimalloc on macOS with system compiler clang 18.
- *(neonraw/img-proc)* Bugfix OpenGL sharpen/denoise.
- *(neonraw/macos)* Mark NEON as available always (for MacBooks that will be true).
- *(silvernode)* Merge include/ into src/. Promote all warnings to errors and fix them.
- *(neonraw/cmake)* Promote all warnings to errors and fix them.
- *(neonraw/aarch64)* Fix aarch64 compilation bug.
- *(neonraw/memory)* Fix resource management for Blur Textures.
- *(neonraw/macos)* Figured out the mimalloc override plan for dealing with the bug on macOS. Also, this bug seems to go away with SDK15.4.
- *(neonraw/windows)* Fix Windows aarch64
- *(neonraw/jrs)* Bugfixes for Job reviving logic after being blocked in JRS.

### 🚜 Refactor

- *(silvernode/libfacedetection)* Cleanup libfacedetection.
- *(silvernode)* Fix for updated vg-renderer

### 📈 Improvements

- *(neonraw/img-proc)* Reduce memory usage for denoising and sharpening buffers.
- *(neonraw)* Extra safety for not accessing lods out of bounds.
- *(color)* New improved curves fitted on planckian locus, based on Judd-Vos data.

### ⚡ Performance

- *(silvernode/ui)* Move UI widget background generators to separate file with -O3 flag.
- *(nui/nui)* Small perf optimization.

### 🎨 Styling

- *(silvernode/grid)* Improve design of the tiles in the grid and preset bar.
- *(silvernode/ui)* Work on the light colorscheme.

## [0.2.0] - 2025-06-02

### 🚀 Features

- *(neonraw/debug)* Working on DOT visualization of the program state.
- *(silvernode/logo)* Polished Logo. wip(neonraw): Rewrite Texture/FrameBuffer stuff. Close to finished.
- *(silvernode)* Support failing images.
- *(neonraw/jrs)* Support failing jobs and propagate failure information to resources.
- *(silvernode/bindings)* Zoom Bindings.
- *(silvernode/settings)* Descriptions for settings.
- *(neonraw)* Zoom Support.
- *(silvernode)* Export queue (per plugin for now).
- *(silvernode/debug)* Add tracy self-profiling support.
- *(neonraw/jrs)* Hook up the jrs::JobSystem as the implementation for Halide's parallel for. Now we can effectively limit the number of thread silvernode uses with this.
- *(neonraw/jrs)* Added SN_WORKER_THREADS env variable to read from.
- *(neonraw/jrs)* Semaphores are managed by ref-counted SemaphoreTokens, which hold a 'taken' state.
- *(neonraw/jrs)* Wakeup GPU callback.
- *(silvernode/bindings)* Blender develop bindings for multi-select in grid.
- *(silvernode/ui)* Support fractional scaling.
- *(silvernode/bindings)* Blender hold-and-drag option.
- *(neonraw/adjustments)* Seperate effect strength for base exposure and exposure.
- *(silvernode/develop)* Implemented new contrast function, which is shown in the curve as background monitor function.
- *(neonraw/shader)* Implemented new contrast function.
- *(neonraw/blade)* First seemingly working implementation of the BLADE trainer.
- *(neonraw/blade)* Seemingly first decently working multiscale denoising training and inference.
- *(neonraw/blade)* BLADE augmentations. Schedules for GPU for most pipelines.
- *(silvernode/filebrowser)* Added a file brower in the grid (does nothing yet).
- *(neonraw/blade)* Multiscale BLADE denoiser works beautifully.
- *(neonraw/blade)* PSRN monitoring.
- *(neonraw/blade)* SNR.
- *(neonraw/blade)* Filter property table rendering.
- *(neonraw/blade)* Cool table printing stuff for visualizing filter bank properties.
- *(neonraw/jrs)* JRS has now a dedicated Halide device thread.
- *(neonraw/halide)* Support for Halide device API selection.
- *(silvernode/denoiser)* A metric shitton of work on the denoiser.
- *(neonraw/halide)* Properly detect API support for Halide, configured through CMake.
- *(neonraw/debug)* Track Halide device memory in Tracy.
- *(neonraw/denoiser)* Specify LoD-level below which the Engine takes care of denoising, instead of the Pipeline.
- *(neonraw/halide)* Support multiple GPU compute API backends in Halide.
- *(neonraw/denoiser)* Seemingly almost have a correctly functioning Tiled Multi-scale Denoiser.
- *(neonraw/debug)* Dot visualize Halide jobs.
- *(neonraw/img-proc)* Sharpening and Color denoising.

### 🐛 Bug Fixes

- *(neonraw/jrs)* Fix JRS_INSTRUMENT=false.
- *(neonraw/memory)* Bugfix arena allocator to respect alignof(std::max_align_t).
- *(neonraw)* Fix the ImageBlock and Texture mess. Fixes #192.
- *(silvernode)* Fix render loop.
- *(silvernode/jrs)* Fix JRS bug where blocked jobs were not revived.
- *(neonraw/jrs)* Fix JRS bug where blocked jobs would not start once their launch guard was ready.
- *(neonraw)* Fix fmt::runtime usage.
- *(neonraw)* Bugfix the linkage of the new/delete operators.
- *(silvernode)* Bugfix main render loop for slow hardware.
- *(neonraw/memory)* Memory allocator alignment bug.
- *(silvernode)* Tweak the render loop logic to fix a CPU usage bug.
- *(silvernode)* Fix rotation of images.
- *(silvernode)* Hopefully fix the render-loop for real this time.
- *(silvernode)* Fix dt for plugins after pause.
- *(silvernode)* Q'n'D fix for exporting JPGs from Ctrl-E. We need a proper export queue with visualization in the UI.
- *(neonraw/jrs)* Bugfix JRS assert_ready vs assert_assert_and_not_failed in case of Optional.
- *(silvernode/jrs)* A few bugfixes regarding jrs::ResRef::is_ready that should have been is_ready_and_not_failed.
- *(silvernode/bindings)* Small tweaks to game controller handling.
- *(silvernode/develop)* Fixed effect strength toggling. Also seperated base exposure and exposure.
- *(silvernode/ui)* Fix background of UserVisualization.
- *(silvernode/ui)* Fix key name in user input visualizer.
- *(silvernode/photo)* Fix Saving of edits.
- *(silvernode/ui)* Also Fix Clamp UV for rendering in vg-renderer.
- *(neonraw)* Tiny fix.
- *(silvernode/ui)* Bugfix HiDPI
- *(neonraw/pipeline)* Insert missing copies.
- *(neonraw/blade)* Fix fast noise.
- *(neonraw/blade)* Fixed the multiscale training: mipmap instead of bilinear.
- *(silvernode)* Small tweaks/fixes.
- *(silvernode/linux)* Fiddling to make Wayland work.
- *(neonraw/halide)* Fix Halide pipeline error on CUDA.
- *(neonraw/img-proc)* Fix demosaicing on GPU when buffer is cropped. Bug happened where device copy exceeds bounds due to offset+pitch*rows being outside of buffer.
- *(neonraw/img-proc)* Demosaic full-size and fix clamping to wrong color (clamp mod 2). Leave Halide device taken.
- *(neonraw/img-proc)* Fix sharpening on zoomed-out images.
- *(neonraw/adjustments)* Fix saving denoiser settings.
- *(neonraw/jrs)* Bugfix WeakResRef deadlock when clearing producers upon invalidation.
- *(neonraw/denoiser)* Fix nan-bug in shader for zero color-denoise vector.
- *(nui)* Some SDL3 fixes.
- *(nui)* Compilation issue fix.

### 🚜 Refactor

- *(neonraw/jrs)* Memory tracking revamped.
- *(neonraw/pipeline)* Redid the Pipeline Preparing interface: can now specify which _Bits_ you want to preload.
- *(neonraw/pipeline)* Removed all the Refs from the PipelineFrameState to free memory of intermediate buffers once they were no longer needed.
- *(neonraw)* Lots of cleanup.
- *(neonraw)* Moved files. Will run sfincludes.
- *(neonraw)* Improve compile times by moving debug print stuff out to JRS_instrument.cpp and factor out the non-template part of ResControlBlock, ResRef, and WeakResRef.
- *(neonraw)* Factored out the to_dot of ResourceControlBlock to the instrumentation file.
- *(silvernode)* Ditched ghc/filesystem in favor of std::filesystem.
- *(silvernode)* Notify Finished Jobs queue is now moodycamel::concurrentqueue.
- *(silvernode)* Almost done with transitioning to vg-renderer instead of nanovg.
- *(silvernode)* Fixed some more bugs regarding transitioning to vg-renderer. I think it might be finished.
- *(silvernode)* Semaphores are managed by ref-counted SemaphoreTokens, which hold a 'taken' state.
- *(silvernode)* Remove fallback from to-dot, so I implemented all to-dot providers.
- *(silvernode)* Updated to the Layered rendering of nui.
- *(silvernode/plugins)* On-demand continuous plugin update mode.
- *(neonraw/halide)* Reorganize Halide generators a bit in separate files, and bundle the related ones into INTERFACE cmake targets.
- *(neonraw)* Before doing a sfincludes.
- *(silvernode/libfacedetection)* Switch to my fork of libfacedetection.
- *(neonraw/blade)* Factor BLADE solver out to neonraw main code.
- *(silvernode)* Migrated to SDL3
- *(neonraw/dd)* Rewrite dynamic dispatch.

### 📈 Improvements

- *(neonraw/jrs)* Closing the new JRS compatibility gap.
- *(neonraw/jrs)* Implement string_tape to construct names of variables.
- *(neonraw/jrs)* Swapped out the std::string name in ResControlBlock for a const char*.
- *(neonraw)* Use color matrices in rawspeed data.
- *(silvernode)* Lots of improvements.
- *(silvernode)* Reduced aggresiveness of preloading.
- *(neonraw/jrs)* Allocate Jobs from a thread-safe foonathan::memory_pool.
- *(neonraw)* Grouped together a few more jobs that were too small for a parallel for.
- *(neonraw/img-proc)* Relax requirements on bilinear demosaicer.
- *(silvernode)* Change render loop timing to use SDL Performance Counter instead of SDL Ticks.
- *(silvernode)* Grid thumbnail rendering supports being dirty and automatically refreshing itself.
- *(neonraw/jrs)* JRS perform_gpu_job now returns why it didn't perform any.
- *(silvernode)* Made darknet optional.
- *(silvernode/settings)* Improved settings workspace.
- *(silvernode/ui)* Improve rendering loop.
- *(silvernode/develop)* Improve dirty-marking for failed pictures.
- *(silvernode/ui)* Estethics improvements (target white point, filter label).
- *(silvernode)* Tweak contrast.
- *(neonraw/shader)* Tweak contrast.
- *(neonraw/blade)* Remove non-triangular Gram matrix storage.
- *(silvernode)* More tweaking on the main render loop.
- *(neonraw/memory)* Neonraw::memory debug mode uses foonathan malloc allocator for creating unordered_map
- *(silvernode)* Frame rate estimation outlier clamping.
- *(neonraw/blade)* Figure out that coherence is more important. Figure out that the second blurring window is important when trying to determine filters.
- *(neonraw/blade)* Optimized some of the BLADE file IO: support for writing arrays, and coalesced memory allocations for filter in filterbank.
- *(neonraw/blade)* Lots of work on BLADE and denoising.
- *(silvernode/bindings)* Adjust blender bindings for contrast and saturation. Closes #212.
- *(neonraw/denoiser)* A metric shitton of work on the denoiser.
- *(neonraw/img-proc)* Small performance improvements in demosaic pipeline and convert YCoCg pipeline.
- *(neonraw/denoiser)* Improved stability of denoiser.
- *(neonraw/img-proc)* Improve sharpening a lot.
- *(neonraw/denoiser)* PoC shrinking color denoising.
- *(color)* Small improvement to the Tint mode.

### ⚡ Performance

- *(neonraw/img-proc)* Sped up bilateral_grid computation.
- *(neonraw/img-proc)* Sped up extract highlight ratio extraction.
- *(silvernode)* Ditch perfrep as a seperate project and bake it into NeonRAW with a decent rewrite using foonathan::memory;
- *(neonraw/perfrep)* Ditch perfrep as a seperate project and bake it into NeonRAW with a decent rewrite using foonathan::memory.
- *(neonraw/jrs)* Improve subjob logic to reduce overhead.
- *(silvernode/ui)* Speed up generation of background textures for the HSL curve editors.
- *(silvernode)* Grid thumbnail keep aliver now also keeps gpu-buffers on cpu side ready for the thumbnail (need to evaluate memory impact).
- *(silvernode)* Prevent retriggering thumbnail render in the grid if the previous one is not displayed yet.
- *(neonraw/shader)* Implement a texture pool logic for uploading curves to the GPU.
- *(neonraw/blade)* BLADE trainer is working on GPU.
- *(neonraw/blade)* BLADE Denoiser works on GPU. Vrrooooomm!
- *(silvernode)* Optimize startup time.
- *(neonraw/halide)* Spawn separate Halide worker thread function to enable asynchronous API detection.
- *(neonraw/blade)* Improve MSBladeInfernece schedule.
- *(neonraw/rawspeed)* RawSpeed loading with memory mapped files.

### 🎨 Styling

- *(silvernode/settings)* Improve configuration workspace with info about settings.

<!-- generated by git-cliff -->
